From ddc711a4213c1c46a10899ee4c24bdd46622274e Mon Sep 17 00:00:00 2001 From: JoyceCoder Date: Thu, 12 Mar 2020 16:31:06 +0800 Subject: [PATCH 1/4] add two items 1Contingent 2Flow_Shop_Scheduler --- .../3-1.png" | Bin 0 -> 11197 bytes .../3-2.png" | Bin 0 -> 10276 bytes .../3-3.png" | Bin 0 -> 115228 bytes .../ex3-shopSche.ipynb" | 1085 +++++++++++++ .../flow.py" | 311 ++++ .../heuristics.py" | 30 + .../neighbourhood.py" | 81 + .../tai20_5.txt" | 80 + .../6-1.png" | Bin 0 -> 243823 bytes .../contingent/__init__.py" | 23 + .../contingent/graphlib.py" | 106 ++ .../contingent/io.py" | 58 + .../contingent/projectlib.py" | 212 +++ .../contingent/rendering.py" | 44 + .../ex6-contigent.ipynb" | 1386 +++++++++++++++++ .../figure1.dot" | 22 + .../figure1.png" | Bin 0 -> 9824 bytes .../figure2.png" | Bin 0 -> 18476 bytes .../figure3.png" | Bin 0 -> 9980 bytes .../figure4.png" | Bin 0 -> 44574 bytes 20 files changed, 3438 insertions(+) create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-1.png" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-2.png" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-3.png" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/ex3-shopSche.ipynb" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/flow.py" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/heuristics.py" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/neighbourhood.py" create mode 100644 "Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/tai20_5.txt" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/6-1.png" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/__init__.py" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/graphlib.py" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/io.py" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/projectlib.py" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/rendering.py" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.dot" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.png" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure2.png" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure3.png" create mode 100644 "\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure4.png" diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-1.png" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..0977898f6d169d774c46afee49af5118c9c8b476 GIT binary patch literal 11197 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%0D$U%%8yZ`;MM)77yK}*0Xzq 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 literal 0 HcmV?d00001 diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-2.png" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/3-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a63bbf1577a535558e5070a58b2de720a24c487 GIT binary patch literal 10276 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�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

eX*__0RyOjloB@fcBjwX54UR$dT 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 z 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本节练习节选自书籍《500 lines or less》——A Flow Shop Scheduler\n", + "\n", + "## 介绍\n", + "\n", + "在本练习中,我们将介绍流水车间调度问题。流水车间调度问题是查找最优解问题的一种,本练习基于局部搜索(local search)方法,实现流水车间调度器。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1 流水车间调度\n", + "流水车间调度问题是一种优化问题,其中我们必须确定作业中各种任务的处理时间,以便调度任务以最大程度地减少完成作业所需的总时间。\n", + "\n", + "例如,一家汽车制造商拥有一条装配线,其中汽车的每个零件都在不同的机器上依次完成。不同的订单可能有自定义要求,例如,使车身涂漆的任务因一辆汽车而异。\n", + "\n", + "在我们的示例中,每辆汽车都是新**作业**,每辆汽车的零件都称为**任务**。每个作业将具有相同的任务序列来完成。\n", + "\n", + "流水车间调度的目的是最大程度地减少处理从每个作业到完成所有任务的总时间。(通常,此总时间称为完成时间。)此问题有很多应用程序,但与优化生产设备最相关。\n", + "\n", + "每个流水车间都由$n$台机器和$m$个任务组成。在我们的示例中,将有$n$个汽车工作站,总共有$m$辆汽车。每个作业都恰好由$n$个任务组成。我们可以假设一个作业的第$i$个任务必须使用机器$i$,并且需要预定数量的处理时间:$p(i,j)$是第$j$个作业的第$i$个任务的处理时间。此外,给定作业的任务顺序必须遵循可用机器的顺序。对于给定的作业,任务$i$必须在任务$i+1$开始之前完成。在我们的示例中,我们不想在组装框架之前就开始为汽车刷漆。最终的限制就是**不允许在一台机器上同时处理两个任务**。\n", + "\n", + "因为作业的任务顺序是预先确定的,所以可以将流水车间调度问题的解决方法看作是作业的排列。对于每台机器,在一台机器上处理的作业顺序将是相同的,并且经过排列后,作业$j$中的机器$i$的任务计划为以下两种情况:\n", + "\n", + "- 作业$j-1$中机器$i$的任务完成(即同一机器上的最新任务)\n", + "- 作业$j$中机器$i-1$的任务完成(即同一任务上的最新任务)\n", + "\n", + "因为我们选择这两个值中的最大值,所以将创建机器i或作业j的空闲时间。我们最终希望最小化此空闲时间,因为它将使总有效期变大。\n", + "\n", + "由于问题的简单形式,作业的任何排列都是有效的解决方案,而最佳解决方案将对应于某些排列。因此,我们通过更改作业的排列并测量相应的有效期来寻求改进的解决方案。在下文中,我们将作业的排列称为候选。\n", + "\n", + "让我们考虑一个简单的示例,其中包含两个作业和两个计算机。第一项任务有任务A和B,分别需要1分钟和2分钟才能完成。第二项任务有任务C和D,分别需要2分钟和1分钟才能完成。回想一下,A必须先于B而C必须先于D。因为有两个工作,所以我们只考虑两个排列。如果在工作1之前订购工作2,则制造跨度为5(图1);\n", + "\n", + "![](3-1.png)\n", + "\n", + "另一方面,如果我们在作业2之前订购作业1,则制造跨度仅为4(图2)。\n", + "![](3-2.png)\n", + "\n", + "请注意,没有多余的空间可以提前完成任何任务。良好排列的指导原则是最大程度地减少任何机器无需处理的时间。\n", + "\n", + "### 1.1 局部搜索\n", + "\n", + "当最佳解决方案难以计算时,局部搜索是解决优化问题的策略。直观地讲,它从一个看起来不错的解决方案转变为另一个看起来更好的解决方案。我们没有考虑所有可能的解决方案作为下一个关注点,而是定义了所谓的社区:被认为与当前解决方案相似的解决方案集。因为作业的任何排列都是有效的解决方案,所以我们可以将任何将作业混洗的机制视为本地搜索过程(实际上,这是我们在下面所做的事情)。\n", + "\n", + "要正式使用本地搜索,我们必须回答以下几个问题:\n", + "\n", + "- 我们应该从什么解决方案开始?\n", + "- 给定一个解决方案,我们应该考虑哪些邻近解决方案?\n", + "- 给定候选邻居的集合,我们应该考虑移到下一个?\n", + "\n", + "以下三个部分依次解决了这些问题。\n", + "\n", + "## 2 通用求解器\n", + "在本节中,我们提供了流水车间调度程序的一般框架。首先,我们需要导入所需的python库文件和求解器的相关参数设置:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, time, random\n", + "\n", + "from functools import partial\n", + "from collections import namedtuple\n", + "from itertools import product\n", + "\n", + "import neighbourhood as neigh\n", + "import heuristics as heur\n", + "\n", + "##############\n", + "## Settings ##\n", + "##############\n", + "\n", + "TIME_LIMIT = 300.0 # Time (in seconds) to run the solver\n", + "TIME_INCREMENT = 13.0 # Time (in seconds) in between heuristic measurements\n", + "DEBUG_SWITCH = False # Displays intermediate heuristic info when True\n", + "MAX_LNS_NEIGHBOURHOODS = 1000 # Maximum number of neighbours to explore in LNS" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "其中,`TIME_INCREMENT`是用作动态策略选择的一部分,`MAX_LNS_NEIGHBOURHOODS`是用作邻域选择的最大数量限制。接下来会有更加详细的描述。\n", + "\n", + "这些参数的设置也可以作为命令行参数显示给用户,此处我们改为将输入数据作为提供给程序。输入的问题(来自Taillard基准集)被假定为流水车间调度的标准格式。\n", + "\n", + "以下代码为`__main__`求解器文件的方法,根据输入到程序的参数数量来选择调用合适的函数:\n", + "\n", + "```python\n", + "if __name__ == '__main__':\n", + "\n", + " if len(sys.argv) == 2:\n", + " data = parse_problem(sys.argv[1], 0)\n", + " elif len(sys.argv) == 3:\n", + " data = parse_problem(sys.argv[1], int(sys.argv[2]))\n", + " else:\n", + " print(\"\\nUsage: python flow.py []\\n\")\n", + " sys.exit(0)\n", + "\n", + " (perm, ms) = solve(data)\n", + " print_solution(data, perm)\n", + "```\n", + "在上述代码中:\n", + "- `parse_problem`函数为Taillard基准集问题文件的解析函数\n", + "- `solve`函数为求解函数\n", + "- `print_problem`函数为最终结果的输出函数\n", + "\n", + "### 2.1 求解逻辑\n", + "我们先来看`solve`函数,该方法期望`data`变量是一个整数列表,其中包含每个作业的活动持续时间。其开始于初始化一组全局策略。关键是我们使用`start_*`来命名的变量,这些变量用来维护每个策略的统计数据,有助于在求解过程中动态选择策略。\n", + "\n", + "其中:\n", + "- `start_improvements`: 通过某策略可以改善解决方案的数量\n", + "- `start_time_spent`: 在某策略上花费的时间\n", + "- `start_weights`: 与某策略的好坏相对应的权重\n", + "- `start_usage`: 我们使用某策略的次数\n", + "\n", + "```python\n", + "def solve(data):\n", + " \"\"\"Solves an instance of the flow shop scheduling problem\"\"\"\n", + "\n", + " # We initialize the strategies here to avoid cyclic import issues\n", + " initialize_strategies()\n", + " global STRATEGIES\n", + "\n", + " strat_improvements = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_time_spent = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_weights = {strategy: 1 for strategy in STRATEGIES}\n", + " strat_usage = {strategy: 0 for strategy in STRATEGIES}\n", + "```\n", + "\n", + "流水车间调度问题的一个特征是:每个排列都是有效的解决方案,并且至少有一个将具有最佳的制造期。值得庆幸的是,当从一种排列转换到另一种排列时,这可以使我们放弃检查是否处于可行解的空间之内,因为所有一切都是可行的。\n", + "\n", + "但是,要在置换空间中开始局部搜索时,我们必须**具有初始置换**。为简单起见,我们选择**随机排列作业列表**来初始化局部搜索。\n", + "\n", + "```python\n", + " perm = range(len(data))\n", + " random.shuffle(perm)\n", + "```\n", + "\n", + "接下来,我们需要对变量进行初始化,以使我们能够跟踪到目前为止找到的最佳排列以及提供输出的时序信息。\n", + "\n", + "```python\n", + " # Keep track of the best solution\n", + " best_make = makespan(data, perm)\n", + " best_perm = perm\n", + " res = best_make\n", + "\n", + " # Maintain statistics and timing for the iterations\n", + " iteration = 0\n", + " time_limit = time.time() + TIME_LIMIT\n", + " time_last_switch = time.time()\n", + "\n", + " time_delta = TIME_LIMIT / 10\n", + " checkpoint = time.time() + time_delta\n", + " percent_complete = 10\n", + "\n", + " print(\"\\nSolving...\")\n", + "```\n", + "\n", + "由于这是局部搜索解决方案,因此只要没有达到时间限制,我们就可以继续尝试并改进解决方案。我们提供指示求解器进度的输出,并跟踪我们计算出的迭代次数:\n", + "```python\n", + " while time.time() < time_limit:\n", + "\n", + " if time.time() > checkpoint:\n", + " print \" %d %%\" % percent_complete\n", + " percent_complete += 10\n", + " checkpoint += time_delta\n", + "\n", + " iteration += 1\n", + "```\n", + "\n", + "下面我们描述如何选择策略,但是到目前为止,知道策略提供了两个功能库:\n", + "- 一个`neighbourhood`功能为我们提供了一组下一个要考虑的候选人\n", + "- 一个`heuristic`功能则从集合中选择了最佳候选人\n", + "\n", + "从这些函数中,我们得到一个新的排列(`perm`)和一个新的制造期结果(`res`):\n", + "```python\n", + " # Heuristically choose the best strategy\n", + " strategy = pick_strategy(STRATEGIES, strat_weights)\n", + "\n", + " old_val = res\n", + " old_time = time.time()\n", + "\n", + " # Use the current strategy's heuristic to pick the next permutation from\n", + " # the set of candidates generated by the strategy's neighbourhood\n", + " candidates = strategy.neighbourhood(data, perm)\n", + " perm = strategy.heuristic(data, candidates)\n", + " res = makespan(data, perm)\n", + "```\n", + "\n", + "计算工期的代码非常简单:我们可以通过评估最终作业的完成时间来从排列中进行计算。" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def makespan(data, perm):\n", + " \"\"\"Computes the makespan of the provided solution\"\"\"\n", + " return compile_solution(data, perm)[-1][-1] + data[perm[-1]][-1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们将在后面看到`compile_solution`工作原理,但是现在足以知道已返回2D数组,并且坐标为[-1][-1]的元素与计划中最终作业的开始时间相对应。\n", + "\n", + "为了帮助选择策略,我们保留以下统计数据:\n", + "1. 该策略改善了解决方案的数量;\n", + "2. 该策略花费了多少时间计算信息;\n", + "3. 使用该策略的次数。如果偶然发现更好的解决方案,我们还将更新变量以获得最佳排列:\n", + "\n", + "```python\n", + " # Record the statistics on how the strategy did\n", + " strat_improvements[strategy] += res - old_val\n", + " strat_time_spent[strategy] += time.time() - old_time\n", + " strat_usage[strategy] += 1\n", + "\n", + " if res < best_make:\n", + " best_make = res\n", + " best_perm = perm[:]\n", + " \n", + "```\n", + "定期更新用于策略的统计信息。为了便于阅读,我们删除了相关代码段,并在下面详细说明了代码。\n", + "\n", + "作为最后一步,一旦`while`循环完成(即达到了时间限制),我们将输出有关求解过程的一些统计信息,并返回最佳排列及其`makepan`:\n", + "```python\n", + " print(\" %d %%\\n\" % percent_complete)\n", + " print(\"\\nWent through %d iterations.\" % iteration)\n", + "\n", + " print(\"\\n(usage) Strategy:\")\n", + " results = sorted([(strat_weights[STRATEGIES[i]], i)\n", + " for i in range(len(STRATEGIES))], reverse=True)\n", + " for (w, i) in results:\n", + " print(\"(%d) \\t%s\" % (strat_usage[STRATEGIES[i]], STRATEGIES[i].name))\n", + "\n", + " return (best_perm, best_make)\n", + "```\n", + "\n", + "最终的求解函数`solve`为:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def solve(data):\n", + " \"\"\"Solves an instance of the flow shop scheduling problem\"\"\"\n", + "\n", + " #我们在这里初始化策略以避免周期性导入问题\n", + " initialize_strategies()\n", + " global STRATEGIES\n", + " \n", + " strat_improvements = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_time_spent = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_weights = {strategy: 1 for strategy in STRATEGIES}\n", + " strat_usage = {strategy: 0 for strategy in STRATEGIES}\n", + "\n", + " #随机开始\n", + " perm = list(range(len(list(data))))\n", + " random.shuffle(perm)\n", + "\n", + " #记录最优策略\n", + " best_make = makespan(data, perm)\n", + " best_perm = perm\n", + " res = best_make\n", + "\n", + " #维护迭代的统计信息和时序\n", + " iteration = 0\n", + " time_limit = time.time() + TIME_LIMIT\n", + " time_last_switch = time.time()\n", + "\n", + " time_delta = TIME_LIMIT / 10\n", + " checkpoint = time.time() + time_delta\n", + " percent_complete = 10\n", + "\n", + " print (\"\\nSolving...\")\n", + "\n", + " while time.time() < time_limit:\n", + "\n", + " if time.time() > checkpoint:\n", + " print (\" %d %%\" % percent_complete)\n", + " percent_complete += 10\n", + " checkpoint += time_delta\n", + "\n", + " iteration += 1\n", + "\n", + " # 启发式的选择最优策略\n", + " strategy = pick_strategy(STRATEGIES, strat_weights)\n", + "\n", + " old_val = res\n", + " old_time = time.time()\n", + "\n", + " # 使用当前策略的heuristic方法,从策略邻域生成的候选集合中选择下一个排列\n", + " candidates = strategy.neighbourhood(data, perm)\n", + " perm = strategy.heuristic(data, candidates)\n", + " res = makespan(data, perm)\n", + "\n", + " #记录有关策略执行情况的统计信息\n", + " strat_improvements[strategy] += res - old_val\n", + " strat_time_spent[strategy] += time.time() - old_time\n", + " strat_usage[strategy] += 1\n", + "\n", + " if res < best_make:\n", + " best_make = res\n", + " best_perm = perm[:]\n", + "\n", + " #定期更改可用策略的权重,这样搜索可以动态地转向最近被证明更有效的策略。\n", + " if time.time() > time_last_switch + TIME_INCREMENT:\n", + "\n", + " #将改进所需的时间归一化\n", + " results = sorted([(float(strat_improvements[s]) / max(0.001, strat_time_spent[s]), s)\n", + " for s in STRATEGIES])\n", + "\n", + " if DEBUG_SWITCH:\n", + " print (\"\\nComputing another switch...\")\n", + " print (\"Best performer: %s (%d)\" % (results[0][1].name, results[0][0]))\n", + " print (\"Worst performer: %s (%d)\" % (results[-1][1].name, results[-1][0]))\n", + "\n", + " #提升成功策略的分量\n", + " for i in range(len(STRATEGIES)):\n", + " strat_weights[results[i][1]] += len(STRATEGIES) - i\n", + "\n", + " #此外,加强未使用的策略以避免饥饿\n", + " if results[i][0] == 0:\n", + " strat_weights[results[i][1]] += len(STRATEGIES)\n", + "\n", + " time_last_switch = time.time()\n", + "\n", + " if DEBUG_SWITCH:\n", + " print (results)\n", + " print (sorted([strat_weights[STRATEGIES[i]] for i in range(len(STRATEGIES))]))\n", + "\n", + " strat_improvements = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_time_spent = {strategy: 0 for strategy in STRATEGIES}\n", + "\n", + "\n", + " print (\" %d %%\\n\" % percent_complete)\n", + " print (\"\\nWent through %d iterations.\" % iteration)\n", + "\n", + " print (\"\\n(usage) Strategy:\")\n", + " results = sorted([(strat_weights[STRATEGIES[i]], i)\n", + " for i in range(len(STRATEGIES))], reverse=True)\n", + " for (w, i) in results:\n", + " print (\"(%d) \\t%s\" % (strat_usage[STRATEGIES[i]], STRATEGIES[i].name))\n", + "\n", + " return (best_perm, best_make)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2 问题解析\n", + "\n", + "作为解析过程的输入,我们提供了可在其中找到输入的文件名以及应使用的示例编号。(每个文件包含许多实例,如下图所示。)\n", + "\n", + "\n", + "我们通过读取文件并标识分隔每个问题实例的行来开始解析:\n", + "```python\n", + "def parse_problem(filename, k=1):\n", + " with open(filename, 'r') as f:\n", + " # Identify the string that separates instances\n", + " problem_line = ('/number of jobs, number of machines, initial seed, '\n", + " 'upper bound and lower bound :/')\n", + "\n", + " # Strip spaces and newline characters from every line\n", + " lines = map(str.strip, f.readlines()) \n", + "```\n", + "为了更容易查找正确的实例,我们假设行将以'/'字符分隔。这样,我们就可以根据出现在每个实例顶部的通用字符串来分割文件,并且在第一行的开头添加一个'/'字符可以使得无论我们选择哪种实例,下面的字符串处理工作都会正常进行。\n", + "\n", + "给定文件中找到的实例集合,我们还将检测提供的实例号何时超出范围。\n", + "```python\n", + " # We prep the first line for later\n", + " lines[0] = '/' + lines[0]\n", + "\n", + " # We also know '/' does not appear in the files, so we can use it as\n", + " # a separator to find the right lines for the kth problem instance\n", + " try:\n", + " lines = '/'.join(lines).split(problem_line)[k].split('/')[2:]\n", + " except IndexError:\n", + " max_instances = len('/'.join(lines).split(problem_line)) - 1\n", + " print(\"\\nError: Instance must be within 1 and %d\\n\" % max_instances)\n", + " sys.exit(0)\n", + "```\n", + "\n", + "我们直接解析数据,将每个任务的处理时间转换为整数并将其存储在列表中。最后,我们压缩数据以反转行和列,以使格式符合上述求解代码的期望。(其中的每个项目data都应对应于特定的工作。)\n", + "```python\n", + " # Split every line based on spaces and convert each item to an int\n", + " data = [map(int, line.split()) for line in lines]\n", + "\n", + " # We return the zipped data to rotate the rows and columns, making each\n", + " # item in data the durations of tasks for a particular job\n", + " return zip(*data)\n", + "```\n", + "\n", + "最终的解析函数`parse_problem`为:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "def parse_problem(filename, k=1):\n", + " \"\"\"\n", + " 解析Taillard问题文件的第k个实例\n", + " Taillard问题文件是流水车间调度问题的标准基准集。\n", + " \"\"\"\n", + "\n", + " print (\"\\nParsing...\")\n", + "\n", + " with open(filename, 'r') as f:\n", + " #标识分隔实例的字符串\n", + " problem_line = '/number of jobs, number of machines, initial seed, upper bound and lower bound :/'\n", + "\n", + " #删除每行中的空格和换行符\n", + " lines = list(map(str.strip, f.readlines()))\n", + "\n", + " # We prep the first line for later\n", + " lines[0] = '/' + lines[0]\n", + "\n", + " #我们也知道'/'不会出现在文件中\n", + " #因此我们可以将其用作分隔符以查找第k个问题实例的正确行\n", + " try:\n", + " lines = '/'.join(lines).split(problem_line)[k].split('/')[2:]\n", + " except IndexError:\n", + " max_instances = len('/'.join(lines).split(problem_line)) - 1\n", + " print (\"\\nError: Instance must be within 1 and %d\\n\" % max_instances)\n", + " sys.exit(0)\n", + "\n", + " #根据空格分割每一行并将每一项转换为一个整数\n", + " data = [map(int, line.split()) for line in lines]\n", + "\n", + " #我们返回压缩后的数据以旋转行和列\n", + " #从而使数据中的每个项目都成为特定任务的任务持续时间\n", + " return zip(*data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.3 编译解决方案\n", + "流水车间调度问题的解决方案包括为每个作业中的每个任务提供精确的时间安排。因为我们隐含地表示工作的排列,所以我们引入了`compile_solution`将排列转换为精确时间的函数。\n", + "\n", + "作为输入,该函数接收问题数据(为我们提供每个任务的持续时间)和工作排列的数据。\n", + "该函数首先初始化用于存储每个任务的开始时间的数据结构,然后将第一个作业中的任务包括在排列中。\n", + "\n", + "然后,我们为其余作业添加所有任务。\n", + "\n", + "作业中的第一个任务将始终在上一个作业中的第一个任务完成后立即开始。对于其余任务,其开始时间是**同一作业中上一个任务的完成时间和同一台计算机上上一个任务的完成时间中的最大值**。\n", + "最终返回每个任务的时间安排。\n", + "\n", + "该函数代码如下:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "def compile_solution(data, perm):\n", + " \"\"\"编译给定作业排列的机器上的调度\"\"\"\n", + " num_machines = len(list(data[0]))\n", + "\n", + " #注意,使用[[]]* m是不正确的\n", + " #因为它只是复制相同的列表m次(而不是创建m个不同的列表)。\n", + " machine_times = [[] for _ in range(num_machines)]\n", + "\n", + " #将初始作业分配给机器\n", + " machine_times[0].append(0)\n", + " for mach in range(1,num_machines):\n", + " #前一个任务完成后,开始工作中的下一个任务\n", + " machine_times[mach].append(machine_times[mach-1][0] +\n", + " data[perm[0]][mach-1])\n", + "\n", + " #分配剩余的工作\n", + " for i in range(1, len(perm)):\n", + "\n", + " #第一台机器从不包含任何空闲时间\n", + " job = perm[i]\n", + " machine_times[0].append(machine_times[0][-1] + data[perm[i-1]][0])\n", + "\n", + " #对于其余的机器,启动时间是作业中的前一个任务何时完成,\n", + " #或当前机器何时完成前一个作业的任务的最大值。\n", + " for mach in range(1, num_machines):\n", + " machine_times[mach].append(max(machine_times[mach-1][i] + data[perm[i]][mach-1],\n", + " machine_times[mach][i-1] + data[perm[i-1]][mach]))\n", + "\n", + " return machine_times" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.4 印刷解决方案\n", + "\n", + "求解过程完成后,程序将以紧凑形式输出有关解决方案的信息。我们没有提供每项任务的每个任务的准确时间安排,而是输出以下信息:\n", + "\n", + "1. 产生最佳生产期的工作排列\n", + "2. 排列的计算的计算跨度\n", + "3. 每台机器的开始时间,完成时间和空闲时间\n", + "4. 每个作业的开始时间,完成时间和空闲时间\n", + "\n", + "其中:\n", + "\n", + "- **作业或机器的开始时间**对应于作业或机器上第一个任务的开始。\n", + "- **作业或机器的完成时间**对应于作业或机器上最终任务的结束。\n", + "- **空闲时间**是特定作业或机器的任务之间的松弛时间。\n", + "\n", + "理想情况下,我们希望减少空闲时间,因为这意味着总的处理时间也将减少。\n", + "\n", + "我们已经讨论了用于编译解决方案的代码(即,计算每个任务的开始时间),并且输出排列和`makepan`。\n", + "\n", + "接着,我们使用Python中的字符串格式化功能来打印每个机器和作业的开始,结束和空闲时间表。\n", + "\n", + "请注意,作业的空闲时间是从作业开始到完成为止的时间,减去该作业中每个任务的处理时间之和。我们以类似的方式计算机器的空闲时间。" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def print_solution(data, perm):\n", + " \"\"\"打印计算出的解决方案的统计信息\"\"\"\n", + "\n", + " sol = compile_solution(data, perm)\n", + "\n", + " print (\"\\nPermutation: %s\\n\" % str([i+1 for i in perm]))\n", + "\n", + " print (\"Makespan: %d\\n\" % makespan(data, perm))\n", + "\n", + " row_format =\"{:>15}\" * 4\n", + " print( row_format.format('Machine', 'Start Time', 'Finish Time', 'Idle Time'))\n", + " for mach in range(len(data[0])):\n", + " finish_time = sol[mach][-1] + data[perm[-1]][mach]\n", + " idle_time = (finish_time - sol[mach][0]) - sum([job[mach] for job in data])\n", + " print (row_format.format(mach+1, sol[mach][0], finish_time, idle_time))\n", + "\n", + " results = []\n", + " for i in range(len(data)):\n", + " finish_time = sol[-1][i] + data[perm[i]][-1]\n", + " idle_time = (finish_time - sol[0][i]) - sum([time for time in data[perm[i]]])\n", + " results.append((perm[i]+1, sol[0][i], finish_time, idle_time))\n", + "\n", + " print (\"\\n\")\n", + " print( row_format.format('Job', 'Start Time', 'Finish Time', 'Idle Time'))\n", + " for r in sorted(results):\n", + " print (row_format.format(*r))\n", + "\n", + " print( \"\\n\\nNote: Idle time does not include initial or final wait time.\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 策略\n", + "接下来,我们对本练习开始时所使用的\n", + "```\n", + "import neighbourhood as neigh\n", + "import heuristics as heur\n", + "```\n", + "中的两个功能类进行介绍,并使用代码实现如何进行动态策略的选择。\n", + "\n", + "### 3.1 Neighbourhood\n", + "局部搜索的思想是将局部解决方案从一个解决方案迁移到附近的其他解决方案。我们将给定解决方案的**邻域**称为局部的其他解决方案。\n", + "\n", + "在本节中,我们详细介绍四个潜在的领域,每个领域的复杂性都在不断提高。\n", + "\n", + "**第一邻域产生给定数量的随机排列。**这个邻里甚至没有考虑我们开始时使用的解决方案,因此“邻里”一词扩展了事实。但是,在搜索中包括一些随机性是一种好习惯,因为它可以促进对搜索空间的探索。" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "def neighbours_random(data, perm, num = 1):\n", + " #返回个随机作业排列,包括当前的排列\n", + " candidates = [perm]\n", + " for i in range(num):\n", + " candidate = perm[:]\n", + " random.shuffle(candidate)\n", + " candidates.append(candidate)\n", + " return candidates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**第二领域考虑交换排列中的任何两个作业。**通过使用`itertools`包中的`combinations`函数,我们可以轻松地遍历每对索引,并创建对应于交换位于每个索引处的作业的新排列。从某种意义上说,这个邻域产生的排列与我们开始时的排列非常相似。" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def neighbours_swap(data, perm):\n", + " #返回与交换每一对作业相对应的排列\n", + " candidates = [perm]\n", + " for (i,j) in combinations(range(len(perm)), 2):\n", + " candidate = perm[:]\n", + " candidate[i], candidate[j] = candidate[j], candidate[i]\n", + " candidates.append(candidate)\n", + " return candidates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**第三领域使用特定于当前问题的信息。**我们发现空闲时间最多的作业,并考虑以各种可能的方式交换它们。我们采用的值`size`是我们考虑的作业数量:`size`最空闲的作业。\n", + "\n", + "该函数的执行过程如下:\n", + "1. 计算排列中每个作业的空闲时间;\n", + "2. 计算出`size`空闲时间最多的作业列表;\n", + "3. 通过考虑已确定的最闲置作业的每个排列来构造邻域。为了找到排列,我们利用`itertools`包中的`permutations`函数。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "def neighbours_idle(data, perm, size=4):\n", + " #返回最空闲作业的排列\n", + " candidates = [perm]\n", + "\n", + " #计算每个作业的空闲时间\n", + " sol = flow.compile_solution(data, perm)\n", + " results = []\n", + "\n", + " for i in range(len(data)):\n", + " finish_time = sol[-1][i] + data[perm[i]][-1]\n", + " idle_time = (finish_time - sol[0][i]) - sum([t for t in data[perm[i]]])\n", + " results.append((idle_time, i))\n", + " \n", + " #以最空闲的作业为例\n", + " subset = [job_ind for (idle, job_ind) in reversed(sorted(results))][:size]\n", + " \n", + " #枚举空闲作业的排列\n", + " for ordering in permutations(subset):\n", + " candidate = perm[:]\n", + " for i in range(len(ordering)):\n", + " candidate[subset[i]] = perm[ordering[i]]\n", + " candidates.append(candidate)\n", + "\n", + " return candidates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**第四邻域通常称为大邻域搜索(LNS)。**直观上,LNS通过隔离考虑当前排列的较小子集来工作,找到工作子集的最佳排列将为我们提供LNS领域的单个候选者。\n", + "\n", + "通过对特定大小的几个(或全部)子集重复此过程,我们可以增加邻域中的候选者数量。我们通过`MAX_LNS_NEIGHBOURHOODS`参数考虑限制的数目,因为邻居的数目可以快速增长。\n", + "\n", + "LNS的计算过程如下:\n", + "1. 计算随机的作业集列表,我们将考虑使用`itertools`包的`combinations`功能进行交换;\n", + "2. 遍历子集以找到每个作业的最佳排列。我们在上面已经看到了类似的代码,可以循环访问最空闲的作业的所有排列。此处的主要区别在于,**我们仅记录该子集的最佳排列**,因为通过为所考虑的工作的每个子集选择一个排列来构建更大的邻域。\n", + "\n", + "如果我们将`size`参数设置为作业数,则将考虑每个排列并选择最佳排列。但是,实际上,我们需要将子集的大小限制为3或4;任何较大的值都会导致该`neighbours_LNS`功能花费大量时间。" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "def neighbours_LNS(data, perm, size = 2):\n", + " #返回大LNS搜索领域\n", + " candidates = [perm]\n", + "\n", + " #限制社区的数量,以防有太多的工作机会\n", + " neighbourhoods = list(combinations(range(len(perm)), size))\n", + " random.shuffle(neighbourhoods)\n", + " \n", + " for subset in neighbourhoods[:flow.MAX_LNS_NEIGHBOURHOODS]:\n", + "\n", + " #记录每个领域的最佳排列\n", + " best_make = flow.makespan(data, perm)\n", + " best_perm = perm\n", + "\n", + " #枚举所选邻域的每个排列\n", + " for ordering in permutations(subset):\n", + " candidate = perm[:]\n", + " for i in range(len(ordering)):\n", + " candidate[subset[i]] = perm[ordering[i]]\n", + " res = flow.makespan(data, candidate)\n", + " if res < best_make:\n", + " best_make = res\n", + " best_perm = candidate\n", + "\n", + " #将最佳候选人记录为更大社区的一部分\n", + " candidates.append(best_perm)\n", + "\n", + " return candidates" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2 Heuristics\n", + "\n", + "启发式方法从一组提供的候选中返回单个候选排列。试探法还被授予对问题数据的访问权限,以便评估哪个候选者可能是首选。\n", + "\n", + "我们考虑的**第一个启发式方法是`heur_random`**。这种试探法从列表中随机选择一个候选人,而不评估哪个人可能更受欢迎:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "def heur_random(data, candidates):\n", + " #返回一个随机的候选选项\n", + " return random.choice(candidates)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**下一个启发式`heur_hillclimbing`使用另一个极端**。与其随机选择一个候选者,不如选择具有最广有效期的候选者。\n", + "\n", + "请注意,列表`scores`将包含以下形式的元组,`(make,perm)`其中`make`为置换的`perm`的`makepan`值。对这样的列表进行排序会将具有最佳生成时间的元组放在列表的开头;从这个元组中,我们返回排列。" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "def heur_hillclimbing(data, candidates):\n", + " #返回列表中的最佳候选者\n", + " scores = [(flow.makespan(data, perm), perm) for perm in candidates]\n", + " return sorted(scores)[0][1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**最终的启发式`heur_random_hillclimbing`结合了上面两种方法**。\n", + "\n", + "执行本地搜索时,您可能并不总是希望选择一个随机的候选者,甚至最好的候选者。通过选择概率为0.5的最佳候选者,然后选择概率为0.25的次优候选者,heur_random_hillclimbing启发式方法返回“相当好”的解决方案,依此类推。\n", + "\n", + "while循环实质上是在每次迭代时翻转硬币,以查看它是否应继续增加索引(限制列表的大小)。选择的最终索引对应于启发式选择的候选。" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "def heur_random_hillclimbing(data, candidates):\n", + " #返回与排序的质量成正比的概率的候选人\n", + " scores = [(flow.makespan(data, perm), perm) for perm in candidates]\n", + " i = 0\n", + " while (random.random() < 0.5) and (i < len(scores) - 1):\n", + " i += 1\n", + " return sorted(scores)[i][1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "由于makepan是我们正在尝试优化的标准,因此爬坡将引导本地搜索过程转向具有更佳makepan的解决方案。 引入随机性使我们能够探索邻居,而不是在每一步都盲目追求最佳外观的解决方案。\n", + "\n", + "### 3.3 动态策略选择\n", + "\n", + "本地搜索的核心是**使用特定的启发式和邻域函数从一种解决方案跳到另一种解决方案**。 \n", + "\n", + "我们如何选择一组选项而不是另一组? \n", + "\n", + "实际上,在搜索过程中切换策略经常会有所回报。我们使用的动态策略选择将在试探性功能和邻域功能的组合之间切换,以尝试动态地转移到效果最佳的那些策略上。对我们来说,策略是启发式和邻域函数(包括其参数值)的特定配置。\n", + "\n", + "1. 首先,我们的代码构建了我们在求解过程中要考虑的策略范围。在策略初始化中,我们使用`functools`包中的`partial`函数为每个街区部分分配参数。\n", + "2. 此外,我们构造了启发式函数列表。\n", + "3. 最后,我们使用乘积运算符将邻域和启发式函数的每种组合添加为新策略。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "################\n", + "## Strategies ##\n", + "#################################################\n", + "## 策略是Neighbourhoods生成器(用于计算下一组候选对象)\n", + "## 和Heuristics计算(用于选择最佳候选对象)的特定配置。\n", + "##\n", + "\n", + "STRATEGIES = []\n", + "\n", + "#使用命名字典比使用字典更干净。 例如,strategy ['name']与strategy.name\n", + "Strategy = namedtuple('Strategy', ['name', 'neighbourhood', 'heuristic'])\n", + "\n", + "def initialize_strategies():\n", + "\n", + " global STRATEGIES\n", + "\n", + " #定义我们要使用的邻域(和参数)\n", + " neighbourhoods = [\n", + " ('Random Permutation', partial(neighbours_random, num=100)),\n", + " ('Swapped Pairs', neighbours_swap),\n", + " ('Large Neighbourhood Search (2)', partial(neighbours_LNS, size=2)),\n", + " ('Large Neighbourhood Search (3)', partial(neighbours_LNS, size=3)),\n", + " ('Idle Neighbourhood (3)', partial(neighbours_idle, size=3)),\n", + " ('Idle Neighbourhood (4)', partial(neighbours_idle, size=4)),\n", + " ('Idle Neighbourhood (5)', partial(neighbours_idle, size=5))\n", + " ]\n", + "\n", + " #定义我们要使用的启发式\n", + " heuristics = [\n", + " ('Hill Climbing',heur_hillclimbing),\n", + " ('Random Selection',heur_random),\n", + " ('Biased Random Selection',heur_random_hillclimbing)\n", + " ]\n", + "\n", + " #组合每一个邻域和启发式策略\n", + " for (n, h) in product(neighbourhoods, heuristics):\n", + " STRATEGIES.append(Strategy(\"%s / %s\" % (n[0], h[0]), n[1], h[1]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "一旦定义了策略,我们就不必在搜索过程中坚持使用单个选项。取而代之的是,我们随机选择任何一种策略,但要根据策略的执行情况对选择进行加权。\n", + "\n", + "我们在下面描述权重,但是对于`pick_strategy`功能,我们只需要策略列表和相应的相对权重列表(任何数字都可以)。" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "def pick_strategy(strategies, weights):\n", + " #根据权重选择随机策略:轮盘赌选择并非完全随机选择策略,\n", + " #而是将随机选择偏向于过去效果良好的策略(根据权重值)。\n", + " total = sum([weights[strategy] for strategy in strategies])\n", + " pick = random.uniform(0, total)\n", + " count = weights[strategies[0]]\n", + "\n", + " i = 0\n", + " while pick > count:\n", + " count += weights[strategies[i+1]]\n", + " i += 1\n", + "\n", + " return strategies[i]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "为了选择具有给定权重的随机策略,我们统一选择一个介于0和所有权重之和之间的数字。随后,我们找到最低的索引i这样索引的所有权重之和小于i大于我们选择的随机数。该技术有时称为**轮盘赌选择**,将为我们随机选择一项策略,并为那些权重较高的策略提供更大的机会。\n", + "\n", + "剩下的就是描述在寻找解决方案的过程中如何增加权重。这在**`solve`函数**的主`while`循环中以规则的时间间隔发生(由`TIME_INCREMENT`变量定义)。\n", + "```python\n", + " if time.time() > time_last_switch + TIME_INCREMENT:\n", + "\n", + " time_last_switch = time.time()\n", + "```\n", + "回想一下,`strat_improvements`存储策略已进行的所有改进的总和,而`strat_time_spent存`储最后一次间隔中给出策略的时间。 我们将每种策略所花费的总时间进行归一化,以衡量每个策略在上一个时间间隔内的效果。由于策略可能根本没有机会执行,因此我们选择少量时间作为默认值。\n", + "\n", + "```python\n", + " results = sorted([\n", + " (float(strat_improvements[s]) / max(0.001, strat_time_spent[s]), s)\n", + " for s in STRATEGIES])\n", + "```\n", + "\n", + "现在我们已经对每个策略的执行情况进行了排名,我们将$k$添加到最佳策略的权重(假设我们有$k$个策略),将$k-1$添加到次佳策略,等等。每个策略都有其自己的权重增加,列表中最差的策略只会增加1。\n", + "```python\n", + " # Boost the weight for the successful strategies\n", + " for i in range(len(STRATEGIES)):\n", + " strat_weights[results[i][1]] += len(STRATEGIES) - i\n", + "```\n", + "\n", + "作为一项额外措施,我们人为地提高了所有未使用的策略。 这样做是为了确保我们不会完全忘记策略。 尽管一种策略在开始时似乎表现不佳,但后来在搜索中却证明是非常有用的。\n", + "\n", + "```python\n", + " if results[i][0] == 0:\n", + " strat_weights[results[i][1]] += len(STRATEGIES)\n", + "```\n", + "\n", + "最后,我们输出有关策略排名的一些信息(如果设置了`DEBUG_SWITCH`标志),然后在下一个时间间隔重置`strat_improvements`和`strat_time_spent`变量。\n", + "\n", + "```python\n", + " if DEBUG_SWITCH:\n", + " print (\"\\nComputing another switch...\")\n", + " print (\"Best: %s (%d)\" % (results[0][1].name, results[0][0]))\n", + " print (\"Worst: %s (%d)\" % (results[-1][1].name, results[-1][0]))\n", + " print (results)\n", + " print (sorted([strat_weights[STRATEGIES[i]] \n", + " for i in range(len(STRATEGIES))]))\n", + "\n", + " strat_improvements = {strategy: 0 for strategy in STRATEGIES}\n", + " strat_time_spent = {strategy: 0 for strategy in STRATEGIES}\n", + "```\n", + "\n", + "接下来,我们以小文件来测试一下调度算法的运行结果。" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Parsing...\n", + "\n", + "Solving...\n", + " 10 %\n", + " 20 %\n", + " 30 %\n", + " 40 %\n", + " 50 %\n", + " 60 %\n", + " 70 %\n", + " 80 %\n", + " 90 %\n", + " 100 %\n", + "\n", + "\n", + "Went through 3625 iterations.\n", + "\n", + "(usage) Strategy:\n", + "(264) \tIdle Neighbourhood (3) / Hill Climbing\n", + "(250) \tLarge Neighbourhood Search (2) / Random Selection\n", + "(223) \tIdle Neighbourhood (4) / Hill Climbing\n", + "(232) \tRandom Permutation / Hill Climbing\n", + "(213) \tIdle Neighbourhood (5) / Hill Climbing\n", + "(247) \tIdle Neighbourhood (4) / Biased Random Selection\n", + "(216) \tIdle Neighbourhood (5) / Biased Random Selection\n", + "(230) \tSwapped Pairs / Hill Climbing\n", + "(234) \tSwapped Pairs / Biased Random Selection\n", + "(217) \tIdle Neighbourhood (3) / Biased Random Selection\n", + "(154) \tLarge Neighbourhood Search (3) / Random Selection\n", + "(160) \tLarge Neighbourhood Search (2) / Biased Random Selection\n", + "(188) \tLarge Neighbourhood Search (2) / Hill Climbing\n", + "(146) \tLarge Neighbourhood Search (3) / Biased Random Selection\n", + "(164) \tLarge Neighbourhood Search (3) / Hill Climbing\n", + "(129) \tIdle Neighbourhood (3) / Random Selection\n", + "(93) \tRandom Permutation / Biased Random Selection\n", + "(66) \tIdle Neighbourhood (4) / Random Selection\n", + "(48) \tIdle Neighbourhood (5) / Random Selection\n", + "(84) \tSwapped Pairs / Random Selection\n", + "(67) \tRandom Permutation / Random Selection\n", + "\n", + "Permutation: [13, 8, 11, 17, 14, 4, 9, 6, 15, 16, 18, 7, 5, 12, 3, 1, 19, 10, 2, 20]\n", + "\n", + "Makespan: 1297\n", + "\n", + " Machine Start Time Finish Time Idle Time\n", + " 1 0 1121 0\n", + " 2 14 1198 184\n", + " 3 87 1238 204\n", + " 4 150 1269 38\n", + " 5 189 1297 104\n", + "\n", + "\n", + " Job Start Time Finish Time Idle Time\n", + " 1 735 1123 115\n", + " 2 944 1267 34\n", + " 3 720 1065 219\n", + " 4 189 611 84\n", + " 5 552 973 68\n", + " 6 287 715 151\n", + " 7 499 920 143\n", + " 8 14 289 54\n", + " 9 260 680 213\n", + " 10 857 1204 42\n", + " 11 52 419 110\n", + " 12 629 1045 182\n", + " 13 0 197 0\n", + " 14 160 526 131\n", + " 15 323 762 214\n", + " 16 335 849 249\n", + " 17 128 477 158\n", + " 18 412 867 112\n", + " 19 789 1191 133\n", + " 20 1027 1297 0\n", + "\n", + "\n", + "Note: Idle time does not include initial or final wait time.\n", + "\n" + ] + } + ], + "source": [ + "!python flow.py tai20_5.txt" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 总结\n", + "\n", + "在本练习中,我们看到了用相对少量的代码可以解决流水车间调度的复杂优化问题的方法。很难找到诸如流水车间之类的大型优化问题的最佳解决方案。在这种情况下,我们可以求助于近似技术(例如局部搜索)来计算足够好的解。通过局部搜索,我们可以从一种解决方案转到另一种解决方案,以期找到质量好的解决方案。\n", + "\n", + "局部搜索的一般直觉可以应用于各种各样的问题。 我们专注于:\n", + "- 从一个候选解决方案生成问题的相关解决方案的邻域\n", + "- 建立评估和比较解决方案的方法。 \n", + "\n", + "有了这两个组成部分,当难以找到最优方案时,我们可以使用局部搜索范式找到有价值的解决方案。\n", + "\n", + "我们没有使用任何一种策略来解决问题,而是看到了如何在解决过程中动态选择一种策略来进行转移。这种简单而强大的技术使程序能够混合和匹配针对当前问题的部分策略,这也意味着开发人员不必手工定制该策略。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cgsource", + "language": "python", + "name": "cgsource" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/flow.py" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/flow.py" new file mode 100644 index 0000000..777ec6c --- /dev/null +++ "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/flow.py" @@ -0,0 +1,311 @@ +import sys, os, time, random + +from functools import partial +from collections import namedtuple +from itertools import product + +import neighbourhood as neigh +import heuristics as heur + +############## +## Settings ## +############## +TIME_LIMIT = 300.0 # Time (in seconds) to run the solver +TIME_INCREMENT = 13.0 # Time (in seconds) in between heuristic measurements +DEBUG_SWITCH = False # Displays intermediate heuristic info when True +MAX_LNS_NEIGHBOURHOODS = 1000 # Maximum number of neighbours to explore in LNS + + +################ +## Strategies ## +################################################# +## A strategy is a particular configuration +## of neighbourhood generator (to compute +## the next set of candidates) and heuristic +## computation (to select the best candidate). +## + +STRATEGIES = [] + +# Using a namedtuple is a little cleaner than dictionaries. +# E.g., strategy['name'] versus strategy.name +Strategy = namedtuple('Strategy', ['name', 'neighbourhood', 'heuristic']) + +def initialize_strategies(): + + global STRATEGIES + + # Define the neighbourhoods (and parameters) we would like to use + neighbourhoods = [ + ('Random Permutation', partial(neigh.neighbours_random, num=100)), + ('Swapped Pairs', neigh.neighbours_swap), + ('Large Neighbourhood Search (2)', partial(neigh.neighbours_LNS, size=2)), + ('Large Neighbourhood Search (3)', partial(neigh.neighbours_LNS, size=3)), + ('Idle Neighbourhood (3)', partial(neigh.neighbours_idle, size=3)), + ('Idle Neighbourhood (4)', partial(neigh.neighbours_idle, size=4)), + ('Idle Neighbourhood (5)', partial(neigh.neighbours_idle, size=5)) + ] + + # Define the heuristics we would like to use + heuristics = [ + ('Hill Climbing', heur.heur_hillclimbing), + ('Random Selection', heur.heur_random), + ('Biased Random Selection', heur.heur_random_hillclimbing) + ] + + # Combine every neighbourhood and heuristic strategy + for (n, h) in product(neighbourhoods, heuristics): + STRATEGIES.append(Strategy("%s / %s" % (n[0], h[0]), n[1], h[1])) + + + +def solve(data): + """Solves an instance of the flow shop scheduling problem""" + + # We initialize the strategies here to avoid cyclic import issues + initialize_strategies() + global STRATEGIES + + # Record the following for each strategy: + # improvements: The amount a solution was improved by this strategy + # time_spent: The amount of time spent on the strategy + # weights: The weights that correspond to how good a strategy is + # usage: The number of times we use a strategy + strat_improvements = {strategy: 0 for strategy in STRATEGIES} + strat_time_spent = {strategy: 0 for strategy in STRATEGIES} + strat_weights = {strategy: 1 for strategy in STRATEGIES} + strat_usage = {strategy: 0 for strategy in STRATEGIES} + + # Start with a random permutation of the jobs + perm = list(range(len(list(data)))) + random.shuffle(perm) + + # Keep track of the best solution + best_make = makespan(data, perm) + best_perm = perm + res = best_make + + # Maintain statistics and timing for the iterations + iteration = 0 + time_limit = time.time() + TIME_LIMIT + time_last_switch = time.time() + + time_delta = TIME_LIMIT / 10 + checkpoint = time.time() + time_delta + percent_complete = 10 + + print ("\nSolving...") + + while time.time() < time_limit: + + if time.time() > checkpoint: + print (" %d %%" % percent_complete) + percent_complete += 10 + checkpoint += time_delta + + iteration += 1 + + # Heuristically choose the best strategy + strategy = pick_strategy(STRATEGIES, strat_weights) + + old_val = res + old_time = time.time() + + # Use the current strategy's heuristic to pick the next permutation from + # the set of candidates generated by the strategy's neighbourhood + candidates = strategy.neighbourhood(data, perm) + perm = strategy.heuristic(data, candidates) + res = makespan(data, perm) + + # Record the statistics on how the strategy did + strat_improvements[strategy] += res - old_val + strat_time_spent[strategy] += time.time() - old_time + strat_usage[strategy] += 1 + + if res < best_make: + best_make = res + best_perm = perm[:] + + # At regular intervals, switch the weighting on the strategies available. + # This way, the search can dynamically shift towards strategies that have + # proven more effective recently. + if time.time() > time_last_switch + TIME_INCREMENT: + + # Normalize the improvements made by the time it takes to make them + results = sorted([(float(strat_improvements[s]) / max(0.001, strat_time_spent[s]), s) + for s in STRATEGIES]) + + if DEBUG_SWITCH: + print ("\nComputing another switch...") + print ("Best performer: %s (%d)" % (results[0][1].name, results[0][0])) + print ("Worst performer: %s (%d)" % (results[-1][1].name, results[-1][0])) + + # Boost the weight for the successful strategies + for i in range(len(STRATEGIES)): + strat_weights[results[i][1]] += len(STRATEGIES) - i + + # Additionally boost the unused strategies to avoid starvation + if results[i][0] == 0: + strat_weights[results[i][1]] += len(STRATEGIES) + + time_last_switch = time.time() + + if DEBUG_SWITCH: + print (results) + print (sorted([strat_weights[STRATEGIES[i]] for i in range(len(STRATEGIES))])) + + strat_improvements = {strategy: 0 for strategy in STRATEGIES} + strat_time_spent = {strategy: 0 for strategy in STRATEGIES} + + + print (" %d %%\n" % percent_complete) + print ("\nWent through %d iterations." % iteration) + + print ("\n(usage) Strategy:") + results = sorted([(strat_weights[STRATEGIES[i]], i) + for i in range(len(STRATEGIES))], reverse=True) + for (w, i) in results: + print ("(%d) \t%s" % (strat_usage[STRATEGIES[i]], STRATEGIES[i].name)) + + return (best_perm, best_make) + + +def parse_problem(filename, k=1): + """Parse the kth instance of a Taillard problem file + + The Taillard problem files are a standard benchmark set for the problem + of flow shop scheduling. They can be found online at the following address: + - http://mistic.heig-vd.ch/taillard/problemes.dir/ordonnancement.dir/ordonnancement.html""" + + print ("\nParsing...") + + with open(filename, 'r') as f: + # Identify the string that separates instances + problem_line = '/number of jobs, number of machines, initial seed, upper bound and lower bound :/' + + # Strip spaces and newline characters from every line + lines = list(map(str.strip, f.readlines())) + + # We prep the first line for later + lines[0] = '/' + lines[0] + + # We also know '/' does not appear in the files, so we can use it as + # a separator to find the right lines for the kth problem instance + try: + lines = '/'.join(lines).split(problem_line)[k].split('/')[2:] + except IndexError: + max_instances = len('/'.join(lines).split(problem_line)) - 1 + print ("\nError: Instance must be within 1 and %d\n" % max_instances) + sys.exit(0) + + # Split every line based on spaces and convert each item to an int + data = [map(int, line.split()) for line in lines] + + # We return the zipped data to rotate the rows and columns, making each + # item in data the durations of tasks for a particular job + return zip(*data) + + +def pick_strategy(strategies, weights): + # Picks a random strategy based on its weight: roulette wheel selection + # Rather than selecting a strategy entirely at random, we bias the + # random selection towards strategies that have worked well in the + # past (according to the weight value). + total = sum([weights[strategy] for strategy in strategies]) + pick = random.uniform(0, total) + count = weights[strategies[0]] + + i = 0 + while pick > count: + count += weights[strategies[i+1]] + i += 1 + + return strategies[i] + + +def makespan(data, perm): + """Computes the makespan of the provided solution + + For scheduling problems, the makespan refers to the difference between + the earliest start time of any job and the latest completion time of + any job. Minimizing the makespan amounts to minimizing the total time + it takes to process all jobs from start to finish.""" + return compile_solution(data, perm)[-1][-1] + data[perm[-1]][-1] + + +def compile_solution(data, perm): + """Compiles a scheduling on the machines given a permutation of jobs""" + num_machines = len(list(data[0])) + + # Note that using [[]] * m would be incorrect, as it would simply + # copy the same list m times (as opposed to creating m distinct lists). + machine_times = [[] for _ in range(num_machines)] + + # Assign the initial job to the machines + machine_times[0].append(0) + for mach in range(1,num_machines): + # Start the next task in the job when the previous finishes + machine_times[mach].append(machine_times[mach-1][0] + + data[perm[0]][mach-1]) + + # Assign the remaining jobs + for i in range(1, len(perm)): + + # The first machine never contains any idle time + job = perm[i] + machine_times[0].append(machine_times[0][-1] + data[perm[i-1]][0]) + + # For the remaining machines, the start time is the max of when the + # previous task in the job completed, or when the current machine + # completes the task for the previous job. + for mach in range(1, num_machines): + machine_times[mach].append(max(machine_times[mach-1][i] + data[perm[i]][mach-1], + machine_times[mach][i-1] + data[perm[i-1]][mach])) + + return machine_times + + + +def print_solution(data, perm): + """Prints statistics on the computed solution""" + + sol = compile_solution(data, perm) + + print ("\nPermutation: %s\n" % str([i+1 for i in perm])) + + print ("Makespan: %d\n" % makespan(data, perm)) + + row_format ="{:>15}" * 4 + print( row_format.format('Machine', 'Start Time', 'Finish Time', 'Idle Time')) + for mach in range(len(data[0])): + finish_time = sol[mach][-1] + data[perm[-1]][mach] + idle_time = (finish_time - sol[mach][0]) - sum([job[mach] for job in data]) + print (row_format.format(mach+1, sol[mach][0], finish_time, idle_time)) + + results = [] + for i in range(len(data)): + finish_time = sol[-1][i] + data[perm[i]][-1] + idle_time = (finish_time - sol[0][i]) - sum([time for time in data[perm[i]]]) + results.append((perm[i]+1, sol[0][i], finish_time, idle_time)) + + print ("\n") + print( row_format.format('Job', 'Start Time', 'Finish Time', 'Idle Time')) + for r in sorted(results): + print (row_format.format(*r)) + + print( "\n\nNote: Idle time does not include initial or final wait time.\n") + + +if __name__ == '__main__': + + if len(sys.argv) == 2: + data = parse_problem(sys.argv[1]) + elif len(sys.argv) == 3: + data = parse_problem(sys.argv[1], int(sys.argv[2])) + else: + print ("\nUsage: python flow.py []\n") + sys.exit(0) + data1 = list(data) + data = [list(d) for d in data1] + (perm, ms) = solve(list(data)) + print_solution(list(data), perm) diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/heuristics.py" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/heuristics.py" new file mode 100644 index 0000000..e6e0d72 --- /dev/null +++ "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/heuristics.py" @@ -0,0 +1,30 @@ +import random + +import flow + +################ +## Heuristics ## +################ + +################################################################ +## A heuristic returns a single candidate permutation from +## a set of candidates that is given. The heuristic is also +## given access to the problem data in order to evaluate +## which candidate might be preferred. + +def heur_hillclimbing(data, candidates): + # Returns the best candidate in the list + scores = [(flow.makespan(data, perm), perm) for perm in candidates] + return sorted(scores)[0][1] + +def heur_random(data, candidates): + # Returns a random candidate choice + return random.choice(candidates) + +def heur_random_hillclimbing(data, candidates): + # Returns a candidate with probability proportional to its rank in sorted quality + scores = [(flow.makespan(data, perm), perm) for perm in candidates] + i = 0 + while (random.random() < 0.5) and (i < len(scores) - 1): + i += 1 + return sorted(scores)[i][1] \ No newline at end of file diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/neighbourhood.py" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/neighbourhood.py" new file mode 100644 index 0000000..4e90000 --- /dev/null +++ "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/neighbourhood.py" @@ -0,0 +1,81 @@ + +import random +from itertools import combinations, permutations + +import flow + +############################## +## Neighbourhood Generators ## +############################## + +def neighbours_random(data, perm, num = 1): + # Returns random job permutations, including the current one + candidates = [perm] + for i in range(num): + candidate = perm[:] + random.shuffle(candidate) + candidates.append(candidate) + return candidates + +def neighbours_swap(data, perm): + # Returns the permutations corresponding to swapping every pair of jobs + candidates = [perm] + for (i,j) in combinations(range(len(perm)), 2): + candidate = perm[:] + candidate[i], candidate[j] = candidate[j], candidate[i] + candidates.append(candidate) + return candidates + +def neighbours_LNS(data, perm, size = 2): + # Returns the Large Neighbourhood Search neighbours + candidates = [perm] + + # Bound the number of neighbourhoods in case there are too many jobs + neighbourhoods = list(combinations(range(len(perm)), size)) + random.shuffle(neighbourhoods) + + for subset in neighbourhoods[:flow.MAX_LNS_NEIGHBOURHOODS]: + + # Keep track of the best candidate for each neighbourhood + best_make = flow.makespan(data, perm) + best_perm = perm + + # Enumerate every permutation of the selected neighbourhood + for ordering in permutations(subset): + candidate = perm[:] + for i in range(len(ordering)): + candidate[subset[i]] = perm[ordering[i]] + res = flow.makespan(data, candidate) + if res < best_make: + best_make = res + best_perm = candidate + + # Record the best candidate as part of the larger neighbourhood + candidates.append(best_perm) + + return candidates + +def neighbours_idle(data, perm, size=4): + # Returns the permutations of the most idle jobs + candidates = [perm] + + # Compute the idle time for each job + sol = flow.compile_solution(data, perm) + results = [] + + for i in range(len(data)): + finish_time = sol[-1][i] + data[perm[i]][-1] + idle_time = (finish_time - sol[0][i]) - sum([t for t in data[perm[i]]]) + results.append((idle_time, i)) + + # Take the most idle jobs + subset = [job_ind for (idle, job_ind) in reversed(sorted(results))][:size] + + # Enumerate the permutations of the idle jobs + for ordering in permutations(subset): + candidate = perm[:] + for i in range(len(ordering)): + candidate[subset[i]] = perm[ordering[i]] + candidates.append(candidate) + + return candidates diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/tai20_5.txt" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/tai20_5.txt" new file mode 100644 index 0000000..a2fedb3 --- /dev/null +++ "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/tai20_5.txt" @@ -0,0 +1,80 @@ +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 873654221 1278 1232 +processing times : + 54 83 15 71 77 36 53 38 27 87 76 91 14 29 12 77 32 87 68 94 + 79 3 11 99 56 70 99 60 5 56 3 61 73 75 47 14 21 86 5 77 + 16 89 49 15 89 45 60 23 57 64 7 1 63 41 63 47 26 75 77 40 + 66 58 31 68 78 91 13 59 49 85 85 9 39 41 56 40 54 77 51 31 + 58 56 20 85 53 35 53 41 69 13 86 72 8 49 47 87 58 18 68 28 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 379008056 1359 1290 +processing times : + 26 38 27 88 95 55 54 63 23 45 86 43 43 40 37 54 35 59 43 50 + 59 62 44 10 23 64 47 68 54 9 30 31 92 7 14 95 76 82 91 37 + 78 90 64 49 47 20 61 93 36 47 70 54 87 13 40 34 55 13 11 5 + 88 54 47 83 84 9 30 11 92 63 62 75 48 23 85 23 4 31 13 98 + 69 30 61 35 53 98 94 33 77 31 54 71 78 9 79 51 76 56 80 72 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 1866992158 1081 1073 +processing times : + 77 94 9 57 29 79 55 73 65 86 25 39 76 24 38 5 91 29 22 27 + 39 31 46 18 93 58 85 58 97 10 79 93 2 87 17 18 10 50 8 26 + 14 21 15 10 85 46 42 18 36 2 44 89 6 3 1 43 81 57 76 59 + 11 2 36 30 89 10 88 22 31 9 43 91 26 3 75 99 63 83 70 84 + 83 13 84 46 20 33 74 42 33 71 32 48 42 99 7 54 8 73 30 75 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 216771124 1293 1268 +processing times : + 53 19 99 62 88 93 34 72 42 65 39 79 9 26 72 29 36 48 57 95 + 93 79 88 77 94 39 74 46 17 30 62 77 43 98 48 14 45 25 98 30 + 90 92 35 13 75 55 80 67 3 93 54 67 25 77 38 98 96 20 15 36 + 65 97 27 25 61 24 97 61 75 92 73 21 29 3 96 51 26 44 56 31 + 64 38 44 46 66 31 48 27 82 51 90 63 85 36 69 67 81 18 81 72 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 495070989 1236 1198 +processing times : + 61 86 16 42 14 92 67 77 46 41 78 3 72 95 53 59 34 66 42 63 + 27 92 8 65 34 6 42 39 2 7 85 32 14 74 59 95 48 37 59 4 + 42 93 32 30 16 95 58 12 95 21 74 38 4 31 62 39 97 57 9 54 + 13 47 6 70 19 97 41 1 57 60 62 14 90 76 12 89 37 35 91 69 + 55 48 56 84 22 51 43 50 62 61 10 87 99 40 91 64 62 53 33 16 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 402959317 1195 1180 +processing times : + 71 27 55 90 11 18 42 64 73 95 22 53 32 5 94 12 41 85 75 38 + 13 11 73 43 27 33 57 42 71 3 11 49 8 3 47 58 23 79 99 23 + 61 25 52 72 89 75 60 28 94 95 18 73 40 61 68 75 37 13 65 7 + 21 8 5 8 58 59 85 35 84 97 93 60 99 29 94 41 51 87 97 11 + 91 13 7 95 20 69 45 44 29 32 94 84 60 49 49 65 85 52 8 58 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 1369363414 1239 1226 +processing times : + 15 64 64 48 9 91 27 34 42 3 11 54 27 30 9 15 88 55 50 57 + 28 4 43 93 1 81 77 69 52 28 28 77 42 53 46 49 15 43 65 41 + 77 36 57 15 81 82 98 97 12 35 84 70 27 37 59 42 57 16 11 34 + 1 59 95 49 90 78 3 69 99 41 73 28 99 13 59 47 8 92 87 62 + 45 73 59 63 54 98 39 75 33 8 86 41 41 22 43 34 80 16 37 94 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 2021925980 1206 1170 +processing times : + 34 20 57 47 62 40 74 94 9 62 86 13 78 46 83 52 13 70 40 60 + 5 48 80 43 34 2 87 68 28 84 30 35 42 39 85 34 36 9 96 84 + 86 35 5 93 74 12 40 95 80 6 92 14 83 49 36 38 43 89 94 33 + 28 39 55 21 25 88 59 40 90 18 33 10 59 92 15 77 31 85 85 99 + 8 91 45 55 75 18 59 86 45 89 11 54 38 41 64 98 83 36 61 19 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 573109518 1230 1206 +processing times : + 37 36 1 4 64 74 32 67 73 7 78 64 98 60 89 49 2 79 79 53 + 59 16 90 3 76 74 22 30 89 61 39 15 69 57 9 13 71 2 34 49 + 65 94 96 47 35 34 84 3 60 34 70 57 8 74 13 37 87 71 89 57 + 70 3 43 14 26 83 26 65 47 94 75 30 1 71 46 87 78 76 75 55 + 94 98 63 83 19 79 54 78 29 8 38 97 61 10 37 16 78 96 9 91 +number of jobs, number of machines, initial seed, upper bound and lower bound : + 20 5 88325120 1108 1082 +processing times : + 27 92 75 94 18 41 37 58 56 20 2 39 91 81 33 14 88 22 36 65 + 79 23 66 5 15 51 2 81 12 40 59 32 16 87 78 41 43 94 1 93 + 22 93 62 53 30 34 27 30 54 77 24 47 39 66 41 46 24 23 68 50 + 93 22 64 81 94 97 54 82 11 91 23 32 26 22 12 23 34 87 59 2 + 38 84 62 10 11 93 57 81 10 40 62 49 90 34 11 81 51 21 39 27 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/6-1.png" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/6-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..e637ba3db397b19d699cabe3349d84a46e2a596d GIT binary patch literal 243823 zcmd?Q^;cX?&^0>1;5HCk2Mg{_fEnD~fUgNa6h1^@ssGh{^&Sdc4 z%tc*B98ft%w*NW-T8Sx%0RS~I=#Qp|uX9vKSzQ+ZfPn7b2To3%_7nhkDU_2G)ATg@ z>xT?8l)8HMda_@&^FE=1!c-;Lb8ncmq|{XL0`da>e*OA2=qnmi5GajC+yxio#k4jtJ>HD+pW@X>w`0qC^D@%AmDB1ru(Mc3<9pwLI zpH(=%!FP83e{Ed@Pz-SVUv`Vv$q4wr)i0!TtYmDHs&%^cYj!<`K0E@sb}o zC3G0*yt11-mJR%{8FfJ${AmGb2=@o)54nk9(>Vgi| zObD&AA_feIfsS1U!1OgHk{f|2lFZ>I^RSRO#GbU4l$lOZ*V9W?20Q&teLS?q$um~8 z(4)Oug3xYvSKkP6({~)A?1s`!JVsS`6ZVhp8{<~f5V^<6RaP1z*svP$8YiNtKb34- zYVfP|$N*og9c0|Q(d?d2D?$sAo`r>e7>o&A7&MciJ^J^T;vbgC^0B3Ou;N)xT}rz8 zrbN44KisV@|ENG%v2Ee20Q69<6-z;gTS$YIp$p9*j`Lzm;@BcX^jcRpT$jQtA27o8hP7)T@Tp4 z-kM!Z>;F6P?QE^x3$F*{092$jL6ATUA=(OnU8^eEO$7;iMm{3cfK|O)wn(kj5&za@ z?*i`fiS|kGcT79R3C4yDsCPq&dZos|C=(I(@18#+b051)dIa0+nDWIuww~AUBD5H{ zE#V~h)Rt?T*eW9M$lqL{*=e<5Si?0**-7CAv!?vyt&(*m9Bs^~X&#o*Nh*XS0bAV( zKb!1dXI*|9ZSDG^^s=G2AM9aae3P6n8gCkxxdmY2-3B@{yR8 zaa%D-H#Rr9mx5)yJIp)y@NcFwz48#fnWA} zi=H0Ice)gNK6w}bvD{sw1x#0Dg8QtDx>o&U>Ww$|qH$Ub{p4*A9xnCPt2(7ZO#9|n zJ)bbTi4qLU?!iBU2R$Nmkr-&;qTR%K`nHCA4Fgl$SL$_zG_b$Hd$d9Aw1o`=Te(pG z2Pbcd@|b4}GHMp975he(JAbY#Hn1D&blbP*7+SjJXvoB)wh=5Qs@oi$4G6_@Jsb;>7O64h~ z;X=!8{aW8iMY$$T1tM{6z6_Xxf>1^rM&%>}BEzT3o!3XbNcmUoZ$1xS?m1)lC$eq{ z2GV3OSz43<2WCnl4?ZAqUjz}#_GVh-MSO~Ba^Nj$h=jU9Llp+;3nJr@2VkS-MEwg? zMgh)1)#PnP0u(ednv4esnH^pddW8i6JF8n_yp=`f^^R4F)2MB2xL9Mr(WEA-D(JE) zsD{0cjVWzf#Cq??(0I;+DnfwGvY7%W4n@wyr%gBf09#E|MSFZe7A}}lKLK^~wydU5 z=f4=E>Z%TavQ2UR_I4I7^m3CWl-7V#rHMD7YOq~Nq;oNfbv;C4%=?z8PzDc97?veq z!z~2$@f-!k2lre9AFQ?Q&s}h(U(m$?uYNuHU{e#1nWLhI2<4#fGU4o&UvDmiB=E{I zG~<|>K)+rmo{JF<#MaP5cZ%}>nL;qn1B~GALckq8;1tsPKOs((*7461#~Nt|W`?940@FxNSjtIa-#%dg$*8ynBq$} zmgwPNWd_Nx7}t|vkU$Y#rltPv#k!wSdyy_$u<704KS&~L3|B^j6`&nmaz$@4Ue!}& z4myODB^gYsmm2XI?u`5EiqF5@UoBJrFi8#KLsQ}z7?TI%hD0U>fo9XdLIS?3)mF}G zUv=~16F~TYW^~IgO-B(3&VVdmYOG=oVzeJen7;wjI-qhdd4J}u99@c>MxI)H?xect z9uM))#lba&uU)57s^WNDeu>0gR4OX-)l!Hs51XI=v(c1x%ulWsiblm zXFKa+Tv1?7qsDi)o9l zckBvkwDdG#7)hQ^4ya)Yu{1ZB&?S%x_8NIDf4*pEo~J{VKOWlf%^_RlpV?ai{Wl#y zIX?V@bfw4R?r{4khZ^3qpXfCI;C;6DL@07mZHg@v1NBLKuf+ffwDvafa?W$Frz_E1 zLay41n8QrCr1pKc7zcfLhK(-$mD@!@(WlJ%EhO1rYnv8Jy>H?~SOE;TGI0t(MS@m% zQ`8A{=*9L6d=-*1+<%}tf&Ey|F$=#Ucj%{>X)*G{|v8a2jE#e9E z&mU)77k00MF2^p=y>+Hk4=J&x(qY=jr*p!cwm|{)L+~`W`Z5#aI}TMR2>R1@lwhA% z2KPAz0qrl`TE+a_=z{>(2i5BkmO(W^RpyqR&{~^c%(bV>I^iX?S--x5Q6y}F~)(jm{{jGi($gtYHB)9k{ z9XUkktOkICLVb_z#bl^k?$VaSQWLPX@v*d%3~4fqL$YOxf>6UWT*q=~qlf=i9-? zk%V+D_MtpPc8TzhaW(nVu_pwE9n%^5F zs_YEX;z6RgmzwQA!hn0zzx>0Kdnn0+jy_lUs_(Om7p3d&Y#<+Djo)!$f4<)A!J_wsnUowlkP-fyW3{j&^bnCr znDxb{m?hT7AwK!nO=^F@OSz+Bh3=)=jokcNk}h84bNzMU(zdGfVe$V|NVCM0m`7bZ!BW3m2 zzdXv+2PU4hiX(k$>(MvvA{M#q%9N-9E9O95H?-p90)fRat);8X-dP=LfOZn%$Li&o zmYL+5canu{>{ftHx+H5P8J@<)&#VwR?Drp5N-ksa>F5yaX-MGqThn0@!ICzv*mXdgVS1b4LM>F z?;y=9l8C_8uVH^;2O0cBX%nOOB`!@%y?pi4>#*XcX3MKHvy-~Y9a*Sdz zzD(3~(0d!WVX7{AN<>_@C?~sL@iHzQD>q{W2RPxgMs@sqsGYVZRedJZ>+z3p?4kMR zmKpvz5e|2DH)_*bD}YbIew*3SxH^p%x$_{DpPkFt!MV%-_JCN<3YTQKh%gF&u#1L0RS7 zxJQ&76(lhM%{K*=HIY8-9j$N6kE()6(YMXVi~U zpz~xLYp+I%R{F=Qk2iZB z!=fulhc-cZD0R|Dwra?b7W6k54;*4Dkt1P)(KhnE$7I-tz@|!)3W9#$@FptSv*YY( zAMH-pPRYpMPRTdmhqyn1enJYR{+re8%75FlwcS74dsEE3WmS{pRT}GHbv>w<`YeCp z&&6ntewTr22};rn5Z?KKJJ3fP^0|bT7Oyh7Fd{qgAl(9&frJVlA)31w@XG9Zov_)p zOEJrlGm8OWO*rUom&f717&yUuu8RXvOx@KKxVCf?AxdKJ3KS~t-)o@NbF{MbIr8>f z?o z$ppA0Jv>}!T@3ZtVDo<`_-HD83g2ZyS7_cKt}Fa#aHzpaqy%sv^!5i~{x6paHhCXNkSdvtI zLo}}-Mtw@vXns6CW~-F~ z8IZP;H2Go2(O%xS7_#S^`?Zrj2S$JW>1+ELyfqP%OfeI5Ic`?QLY^{0OlONk1zq? zspJMtfk(%t`BI2R?ARiZqi6YZ3l5G7!o=UmLjV&%Sm1wh@P{A^sUPV!yz5Kf*aLm) zvNDPZCd;$oAyw`O5Spzw=6V3(KW*>~)%u*%iLz_T0i#-emtP?zG4m~}=zG9qF+>>Y zX%niQa$(xN*QHuV#B(}x&nPO!Q8j#fi;QA3A3FSIS-_ojJ9j3|af@c>dtj;((jqG` zQoVCaffho2kQKJ(oUf=0g{X%1i8O+u8q z{Vx??I)1f=S46)4cVhp=7+l_;Tp{j{@)R))Xr7Ew16Wf#kiR9aWuer913*;ZK+^Ov zH2wmuV#zH2;(W6#agLL+4FIAtG(aU?q&!=&e-#0MK_bc6F{C0T2n|pXtHZV~wFesi z7X)*eZ*_6XfYtu32RrseoBH})!CReX(A%4gD~(&7UoiU1vI%7cxL#9trX}XHQ?hVW zLY&z@i#ES1Wkf(n z2Vpsf)4o*)etX>wd1{u2^sQBM%ei2trEvI-CIHw*2X8-&SOP!^P6_Xna#AUTRjE=c z`k{UPPvs(;kb|2LH6B;`9q&klQMWO@{g>`z&;V%ny27~~Na_qRI3;8pV+??`KZI9Aoh3{FYdG*a zX07kwrn*L*B)n99fnDbpE=!LxKn@~I3lOU|X@~hgwT{pUKG2M6^4RHwdXXI zhj7&GdGb4-n+0b8c_^ngx8e~Sr9uUp7QA@zG{Ag-{}@NF*o6MO2*aQKz99hn*7L?P zUz$BqL22@N=V9^DvmpbZ-i$1h0dyGJTd{+X-(XeCV4ssnW}|%G_>M9W1^j*AgKg&2 zS%}#BFIwLUgGz(&q2aXFN>pI5!``m(A26WgUzX`RlU==yz$%aVPy{ z1lyr*4EiUivr*CZ10i-2GZ~V)yfT2Eg#&CWE(xxk_3cuQ=bbiPxW*_O%4r8c0WT?l zq~9|T%B=2;4cO`F_{*;enm~goBCHYv$^AHi(p)3%Xby=<5tJ$EN)fcGJnBP8S+x1? z5d8g807Jap+pzL3K*&HOwNBN65$0m9)Om~_Hv0$tmw({wxQC%2A@FGmM=*1~cp_W5 zm@Y}4IEAnOHdH)^xqwt?M^E*3GZh^Y)4?(RHoz9&WQb$mby>g*uaL@Uq0tpswbQO7 zW>Q69?*>+Z*PF{#K6#TIa5}_yb)IwQAVF;J)kgW}#%ht1GI6o*rytb%T|7jxz1hLR zMYs|5cIUgP=SkxUy47aW!{j*)rqz_WSapS)SoDpak!qeA+ewdy%u3&CVvlcRJ}*=; zZ=E_H1?4jxZgl7BYP7VN`C;c{jd#cI=Nn?4R_Dw)GsuVzeH_r^b zm9KfGNTvs>{CyV7Q*ayvo)WX!S3@DO6wjyy)^H-&_$dlO+}NHkP`qs=4J zO-j8RRlO3Csp$;+w^-U#bhe?KSKj-uV}LG-d5$ciknhLcrHLkDU=OJvPKuZ42*n3UybDsb zgz|9bQjZqXCB*Ky1_L8hKk$5Uh`P`D#F+dUNj6qM=IbQZZIN|~t3a^3`SMxxZ4u+v zBCd5Z?F!_Ll>TN$h`hLGhju;O%8>2&j(HtVBcB3;9@F}JM#2hNrr>nv&1_Ym4ig=; zdft9An~Q3OP=}2ibV=v$(TI#Mx02CARm;S@H-25aI>JHHOf#25=r-g+^c%r>mh#H^ zA0YI?^3%yLg)sa>yTIe~`b_HFMDKpP8i(>lC*dv0mO?MY=JeDXrY2g&4l-sH%!ZL{ zlpMPMEHdQEGWU5F!179Ztb@sJ^Q_z6uj)p)+o<7B$(LNDm#Ui+2Ld77KkHfRpN8d;wv{!_3m&}shI z=2VBc9byuCt~sSBKG_Q)`y!{NhI*d!8>K{eAqC!7p!;%-qf0?DZ%r;q`5U$ghqm$1Js=I!b`4l?J1J6eSpp1V$h# zq={{!mL29{z}=7R5kYbcD^|mvq9{@_JGB(TAA$aQA1$=B3uO>vRg;>DgU>1Y%z+Hq z8Rv=2=UxvlLc#*oN1bBJAi^b)n{pt6`+jE}g5USM{&CnI>jr;B1;v`+p~hh)s=;$6 zzRCRn|ErfOZnM3lToZ9JSyMc(@E5~eJi0)ynIC+)er(2{xbl1~qX#uvdK;ika5ZMP zIQ*AJzL6c(2*^&1fm`;98cWEzfG zJIH?1OT$4wgOI#&O0cVA-d6roSc~yinp3gk4dWpkLw0A+DC~}9VeQLBiXu_KfjeO_MQmgL z>t}GgQ(yYmPzGyb4A%(xFL-;pOsJm#H>T%Y3Xl!O;#)TCiacg}Mb{Z!lS3?}rSR>P|RlA+<{y3j!HpUc*En_GI zIiTsSE|hO`DC0fiPhSYgG+JN?zYl4Jiv>_l%*?==S?~QWGu7xF0~SOz&rctuC!={z zRNlr+7vWHl0rW*79$c?^sI>a$>V(XM1?%as6sq3Y8B?ZP)lV z)A|+E|M2^TJV`IYk|y+0DgP-}Sr`&YLY@4MZp~MiHqy1d&7b2)fkCwWCwnp_Q!oTN z-V54FvVu5GM9veL3#nA0t3gi)_#nL4;v-227x|N>!Z^>4V8mksOPH6}enzQ8X6nkY zt`hpX>n)NPO<4{+m`O$~&R^OD2!}31hd~_=KRM8;){G$)ahWb#NQd_&mjzehSXxDi zw}Ot^!~ovJ{B(@!Hgq#SBqw5KAlR#p!k2Is2TN(-I+tjKAg5i*jlG<7BRvf_tn*Ds zDr#*w2q@9Hyx(GjnS=r-5a!YSo&Q&}VuTVA20_)z`p{TtCka$?3tLEB=Ra>!w) zm3bcCq6V7v&orTrKXd)<(8rpsR86846?lR?RJ<2_K>?~hJ85IIiEBGS#HhbO*laN2 zJJwq^#*f4keS&^f3QNeJb0ivuHGOoE*`+d+L4Hv_fUw za)!UZH;IK%Lh7MX{^XGsa0hZin}rrcn-lflEF9Ai5Dje8jf_`wY)Zgj*`C{PuR%w| zlk)YOlotHwesxknBOl9O)=F_h>50Y8@93cxgGtiv86zL8ga{>h#PXOZrtaRcUC665 zBR^`JMOGfZIbPgM7dlPu7Qx4|!@g)!6P=ofk&ky3s<_(Zk7;5=Sa=8wr~>Ot2v+|M&PhV`$A>SwomhC(=gCc z=+DiC@B;6v$yFUu+|Yw2O1cs33ov5n?2^C0z>&_s#QmGG92u*{F4wryp>14idC&pJkaV_*NQp_VTv7UVej69) zcE5WPjgjpz*n_oav6l{Sn>XydMHIqP!3yrSF5Za8t)L-(QMxU>ZJGHx+lzME)YR1X zJ3_)Fa8)%Ae^bea(64aqgim*vdit-m#Sd%vojTPgIYz(^2?0fPtafIRmPB#Ym_#0) z*|J)uB=Kym_Ah?P(P#DQ2cP-->Rw%3VjO|-7ZyB{C^=6>tegfP6M&<->@-^Jo#e(S zmHO^xnB~n>gi0o$z%8}XPwwaMt|n=Yo={(uqHjvl z(hTHSSHDcg=dWfZrFX`SnH<_gjIGWjz&|Qj8EtHo*V~DDTMWM29$1Xt3zgc+_E?zD zfA`jHEZ2rdsVXM{H}JBaue2uB`kQeB=Tm{D4SmC;7e2A5T46cuR44Kl;j?fZ<#}Al z!tqEp2ul^IdJZmYPV?`VSuS>16D)@3tck-Mr+VYi5bUj6X&{JS>iPlJ@8%ne zhD$XzmmGz_koGQ@XRWQ~Q2CwIz z2g_M^QzpOXw7TV8~|w(MvF+P`PZ z;A$}MiV?wm9%Q{#ngh2 z5;i!qh?lq?;Y{{cQAi_NXv^kXm1ugBF#u^)jcd?ZR(Suj<1KO5$Y zm0Bmt>`@>;I{}|rd;hP$gkK$tVXeA$l>xSY{(Jea!{$fnQCtqk)bq``+VToRarCRi z(ej>$mwt;UsLa0l^=-u`%gyuT_!zdceX?BhW>6(3$ z47xJyxe&48G(EsWC8Y9G?Mb|n5ZF8%fee+Em&cDbT%GS^)LD#vk5bqAt*>37$6BUS zF?qYixR65a82|Ys!guW!ZHqA@gB0iUEMTvrRQr_m(cKsO(llx~WjCVM|DQ@If*mIG z7epi$A6$e}F>1*!jWP-)8VSNV-PvTUKeQ8=fFGtXq&i3TLp(u;z1*StMn1Q)=-%#P_Kj>UfS2yP8UAsd#2_4i5 zgq8T`-2BUzIb=?~I$O5J51DM_C~BykqpqqHNm%6_Y*sny2+E`THqNpeUvAW;WB}q2 zpnsM+wC)CD$lhjDUdn=UU=OEdyXf=QA2as2D&uPjxj^fy<7u5m>{6$~?!X|vxt8f% zj4hjm;1hY|jiTr?r_hdTw8Qu823)ri3P{K4c9rE2tLwYWZd|l}y3ZcvmG-e1Auo|u@vyHkJDU0CL3`MNk^T|qL-PCY98(iDFB6m+Mr%C>^%&WXG4oc9 zo%dsfpC{_L?y4`gztwfn*d|vdtQz{X89W`X4riRSGRK`W+1Odf?IZ&i`0|E%)6?~n z)YkPn3dR~4=%;WNY$obmo99H>|I^+YX#}qIu7rS%ip;=bq{z7|&;VGHE<Q?3d13)r&2m8tw<$ZGj1b5qc&yUnq|2w_=kTY#*} zmDZVQ3sv{uhnwr3Vhd-B$MfcX<5@TQZQx zq`v{3XXnGlM(j1#sE>CmEaN}Fb6e>33prV4kF__Idb~C>812*gcib$OnXmdq$1?|< zlg^ZBhGCHx9j%}TaVKHP^ZFgFlo~QdKJ@Uimc(T_;Q}+(jG1Z+&&-fpqn$ikx3JIAeW;{7|7O+dECjO zMtCIRzqfsrR66R*QPwpV>JO%pW`XCU&KZ`ot88W_;_m7~|1ow%^%8O*t|ZnetvH#a z+(;X*mi$CiTFP->Sx^<#=?`TJvy$`{vsh$59(YL4!Z-TZjiFpERPv#Xq!2VU*NL|x z`NTh{h)!>&T-utQMvzUz&5{vvu*^xI)l;C#!-G;x0=Xbv)0M))HdCN~f_b%+NRJjYpc~L`rK5i!A>chL5Hbp&O@oD$lv3ht}x;p3e zyX*u7w&!Hwhna|YWyhG14~!LmS9!5;Y&H50f7b(32;(E8>*83q> z&<5quuILSoE`}H+4ZaQ^NCUf3$|KLvn{1aVJP&0zq@|lhDwhdjSUQFbgPh#bdDwPp-M zzXe9mS;oV7Ks=NA60^iqzpGip*obBBKUrpuz8||RC@XOI4n3V(xYZ7~A|d@m=7m=f z9BZA`CJfe0x0WXUydAQh zd~&jOx0dYDj`yid)W?OF%jxltx4RNpknB=uMCrqe8kY!5OV-i znazLbcoNLSWGvels$q|H2OF!JehX?_ zHsO$T@t#Qv;$LJZVwTt*xreH!1Ndv;XyWC!RXuP`HN%FHgY1wO2{`=-aYuR1#WcVH zxc2qI?LXD>R0YLbr*ZLc=hvN&GEqf`S5)S23<4B;}#dIxed*YS0GeDYH1ml4OmnIA`U}8<5ZA zAg#qx<-5UVL+PRKTFhIO0U}JJCXv*?=sYQ%!3L1Q_U<%zUpHTk{J|46jJp4tQMzCu zbgOR20m5imJ7_qht}|%Qc=rjXh)%yP0>g`kM;M6IQwvTLe>*K!dKFJ&?g zIPatfamb&O^*hllC9s9^Mi=T|^20Mt!$kAmhdEga18r2Ts^yS*vv58T$DAoqNJAUF z0#$9j_}K9k<+#O2i9g>tZwij7X6QOps_iPesas9!F3*~a4;wbRhAuhw7@K#8#MO?k z_$a7x?q$=SRcbC2Yu!eRIX=y+_=8{kPK}-C=Q<*P)Ut)G+IVbLjQrHM+ROIJb`J%% z)>n*#1zWm6W|ktbTPVhN+K%2eG+8|S?sag`f0Od~Wt}i}EZJ(9XFqCU-1V`@4#ET< zi5s*JUt3zFoaMQJXt*J}5@mZmAI-|T#@K1*DEBs#Nn~oxE8eCpes^m{N$N~p_h*sb zN-D3+cm7#fT^qy=m%A@&d3*1u`P$PXiA2TS=Pe>zpRO0z<|z`xc93R*kA@3@e-mDt zq1mNdWN^-9&ot4@JD*3NSirZ%>a6jyJPKU)F?2jn3yB;5dLQbl5%2+EAfD0h^{ftg zS;1gK;0NuuH39}|rDH4cB^RyQXkP=tA)BhG;m)O%%rW>$3V6|TvgLTdd=v!k0x`4$ zo~T_Re|+~AqcWh)5G@J++2S-FjWNo=cLu;D^%=DU4r?+B{{kbExKNq-8U|Mqk|qI6 zRW%l9npfTKZWtx}vf=8r{kz4vTTW(pkF)30Xy&>o)(Gg#fZ`&J`YUAFJUm))g(R5Hm4r#j$_oQi7xc!b~MdcPM7^@R&9pYNE6AQv1nDU18xXKM!v8)kpMnv z;3r-P9}_RHTq_|yW061Y?WC;g(9opE?U#oBB8wM<>%?XHW2!3UZ2ED?P0(wiDPKipLQiHwYZ73tqZ#}RG3cXsST%o|q(57P!{qSPND z_C7fXql?uU$LNxdwdo5W3=^+Vr;qfUW%*IkPKCLmp{TqlycZ1cj3uGIk%dUnA%G8c^!udQq& zU%!g53@DoCjD8Nw(UUR%JmC{VG*0gN;jt@QH>h&z$2g(44Lt01yZ(mH-uLsuP{J3x zFwSlq#zg-I3ol65VW;>A+OD*SZ(le>ROV^&GYrS5!1D2#V@Jxgqrzb8SEG66ABrNy zOQKW#f(KVp{+W_kN<>JfgM7aQ3jP}FpUQHYjutN&E@ZgU@;$n3(DnZ6(#%KCV4@Xt zct6H_;9<}FV{I)_rEH*UQc{xh#+QEiDkH7)srvo%`;j!zp2h(3Bh7h{7HtY(B0Xsq zz#^~oxIWX3FHEU|ode&=X3L2N|4jK$Ex8m9@kjE!`AUY;h}E7bD(HTe*L1nt>L3n3 zNFp~=8M}~C3J4Nc!lA zKs0iNX3B}V?y~*$itA{b-+b(wMY`q6PX+Vsq2KYcbOjz-#=SBhP{L@J@b(T5GPaNA zU0#FpjrsLAsangUk0@1~r4>rA;mBWe`2I1Jeh3EVcgp6J#_dzO z3==D1M(M2G9=2FeU=NDz-Fh6)VrzT2PH0*&Vo-rReJ|H*)9#BRt&FtLy9w1*#@_vbAc3sZQ%nU9%jLBr~4!vHQ`EB^R{9o&90{CED zc(K*@%M3A)=UU;jKRg`XsP$r@JiPSg^Ix~sHQJE8*zqaW$Cd5}W^&)5sG$9+FV(Wl zTP9@HqdsZ>scGcv)c8st$?RS9v{-b1h!e--rS|W08v(fE62`xIs z-KP;d~#+h>)61IH)rCNBf&fl1&N} zzYa+&Saf89A|j=LI+{TH0(k^nuS@q@y2o4yz5!YS=f)Xj-=$xr6wiN+6W&^UTuyDTw8^^$Z$YS+^PG!UaJ!WFu(De#!&va`Jpyp~I%6i^x0l(L_HjHGfZ?2P&m z`gW33=y>V27zx&m3UM9pEa>UBTGzCO);qLvBK!9EoFDthBHYWH))9t?^yS|@agVnb z>}-FT)fORq-Y?Eh_!Y4`T)p0-`M$hzXQwXbC-+MH-N|UmeBEjiokDV6)W@Xfq(tY> zUeoSN1<~~9cI7J}wX0KZk1ji{$TyYglQJ|o_&kiT#>R6DpSbu9T(9*z8|U5SmsyXy zUs@2UcNSEq{aZ&(Ry0Rs#DdPv29D2&-vO!jOA0wR+y$kjx=7d*k>}Lsr#&hI`VOPN zg?RXaw3V|%J<=;q3=P}hEK~>BCmqBrq!g82!?VdVb^VF{`Pg5<^W#>jk{cvqVaICW z$ALHZPadoGgo0Oz32qmV>l9g9mc!W!30;TaV$U~j8SEE3ZRkd&+N=aaV3s<=gf%!L z?|qB~H~ERLt6J2;;meVHm_L&HOX|}bx)%15ytKxdkZ%S$rAJJK*1~lIN13B8iAVkPY9P%tKF>tO3Mq#Y;tUNOyg%bZxiv$(X;fz_77Hs|tnJ zt*+N)&F)sF$4>5B8&HQBI2Bw3-Y{^PTZ&i5ynn(LX6$%*8a>~mVTW;uR=qW^>Uc&% zaVJOFM_E4mjWK45Qs2OJHLtVnz`sn@^m2jYbvsG89mT&2%`yq$5<{tHN3m}3U8hF5 z^z)We&`>Vw5Yjnr-lQOgv^RabX{n=A#&qVOi5kUJuXBouBocfdEpPy0guig?!SonN zg0v`)Zgiaf8i$sQ4dAanC%vXI9zo&ufHxE1faYWAyE*dlz! z*KQmit={3*`sb|p42S2G$BSs>Q|0lYC6CpxSmE~sY|zd%oZO+3*y+9!ci4Mb&NiZ5mWd!^&%Xk};N)Q~GKu*$$*Ws`{Mwi2pK@NW0FF2^u%Kn)YMHlMo{*p{ z0RQw_mBSyEk&9L8*d&qS$}kr?n@@s6TSsO=c+@k$*g>3{(hEK@U^}Z-Q=fNWd5oCw zin1}oI=fnhy&wo?vB7+H3c5RDN~VW30BcxOwD(5;-awSVh6}|Df~P@zS9wtc8nqhp zW;1R#IBwacxa-392bay2;~j^uU%8)(5U1p#^Igek7BjER$n<>A1R7xmw|B!^*NZ2;+&9j0!zcb8nU7B=FNrb~ zca(jP^GuOfClJ;9>!UI>)Ugk9Gj_>3#(rAIVNkz|(Wc={4^b5Fy8_|6Ee$5cx-5w> z3`EKa8LJ%j`wbnjhfj#)e+n{wJ#EqJNC^1JDZjhYoR!Y<+VN^R>w9fFd^CK%>3A6o z#ujCpE>cQJVop&Yx*`#_&SA=uv+7=NE;p<*%JM$9*}C(Xx#F8RdKol}fuOFKQ!NOf zh`Gbg!H-CqVH&4?my?X=8xd7QV#r5doK@zccK%@TW_;vX&2%SWPq@x5C`K}H`W3T% zGxwyce{?ymJd5c#E^y)7a+CF-b(+;-61e2}w0gR76ZmpRIh4uV=5rG-RzjbIW~VcD z+i@{waMuqxj@AFvqICRp69BEsPW~0KiV#J?Iu3y-X|ou=ee?D&3w@?*-q={3eM;4P zwwI@qfJuq~nT4NQHT_xf{geS{PZq@Ik(Qz4UWG5jLy>pM$)YRN-%A0r@4_IOBXg+9~`tzP0Tja8&_3_+xNW<~s6;WcY z{0y#FeAw&dl9<}xD*n-Wd(4T`s!h^rpqR|6&%kXIK<@Q>Z8_$*gIzLw&hg&dBSkrO z=CKa|D>cA|S1d65^*{u4#m%irCa|f|8UJ;2{wMcPz{t(vU?GW#sj7$pTgZXobuR|1 zlui6?a2RR*n()l@a)iC9YV}|f)Cy!iF{!|(K8I7gApP!#N0jn;Z ztu}jd4;Dl-kJIJtUxZiSggo3CLpu*tn@Z9bczG<%*SjswXZ0QAucXsizWQ!YT@*NU z$a{Gl<9c0}rdZISthelDQa}7{<3_sD1_fyo&vbNet>*S5HuLy`@s>dWx4PF*Tl}a{AI23GVF2FV=4zK`8 zfA8(9^O(hFnudleb-ljL>j|viqqQIA)xA!Z5o=o-)sQYvXm+y$&`_{|CZNfV=POF* zQC|MRcne}1%A%W!gS0lv0iXq!LgAZ77SKsKncEhex`8$$ zb8>lN$C6`8>-7Pd;7&8m_I-wbltV(?j|C-lgO9U4PRVUGg7hA%cLkMQX4zk+TSDk$zA#Jl-v-Rmf4@um6c(|mQi9xLvOk3$xVUNf*JlCC=pGXosnQPjP& z{+W_mZh|7cdevj~$@$^P1A3YPw=Tdc_5aXx7H(0s-`A&vAq1omq&t-m>FyXLL>i@~ zOS+Nn?nXc)B&1V>fuRHe$)SeMpZ>A8hmrEcc*-Nxm4&$Ih!3F0)^JK6B8-={13s^V^^A;k z8m;zp7TVluFZO1PKQ9G_2?@8TlnOJ8ET0;HP$J>=)!{PG2fH@iKrGL|?unoC^RuHr zhUwxEpBUQS4V-BDB1UZWLfsy3ZAbcK!^_LdsbGxEmP7F=n~CCDS4%GDEwOg?PAMpf z8*`vbtv>v5fBfIPx3?Wiwl%Xykt6P1*d?{;1Uls8?Eut(3wy3!(7m3GT{wAH}tk&b`8c$8z^Ddn3=C z4Z-UD?_VL}nWc@Me9shF&8{9eE?2#GSZ6k@_!8%d*{cwi$+CQ!gp{GZ6n)Fru`Ab(di004 z@0g{96XvsQ4kyS5rXe=e`A1>SNSf)btrL-z=ztOKiP@jl1#0T*Yo+ds_LZZrhUs{t zUVN@Pl(tXROV0?6S}a#Xb3Sdgxx_YX^l3S4o&iw{_)tyfqVQ`$yIp(p0YWHgta}o6 z%0muWo%KQK*)Km|9j_=)NFC_;p8fWR zQ}*6{iC?f6@%8Q(000SDyv^(dn&o0+p|kO) zm()$NZ?M8FIis(Lw*Cx1@(@Yg;DB2Hxm9KU7TJOaJRw_s%+^j#44>%twJx(z8_J{?JKa z^D=5{So$tDp6Zne1>YizOLw=H+z)|0af{+*kCO+1lkVGP5%ATbw{80)e{XV@xxaSZ zk`)E(=BKd&4KAqkE2h=aZA^7H$|+IEDB21kV07a`U9XNe6lXnM>PZaNEDo6=+ebpS?CvGa@8Wp zx}wcKdoUj=ieJ@k6(}#c+VU>)=^kd}0Xp?mZ+)T6X~9XLyiLz-#PUsRk-C0S52B`q zKh>0-AieYWkuv)myVdOe^V?%`X<0hl+p{G8EO|mnVuc3}1WUz)z~sK3_$JJDYLB`7C}-2!TFtBPAvs^tzIArTgFgt9XGP#zmPYCGnsUIH&rRvlqX9bD>^f2OQ$~H>Fq-PEo~$o?=u+!n8!JK?`G?P#ol!W z&`xReoEMyodgvDEq8Ds(eNoT-=`kmS9h%o!S#Q*B^8EP$@iC`TD;_#0H>a{BhfEBQ zafiw9xk*?n+*7!nJg^-0nviOaU!ezPU$GBFx_)wDD6eQy$aIgc{DyEwo!dINs< z{XIIPhk5%6%zLCuw247`B2^l7d);_#c0Wqfv<*FKg+*Pvq)T<*jn>rnL^iIb3`Is9 zHlFh#V5n7mbd>Pl6UN&C%83j+7Owg(L?kd>V1D{EX=}vVV5+XJZoLKhGfLFbOl73d zFZgt|q^|DWQe(P5s@U|bJstZulUp^<$(Nt-Yv}$W5_qcQ5@RdGJ@jcs$gL%a3)<*= zo|EoY6?+er0r%^bYZb3cHqc*2(am_$tx%lf%z3jsuHNpeYcWi711Q42gjmOcfKR0O zqxGr;mr9uXHZ}XGE?AO<=y9hPakF_{7D$-9xEP_4_gejH_f6x)x7~!E^z;+dn!D&) z22 zQbJJwUMS=gsbI7BiRL_5}8KK@#{Yq5qlWZSYjyN%~;_E zAGR_GDmnpBr@@EGqIluATV-tO_P##|(B85CYErO<*UTI=+4ug$2;1Wq$i_oujIE5%)9m2j(_AGcAdXp@Yry6U*sGf<*cL| zkLCK2Awx2sPqH!VFekT$5A6%ZWF;XCUAK=+hH;4!T<~fpH2Ug31z|yWqB|E*A)UjK zUV$cQh5q^PG_PcFj>E-*l_Cj_*aQ6xAh^Ty+|0@e5y%|Hhp`{>j?%}}4M7h|&HX*@ zX9iOIQJPXzM|zyY1uqRJ#8Hk59`(2+g!mh_tZAQSHND!dTyA59-PdHJM!~_4f(yP` zrdEI7bS(wlLqvK5+w(n+ZLMBl-A2*-y*Dx+Lz0P{9Bx+>bi?;y zp)II|@8BOQB&H*0a>ZMUqxW{!3!regL@$ybw${Q4{|e_cQ&sJ+sN*`mVVbTtZ|~4( zl>IheE7#eqLVHAo_2=nknRdv|SGfmlg1;*$NM4<=nhv~+uRDaRNTQ= zY&9K;8M(f7g1q&~AKy5u3>rQcKwDE;yyFPIeQ0NikhUoDD&WcqqaCM$(DbGJ&{0Hx z3^`QCE;Okh@%g{zZe)R4?Euu7nX87LnA4?0q^A5KeH0DPOM=2_b10$FVjZKR-r(^< zt$i&FKb;Ra@m9FHQX4%cUrgV}j=C4DwBWrLY|9l8HyeM}B7ygBOa(_4XFbl!|EL?s z4&Ls5^DL_7axCOy}PWG?nVGH1+50TNb)b zwR|7898s@^H8N+w(wgIII8UFm41c$O_mH6JNFZszU9622d=I8dT(P+E{3BeSMmn3%Y87`q_sn+M_ zsaDQu1T>v_=~smeIj+GV=?}P1WGupo5x$Y#iHT%AZ#a|~+sFaII>mia)jYX+QY&rJ z%;y_&KNtGe{dq*M!oVMa_6=i$5$Q*_UV`Tm@3o}hKeoNV1Rpbu;dmi1d68tp=bDWk9LBFsU8cLokw7kW&RaDIBx?21-O&JCp@f}K! zZqNq-w~a#gnepJ{QUn3klumVxOBiuc@=jp^Ck#0R)=N5D99y!wUKt*tuj|&Wd%WfC zNPMWEJPA#1r;e~_vXUK?>t`a4RI^uOVbMv=oNkmtY|^jt1mFEy5x^Zd(bYv&E8Ja> z_VUzsBPg=Jroo2|%rMpku}WSiULUi7Jb&;g9s=(Wt z(dZBb{hLY9JOwr@#=v+`fjU+>OSB)Q2o!Ps$jzPA%l9;<4Qtb19hDLlZkHAQLoQOb znR-#QES5W$iH%hQ8_kIvqIi1uwwdFRTLt-yowT&tK_{olfo@<>`(2SH0=T=baY+I(8O)V>=pu(R;&gg zvI5S_91C9aXJVw#^FK4IXF=t%WVvL3*TMKzh`fhA5j6Mr^pCrE&6q>i4Jtg(GkPD6=-1?rGl4~j zdT&o)IsbB1iY2^?ISCNOPPpYG3DG7=FjguRO=|M}j};Mzg8ZX5XX4N;Wb>w@C9?PT z5ELzR2=0H91v#ITW~ zsf5w45ti<2)7*E|v<(=zpYF$t=wzHFx z*F5bH^sW0=gU6)TnHB0;)tsn8((9=p87z6~tqh%mDBxQ|wnm~xOuZlQF+7=9#WAED zE0#THc-P(@romieQ?#_w);tjhyQ#6!>vl@Xd` zgBV5EOB*B353e}PSco}L%)cUuQoVP&xdAE#_x8Fw$x>!=_qdK64xjD>OM`y42zYGM zSm=ye4UG-U_^83}4UkIC-M2xayCJHGzVKG{*Lrb{I@A9^AEdOu$EOt2DXX>>be(PY7GPt!ftHSH67Cin)=jNJ< zV%Xn$GVpU2=Om0vF{Lfv^H9;}gc`s$i&7kdQJSjFbE<^)>Z6emk)A8v_RS(9h#NaC z7m-AOyc{qfmid6CHjG;ixpdWGlyNLseg|4g>o zO-W1o^5aV;8+pl}AKctzVDc?{?-&za(@K;}XBR2U`sj{YxF)Ou+jJ%va@)Hf>$SSI zqKxz7{nM)Rl2qsADlgU_P*?hBP&6aRLqJpTcQ#oTL3$v2AvX5Ma3qovmckzhcO;u; z86Ow6u!yaABPJ8{I0GAXYJH#?Q+@aOxwHwLFVc;8nCYc6H!BGdB%ay@`eY}-)QE(s zX|>B3n}{nzgG51;c-a5+eSwl^Ncm}iIagZajh4%#A#++1^1Jf|>fdH?mg+qa21k5C zrmLhPx4agm{PK%Xub!n^Eaq<#K4)OLecQ_8D~sF#db55=C8!F6VT%(@;Kp3`MR;^v2iBkKjDD~G{&TV~<+^i5gajW< z>cMHd@p!*YDkW_v#0BnOI5*pVP86YOqYfKm-Xj?)-|o-QRw~B%(Vr1J-}CUzs&&PC z+S&et-S801r0JET-tz*N>OF5lq3=K1RZFY5 zZC8RXYhVzs`3KdjMTb%ekxP5i0hx8w+>&!vwQiBYorvQ^yDx4f={_m@aDR1!T&@O z`1q?x2FYjECyZsv30P0ZfN3Y6eG)9(Id@*c*`}ji5%y*7Y58vk`ZZ1Lk&Ah=X?U!8 z*RIZr`Fit=R(j`2&x_^;BYVnQR_EB^t4fTJ=A1d3ox*$87KWSUohr1Ow7>Jhkp3uI zCTM1D=0Q*}?@cVfnyyDUm)PA}H<36J%h&17^R^e&saMy%oka|phdBEma%(2kx}R%` z{5RK@%zau0rCydzA#d^dGo$E(G=Lso5K%AgtZ&^-+@4UY<|E5v;c8gDsV`ay$=4UHdYrCh%-sE zoFru6JnUBe%vrg*0**$$W5-n9TT>nhd-WD0K8OAub67&HTE!GS)I638QLY+9#s_U;gB-;lF-7 zG=eae(@>TnWs{~?WoWzNN?MXJVW&d316f)bFyyg2C{?w(#v%0)Qwe(A<57#m4Etzr z|090M{<}gcl|=@JE82MV9*yR0*m^$l=&QN<$v1aUrZ*%(WED3oJ8d&*MfvlB7Y68v zc)@=8jqh!SAtL+)g(vqpXUuQ&)t){@CU@|Kc>CthsJ|LVbHU3Df!H6kT{b$}@PyQ2 z0O}(S@tZ$DUgsTp!_LGvw42`8qt;6hl$7X->eK4b6g(LC#d5qI?*8t8w)eQAO>qV9n}D$dlqyQd6Y#9El$aFO1-P9!|ixIg}o zYqHx_dXbG`Ct#bT`A8i&)Xj-|Qf?>!a~Nhf7D}3Q;T&N`^#S7K+HM| zu(9pSOdgiF;U1KQY)>z1WL;_W(Y1{WGGONSA}=YxW#9-vU6OUbobAOBY!ocaV<913 zXf=ig#=2BrP}J2dUqWzv@hJyG+1B(*2q*F&o}v#$-*;j7zo7;b z52^GI{H?+23u&&VZnANkUFdhC7PW^lDy5Q0hdj{(>VC;ch4K>Dyf4HVBW$x0y)G~_ z9iw-Q5BJxpz$m5xs28-H!`W*6>Nr|2cyVh8>~QA8b(2el>E|!#-3DJFhG@=ZDEW0+ zfy~mW7l^pHjp7#0+as6Y`X*@S(a$Ii-~CsTN+&huoqCV=FlBvN*FN<7zN7l>Q&M)V z^qRU3C18bZCVCc8#;Cno?Y{MqM7ZF>(yzKi=g05-WZ#MYtXsiV|g@cPEZmn`&Sw@;Xj@O5; zKFZC*PQ>@LrzY7X%vo(^L$(J&und@F_)ip)k}nfDd*mj>uN?t)qE*!?5RkyuK6Hq# zO_ltbO)q3WlA)NF($*Ore~>ZIwbvgq@dtPusF|4=Bh70^G?&kLh0!wVp`IOv$DzqV z5JsHR!0EO6+zJkgl-xzl#d@_^)!=p_u=YDXb8eiq`-TJHr4E+aA)3z#%-zw=nbb_} zJsWo!U21~;4FYJydx%T@L&C+0h>S07&@Z6XX1iUO42p3P*07lfK)=)|hMj}#v>i|L z%a;zbBzlXQZhyQ_0m>68Vzxej@}XK|)z6_LU4Kfa_z5gDzzG{^M|{>U_51LZ6_3?T za0tg5(O)r)d7e85J#w@vBA+M!cMz)ncMv9q8*Zg&hnl*-Qe}shH^S^hF9+io%X@gt zANO+*QN01?Imy=Q1}eRe%v(ggy^7AAm*~`(>j2Ih%#Vq4ou*Pn74C%=_8A|f+Rc(W z&JoV$F1x-hGH>G1gxsDN8R6@U&&o0jkgvU@fqjVMx3S&IHB@C^3YFK~}k6C?OTv^SNc&|9aDXAVwKdi$XqG{XrKbjiGz? zlh*Ga%S#d461pNm&2xJy9pmHXR(%@(vCtQZ^xz*Us_WHX4RWBSs&o@Lzf=^k z*+OeSO!e40oJq>0jrM-J@lG#ePsGX5Ng*j(#rijcsx{Q=L~;VHsoAWq{VEDjHYeq% zCFI38*X@3o_+M%w)*dEz3o%)(e>b`-)&^{U-|TbD=idBG$8uI0B5^hthiIP+GVhCn z;PbCAhGVD8Sxl-5z5jk!rozH%_&0A@)u!>8y=D}=MTBBBr>I@S&j1@F|pj+ ztGx5Xn%5_#<)`Gy=J#Gc1K%!biVQ?`B9&#lbw7no1RAKRL%k?6X)1N7CpZ6nB;NRV z#({NY3hz3f(D~qWx`rM-!{Z?GU0?A0Gdd`|oeNVe?4W{CDzs2fO~Q!9|0pmUK+#P^ z&%f*Hg{*j=s2b4?pBb3@D?XkMOGBF`rP$Mw-l)(429oj3woPyfuuo++M{eveSfSq9 z-sTzQT0PudBFg9=G=M*{tmu9f^Hy+@^!I}uBGDU;^s}#kW2C+YBZQs8mH8LPYGp-E zSTjQs2`7JTpZ}2cmAD7|a^4nF;Js2dhmAwqkR^da>J~e2-Y!2ePqi)bMfbdRJSFT6 zMKeS1u>8yJIBx@5Q3YK(vL8!;ORwPk=3J(myY{#N>$dCAov~phAc{GtJm7*V0vAp)C;qHe& zhBsHLmwSnt1L>R1)p*58IZisIZ|D|3a_t7ZzxNQxQIt$dftfrwG#C8PXJ&XgqmN7rpPqAtKnwcgj5!#lMACg%%wVS7Feui}pXDIzWX4FRmnq3`ZtDomfc} zvo?u}tXk8w)u#PoZ$(`#_M?E0g*o-V-mEV19p2l!3QFjb%NW+Hx~%<62lxm(T^ba1 z;_u!UR5@xpAz}Qw4yM8z`KivHY5u(dKUn&b45Xs;j?b8@bu}Ojc~C?gpJ#|kFxj76 zF8h5r;W@MTi4dKFO*Qgv-@*EJnq0?ZTK!$EN!*P$1Q-J4GpNYnRe=mF3s%HfZLNUo zf+}83Zq?V8kSe80PyaFvlpRmeg(-5lJ|sD=sh6Pabxx&UFJr+QmnH9NCF#MC`JHaQ zJ(PnXU*jqGbzeUX2QI~0aO zFA01eO^UE+D%Diy=Gt15XB*vp8*aTXs0*kB!Rj{S*?cjX6nm!nto#xp`aP$&_0Z5X ztrULq3)Yv!UOKe4LC}SNk|} zhS;IqI)2wQY=QSgPyR$T5NuEmv9l$V?JBD+xyQ?m1Q|&Jv@q|7p90lbfkwKaIFth=X*KK z;elDH#M+XKaEf33`N=ZHFfj%mH!8b1{tNNI4s*B_yeX_rt%0$O42dAF_tIC8SW2x-Pd;wSi9OAHrXTqC?2_h)1rrt4vGE;ugk?* zKP2CHpQ>(HXmsL2ON&?Wd7w<5C2;7S4Tk@MhfM~V(FI+6Pz^gyq88Ty=A5pJ6Y!T_ z6{e9m`_91Y%^o!Qtv|qKu-^Q0HJxd;{B7Rrd5GloDr?a_($-6Ub29L_sqw=mc7tS5?GX`=i9&{FqUARv*z4ZY!~geL_FAr}IBM9zm)o3T%m2 z3{U8oNEC9v|Byh_pCiptCZvx!@yH|#4MN>cwvN=ct}^DmcDs_SQi}j8ye)t}8IQJ} zrnyZr;EmoNc4l218MBH!9`U=w!NE+kRm@*tEeG!aXmYhg?MY$$1;7b{XHp*dOgr8u zA&eWXQZxz!l9A6~j{h2h5Yy`QBQ!2O2|vqT!qh+79iVsPloXw^L}hb@KpYh1-d+e# zo2MiQAFw8zEY&p1Ep3lf`hG>}1xz*|w}xR^^g$@R3vh}uU7%8-pABA*y%8_*zt)9M z%K^T#x%!JXhcMRP5PqQY*y?V!GeP_Iv&%=atFN9Cw*?H8Hz&lKkIJtL?yzemiM ze=ApWPi~ERy2~n_bj&V%Py_$QjpDH_bWbq}_~Q+K^e;?LaCq&}D>l^^&tu-DkxOH2 zHI0rlTB1w~Dn;*w(*Wr8Ob<>x-d3+44EP;B?czRnx6nDHuNPe1k0iTYUMvh8E zbldDL(hh*v?R!w?=A}!Gpm)Y^|_YPX>JT zNOH1SreC$+&3glgSrE9c_gK2h@kbAS3_a|czIBzmvH+nEAT21aYLj;4&3$mzHIQTh z)LeBb|3|~dVP{Kt9?JVwwA;Hn)QmJdA?JL`#tn3dx9?g;4}UEo2mTtnj7d&o#l%zcza+`FUwA@YM#`=P@I=&dN>S_#@ow7> zDj+dV$aB}C{d8aw`T})ViM;RehqFuHrqBl6Je#hEp@HriPc;zJ& zgZ*N#Z{o~gcnz)m!sPic0Xwz`0b*j|k*|FtUYpORz1kSGsu|eJHP%Uz-kBx8u;royjUQp&K^*J_egar0{3Fd- z<{A6BVg<6!ny*L0zMOjp)jvA=k%H+t_ScD3D90P^S0yZsnhPa$S;(;)ylOa6brudXB}fdY;;@3vV}4AIJx1(?jFS`Pdy)P zpIJ%D(_f_aDw%CrNzUJC6=+J2g7$Nv>S@0(RH@W*1M= zMQJ^SS&5`BqU&y@Z?~G@sr3P*Ld~rg$200n;ezM(gC#GKU-*NxloII@{pLn7QN9Wj zoojMA0e{cj=N5_pndI8QH*nin;PdhueZKOye6~=O=dXktt@_bWoEI$S_lpKrTaXX# zEA&BeLDL4#?U&{V2s3#7MX6XxLwkuTz_`KEbhX-L9s^H)*#)1*RblP%!7g)QkE#JqKa6;p$EEkjdw`w#FOK9_ zNM7>UX4DAaAY!mBxToff)#=;Z7FHxdXEg6|jQMWTqxFu*IL`ew6hLCEPXL9kryFX0 zl3c?;H6n)5*1fB1C~K?{9UA`fcJ#^Rxft=e}V+0rxEsuGm5X8Flp3NPl4yo8&%3$yT*1{dm9Ry5Cekk_Xt)&-gVkjB5cE%gOP7bdW!Ye?`ql`$d5Y)>51JbtV`Y(7zFzo`UHt|1$@!#^ zs-{Q$o%#XsI-E3C_hZq@;=nS1yND}Cg#@{;XH8_zef2YC9@&igmv}H=m%7D*D z#8K8K!=dwGGLd}^8p)vS>^zqsnL=N`4g%UYAcB8?)J}n?{87v7Uz=>NzSpIVXR(d% zMM?Dy_9pyrGM_>GNJvL>7n_he+U1AVYEHMx{{Gy$WL$-}K7aK}vuy9>qHvz}PJ+NQ zf|YX2tK`f%o0kIlwdiG_p@gRMbJ;EW+Y?l|jb#mTZ8!@W{Q+gnPJtU@Xh_eBUnId zAZhS4f;paDiWT+YCU`)3G4J$0UwO$+KmP^kXG64kr{1$6non>gYcyMp_OB1wmWe5o zL03)gL)5kqx8WDu_b1Y-L-EwCfp-^wa^4MW4ZA%nV;xd1Apb3+G2^H0?UN?5_9o_8 zMkuXr3thajv>^t~2>tMy0^v}3mO(al!YbyMrxtO4Q{qd!_+sO&Yeyst?Wna`cHu zn?`m+oY9&ae^lvv6KB*;w;K2w<{~YMsQT4k#8Te;UGExIa`|h2*5S+yU#4bWl_P&< z1|yTt6c?r6I84_W@{_)vhLn)%4H~RnEsNZ7`8{uw?PN-eg8|ctu+Bn_0--dLLG&SB z*Q!_be%HHuZ@YISm@YsMJ2dLe^|BxwpkS0}gdvbW%#3aGqn#(+><)8v*hxBE{uPS?2ZYoTcuEAMJ$si6i3B#9Yolexyvtv#F)G;$DOfKjU7eSJr| zl136Co{^C?`c-olvFOmmlBN!cUT@YSfbO?&_o+A3Im{w9tI7z|)mo*3IaByV^DwTGX3;@E$iK2Hh1dmZwUnSyX^V{8rm(Vfqm`r~h zc0qlJuUFv3nCuXMjmO()>W!xn*NZt1VZ^kmm-I&OUt7G?p%!t*iZ)W1?1$laEd)>3 zxgWYkaeMUTY(8jjGvXZAZo^H6RmShe_UcFWg=Ya9NR)a#SDm-~ikU7fJr9|~(-t$G+(N8BWqDG{ZF6Xt?G__TcjNC;U1`}S?uwGghCc%381oe3#c zrTVr-QH0c3D5>dQbMonU*_F>}Wl7>_N3Piy2QcHizF+`G>kF1xd{eWRZFAGmuY=8I zgY@ZHQpjn5^0_mto<(dfu;HjFD#lC%jpYd%b8&IQtICJ~x@=i_sfSKOi+ZuLk*QAb zMfdu*Z?V=JX8zxN11#m!2wsR0AGP2h=%0jT13M;v`$f~w)K5c$!vIdwZf~g`!;6}s zvQU7U;J439HX&<`&{HMre`{PXnF3Fb)MS!zxWkonAEg5CcSmsVkD6)@TTkjNPVd6| z<5bj=3P)8U4wz)^Vfn(~uM)R-qtwh<0h>@AvQqnCOsX87XlD?C!XgLSo0&oC;Lnnt zHg)5b@Ng`n^3P3g(Xg1|I(lMCT=!*93;w(2a-9?p?-GmmBAz($EEbDqO)yKY)>!$8 zv+&Sa;1+PcrvWJJTP>+utEm}FYyK%TXDnq8C+05Qf7d%R$A4)yKeAbVe!HXc>BDr` z{OR;5PoOIiaYQ?tI792hCZS<#P+7k3(4PCF@6Na6)+J|BJ&449l{^6JB&FeY9)(?( z42a;#cE7bB4tad=tb70rF`+?+`29htTzFS2wk|8gu7FroEL>)_eDfpKPIJ^}Dk+?3 z+a~naY*+sFsnGfMD_0>*`d1%8c2f-L-FbySf~REfM*)rl@=TfbYaYmhwEIq}kS_TN zkpNl%6huxNMZg%`#J_vH>JDs1Mn{OhCW&sVn0ic@Zj}|=YpAb(UhQfZd)DV&5tir0 z@Gt1Dpikj!aWOUdZJE-pcmgcv5-ii;ocUj{3Zdi{17KQ+oVaY1X^z*wf7~aszOJ>`% z`w&VhF{_uOOXgRrw*2ISU{N^Mg2$xfMZrHplSPq_Z?bG@IdSNldoM78|12+lcUtU~ zwhJiY+FR))xqJ~J@LAul+ijC=fgJwA9fB_41CbfGB^y0>O84Pf^0VU7NsKEW;J>sS zj?VymARUK|2NT7U5;4)8kCdTFR80CA`c;;!Jt!(_0=h5ow`;b&6(rjhfAjE&uM`oV z$hO-Fnp!IKziRkutrkk+SRb(hW4G@oS%~V33I!uh9a>Js&=vq~@56aH_v^-+XCmG2R?ZqNnB! zU3}XwQ%D%atP?F)4ftM~Wo2y4O2#c0pcg48Xma#b6Nsxw@;!(YFLq|ci)L6e1kEu< z2x^k-(WC_1pK#%p8#6}FbIK;@{(}AGA@BaiGC~bQvg8xDQvr;Z`OazEx%7xegaC7-@8 z8_=ee)P!#ZQi&Kl{xKw!5WyNRk&2sJT=6$H%y+6NKGpSWSv8&S6V}*!PXY9g=IpFK zNtqqk0n*M&^4PpqJR~2VnVQL_z0Mpr%qH8Hhhu&@BSx&@?6CRoS&@vXgp)YvCXooK zzBl@VouS|T$4rw$kWI*`3?uv`n+ctdd%hccck<^r!gw%_<&SoyvdA-&;Gzi@uigl= zjBeHn4f-CM)g*^kf;U=c(>fQgC+2MR-loef4XU3Nd=jZ<>uGK@0a{c}RL8>yU*r#J z#KVa>i!xnsmx2dyLF8Pi=Gg7X_;?$l+m0=UHbclmlSRx^LLFsf*s=AjdO^Z`KvBMY zKE%@c=D4ynH6vQ}Hz7#UfwJ^2&f7$+m<#x z8@4MF=mTvqwG@v7wKo%B3rI0$SQdPD3M#sm9g$f>K9g;<=D2xvWf*-SK@yWv1$k`)UXp4G za!*64`BIN_W4!n+%=96-hB8;>v_qBy0`$bR=N&M@K6jZG;)!l+9V2!GZOdg#u|I1h z-_Yi$c|)S75yh~lUN-c%O4dzBdCHZKSmt=by-K~RU>jkP8woM(!dx>(Ij5BGi|N33 zwiEfH?(-|C%*sj${@_Qbi@vtCp(CkT4zL!FyEs?^&j^~6P;V<+Yr47p2%^*~eVLz! za3hNP_KmCA`o}4U3D?-|cpD0RQ_$tOd+_pPnIpw%MDp2gQNKtji5yfpNU!d@VXIOG zxg%+2hRwY~oTs47PkMVMU#jCTgJMlDVj(C7`ibWMWc!AK_fkt~m$uZN0bi%X)$k>l ziYUk-P&Md9_svB4082A+U9guO`c)s39sA}eM+6o_5svjxE%CuL?8D4_70*ivb)#Eu zM8c2v?*S7E`0=8$7kcMK1Mf5lFin)$R~e6zljg;}A>3N1ie`dD{iw5v9CO9Cnfwy1 zh5Z(tn9xliG!MhCE9`%c>3+gywBos3g%#oPj#qEI~z46;A z*gA_UOrCY1fYfy+X3B=&F&4e6uHV_i!kzu>alOd~>JjZ?*2GxAUe1rg@OX~(rSrj^ z6U+9{w~IE0;2LL55NdlbBqCC^Ha6~}v-hriQ_QPbS-!UUwfq!(5vNNR?EwbtULe_=Bh_BBrpwH;u_)mB8h0Xeyj``*^>Gfe3r)Se zLi8(^un@<=e=xut1z603M}V-C|0ct~hMvw}hc!R94;6am-litLe*HSE+$#NbxopjI z8XCQ+t+q)++iBh*OCvF^mG;L%Ij&#T`<$KOz0~+!0(wv4}ez~ZWN42epZ&$y9;bHY5{;FKqb}OMTPE{f7=@40zvSmLUSo$( zV`j>y`5DnniS_3bTijtU6(Z@D^3JG+EXi-BzB6BotzBEtB0_-Ffa&Xx3-R)Fan@%m zzJD3AFa%z}GQ2FMHOowX);H=Fk9-e);loB8RGT(OwEkMFNUB?SoD}7+^A%jgN_zcI zm#_2UqhV)ILJx5DZ*?(Kk{Vs+LuM>L3$}EB3?Blc{Fbp(QPK2y$HisWk%1KofBx_sR3y3_o-H)1V#vZM0z=9h zws0|@Z}WU1wx2kLJ3oYDKMi}i`keqb3AWjBH$FSt=nm|hc{x*Eqm4c~dy*;nS~JiZ zR@c|)GAZ?Ee7)8r&iz$FkR1wVfC%fDJP&1{P1Wd7wQap8{3d4vs;)B64Jr}ZH)iRs zQA;Lz&wHa-W+Dz@#Sv!6r76d~{X1KagTC#1$H^HR9xB(N&GDrJKiWx)oJlClr3x0` z!J?N!yyhs=p%1O!hi;zr9Wunv3sL=;%M{xhZ+Wz!a;>dZG)%}#{`$o2wA+Y=CBso6 zC%**p$xyUw=gzCft2ay_y}uhTHqO!~NqJ z0+=}7r z`nk>Ud}G_!8vc8_vL2VYwpcC~&ruBVynI$-x`9wADva5-{FYYfk&HM;#5OczXzd#Y z`!OfOba{R(I$nJ_Tu)nj&8mm2fx6c~@e2XnOBLROfnq1JPY$mQ@UJ=EY&3)eOf@PP zF}OKnHJ4O(P&ImX~#Fb13m|1s2OoEBkDb@h#bRDPXy~i{rARX*`VKf^?56^|)(iIBUhI zgtjWl@V(od_>)reCm-GrV(54Jru9(r(lIgo%zOP^nXAsfoFX^Zo^SFc7I)f4yMmoM z@f$8Zj=|x#=EnqM7x@de{@PPJzQ|>H#&Dwpvs$rqPi%A9J|KeTz zG2}!BJFMw}1?h&HZWKnrWWb zcBy`;501dIX0f$t?1}x;r72IrRJx`x%~rZD(SMd+G`LN(%iABspyam< zg817!350YQO)>7blK<*`n~N7P(F!=TWtRA4U<)k$t~q2GqWEZlw+Z}O#Q?VkR6J!@ zgqt|xDWq%Q;pZ|`WMLw9_w04|Q+DJvR*{`ro%+QaXLp&|KYwVXCA0lfoIS3DSVUGl zE592X0ABf@y|kYpL1I@PVIh`0zc}?gthO~?Junrk=NrBjoX=Mzq^S|ky-vXn?GXY} z;LA=8jf}n`acu9}&*;y~OG9F#M-g~kI7vxm_R_Zm(^%T3VB&-jAgHq7nxHZ)6UcSsvFD3AoBAmuOhZ-3w@$i3Q`ik+%GJvgn9JEDpc(@~zX=BuM z9n!dD_G$JnjT=mT=>8vFZy6S4*sXyMLk~y}-6btZgS1FWmw=RjfV6ZEof6VHNGmCg zbT>mujnduSaR&F^=iB>S*Li<%G4lhScRjV%z1F&Ki4gx*+}+?o?~`DDO1&t73T(?+@UV#js| zyLNmbzyi&B;nIVpynfp12>% zHbSd9*cIhu(k$)nx4f|a%5OpD!&{~k^{Pqg0h3khj4&Id6K#4n4zINDLbq78=25NWDLMr99S{ciWb&N8f8J(mG>%qn{7>w&LYRgrX3(EYt=2(2)P71|m(}XQR*JXeT(7 zA7_vHX7p@QMBS4-zuG54n~jfe>}KqW7w7(J^lil$)VZg4D zPz#NlOW&!=vCxcq#$kYpng&!-68g|G?k;N~(_Qnz}CP z;AcBiXfa_DMk#L!F@j!$m2Bgc=8~Wi(Yw}}4L-qcv0J1T;h$3%F{QXW)*K{wI$DUf zmipLexh75ZPM(2VCkgD%;XCwrlARdt13^hFVm4%t50Z(ubTS_rV!v6{QBXv=E+)-K#ls&UriVW$aqC;p{e8FyloLOE980*t;mD8{;5GBp66X_4 zb9K6TA>VcR?Hu6VGIOVfTb3}R6Yue!2uq9DisIV~a7-G_s(wd;1%u?SY;V9eK2c!R zcl4RrQ*X7nzLaqhME%Gql_9Jj*5}iFsm&=gIO*)T?C@4Vp*ioyZ$3uk^neu@SAQ&M zH+Z9lABdfZwCbMQ861hv1Dt=MZwWdv?UFpEiZ=?lrCs?#Dk2$*O`TKCGx*+-IB;Jn z3WNGO%!tf<5lDwaPs1Z33+eNQSk+Si(=-R&;_QCUiIoAtfQ>tN^e^zOSY1?Wq7cT>U0~%fIb~jATe4#3 z9eNZo+CRsOL>rqC(RvFgZg@~fzkTNpJ zKGR(`4*48Q^1-vTtyXgBRl0+D=k`02GG6K}RnwH~PreGw-(~u6SF1*Cx!C@?=7#c7 zJe0ngR1>oF9S|J*5$F?H$2v4or7Sufbl8!&z#M|uho0t?1^bFL=l$%H*!FP2 zXP#c2OC3QSnvOvdCmHy)M(g<)@W6`ffw+fi|4QiC4MTq6!=KEw-G|0aylrtIj^MQ3 zB?5r+zY3e`%GYwwaq1Xl8G)qLu1mkYAwVXCTck4j$N6JwAPc(Fr!8x7lBMVFv;Pfkv_ttas#J5 zo+Y^7MdvGL<}*1abw*3(TzOT;ly}ov=lPTMQhtnT-+P}AFw&s}$)6gMrRbo6?O7Fq zu-OCFIoz!f+F#aM19UK3vee(Nvq#QMORbzt>Xe{#`OP@&HfEp>ly@Rfso}+Okw9 zbjq6#dt#lh8Ke6Ti(j!Tv+x_}C;Rb>TpCUZ`8$Jj@*3EfPeQenIbQKSbG3YLsIsjF zoLvIq{?sIP1rBftu1OsY1QKS^Xvr9So5o1WJT9dD82r2truzEoez*)jxR{&C5EEUY zOChB}k36N8Y&pWFgsi-1nO6C=bKVsHv=YcnWGI&w*38NI{Mm{Imw{k5w@j+?rqyTr z7@IsmI7>RZWoKh|^zNW1%mZZ`V;e6czqDCq8+|)Me<);Lxlf^+B`%%JRpmV`P8mTQ z?&QRcT8aQYn`M)ywkgdqtNba|lG(}93CfsYtz*6?%^iioPBiTo?-Q^~v*lcR?1{Xr zy3|9&VUME`>(Yr4s_%N95W5|UCwnO`^~jz&vaeurL9*A;_=rD#81FIm>ATZ&C~Na0nVz$??f2{Xa+es^-7;qr zFrzb-cK2hM3UfM%S-KKh*p8qFTEax$%WJe%`+yI6>>*bXkFECbLCF%CWTkUy&Jp-^!&0nxSa=(K`=eIQKmPji1rnkARmy)z-rqVa@XOEZM$ z3uqKIpFlAS*|k23mqI1%b+=0;p!c47{!_}kTd%|1kBm?6IZ_u6#aZIy{Ib9-^<^|y z6;}^-4|`ZBUci(7c8iu~kAN$#ZvZk59)-2$m2l+T(!SFG1xa}pELpS{*+}uYb{AC0 zLTX;mMCYlHw-CriWtNl?M7rQ|O?cF?Xv#^LJml41Xy~e7ul{R;XU`^UT-K0j$Hwo{ zb1M7B=PJnsjC(J!jKO1KBKyCky7+J@ikLeln)kH?eK)0j2AR?K(6y-5wyQl)KO#_v z5J~8C1cn$r`C>*SppKJB?r5nZRCBy1f>!0L+Ru)N98%`cF>@_iTAS{IuV~G7LO&D% zY^5LK>DLsf+b z+QkF?#$m|YF5-$l7RRFACIP-{Jv4Y}=>t9OJH4$BnXAFBKQyE*ccq%}!P{J)oG$mN zqgAi7TWkAzGjC~Zd=!*S?`0uM;f_`5-5#W?WMYbNX zn5y~uhC1WhkImq6nH9$xde=^b@LX3P*(;Ck4;Kpng-&=9oc=AfF!rCh{bkx{x6dIf zdSNHkCNHAZB{FZW%dvIkB)DnpVtA+KL^pB6Y?QDphdwpcpPycnxELAEPlPSsS?{+j z!kh)N3fG&~UR`a1@^5ou_P^WhTv}$#x_y8j&keWMOJsOI)Lb9Iz3X8_cXcx1*$&Z zUb9W*%6iNm>l1CO^BVWOuIV{mG3> z(BbfY8_N*u`g*Y5Zh^JDg}J%z6XBU1TSFG-fu8|ZVg2>S`ubA=L8alCeT;)? z-zPRCA#dEi5*bE#x(s4;5B2Hq!VWlX1>3=)4Hb{;C!1*RxtU z6pV=cK|EO-JopC+L~?EH2_DhFwz;L)V}@nYn*_Z_2ZTz^rsex5;pVHWfV>$TX~5?U zrgA?^^x-mBV({1&$6m`KZe{f^yXq!l&*M4_V`{JSF;?Ti^RtB#CE21^DT~hyJCY5H zafly8>k7*v%1?k-t#+ODUn~#zdE@L?|>!A4Ko_hveFd zG=WbuvL`fq{99sl{^h*L1dt8c3Lh`QDz#JhJGh4>E@|7BQKM8^pA<;u{-LP7LJ@*3 zdmL?yFS$8R+T!KcdNM_CQew3xw;X;a;N2F(qSedXH}{OufOgH2c6jnrurEuHcn6t3 zXrFJrUP+1NX!56nVZ>B_3$}QVDf=V24yX>37RQ*Uw;GH8E@GyR zj#0iZ#vr4~vmwnJj=9%f{uOrc*cAFAA&imRd%Pfid$@cx=~nyj;N7-6xQJylR3e#r za~j4dU_!|TcXNRLK3;Gp@AYV{473(4I&MA@`90%pKQz>Pem8YJXyfcDL3Oe>I_GhH z%J=Z%C@a5B6_QKkcpyPro{BA1}Km_FL+rV!X6>G)HW|H7zMTS0 zHFjb%n5bg^j%*ZpYj^HE|+rZ}&-X@y}9Coa@x zDC{tC^KQMEeNC><=U1e|&{9(6VQfijTgBhAMnFxrfUoWrJ+42+F6y<5)oXDFRtH4X zg&t;y-ly~G;Wi6Dzch~|7JVZYGjHs7IYxN!iq{!AssPCOPpUG^WF{|wt~A6Wnu-%c zXw~6l^rQ9sGq%JIqR~XcDWQ$oI#K=Qqn9$0sQ#m8nqx&v_BT>$f(R;6m4Km`6W3VFNVMXS-@J9N6E+7pq>^ z=)4VuBie_)7U*_DP_h`0X18L^ZV>&|dSR`%Izrw1 z*`@Rvy7%9aP3wg1gysHOWgjX03VinR?IaP<^4PUb2bBw!xagc2zwTw5Zt1M+HoB0` z|F^(V_GNpeRW}Qo%Y9qn`A4T$M^q2D*(+`+UMt@AT$UVwtCsKBD`^jIE&if9`GZh0 zUdus5BRxB!sVRr!ea$;gNN1?8;=5Vu=0ZjA4J77F>M(%+L5^KI`*#w5GAc(dp73WtVF6bH=Pl;~<} z0enb!j{QD{5F}J!TDunmZW$nW;zjkfqzRIX&m3^;*9n>;DYlvEuJsaTq8&`!id^J% z!_;>g2fb|01ncGbo%WIuSd_zL{kl}252n9}#8u`Yx{JpQ@OAPkL(GO~Z3e|K$&#GmZUuNLLC>Gxumgr8=8 z{V(Nc*qNa|RcAZDu{lwdaw!CG@+J4P3@;Z!-K2XHV4FeIP zIBwx@fsRDU`U3)^3F+%xgA>;k@~QSwdfA z9jeYFAi!i~Otp_Qv5w+Mzs$ES*JC}7{HY};{fM>iPxqhgy#Ap2?Y77q8GX~_zUtsCCAGwGG%zjKu-zf68<$QPNugb*Lwz1wgtePQ-x;+5MABT8uwD>!|SY(SLwE5 z65WTzq=FVZ-l>Z!x}yiY*$>>j*&8`$vsW*TLD%o=VRPQS>vNBH_Sm@68mcwV%{NN* zG&D8YU0u&l7Q7D!;SMcK6eT4E{%uGET#*CC@pZ*>c(LIBm*8ZTWRRWaY!#giEbEe@tLtfxRi{gR zp}1lVtxv4rgf}5@F!bk)sl8O?=CkrztPPf|?Q(B;@G(!XsM!EKBLq=3^riZN>#TZL zqt#WOtNIbT(Fu_O2^Lo>3FDVa_@ikkLWRtPBqyoF2HJ<8Y)q&+QnBmQpRPFZzm<8b z7oU^}x&ClS=`~~_qfxyLB-E&=-y~%>pP=Cc6Q!s%B7P3>#yNYs8HRy$ecxnVA zLrumn@2cv~%)xeU!mfo~FF&>45YX=pc{$L^&07n=m8Lz~Kmr~1`9Ar8xnjt561(o; ztHWjnEMg9|kamQaNI_wtJ{!CDKz}>~A{)^$QSV@kU}9-`V&l}%LPVq+T9vqAo&*p( zZ_sri3=eygmk4j~wMz{Pt!=urUGur!6S7n3JN5-g%aA633P3lB#{j<8V3KJ$R7LqleBv99%Om3_n=Dw^+R zHSYG)W~O^L?=J=sV)q7T`BhFZGK@1dZ2*d60T6Kfxds5iqv;P|mG2vK=-@Wj2w$K- zeh2KX)6ZvQ#ai@~5-2xdADjg=AV|pO{c&_ZNKL5U z+T0Rb-eZ>0P@Wditg4aa5M$o7ZrqPFk*ypO1M85thkfN?)6{&efk2b`}CPe)>g^KD8epcQJYkqMZCwJ$HC+bNZZuWe1%LRJ(eP1tZ)x#fU)q2<>x$4 z&)~5ZYQq+F4<}f>$rCNFs*ZEG(UemndU8u~kwY#4?X!b_7o|3q8kAlU z0rVmi3Cn+fwN7XMJ!BMDaM;RG5MLTi_EP6Vi=3qWP6%btS1kG=kMAhy+zl2&4e0@2 zP@QHsj#4G2h(M>e$2%2Px}L{=1}lVc_KIwcI*Gjm{kp;dr$QQ)k;mmROXnI4$sFP8 z6cn;xL0uFQSz|tLK=5nK_cm|nm8(8pQ_eMeR-1ReW}4mwkhS$4_c!;m0OIPDk=j?( zFk>INVH>%w^n1KP@SP|8Xz3`P9y&tD;;8=a6w7G8@WD-s*+X^w&*&Y+8wmcD*f*N( zJ=vfmH5(vd*zrh9Sr8{ol-$3KA-dA4vnlAy<8p_Zz%5R*z9kgXfQzE{@+Yv;iLW5` z$F`q=sQ$L+wZmN6MRi5&+D;wHbd=4ve%d9i9%8w+k#pdqYDX;*RLO2@ zq#Q*6x6#`rRzPuZE)cS<6;G5)pJSAJoX9s_k(3OsVo9U52vUi6YRY0EU`x&{0$`vt z_V*0qsr`)2ox<0D)(&GMDE;C3Gxdn_chL43A(j5L{9y&SN z#ceJ854}#)3s=h(B4!(~&~uDW-h((XmUp~3nzL(O%QO-v&?bnTu7Tz4vn$&qQ~Hkyw#;r3Q98MPP&|P$=4c9I~IC32Yd?kwu$dZojg7|0D_E2 z>2ip=b+2?*9(Z>Hid4Y{n*G>7`AR5h;xgPny7%P_e+BOF1&EROI`bfwh+#LUC)rU~X z{!)uJhQ}FFT3X5VWCtur{CI{vRo7WDKthL(cAa?DR;)B`p3169b<#IUo3*B{_S?+Y zg&t`dv5q=38;aJihksQ#@7HU<1*?_G~D4c3&*Z zn6%z$dvRido}V8fYW(+?KnUOx*W+|Vu%Nb98x4n&g@}l#YR1TW0Ku-G>y6>ah14|M zzM(pMGHIQiZZY`JldD8{adIO$sO|WXbO8ala2t&pk|`XeUGA`My_F+F}hY+KBrlJVo-Dg_XvmSnFA4crbpo3lkoydJH{oq7rQx=uw}k%C3~=@NI)9Plplc zzh(kpZdb>sH8aw%kdMQT@=DLF%p31R#iYuE9!WJ zulHh3+C%b=qM8-|R9VyIu9kaif;-$TD3npzz9?CiR_E&Lt#N$E&EEAKx6VL`PJPai zgXvH%L{$w*T0#WweqyM@6r>&+#ZUK%Ak_V`GN2$z?C|UrN@!0Q4D+fIr=-q-@?fgu1E}w{&x{@^B z3+v?e1o6Q*C`0@)Wu|_;QDVGzFypzyCKpSy@%{q;Z&z!pvQ)X%quU9fle zrI~`hLYVY-XbBKqcW}d?1W?&2uq)r^-S!58dU#3%h(^%CI3%G9;AYbv{c(nEp8yU> zBg{XQv=Ht_;iHfkOK!<6i z*6!)6am!zEW(hr8IWd+TxrG=R&$^uk%D+2V6T$g`t2TPU)7@3P-8>tL~PTwNzUqoD?ARS>@Q zt$!~JAAPuFzbmI&eiXRS+2;ECY2c>skGmvuY-gqG%5Tu=b;jWw_oK+e!GxNEq?}`r zB$ht9qh~v!OPDo^m{a48q^oN!Vxb|}6MxB=AjAMQG&FJ}A&81bWe50xaUJSVQ7422 ztg?1X5-Hbq=Ykj~^aWTAFxBqlm}g!4(tp~_c&VYWjSYa|&$h4`%j8qoD8LDr8ipe< zN$E0xB*t$x$USzaXiApHD_zpQ7=;hkM1bkJ(Lu*uTOY;iXk5$bs`hJ$9IwCWDxm=E zqQUd~za)#ePGwC;pqZaLizFB2FDbuUeV6~yx^4ud!UA6Gq>1%aOH!5Gjg@buowV{hvI4+hIwF&U`Szkd%*6evCEK_bXCxVC!(MFrxf0SL0X zjQ5TmsGrZq<#zD{r#m6iVnoQzmVV%)`wT3NZzf5|I%Fmtj%~&d)lVP=ZWa-sk@${| zZio=#I26w3E09a{_~8hL(Q$p=CjDkIwo?aXJnt&1BfPpendRg|pYvlw_F><@SN|VV zP?5DYaewgcK70{98~h4cXDIliJi|J^~ zf?Ime3EsSOa$Gcbe5+bD49^14Az9&b}^PxX=s?j0hU1xX| ziU=EFD#_}EdO*9L@8}8qGe!yHQnhPz7vIx@HUd`yPS+A=={+XZl9Z^kLwhYDHi&Aa(5mR#6ts5Ch%Zcvm7^kM`vqeRK7QQHJfP2 zLOrn=Er%4J2kG} zWn*W%SWB-Wr)2yo90z-`8i|)Nt^!<$yz2J5SQ!-#_ zI*8l?e-t~ZkfD=^DvLn;1NDAb*o$VOkWP{7@vdKGAzy5E-yAI*BJ@%54$wm!uu1^5 zdwZgmd#st7SDQvierp7jB%sa<|Cfw>2@aOkV*4)TqF9;I_~5X zHX79?cFGofu;Kt~27PO~g7a2LZ@qYsi`QMg+H?Q79pO*Bz?R7|Tn=_|y9RX#?Z>c= z+&zP~_#M7(LeP_sZ76V0iD=ecKP8ox#&}Jwq;G|?W9`U#uqMCYqWQOYz9Rd&muhJ3-qu}tmAV%ama$1+{|H6$7u6r7ie7zsAf_x{i;IerKBTrM;ZcHpZc!( zo5$pIV`O4>mIWCh;4q1TBeF%Cb-&50N|xg)$w9np^58I36^Zs3f%>%W#a%Q2`33l0 zRwzg=nJwtW0F1G2XeV)m%-bpqOKF5a!Ei3%eYJeh&lpqIXtC*VNM%=T3&FJ?oFG}X zybdg}2>W2OvKi+4e&_(P^AX66-bLNU@0a3lJWCQkSYbT4M6aL21-LTR9kOHtm@sAKxMbD4OE>(CG9>b56#@z=Owj0mZQ)B`d}M;HX5z-6o= zvdx&rZ5k+kY9*D;XHo{j*m!LTMF4c-SqRiw-U9@oMY*H(CoPpLC% zyfR{(CbwM-grJQPv`I)cDDRp*e*QtgL0-eOP}Zwha(+cYJVYOGo)#S#~*b%Ax+T$JbNfcm+FG)KC9!C>}k8fx8e0WHEf;tNpD5E%HOU1EN*H}}gNk_@Z? zY|T_aqp4o$AT;76v_S~o3Cm{-ke_ z7Sj!?MKb3%?H?&CNk==LIe843Jyw1E8!!7i>-T*Q^S!NpZXC2{x_k5VVsI#yv**cS zw)0s)z?I@JEDT(dNHQfp`SD1QW|>fWs~%C$@wj98Yb9H?Gb5^au>C{-t#GLL+GOY@ zRtE0&VBJJFE&&u~Fvu>kXoq@Qdyw#~1ckN~ut-E2I|yX|1NY7dU2eX-os0#c*lfTE zQ4lO1-*k{f^&o=*2+FaiOJDnY`y>iN0yvif{h)Tn$ZiPL_Q7R1>WKY??Hn<7UUeVl zO%g%y$dI@J_cKlss}Yk^v-|B2HI8aDg<)Mu>UUz*oYLOfBD9NeS$D^+?X4db#5+4w zck>UzfX91cgn8Pt?v+1*9*Lu+{WGc;@y{-+#>v!nRcH6MEhldg&Q37?E1sttASU|% zy#fA%`TZ=of+HCT2)qk<;Q_gVV|`S}MBOo{Xk2m-fKqZa)iB_)WS9s`4t&c_C))qMZQ2Ois5?x!YK zZK-w_@D^r?RnF3=kLRH--qAuRyut5hCj!;+^HF)8@Cz28+~u>atD*m+McF$w1vSt$ zXrs<(>y#_l=MZ;ZlZsLt+X^aJpVcmISlm>9O{6&6^B6{x1qS?^v8Nw2Oe`mOYis?5 z*A+6YP>c0Cxx4aC4Db6KM-YSxsV&DY#L517{}&W8S*CV`Dvc|l)Xiy{?g1IM=ZX28 zS*)0gTkDS>ichih`uci0bR^7^himlCpd;JjdMM9Cbu6}W5IJ;C84vS?aix<74UQb` zzNYEYIoA6?mj=7t5Ti@>d;~P~@L+A5iWn^p_h3cl#p=a@-N8vyleqg#<0&B+@{eHg z3C9*XBaP#%1_1(LI@nc}e$gqgeOIF1Te}DZE#>~RQ2+^o-pbVycTTr7X6M{-kb-)t#ncKkuL!IEstv!B3y9&6j~)Z#j; zgPYL4lHsN-sOutZzgF+gWv_N`bKkc`t>SQOJt8n(r0eOR`me_eyFXc-^w4@Q4NAt8 zapRYWtHJ`0r&Ur7$OsfhwPE+rY=4d@CaUJ|Dv}8K+`IWaP_sxS2@$>+Yz(L64Wh7t z8u^=&!8ZC^!cOj|;z#<3x!geO~&t;pI5 zQ7`5!X@vJGyUbU*BkU+J=6O;Dv-nSo##G;}1BMWqm*ogi4du@WO8Tt<6oltTE*l~# zO3f?X2E2#TgHTvO4*`JFnn%L$d?1)%5_YpG6?EN4vgprra?dATseJ788|&Uj8v2|S z52{O#NIpG5`531uUo3OsSDpwHbRXhfs3&KU$TlBdwO-PKdY;_;xBJbTn|>REc%{OJaFbbDf+| zl(Z=g-+y1)|KHmjjt7lJoivzjRh4M--_(-nBMn*p&ru+TW2}q_zdq1vs`K2F8tZxSg8qjeehuF6{uX ztu`R^_YfjXykhLo$E@jCgw>Y(5yKn*^zpwUb&T0I(6e$O{%=wu0lGX zkn8~nKCWV-h}yMJC%AquElpHNcs}sxyUH`?zu1ybdMv$MiSo{&!mrrpw#CTKzeX25 zEcT_=)n)Hp=1kiw7rWcBhqeq=y1nWYuP8?l!q@)ygvDa@*V;V`+dTS?jOqwF0GAFd zXl~V49|l`o?>o~uUM$+v_TQzV6CtBO?fizL6p?!kYpmiCM8Bsy3!a-)e|dAhe^+q( z>#8ff98CBmrS*Fq$klq4>vNj1Xj?*)rTqd-(u2??yEAYjem%Z~^#R(z`hvl~8d&rSbvw`J&GqOHF9-I&hJh!C1)=W3(w-Er zS^bB+!W@T{!j5ZJwCPQNqkjtq!EA6!EVom38`$5phwIv*@v8oo$T1w14Qr93!MSX7;OGir!Z*M}T08``j zA!jf#Mu4Q3w6xdUjoadZ-{WH1D~CgSw*&x%IL6`LXw#*N7_aljALr3TtV(lHazLQ* z0-(|qP@N#9hY1Hxd_uisxu&G_=poXbMJ0J32mb((SRVEYwFBfnTmLiy;eP zv=5elw0?B)FjhNbkopV_6J4Xj_3VF5eG(UjGBJof)-<6=nF#klo!IUaQwTD1L&v?| zq=a?TmoEm}oT=I`;^m)gjkqq?ek5_kD&I|`D2F6U9Neo*bXHCNV>GL@F+=$s^JGJ&1z0;6`uT9F=}kW`*E~xV8YsUdJY`!+V*m~i({XGn&mjUY=7AW<0yNpBkXF}XU=OT-Y zOn-t%SP`F#w%CWbRv^ZYPgvEorCFX{T^Oc)dJKrO%7ycLV9qaqg1x(*AMR^j0yW z&Vr~QS&Xde=(sim{LiHc40a>8xV3>WTF zJyI6#qVg!U?liw9{ze7WK4S1S^}@pv+62(arP0<~$1JxiG73~Cg9GAXWv%&@PX21S zfx$LvL{Nc6LWs5*lYUY8!~kpU8Q{Mc;L~L80$QTp4r`TXAekuRfp2jzA$A%+=Fh>c z@N73~F4s1Jt-mJYRN;gYr^G}JnMx0MtaB+lzl<#3eQRgr(0y}ygooRVCmxadBE$PG z*JRLn0dS;(z7_ZSVKxsoECFM=BSrPt(1cK;cp#4Rxy6SILE{sctwbmQ=aRusPcLn& zVrplXLWY`2M@@%XKkfvviBMH`#_r7oO$yL$KnC`vJZFDg0z7`=dopS3|! zlWlRE6W7zD>2(eq2mdotFV`2E(S~k-q`X1KR$Jc44>tC_e8SkevbsMU3PcU8@A-}l zEk{2)t}Hb@@23DD_TK-j<7uP`dd+6by22c8_6Rmoq(24{4>KJO9o}t&_I@9{MyUiU%<$_bjaNbhrQa({qvL;SKxQ1Qr{CrSgi;&(oES{%zF`>;U6FC z`eyu{)U7d2U9z=8Ojz1+5t6QskVL^&#Eau2>0EviJvC23b92<+7yY6oiT$>$|iksDQ{5^6;(Aocw9H*8!ENV}P?d(O&Z=NH??{_xAqCDalX z1>=`Oc*51Kn7`=mP6;LfGC-u(8>=A}?|vFB`*|UjW)1KrpwMf4EsuNN|Ehw zZNZv>e)q_SXw8s%UV8`PVuPikj<_Gp!dCusU)Kekd-*cNoPSXui(ijl!f{sXPQZ?% zjs@c5NRF$ur@xGRzgO6Wn(TNq`+O;@z(%U3Gl7m5{-m$@86_c>lLU zJGb?8kPOAESn;6EODfAsza^xMS{p)Jax>@zA@Vl(%K~wNj0JwUCfbdZ=nXL8z>p1M zv=85IMBTc^#$ylfG~C}NL5InebIJFiN^6O3`=5NlzZuQLnr0deMf+AZ?|Ue2XSn7Y z&1E-~$`ZJ7FLm~gv^N-@0g3`wwC_-4*bPo?yA55z%c_fKFJ_&&;BN4;vZ~xp7+P^D zOLa0f{DVkYgOHx}61$Dnp?s5A#r8tDxC7b^LoCL<0<(i|GvuLje?L<9F~Iqi_GDXd zNA;CS*wudL8>PK#1=w6^+GN>x(TZ5d##EGb+YP`w z#ZoL>ygtnU>Q3Kc<9ICBNS&`AyDMv?Xm6Mdze{3HH45Y@e?}T`Rjx$SU!V=B zi$DEId*o)Z?3+TM66G=E`P%&p8P3hnkH=%Zx!Dg1#+jyqv2BJ6sCBmo-m?O5Tf5p? zesX6!onl5(91*^UK&gnmBgVY^k@Kw|Y7>iz1Vnj)xG!TL`mr#CT0Q$$&u@@2Z?GyJ z0^YrHCnqT*2WO!&`HiBYK_UpDRoAB*@0`tAe0Qb@{{Y&7kKA>gR#^UjLfi;8-yYnA z{$E4BOBnkdHBp0xP(<|*lw5#qJD0G+)R!@0+H%5!J$#&-dDSoA1yj6}P-m8Fjf;VV zwCz99ZLX}3jcK2Rad!os2H$iz-WE!FxbXsH!tKg=yvPB+SRbt^KX@7H+HB6?@+DQU z;B^aNuNT|}6NdG;mfk1aas?`cSsO=(3@|J|fk& zN_2Cm9CR91<6SKo)<$)_BLN`?_4tFj7kQ{ce!SQ$PMk-qPrH=_)w#PyLo^7LHz|Nr z_nWK}HeQ_@vZO?f)sz4B-*<@d(uy+8!8uZ=1P&QZ*izT$mCBjcA%zxZ8JvPFy?X)H z^RnsbY^RxYySmUqqPicZjlTs;YYGd!Y^<$o-WJZySCQE`I6MmtxG06{P~!?>d9O2l zWKuL&du!}3HjQmm;^$~Bf7$UUG3K_1jyv?AZFWw^&i>ABd|_dO+1OIwp!9pAy6+@y zU+ws1e3Ok`4T83JsD|Ib#yiU5)s!Wb-JtM=x688d@Xn;ePrF7pBq5oZ-zpV-@!W<7 zI~M=k(JnaZlK%gkWQcDZ93=Y`DHFbMV7=g2b2igBN~JS*Tc{Ealb(H!U`oHy=V6Iq zi9eqns~p_f)ouJRH!)#erom_c*AE2hwSTkN<9~5>-^;|*qw|jOO`AMWGt-3_I80n^ zNK1}(<8aYNLnpZU+c>9L6efr(HFsbwzZ_|r(@*8Q6pCd0ZG2;sqo%H|7?%FqU3tO( zfSh8g{xj$2G%uSG0X=Wal1WK!0E%22@l`47b*;WYM!bz{5HhT6Vo$j3K0LoTp4VIesPf1UBr4_Qn{*2=dPW z`++-iS8`_EId5^;F;;B(1})XzcD?ma{du4-P5lh%9xEdE{-dGFwJJYtJI~{mmvnuN zHS-qJ4F#%$pmABiF{4wBm_MtTB6s(Zg7CZ%3vKQ5`#&U;r;2G%&+J8LlBOCzh|3lSRhD8~*-O?S>T_QQ8AR#e? zh=Q~*Al*5XbPbI((g@NB(%mhgbcl3!_W%PkbLRcdb)ECQf9L01&)$38Ypr`NTkXI7 z6XvOsHZX&wyt-zmSU?CjVw_*X<}Qp3&6aMYz1yz6nCq z#i&0qkHOCk(0XPorPQ z*wDALP0$1J2l7#Q56-kuVU>tf;v7^nR)a9*ND5~j-x|~R3b%{i?BQ1O_lV<)8W>%% z5b^d+W|OlgGT{83L{LR8AZ}<95T$~>@8RKfy^kcA8re;jM0PItL&0{G7O`?a*l5G+ z%{y>$m`%x&T1l?diDX=e7$01-|K}XLSpIKZ_zM?$y*fdzW!-PmiuXXdZMnzl@{Y>KakhD zoAo#{yT9LTppUz^oHS03@#MExQtRtt$yvLq!Zb5hg14+dtw*)F6t6ge|3M&Y-AUqT z|9`S$r{a zaf$qSA5?s|Xtg^?BoxExKN>5sGf5RxP<+pwu2o0+Hl&qaj<)cowBHRLgty_~8xhIt z!xUq!pC%`3G%vGih}~!?#?W0G91Er+29O>?L-HOH*eIKNtY+LoS{!KMo2 z{rhM@BsWYeYagxcpB^+r)PU~ptqRmRzn;cam3Q)gAx+-PN4nX6Iga~{D5xBEQ6 zU)hREp@*wD2r6!Jze!*j_4*ut4(+Pp?FG&f2w;!2dlE8Z%%%j{-3|GSa#FGAr&eCDJxn8VweOARfKl&1eLQ_S2wewt4@G zd&1j~C006eIXfhQQOjKp`#d`$KcYNJY5F$8>*!S3GH;SC2>W#AX4y4A&Jn*r%pHp` zkW$;(yba@?IOJ)67ba7{u9Wxn?Pq&RlJP;e>~1dUnU^=@@YyNHTtA$Ax3dD%Cpyg5 zy*-=DTz3GU`%pc7vD=r2yPH^_uYxyJ!vvNwK1P?@DvU!Q(b~aFs*tBIxVa=METhIL zs@qs^ka)saz>yzo!m{(fMfyZw!_uxB^u|jp^9%!`!Ziz=jjvFBuL-V4ssT$JYrj|y z8@}i`0nRK<8p(W8a9Bx#O)KtSJ;gn_?NB{Rt!;0F?I@cJY)dMD9J@WIq^S1(A8#Uk zgZaYUfaKYB(r!CeyHHAOclwvG>Mxi0K;(qKW6I>yu*Pj#I<@Ks@7H8Qb5GA#0N>uo{ff00SI#YO6l~VC3vN%S@N{NtkwIY`~Eh90eAzB15a;s#V5GtcjYB38OeI3~>WK;({*vdh`Pg3xXy;r7VR& z75gTwKIP<>qiR>B$53ggRpsp?$FnOdR;n3-S}S6vlKs4BdRUE(^)jqe^h1#X)-3yf z0U1$9!F<6Y?KB2e37CXOgQAuKm%Xx4V%|W=kLSi;Wh1@Ys@=%gm;~dM`7mJ#G3;&y zj;XRfDvF9>o{hNHP2w~K`+);&=?o(T+bm`QS|o0*woiS>4vvm80_GRe7css{*y0J0 zr+ZIN8J&SB}A?(koCw;$%8H)p{Db3EMIT76exclr}mw$O{Biw4_liq#INLzMLr9tcl; zCmL;t2p9v5aWfCW8Vr42!CjF$HOPg`Tvb@G)*}sRn5qY#YLmq5#>&kXzU(LRGcafy zmKWw=@{`Y$KNoO{^tax<_r8z2ZpW~neMXgZfG7ABqauzeacfJPr(d^vM|Jco5W^;9 zzTlVbC1JRCL>f2qEzid;l@}Y;Mt}a{*(}6V8r>E;|4k7c9PH~Q!?tF$n?{h4uJ7gh zMesjcwS~{zZ_UUtVr|&@6y*6NV2Jk%xp8L~k9BL|x)z>lwW_FwX>SL{WtLw|LEQF4 zQWe=B$`kZ>j221e8Wh|#g%$)9ByM$HH?do51r6CNkLVlx4EJv`FfX-M0!^_3G+*+o z6-MJU>4q(la&Q!Bx3f?$SmXWvwT$zZN#-z_`6ynNy?9#zbeSt*?0nlgeT((9q1;-= znv6R+^%AElzszf}bmiUbp|mAk;3m~`4w{HTx3SikgqNGKE6Uaxjl!~^3;93s5<~Sc zcew${Q(V_`^Y&!W0ImrpO97t|mJi01NS^4;&1BlN@`J=k{)+zaf=My{h>s6M(-wwj zqV$MX7x+#?c1QkOrZ|}Dh~fy(jIXSUI#Dms0{K}3a$OzcJ1ET^7J%Mwk>&F0f3sTV zU5Y9nRVBksv0hO^@HH0WC=nO%AfvNcuy((Zfurre7kmavb{1kdY~|Vn?pc(|l*W{O z7Ch73Y23Z?f8|-z-33cpjod1D9g9UX4BnHCi1im@4fof^tx*m0h1xuuD%_y%+kGEL zo{6(RNN(u>S%@ zIHn7II;=n+Q6an0N)NlB8zscB>y7Zcf3;Qtk>)G8A!qs0dRM7IS#BvYi8qcn`8WQC zR#K?i!^@0Fj;CKgI5`n*GS1T9fbI3uZzyD_>n-T`P^3Y z0%ux=*e*t&XS)MF8_(EQS;#tr-aih!^m9HuI1DaJ9e$0W6=G}s4ADrO(EOYvAlmVp zdQ9xEa{QUWfXu=D+}DF*8@T|_ilN?=PQkLzAC$8OV$aDh3f9X+%#HqRSN->}3v`W; zTv2KKJnYoau|u~DoTZmN9Dc=ZvPls{i>J@V`tW{=Eu=~zlrq#f8vv*BW0o*WQu95u z_TS6e2O~lw1T^RV{o`;8(~eG#4j6WV72BFNqI93Wm*b~;1}57vFCNUXDbW(+tF{uK>{g z>zaj}#cQYCE5A*y62(?=acifE9A7cWnxkIjKK6CS!T`R;^536=hH7g11R64noM^1Y zTNYiEm0lzwH`D0cziFj?K5T!B)E7+6p)t*INCYCn`2)ZOcN#eliPqCV?C;ufD#hV6 zY3*`EJZ8PU?=~w~$qU)O3l4f&s%P>OwvL!Sq-B_Ia5r$og7l3~SqD=tO!a?w**E@i zDEcWlG4;8w>uN;Q5M?_eL~JNRW_s|>1#&vH*Q+a*I>U51#u51PcI19Uh8SPMimES{ zFfU>RNZ};-Sr4yf6vE$Sw0ii&QP};wE7_4@`w^>RJ}J?)%akVblrNW^FA}uP|e+-@da}?9Dl&5zVDj* zZzzuTY$J4wj9-Y(?+{GW4}MU(8Wo} z#1FM>=N{N?gx8HQOD(GFHG|p2*!Wa{uYnYYgwmq-Qtn}Y2figBtq8&Q(7I)MK5^(b zaNjuH(tWG=_*+@l9MwDcN`*R=4a<$jM>j7L#tAIVSBFRSO8fsank!fV@idB7z^i^o zlCl&$^|M8~>B_Anlet}F$qpJc75*{Fxr$*>c(S_`P|9D+)1NJ!ll+3KrVSHZ7n z_7`g)a6|vi2%hR2c8|{z8=(<3sRjcv!3N^?K4yzn_%;`ZHfD z@^6MoeIn$h$m_&BYSD@(%G%mo?3;U0tS{QiT?7q*7@7$!jplv!tH}K^|2Z5YTC+6m z*TQ(x9J`459$1?3#pAl6*sKK$d?V_l7L&A|!KJlt>+@h6J}@*`xH+MV18`GrX;|+ zs;;h2p!0$h8t)P?TK#yAd~qL%3D?9>Rpt1=``G-C)sD*JozUYI=oEgA3}5x#57X1? zlO0zXC69K}eG5*bJl%2!y#rM_rLso4>TMFd8j(=7E2_o!;6cjU5&OI@M08d^i_i=1 zEbJZ0UDYL*$Ph5*-K?FnE!SKD&DGRHp0-)E&ybe0rQ^*<^fpV&982|W!vYI;uKjcuAB=u|BVpkPJXQ$ zP}L`nz7F}o_YaL)t_j&Llfenx9aGL-;LgBXq-Qd&zBuDo&)Y;swHHkks-Y!Tl+g%+hv(P?Zz^2VpREs}rx+Pz zg$gCg^ZxBQM$Onbg=_*6rHejPYRa!8(zjY~h1%YAOj&g%D;M7$M6n0)v4?v;DAW8x zA42m`&*JvtPMFGguAgQnoV`NxexA^@WJ9=5%FX`CqOIUWpmXW-ZX}g-s$yWvf(4jz?=OMTi{IqcAayb8vDS_p;-T5>!JS@NB1@21(Wpf-QIDN`!JLD zf2@GE876)|S(c)nt4og*t?N^TY-t$wGx!X>lV`r!wkUb%BZb)6eh+G2z3D+3yv<6E z3L62v)vJ73>$o%V+In2GMYi5s_#gD)rrAbc{k*pOoAy=*fA&wWMr-Q3pi6Vjt6owS z9}Uw|%WVF58Agw4mubcIch6r?VcDF7<$rk4VkIHLL?246HqhSM_E9gre4+^HENtvY z+((%%8+#+>C+?q0)n0uLc}>tp8=zNdWRBWJsE7U|@qgH*Yqpyvzm=Eh{2DMBS`-Z!#kd@EP2e~CWbH7v?YqrS*PTf z*IoyU6-2x%y>T(}Qir@W(b~!JB47G2%%T1*had(&WfHX#^)3nI z{_V>7q}?5v#@dLo{ufe@eeAX?N|qHKL50coA)f&@(p1e6#Rt;Psu2PBFz}=VWKw7B zwZ1C0=%HgcSA5B(M7wPmmTItd*0#?qhNzZ09a?s2aa#uOOAL4&j%s-gaQw>#JUf-rp2UM zjveu6dWS`#IU1ud;~V8iGGICx+-|o0h~9s9Hv`=F^ziTJlga=MzV}oE`KMANlr{`* z8W$6L3-&{}KpZD!fCd5F$M<2%ii$=1YRJLYa7eEoA6=+f7NvlYN}rzCgB;q z@4jOvuk7KoNC_oPg9k;3ZvU$a^cMtQNeQeSIUTJ_(zA)d=EvCVZ5KeN z(){;Cu*h7^kc9JlkMZVchYIo{+b?0yf^pzP0niIUDvd?Ij>UXs z3VBIJB7O5FT~8A+PXYeTSPXO1AQI)l%@wTfx51XN7(>`3hE{)MO3f zj#LoBh~9PD-xW)Kp1!!)Q^V+2tcGMx3#8P8478l*bgA@obe)^#rb>pMsgyE~&`&a^ zf(-gXzyq5?Q!l4GQ|%)LB}zDiP1fRG^gz?kJhU%^>~pEmlTPDAf6TdCPm{i zL3?|{i&CSjQey6!HEYL)EHn^j{q7atH_xpTYA)XSD{KXv{FX=Va z=82gQYQR@P# zJ|;up~}+%&&tl?a430=EA?ZbmUT;IjCvpyr6s@mv{Yur}|YWs<3+(X&B# zBy!c_ZuPMi#^uQ1BHbUcR=oLQfkt(qrXKs6W-$$9Vu{KyE1UVItJ1c`7yMJFbg{GT z`lKL=PQDW$348_~jq`(omo`L|mq0H%#1kom=o{os^+n8E6^hBo#o9 z-gIf>I^`xWaew8AnZ(bE;ftLi`dH@GTqK989!x%sJE}-IvAIAo>Px~x&nEGiB~c8? zuA4P>Jf-MvqQcV@oOB`3d)-o%n%|4#V(7SLP9mr;l9 zV=vof@ANYJdZOWQwsg@vip4pK(f!MPLiXN?Ux}ix%uP}l7=2>QS){}He(rZGQs8~C%&QPTV3A*sQC2>`(fv1>S8jzJiw<|VXa2os zZP#9o)TI10%%kaiw^eVl!EGh0uY)>u?qna&ESJGO-)o#{U-~4$j&RnGY7c*8FQr>H zdu(GE@^A25c;zs(?wT>uLYAeJgeSaX{;rMlT87Nkd^!Yok0vZHToi z;CnlY^Hy?UqV*zp(%<&JH?UwIdRIbz@Bw;*O=FVl$NyVt2R-1|ok0;gTkErA?{kxR z?4PBSfu3PG;%>7lW_S02#S_1z2>hUK^v|n2O7qtWXdGDS)-JzAuJ!xHPhy^pD`;S? zVcp=qmID@|fD57f3(f-Ek~T#QJ;&xj(x>ff2fpjOz^$*$>_m5TbV-SttSUeHX;NK5u*t z?AT!eEkO`)(~jeb$CEXG=46GJhW8n$zD~tJBv53ByQef4Mwcxd7`ZR%eTLBihjyIQ zDYJn51ODFKn0~&!B@Z`k47^(%Pmn!&2h=1haXg$EOb|50@LIH|0d;F$op+qGm9)uQ zo7#d*;lK{dCz(Sx?~P(q$3YF)}6>RN@9`na@-XeTXxR9=yLsmV z#=WybhMCMDxN;Ges@dkBx7e!U*0fcl8@r? z=+KYI9WLP9LR6o{fDqRN9k)LiPA8YT>`E)^e{Gqa*u7w*1c5g4PTl&Q2<8mtpE2Z4ABZSsoW( zD{k(X?Rlr!V^KoPEHM=s>s{*?DoFKo9RoO7a;&B%rdlS^u08w=!w>5NBA}p-gS(zP zt>$ZWsTgHal98s7U>my*m!NG1=!GI_Ou%cW#rl#h5pTb)ijRqg&i%a)WiUuEihLva z#{*+)cs%a_!4cw@yZ)619szw1`-UmiJC9eYf{Vu9E9MP0lXW_`XIV1-&9kQ{6MMNV z!?!i)*0;i z16b(V3}K_}@vMek9Af(N`nO99!iEbX8XCZV%I#|Y^Ud&LG#9e)Jf3s#^wdw7YqN10BcE6 zhXu2|_|orp-gURkB8Z4ubst?N7ZQjkQts#mO^Hm^&aDJdSYR+ z0>dkZvbniBnijdxYqPv6;6*R|gwQs3*A#F+38`*+JnLAuP0M~k1iYEDghmk}ovC&? zptm)Fv#1Ji{q0!%1z&w#d4{+JyJCjqwT^QWXvKAqx#`1EhVE+>zo8yD(Cb8h+3&cD zXHw>BN{)PW)80{Ny7d$8(TV$U!0cm*|pl3=smPi+oacMxzqr92s>=#go>rtyPE zv4F`r@zPJFg~DGaSIHczCtf^yrtlHa$^CXhgG&IMk;i#{F_os2+v#VOe$$Ada7Cm8 z=KBE8eXGdK5sFQL0)-bv|EHr+StT^JK>L z-U(a%kubz^a47E_;~?By7Vm*kWyAWf_4t)?=CH=gF-HJzqjUj!_gAh&x_2v{8G*)b z=UvwViBbxdyzCKfPyFJ`gES^(G5tjZRcarisfcO2Ombm`-ya@k)1V}d|Lz%IS|!EP z3a`{>*>pTW=9lNYudK6QS+>7=hkoKT*)E)4R{Z<5(kRHt>nH!GPW=G0&kV19zH~Kj zyb_la6>nK+))o_|lle5#>=Uw7t3wQ5b%6{|pfCdXybJ1O^7pyPi*SX$eEDk{9<932%0+bFaZTG$Br)@er)3k4ZJZ`f#e1RW=5}mvw!l)Cfva`d;DORG3Jn0<>BX+MhN>TxFaZuEWw#Th6D+8ca0WtR?_?7 z7){mW80??9^@RtEUC!r{vfM3ZC&Sx!zglN(_CC@s#bh|%-6*@NC|_57tcjH#%T*@) z1G?zk?5??DaN`v8?JBG|QaqM{BshURu!nB{LvzK*CE~VSddHjzjU(>Y?6cs^SELG> zW%wzcgf;^Zp>FzVjLn3RPu$}7JMp)8uh6%3B#Pvq7_=Oj z@Q208ARAO%VNAeMNj{6E_?l0XTF!kf{7{2txp_Ih?!%8?w%g}jpb-`OpOd+(vWU09 z_28^IR0zfxYWR>Z>6mW*`h0X|^QWLj13G5Z0%x|fg=#u~ovyaCs;bH_6CM0Q&nC<# zsr9BNPp^mF`9(sVALUGUO+CodMCeWm#YcoCbRUQugf2OH^Eku?zKw+{YuS2A-)0M$ zC%0Up#;`xk0T*n$*Idh=Cr_zrew+B&|B!(lY?td~F2-PhlQuEVkN%a$eBKDbUFa#P zt6HmS<~K+DX(8G}uO3x^zbGhsU@TU?@Pe zce%x8k?+fKw2IX)K!xTjITrw}H$0WGg7wkR09A?1y7;rr&F??Bqr1G|+mton*nCUs-H9KN6;gH0(jZXT2vE&*E26OY{Gj{h!>B4nrZh%yuHh0Ww!p zirqH>Ct}MB5s>>Znfr@hUU%@j<@pK8VH}mqaO&zV=qJNwr!0Uk-?7W66=PnVA=nxM zJ2nmccP|Ke%w~dYMR)&2PF!xU`d|reU%TG{fT@oPo40Da{_`?-3u=Xe(9i}VM!9Hf zV33k;n@{gGy(*{``HZJ{9XXxo^u*-7aO%GPxJe4mr_}1k36+naqNW|ll*AP@8~8%z zbva10c)vWnoG~eD`1Jc^DBHOnXZlgka(GFIr?ioUz~MyXqNJMpU{3qQUSui3%UX}A zb14nt__<*pd2NcAaqixwuDPolW^n<`$tG5SA7;=zfQBlkSTf#aYmM73L3dIe=Y6=R z<&M?OmWfgm)PlxaaNPj}{OYA`{G?j0leo&|@Nc;;$iuPe;=PpadB<5J%hSEG-ix5& zt4D~bXBt1sUANHPv`QkiKsqTi|60j%9l3Tl;9^4Q(mfI6k9cUVOGT_3dwgw~%$E<# z8P-;YVbh!EZVm3v<=1F|Z9FNYV z;|&}Y$vWq6o8LlO@uoa{K9xu31Qns+#iS$W))!HNMig8#H93ubk1joY;Ta;z)MYSl+DLsoV@T)n7hl{Zd95Gj?)FqN zY#t=NYpxconRvw_%R!UMKOGOyTRj|(M|s4|?9&OZ&biln3jUND@%8@i@z>h2WUQ-m-f{cSP=<)@!Uw;@ zayYIDb^iXLV2oXd9L5f35$c5x>bDuUTCaV7Xkf0EWwR?dIB1(VPsFVZ&Z|Fo_u zsMb=Vn!Z@}mECEd$y?8aF&DJgP`WuaP)V7++pXaf;o5yqy1yKD_x{iQTFZ+Zy~S1U z_0t$Uf_s$cZL6k6*QRH>G|3jc*(=zG~u~j>yEa$zCTV;glWP# z{BHH!R0z$;>X&3vZW?vY)cD$}tJ0!bHfF=uBhDHcjDUzG42hkju+xJg(sYbanYZbkflvQT=9G4bDq6OV5$jsqH#R%LTQ7t+5q-+Ju zJg&P~HZSxyr#=RsL44PItG@uRP~yNhN@qR&TK7)& zBaLZ*7O(Etryq)t@(jYes%Rk_v7mM(pQvyA^ZJ9 z$y$fQ3eEJH3MOLba;#x;sYp9KDuyL+lhD*PY}Bj?_2h%CSyC+mlU-kU!;1JONX$^U34cTfOF#Fb3K@+urx*6cv3qXnn9#m5il*RZ zSoZ1wgHd7aP_M+%+Pg(t)8!AL?uv?Cs0U3*cqyE2P_(sfxTdeb%sN8Ev#jz>^tRMf zm8{~QK9g`=)dS%6bzaKLx`@=sL+yH##;@#Aiw3se3y$AS*6>$&ZH7ap-`bJdxGYOU zNUkiX-cbIw#~jJ;`jahYTHi|cn9O)X=StKoqaGqq!I`v@QhFCQQ`-WYR%U5JnHEQw zeRs_L4>pwpI#4p4M(yybO!sCxKE=oLQr&aq;$nddH#J*}O#B!d{We9zS!fNvzEuiW zkC}$-Z7M_+-kFE&@AjOKgbv3dxsiXWf6v^Zag}$N3)=7Za#q3uQ=%A6voQjNJu zggmi7uB(Zoa(Wx-W>1?U2&1VSUzuF(h{re{;3OtB9z{|FeZzAMm0(|8Lm!MSK2NH&UVp1RAhj>g0AcqcFaSWp>cC?L5O%HPxAz{ZYMYBxv6DXtGtK zYI5jtOb%p9?>Of`wC~(j3uLoULTm^Y=6^MP1PQ+;Gca;rXkqWVav$!Ez4KkT2<}!l zUB`Q~ba2`(5XAEi7xPl`bbVH^{T8E(s!@!FZS9UaJxcmbus~)TfkNkGWBbck_oZJi z0DU~C3Yljd0IV?dpdAIHAkFXxsMiIqW~3x4vAh{mQ!FTmHUCMIHL2yDhWbWWGRDSm z{l%zYPe0Yps6fw{K+hJzx_WJZZ&%f)#S>FHxxP&uuQ3~OakeKdu?5Zvki?H%?2XA} zn3Gtlq}>JUx?|kd2)S*)K~pbL_x60q#^}ocl8+>Y)S-+T%Z>g_!rYW9{|H`kG~t7f z3~@hdq|$Yu!gk)9`QuPh1;4SDnajr_-Q4G96hSm5OV1^DJb z?f36%R$>)~hbsxY4ORvTv;1>mX9ou_MNE+hZkaKU>qVt43(<=kSgF-WX`li0RAh@c zk?uh+)oobA#dL%?F4;qkv@H~`V^d{g^$=yg?(|elbl(c;RmG+KA@60gSDIZN5(q{q( z{^s$)Jjh``qNZyP_q~btX_MC|ip6QrkUbP>23OH~^!vOJJST1v7v1o!ApOIlBm?D< z%d1^yw5Ea)ln6I4=>aPBn`WF_FW<(WqFC=~W4AVxF_7u#@IQ0iS1j(Ixq1@GcXHE# z9Y>*sQT3BFufKem*~=rNns!yvvWd)`!`*nxwDcx6ZhxBIl=ep_+OFzaU7(Qq>hqEm zU5N}66qS5A2{-|QjIG7jJt*EB4q+et(uYDdWrXE~p)sOEA@62oV{3#`KQupKy(V4O z#Tykm%e)0W(2~vuZ$`Ynu*Nx()Km%7+iueJX>c$97}Ee~8|e@-_>L}spu$Q+@hF<& zyeMwJ+|l7l731$>Jj-9HXpJuWY@~^ImCwnpmwmru4XXFkYx(}tWL*~kqQyP?%F?LA zBm3)!U5~`9R{qe2RMu29m{e1)E%o6YLnFE&W109aIdjnFtIgTCN+{ZXK|hm;j)5__ zqPWZwZ&7`cT{+%eT3F!Ox^LM*QJB|zqDm(jG;a24{SfaE<@fLHH?(-8(r|@MG+56J ziOv63;vP`Wo=g#T7z-GdRZt?J&yCvz|MqhK9yu&G-*?hWE45#m!;vgicgT2I%2pyF z8ss5F-WIyEWT-z;^7Q%A|K6MMcr)+wG!WlV$E53FfAs8Zoxd^)BA!8T%prK3I&-cb zs%~4ClM2B%$?2@bTg^cgOVAi&<4W9eB;cXIgiF$o?8dMN6ejS@N1gd;&qY*=j99{92$Ll?>tZ`wvLZG>Ic3G)5d z35~)nKEymrTm(X+3$0wg0aXnj&ZJaOJ|edLtB4Ry8}5u74vx)QX)KE?UVdwTxl+M9 znWu|ir)5P67bSbjM}AM2$|xr+i+L22R~fi_ac_iuN+xe8R^-&2Z{YG-4Noce->MQ0 z?h1Z>HG!vDoWEg<1rf0(DX!~VKHHO5k1!l)tq#rZ$cvbnt3LzD$;su;$MylUb z)boWUHrzO)X;QTJ@=KFl83alBUa5*%4A}XvKPI%ysz0WF4}=W*)fD}XM4i#3b*s+;OxO+pY>IY9LC4- zj`_0pr~0%f36)_qKR!Sg4Yj`xU+n^(h$8)Ld~`uas?sB2>iWd;O!f>rn$74!9h0_f z2Dy{Gc;OyL${nfcg`Mx0!hh^YizvTzs|Zon^qn%(#QG%kr7VX-mBug(7BlzkhVG8h z+bA9WJ*^ z2=1Ff{u@lGSFKzmDonfbcigRRi?T0QbymGX6a(4*ExvykXDLTtx{zBMQ zBqU< zuJDndmGhw`fp<;>F1psAlK8f~9xh(0-rrKt*a!=E)-e^63ESil3^ zy!@^&ijf!Lmw6OW$y5$&@C^O+{yR=G6k;>;88OC1vxw1ugh}-Nf-vs6)3wE|qMsNu zb8KCt1Z&dxy8;^Zi_ocb8`TWHCIb;0{80>47?Q3(<>HFu=QN~+i?{2rkHRXPB7G-J zyCy(*AXtZwBHyJG!7D{?^^UOXHT*Z({4u9lT<4rz&5e{MQ>A@p@<0qlDUb&a#(pj^ z`deAh4tbok9ngz0TE6NEw%<2biUxRD%DHmLR67zHu3yemHg|8=@Hhnyo9ZlN$FF;5 zM%Lpb{03Rh(+Gm8xRmn(SU#LfUn3k>{;|LezXeO!xKd)c6wbc5odmaM6 zSl{S52b=-;PFpzd{I<7I*$Q}gQtz*sqg`*3i8*Km_k;sXReU{`z%mbSRZ+x_13p8U4~ zOvcqLKA!&78}R5D;2!%+psHz6QhsB^96mQ!_(iCg~&Bz?Bl&{2Y0N@KFLT_6?sVsZ|TR~)HIl^=>(pBw?hO>MZ0(j zBf_jC71T{DY-Lw+)w_U|04peztPE)k$j7^>LHkq$%w!5e(P=L8CZFS1?|T>mAAdI$ zGLUei2%~HY@8ig0=Yk+{2PY$|a}>z!98XE`^s{M-Pn2xxniWu~8**6<4iR&|v0L`b z20P^iLhDF#ZsZ?(d06V`p#~XPgLD4%fI85 zA2Z+nNg3kA#!AcOrLxZ{d@2~&!j#38T0y10?y{>jw@8^p30Hc^vJKqSF4UJcYSnmU)*l>MNr9qIJJJRi0T>HI zF|=q*qwLdePVe4d1-|T`J?iAmgj=gC${2N2Z~gH}R$R6PUfb#0pUTv>Lxyc+%?-`= z!t+x+oX>HtR6D%%@-%yN!V^|hqCABsi=;3tR0)r|K|`c~m)kFX{TsVd_5IJ)*Vxt9 zUhDT4{^24!PyTZ>zPCI*A>c|R{KmYm9Hhabl8?)6`zQ2Bo_|aef`Zrs=beWIq zrD|(vf;vMxr1RAeR8zFb3Ju;V#NnXS3h~35s%o3~#6-L7vdgVec=OrO7V*;SuDQ-0 zSHA@s)_7NYw5ZM)iBZ@wLeSm-d>5V?4Z6@Cj@28!C8Mg!4B)rU#9K&HC3>B<~G4Usg4|AuS4kI zL{B+q?tQ+j{WFIKeD~{-rtTm z;%K}2>Z_$JOCir>rGyTWu-zyD5hb#>aln0eX0{HU;`rka6CQPT{q_Hqf_u5mnKw(y ze6>CG>_k7L?6Jot*_LC**?Zozrvys&mo`bcs8yXyk%c96B8a!!lEsU>?%Qm=g$)@p z&{j$4=hXYMvWi4;XC^=Fz4b%)q#&{E7-bujrcHmzo_z8NpY42g{#^Uw7r*G=|1K_; zkT0bT1tK0is4V=Gd2EY#<&{^gNjRa5|LRx2w)^gT$Tr@1Q`>8=J(Yh}y~9i_a$l%9 zGpIojXK!(ZAHc=u7zYm?sL;^IbQOv}=OBz2zL6U*9(eeEwbAX~cV~a;OZJ^_o#XND zzWXtIY{H{9=hZo$e>^mh**x|a*GLJ(sKSAN2;?aJYym-8qAtsquk=sSvD$zGzI-NG z?Gk2FnN0{d1zL-s453qpLbVH94*7q- zP(Zqs?H3qlP&SFHAfHLCt*f@reeSdB+w1M#d+)SA{qaIO`k13V9*0PBP#k>%-H^X; z&5+}sa%flRd+?ya9uLD22LLvU{xb~?QY?$CL9`o`;ATI_bML+P_7m$r_qoscnFX)T zU*L50?>(jtFw-?YY<9K10qyova2bEz;O;V`@}#aD9Q^pTVqh_4F=Z0@}C z&bISTJK5ZsGwt-xe8#tQ1isTIesPDL|Lb2{7G|q-Bxlxs(BL7qlhQ3${~UMRadykC zw~3dwcv+7=`k4Ljhd=TaSO*_^m>=GVvJLLfKKrbHl|>z7-}uJY?V}(6nD6($d;EAm zSP(uA&I5&4T}`#Rhy!3NZTRrvZUksk+h^OdmXQ`dd(J#xT|nF^Q(m&$#oJz-I@NaG zeRsR<)|+kL0}t>|1CGCKyiI;#iZAo8Q~RX4h!f_?ZwbaAe0MKDYVys0FQO-#$?e-k~h}TzG`r4OYI&5uu_4IqUl${QHBk_Cs zrNh>qS7G7;@RDX02Ln^90&whc3ReAYK$=`SEVmNieIk#pY0*tt)W7bfi zDd$mNhwGNEA0b`0=)g5Pp4Se%0#-$Sq`Zyf*%TJ z^bgA-!%|mNLiSI_{pl#p%t|w(0uN@1HcR*sj93~@9E7DPP@?oAC{|SHJs>6ZuDc$x zV~_iw9dYy#wqVhG3F^vUB+Se%P8c{IWzrA-_@_VHfd?IJU;5HFg1=Zkp_I%X`%$At z+G(eKM#6lFy|!?P{rnf_*%3z`WBcrTkezhWN9?-mZn32j&X0fJ@wVT7`?^3#JrGP$ zMp!1>b3Al8_y{wf9Uk|LGtRIvV@62eZBxFt+lN1VnjLuHG4_?OoNZI5&avW>4%=my zZEVjy_tZV7XLn7OASZT8$@WzY<)sqN8*PUjx0eDw%0J(S;s68zll|^2tM0Jo<|bE4 zUt74q4mxNr#UE++-T$b4{*1G2|NRfL4}9Phd*<26(tEdRbFAA`SjVg@4iRc-~M)) z@PalZ=dpM~#r#5Te(=FZ+mFxvrM>prLi^g+eqhU%EwRsk{&RNdVF%m3`|o3CpZ!Hw z>^P)x-aO%_^ep?wAVmM1eDa6YXNTK8cR%QYIR+5w&ulBo5`KKEe#VR$ejwVRhaMtY zVQDq9sURKj4y#TQo(L~gKL-AWUxCvsGr3`(HFR3!!hcX!*$#n_Py7uVe9Y75x;h`w zcxS9)XaZ<&_D%B%%U}NDXLjR_|Mipa&-%hyw$)Z!Syg3~`9YS@s1zlPFer%_kkp90 zm8E2>kJXlb>c0G#ErqXOT!_ot;~{rhrOQZ>rBCT|^4UQO>H!BI?8^L$&p&Tpl7jy6 zPkh3TKlWHVOZWHPcfZe?pY_Er+Qyq~;&?*`bal;+|;@D>B54tx$2@llCT0)iVNp$+iakGb*5sC=6D$ z6)Q1Th)0auHq^Uz@L)F>{^$oku;Y$C+Dq4W_UTW5#%9f&ZC^g~EH~=0a-*rG)ovMohkf|ukJxcX9&L*kFI5%cpeWq! z_T012*oQyz5j#jU$(Dlus=V>H-|qDIE%iZJMU{Q?oNsxX-=jYG*FXO$Tt&|`4Q-|R zUv>30cH;5xvoD^0x*KAU7Xhbz(JSu<+yf6h;C12b0?rtqjTk4qJ0cxpM5L|XYJiii z7eF~H(TFX@sj|hLtybKw7mzio&_-RG{90i3R?vxCDYrt;%jA|SY;oe2$f;91m&>0x z(J5}u_4H4Nr~T7zUH#*I^iPNN=ARBv`={Ny`p5g|pAPHIKOLU-PrG&XkN43(9hQ!h zj@O%i+O4a9ypR6ru*BJN4aQ|6v?XG~i{%!{>Aq0+1-ce2)%^;&M%`l!5J9FvkHLo_ zpcjW{HZ0)X*4-hHqu|HG$Y9=)?~w3XXrKMusWxob2z&L_`TpJQm!`gK^^Gf)C(A>{`NjId6XM-^ z>#_FR-=1$rAAOh$YA?L-yxg-kYxYbj?4#|AUp!5U@(DJ2^k|>0;>3FD%d93igQL5m z-d$7-`83!UzVLZF;e?~5G?x1(^rlRC-X=|&W;^Y)t$qD#U$j#`apZ{9d+c9K1;fA z;e4Al>t%c8mFen-ZR}g;eBD0v$&V@TQVFxo5@y)|8U$h&Y}FsN5{6f*zot!l$+rzG zd~J~{-R!$R`Q-Q6h!J%*d-hy=>gng~w(+;yC71j|Wy}>$huRUsY0$s{e%Ro_2OnS` z`N#>1yU_ml$3OeY`&*42V+S6*pRbH~_Sq>m<;CZuoGg*@S>&q&oNQG2NSl1J?Ww1p zvH=5X?Zgw`uj@cx63o7I;zVT@J{#yZ^cxPtDEuDd0Q3qC7qYCwX*(XXzEhZ$m2ydc(8RPi?F(Q$;B86A zg)sN_IQSKpmbk*cV)^pK_@;CUqwoCCH_<(S($1IxmqQLc)V_H3*|x`f-ea#VSz^yV z{j^Pb?m1h&YL)G{^Un4yDWS(4eU$2=eB~#~^iS;x8DF+dKCDdO(7k3Up^lUs%knW` z3=n-{atv~MZw{U@H_Gsr7B3=lkOYP^1k0sdJ!rQ_=fg9Z(@4}Iuls}`OU z9-rW|&(1dm99)Rf58d(w3=A`@*x+zF8ksMpcps>JeR;dul{yFhQ)X3_6&~gX*~xKc z0QF}t|6Y6V?TYi>sz3YjUl31zRoAVy+1gGy^%O5(o#V!j=9XsXP5bY^zy0!;zqG@T zKH9$|!1f{>pJQctKc8NtJqHgS>|ZCjOZRx9kL?XNHzPs(b>#o*VU+?Yw>@&~!;e!v}f4>bG zG{`^IxQoK;8yakk`t0}bPTVQ}J4ih%e}UGF5#{+q0U4 zaK0KrJM#Hf+UOaT!FeSZ7q;1E8>dm)G%Eh|5A93Zw;BqBsJebV0F>?q4P{@@Z0&7} zt)pd;UdRgQl&~Pe@{#S#GBQkF6e7X`5u^lgX8;=QtR}Dy4tWbqHV=7VriW9ZJ47p; zg+YM}FK5U~0$CBlq?lyk0EJb{vqFvoiV|9bcR@-{PGJZ@X?fTHAatiguK8 z--ZZXyf-{2zWPgePVndzJU9L1vPf=n&wxLm;KLZ#keOiZEScHV$Tz!{vR3feJ(9%o zy1#!?4=Hq3LoNMG61o3}_gEhOpCBse&=7(RN^=y*5pV#Muxv-0ghvGZV080?_oUGB zsi$_rc*Xl{aHmz2m)XjOF|9isH#kk+oqdrVkaDbjQ!=Wm-v$H54`_G{{}Vr zaBvmN!tcHJUVCxMD@rd#K=`u9e$1H7Z1>%Fv(1k*xYP0rq8nF%U0NCn{6ru`2)7+9`CW2Uzs6+{aicz z@Plmp?YH?J?53tR+hO~yZLhs{w;@A^SW|PO@+z|0nmYT--!8Lx^XA(=`|M?h9JHU5 zre@WnRCV}|&7HTv_S@&ZcA)%Ol05C@SM2@=A5fcSgl)0XS4p9&viYwrv%TN5lj^&h z6+=g&Dd^~xSEl*ukMfE_JCtv}4;gMxKl7a2)4r+#IrI4AkF>3}-qOoOL1+JUMOlq# zuGKEM@M8Pdl~?<@2NzuUYp2oXX7wklQ`LtU0^G=|e_y?#v_ZZIZOTfO(o$$euC&|@ zTHsB;``JXg0vkRrgsySzHgncYyWsbKu;)e38;=@oW4GGcHs5?RUmnitnz9OwWzl$C zk1HPZP3`E>>4T7n`lfkL(3=IT2%&P z6eawgyYIFdDZZaN?X#X&;6ueWYvv5Q{<`bDmp`d6wzK#bE>s5ej1lf-DWoXod^T`5 zDV1Z!jCCavVD=d!A_g$pZ`tw{j@P_7bKIzb?o(A=W5YMv$PXmlX!tP2Q)w!Hj^f;K z{q<6nvi6D3oMr>0^mEW2JQyPZyyc9~e%2;Tm|&m%{O9d-Iog2w6Gk1NOWJVZg4gV- zfBy^V*-rh~$JB2lZQ_K-?Vfw?@q-!9IOFq5)8+=!veFWpGi#Pz%l0QJyI=kK*ZjnM z421Q zZNA`u0T>1Qz3C+hdPDrg7Y9@7-@d-_k*QFc#sxQ`Oe@sjr5O9I0`C zoNc`E#`e^cPuXoZ-(=NQmFlCrCMxs6U+RL`sa!hVj z7h5PMsbA*InQbGL=SMz#viS96y?dUrMGF^tpAXq+xPAE4Q=QMSy(t>R;ZrM=??*m# zvipDeYhSZtjyu-di~Qqz1LfcQ2V=R@d68u}bES~&UZu8h(NdeJy3C)ecU@z>ed^Q` zY{zk9Q`45TEc!B(6jnI^dK)EoeZzV*04Q4~1v*-V)pBd8pJ5G4UeVxbmS3}VviwAN z^KuGEssb$CF3^jyu+5DC9VmHJLW+N(8vxi&K$Y|GZU<;{Vl>l9F_YdEDCqKgKAnt| z!SG02;vm!|JV(zVq&wv3CT5phLtN$Nez0W}B3y5|B;Yu$4TO(`OmYm|GfAUMxJ%~| z%S!uohwuuB4oLIZAS{Hz(hKyg3eoy5Di0eNMCBic0LVKjO^5N#ewM+qzrC$3qwo$FN|{Y-ZIhp52N&Muhce4-Ubd~nsw!)(epRCswPKIU z@?#FTL)2`^C@CwXb~j z3vRTb&ShnKpNhAkh-F%X5`qDTa|2j8z;+MX7eSxza}SfEjvtBqHP+w+&i`B=CEsaiR_z|DkLqEM+;jFwMF9`v{Req8K=%Q>pGqmjrYw=~`^fx@S zu4=GNk}`4Og@5tY2H*PDSL{9S*~@8Dq$D&XcS0w^C(t#mj9~`@0&On7OPI9Oii&C} zmK<^i4U~GAhdWP9_~r%=fv(w-!gtf3nDC^Ololy{TiaG!ZLRj<&^%6IZ&4d|T5&0- zr>nKqmqltf4usPPuoWwt?fDmG*j@MBE151B0LEbesOjARfSSYDV7&6_K6nkNKo0=4 z$ykNPP}rfLNIQ&$!2<{Qb^>Uges+aa9gAWcxAuS|e5z84APPDiiXX;=s;VmINdS4k z`v?n0z(Nn_8J>dT3@&_`gtEXRUMZKc5%C%_XrSsDly&HvFKtj)W|%QfGFC~;sq&n2 zv1|q3$WM$?N)x_{QDk@Cb+`TYm%p?fciF{GKl4oW#~5!Da0f5S0V zP4Rn%0rCFz=9P}mGq9%kYYKZOmEAK8cs=pcVQVj&6##r*634=jHofpmBoweusi2@- zjAgV9-)NkT+H6-VEFPs~gO#pER|y+QR!(2IBfKFE}cGa6E!@_yZUx@jm_A z4dm6`H$G8DxZ)hI9O~Uuja|o?0<8G94j8HXXAj{&J zeQt8aeqh}|R}u+BKtx%~N(h5kF$^HQf+u^yE2PvjTiD#vB%xgbq4H(lHcB+c2nd)% zJ)|J8QfVT}FhqKmD$t=a1y zT-cXNd6eZsw(1pycTPTUYHXI$Rjal@knQl9eA?--!;ZA+(`Va{e)K&%`|LB^0KjZ& zO-+^8-M<{5D+&X3YHV2L1`=j_aqu7%41{0yWye0E-BF~1a#HH_0j{($Z9=^e;#pn` z-o!y^3i!5qe2f__8CH=L`{8n|BH>(wCeaJ+&2ndo=brG6g_#UTzu!l|GyQrMsX zy5{giW;~%;y;~)a(I(JCTWc6UoYx_VP47euOr+C~;^YhfE1KK@aPR#On0nWCU5f#L zKBJ+bT@HHWG(bC1VBM zXz-u`_UZyY4chMG3w%h2Ld*e&;R_(5`Id~zX}8g%Hc~kqcJ>#}^6fpxp71_9_0&^+ zyG7uOlumyHLkx~*zM4?3@kU)R(o#3eKUfT>}8)EKA`T zr{qOGDD)UG$gj4pR=lXe`QDPni$lNF)P%N7?!lQAH{M3dbJ_A`KC4eTu}}E&1bG7R zE6V3=33vvIKX}8_F}(6AQ;a$T2G$v$6ov1DKlMTJXJ(#yP%ioV`5tN$p2LBtowiE+ zllMb;MFrd<*G7b4j38|4)Twsi?|*MkKK7Vh_RlM9i?LfJhMaPDqyeA}98FfDayNh# z0Lqd>U^H;8ZK+w~bXzd{F?;c)hZMBTDoRD@s#p;-`W;192&2USP^6a?1^`w8_*MXN zLg}ZfMM9S9C@vVs7cRoQ`{O6az55YHoDkG&81TB|%k?aqxWM`>I~T_N+o9|?m>19w zWfM(zmK76s3$p~B5)JlM5@1@hMH<|rZRDu!ZOiQr5Mvvyn5+V*l?yXG0C~96Jw->C zhj%uJmx|$s`*;li#Q?lGSgseA9P@G@UWf`cM4|)m?UsoHFV6@l`n<6G-d{>$#$u~5 zb*{l-(Z}+;b^`$E)(jd4BHSQ=1l&R$x*Whu3>Tl%*R<;v$N%8B;VJE~k~8)~+~|OK z4UlA&hj#%W#6aKB5QnPq4QG~3LL&%4E=Wl*94H}n*Ijq~%&cc6 ztgVs~ieMRq_c$v@nyB=0?}A(+lmXz+r?QAce1uZ+BR>Ar8G-SJ>u<5ooqo22MrO4* zM^;xH6BP!OZX z(4oT}CxlnN%YN5g57>`?e7@a%*MDu}(IXvignAq^PAJ!$-c7rao^aZxgqe3K8E_}` zEBFkv>dbC$zx|#zbLMRO^{;+nXMW)`5@c67ZuCoATT8AV!wQek*3^&wM*v5Gr_HJ= zYrH&o2G4}Ye)D?kKJrZ39AO+B$%}TPo;duuqU50{WinDe)J`18=J>SpDMOU6z~7ju zuc@xH`L8avv%mNq(c?frXJOnnTicvhXDgoyy$@QfgwF@6EI#*zvX7xcXvqm@@mv)C zaw+~Oki|vetO}P+ooAvL>LS;T2X4^(FudE^vflX|*eRo^20V3yr|-~E;m9bo|QEdbE~pfu3{z>F=+xfyH?qGx8T8JCUz zC64gfO6X_q+_{ni2RoeyBVtg@7$=Nz=mO&(<0-t;!n-#8~%(j43CUo)JEEg@`y_u z+KKTNm1)W+58^Qf0hYCcH#iW7E3y%zoqNVC@i82-s*6+lXUv}Kc@G&fB-h4)F9u@) zSNa2kD`PAA52&rM`3n{~oslnX0&io*8S#lnonrfvFZG088}wd)jyQ*fll+NKyAYRr zX#Zf`WV=vkEAYmjd;GzHe#dytBn!CHH^hl;b@!cj+E>mz(|-D!-`Fw79-E^D+LN+k zdr>~+`k4X3bHgwIVCidTU@VuEFw+*!e#~B(`jC~E>V-9AfYntFw$j2%D`+qAl>lCW zLNWhBlz(+vA+HuHqk-N@HRSkDu*Hkj11trPei3}uOJR7&1_<$0N)ncaT>NzYa>R;Z zX$X0}zOsqedtMTrJg@(cvSXXP^U6j|(YRKCUhaAsw6r!@aaoB3tHri-d83t947MRd zx3*2UJJ5=XH&VPoau@)ZtqFNjHf8BoUN{C!_j2>_&I7kV3t;-;FtG3(uE7N%#0eIDY$vH84HvESh0rV7~v-9#vu@~|O8T6{pD z;naHesK)VvU;|WERY*~VnRw$p<53GVRE&F++rk2r zno`?)uYK*6SLWC+fAJGL>x-YURShdV9Vg)38CaLn_RBFpTri7J66sWQ}eWOyAHC99)U; z7XG9bsPD~{91K$#dtu5fyZN@;d@${{XWs^ZLgh<&D#d4V*)tD~uw4Y2f#w+d&=;rQ zLpRV-q$PlDNgx}U2@c8&20hA#_8A|9gA=%sjx?m@@IDT`i%Kl@W$dvU z;tnaHx7>WQ&!nGw?zx^{;A2_G5eJTx!PsJHJ74UGb)hWUjC8aUj&kuQEn(zE+Y+C= zaD=gxUscJq8EF9Wg17U@PQIuBfHPw{j(y@|ScpsHVUfPNLiadj>hBcBCo}%6uGo0v zjl>h`Js$M|$OC*MUmhbUXeZW$RqZTfBeHX-)uAc!S}u^HAUt6s*}LGXrD-zk*+o@0|1|8YpoX+D=gbO z%U+%Rn7usp5v#7s+9sn$*^t^%R#sG}Xc`1L&U_D8{iOfZ0Z_As&*jTypRG#CSoZt_twn zBOB$#6~XUd=>C-8BHCUvD1IuBz98V2JS31ym6S;^hgmuF$TJ-`xzTM9UVIiuFDf?- zB!27%W+^h)7}xh(#&FM(`zRE5FE0-pE+7aY7@<^iVAaf-Gu@9d0c{}Qv};`XxN$#G z3KEzArESo_fi8rxH+}Gs0k-o_+uCWL`;_sW{5Zo`Q7MHooAKqFd}AD8l6(=W5Tdd! z_=Y{}+*1z17J?wcW>DONGK*r(vQrEI2x9DA_e0+_rU)B0bhv+yK8`PznsfHRMngBU zl?^MM_9S_tsYDah!{E7Ah59$*H`|wFSmg=HVXR>W-6IM=yrKhw9+Z1L@pJ7WEFSQ+Z+Cjp9 zmC~`KKJ4j58Dk3o{ZL-PstWe8avlJ)m*F#v7#LaVUQ!&4F1Ou!yZi03%MLbb^IH;dRdc#LqAW6ctG+C@xc-Dx_>;_<+x$j3iexx?rr`o+2=V(aJ-?MjAcsX6axRCoz$O3w;_j6FYjhTV9}EmmAn zX1ndVTb~91=(ZSxg8G~G=IbAfV`M^TiDmQ98MMNZd-l%9af3n_cn8LUKzoca0R9yf zKWGr(nY`nSKJkI543d`c^gZRqINZ}Nq=QbGp{5+-;^19`q2S}sm5>4+s>| zkvIQD*H2IuDKq-5e(fzR*D`N7ekl8OL%I-$bmr>_tL3p~2=z$XDOV5hC(K(kT|K{# z@mH&3x3XiZbq7z8%hF2HzK=JW&g+W5Hr|AZ3dj@** z%fs6peB8((Fzvnf-oE#d=Ljy)Nr`4mF(wh35Q-A3%9TK*o<* ze~P{!j5Dhi zd0K~XC(mHifVa8OpR`HX-_A@Nau)X}=+u!JGY(SIds2PCes7Ey7!$IbWq?s$ybs=q zk%9baFZvyDJgL5Njb{L0Y#{GoObN?rX>0JN9Z16#5rpfYGz7jw7<~k-g#74x(Ua;y z8Q@h}C8eY-)SI;MsmjV~YiXwJDr;|rucNG~PQtmVsX^_IoQVPgqN+f<#A?S`_z71G z7M%9ab_ieg?~@m_o1E?=&!z4_sBeIE;rs7gprX7trRb`n?A7)$pf+J_mz0Fc^S_2IU6XOv^TH?hv1bC*L*dD~EZBe3$ z*XHt87zp4?T-warlCtH8kpN==;BBe00A|De9-QQmJ6O>W>j1>|kA6JIc8R=)vLeo0 z35!M!?un0s|A2oEca=|C>W;s+jT|dPFaXdlr1Jw!#iNKrI?9b@N4g^K(3fF_0qMXw z;?I@#z^Ma-TrdD|Mn*wVnHvC}m>3KIEqxjQLOU}8!kzMy3q8{}tS18ipiUBVwSpDa zo_X2k&%WPYe(@ozEbXu@HXUoVwVSKahG_6t3SkM1ouCTgt1^BMgVi805sjV-{9EpU zIQ?Hyx-B7(HBG{Deq6b%CH`v5(Ubdbc>z7*CtkVV05LL<_6Gv7(^Vekg@kVGPw2`` z1g|1Gcu6}hgapS+knX$$c;Ygm^IPfS+hZ@w<%~k~2#UGdqU5=dB!o05Q-3H*pJT41qwgH5W*>8#QEO$zL(nq0N{tfv0{PG>??Y19h+if?_KeKntF-O@(BZm8!MWN%3OnPp zva-he9Ny`tU&kuK2fvNV=+1`3Vu@Y9c^ zp`NZJB>hUidvV^Mksn883gxO)Wp^rn4sZ+ynSl%K1n*(>5_{1(g8(Iue!?g~er#XB zm=uh^$Vu?5F5?GFwJ`ut21XLnVrW574?HZo_#1#a;-MloV4#vvSXf0FNSHAYi~$&& zh~n?v#K3|9kXR`HNM7v{q*twKu_-Ukv^(#;$Fgd;@EO3ZMaR`{pz}9|(n7zqr!Q4k zJQU;#DaOz_VgZUabitVAoyVwCgd0S828XR^dIsLb>!rIwpYQg z2q$jL7rc~Br0 zC;Yt}bvWtBgD~n3@P6c-72~nWfO}^CG1BmyGd3x{E-FXwBlvE+`koa4MP;@qF#xGyrZdNcqCoJp>*_QpxJXy#ou>y<~Xv@mO1jor!0 zYBsmdl3`NB^uqC~sM9)iCv?JAA-%w1B5D;BZOj1xgA3@CANTRvo8Owk(y%V^`wGJ= z%#x=Bd_S}>CP?|yT^sM-wF} zF0G}lycg9WL1+v(@J8}hqQBr<{5fHya3oIR^lt4ANt6KOgiEFE2jI0Ca0>T50Y6^) z2oBI5&vE9YFG%MT^9Jz8rOS)Y(M7))9wDZQ*9b99+8?0?p#|XtL53^O_;Zi4zhJ=v zd->&;ZPu(=z6YD7jvQP?Ud)~>UcA^11f&OO1L_?GDB|GKqJX>L0>AZV&Jm zQR+Si=`txOX+OqeeD6DOC0)Fxpj&>u0lXpzwyUM>6=Ipa0bzZG_slyLZ#Dk1wtP}~ zdE50BH$pnU9_f1n=fiyg<#pxJ#V>U4SDw}1;$LhP@RbK%Hm-|#1Uexuyeb^>heCw{ zf#Ma?04M~3jzb>rW{B+`mCi7(dhP$@T^hz)mjQr#wg7Mjz%Ap)OH3=U-S*hs&jJZs z0D2ezlzo^j4gDPeS(cnaeqFF8x_P}2XeHLTCxj~VzUq~u1W4!@8Q7gaZMfj=ph`xT z;8zcE?=C-oaPM4v*ZZR11`kv;(Fw(CFaUJ;3V?E3v~amiocN@@I(J@T0AK~c7}uK7 zm2*HF3R2CuR#>kF0Oaz5f|b_U@T@JFal6fab+|;uktSUV)UK6Dsb_LZq>N$}cx&-(Celz&dtt&k8G?!ycU#(^}CkA1=zkNrY@ldv^4VT|q&+dE0u&k*a& zYZPSzMIk5#0q~D5w86UJ5YrGJhXT&EHzPuf3#7{i()git1KdY{;^TN;xNxDp^2#f| zgdYX}x#ym91t0&kQV*c0v!8X#Ew{8?ciq)?*<}|SJ$kfVam5vO(@i(Ip&-^Z&agy0 znDyY)=S?@=)PDHGANsig%$g9tCyo)%EVDfF&O%|(uosziaxT?R~Tc=uKEnC8!apRTn7vRaeQ>Ap^$e^zjr6Z{(xQq z`a{mgLJ#nMT)P3Fu(%-g6@VIJzjo-~xB?)I@o4xDWhxhynR|akx^)`qF9_wt8mFPF zx?Q2jnX3cSnhCCsZyxdhKr@NX#cC+d04QJuK)Eeiw9F8U^|fU@id?ymGhzgb5FSsbc_$aTA=u$#Dw; z6u>JsgvYo*k7x4nw9!xZs|gj#i6}W-dWRfJeS$I(tq?750CsY@<5%^K>RE#Q{=cuK_;Eg zGOkvc0O>NIbzj;kAZ;`{;2#e&!XL*yaThIGWYecl_vQI0_gp!oh|ghRTmXV#9TXlE za=zuy;e06eDEgahvWX2EG|0mvzOft>ca}Tedh4xr-g)QQq)C%BzJl@{aVHK&gF_BE z#7;To6x(*&ZEd5CHu7{aPH$}$9b=uP#!b!3-4GCrf5E_~m3uS;&}vclA#&hMS}2;{1Zt|Hcg*VXHtN}26z1%Pr9O@vZI zo|d9g4o^NM+c2TSppac8C;H-G+on>TNsFU?1}kNC2L zAIBb74l}}`fN!?hX8s**X68}m$roiEWgkNTLO3)2gtG#H^3(V-4yhYyCQO)MU;EnE z{7Su0=qVe;|C68mq^}m(YOAem?AWoMZ)_Lhkv`_z6NpDYVgSgrHmJ<5RX*{Ij{u>q zeASQsd<%)MKncV`K4C>rB%VlDY3OS20E+A5Ho14#8<0=Wym;;zzc;@KF-%vF!ZQw> z!1eX!l?L*ZODo~gpFBJazvLNMExztukpoikR)gNc))aqTK`J}J%<{h4l6Q>~$ zLLuZPajFA{rQrvU3H&A)uiW@3UK3X%6&QvBcuW_*X`0VN1lkAJ9|nM#i2o7K=^o|3cLM-D8}bWIrR8Y#&BN(2JN(!P11 z%;??>fKzn+0SQk1z=OP9bJ?U7W3CCW5g%a*ZiuJeRvbSpFcH8x6_{%Y%X0nXU->7i z1=vDBKEVhO+Q3WbuclZBaC-IG<$!yj!{C7EpLT>n!_i;>1Orz1=5SAlWpJn+`|z2; zXMcTE@RuxE;%Ui~L-<&t&p}Zr+YvYRH!bMVp$Ayms`iT61Jh%_#B%Hqo1iZSg0v{W__&dbs zHR1kxK>4KTJ2)`KFI~3oiRbUrbXY2WPgFe&Pp)aek32}%TbTTuucGJ?XSIyi14KM@ z_2PI=Dvr)jqDsDd11tv^AscUYd2=3=iCcM zeje6e5J)M9kC&OwKi!xSzceJ_a98TkDIwgK-p078@EoM?`vT%527s9NT7fuy;3xn_ zLAkzKAtY}AcxMAjdiwXgu$l-z1odzYbwR02`cbbp6n+c< z92}V5qZ?-EB0oyIw+5&m3NLt~vBj)TUi^5#9`W#Fb_|zR-ckBd?D_UEOZP{O8fC+V4fCb^DBiLBp18(3aE~$$ z#OLUuU-T!h^fLfnr=Nbhz3{>dzQ=#(op-iljycA!^qe~$7zDxNz^oaMSf$>2?#;m(4FEl!fxvNk2dAz#k5V2sAP8EU zh{6p3x?=@^T+RS6Z;oXo8+_{26MHcL=*DR<5F*~akmPERHvqgz@J9C0pD;e}2pAT( z(Vr_WzCZz(WDvB1|C-pv>xV7_09SwpOgCbxyd0B^kfe$D3(xKbfFy0VbUpKk5YqtE zGZDBvZ3M;XEvWY&&AD8TJvBeg)`R1GZ zj5^Er`Ls|}+yTmuctxBdL_b`tLxdPNUB~EpDnP`g9ys!d+XpVZ@Irq+@W2CopMT7s z`jQWIA#d6PyknV!r6KxvhdAyDi{Yw^-YvAN8w=SQkQH9K_mu(|1LXYu11P=o1ouhj zLxAo@b6xMYba(>Y-g^;x^LwM9@^c0Nuza&Xe*KV-8vtm-{xkr@eA4)FpE$?6=RFXw zfo6OQSlCzO04)W+A;q8ZBmUtli}dV$&x!!}M~-hqAm1?iA9zde0B!ah5ARNhbl=|w zfL(0dxYP;&Vrkq(13>tsTye+&ldK=#J3OQ)?3I>jKBo9<${J%RFZbWn25 z`4OMGq|&P%-IpvSah>S6j}VD44dfAkK6X)!YZ|R?4*|LiK7@4-ca-_b8vy=)A>H*o zp^tWCHjY3S0%CfNiMEa=z37{*4duTL7ruo{qE1X5{QC#`3oqJ`b`EX*W+BeFMTmV7!S7wT?j83SKOEkre+^dt z!WjXa55TM)N^zLM^8*C+qU_>zeet~hg@|WVl+zAB982|Q&z^15rcJXcQ>OUo`e_9} z(j*S0m|6QVW5)R5SL4Qw^S$!S;xl{CL3zaKsU-IXlnrjZDeWlhK{*Ob@QE80bRhcS zQ0ODzp9Y?BU<{+JooU+y$gHBeWL&lYNO7G*P8+I z=#P9S!WB5N};N zZcPvj0023GTbF0n z`jh*RUm9XuwOB3;zvv&p)A1u(A#QO=dENl<{{gG@UjnPOArV7ljb{H1TqkDGZp&7_ zCLz5g7v2Ry&~ocP!aaQ+1pqH6$yXT$r(TxON1Est!y`n&E$!DQ_}J+$qM*EWD07_v zocaSV;p4oZXS=^K2u->=UOk0n6iguWZE!&BGYkMyQ(bW9YYiRkD0ajThXi5(2>W+S zt-P!<5%8T$rLOA-vQpkxty<;F@?U!CC1382a*wjl-h32c>JVn6+g%}H-#z=`nXzXE zpHuZ&BG2-CmgZA`S6mW@k{nk6pwy(>C#~Seu&#FNQvA86eDLKto;47|qN2}p+6WNC zftV+*XS~>lTv7HhQV>p=7#e_xKYpag#d4`%ypMHxy%6yXKwWqS-$>KSU;M>a1te{e z6>h9FqTJMrrU!(&k=JVAseX@D%_nE(m7;bTa^`58MC%A5jS^!pYI| z0@PLA1V#`{wxO9<5PN4*ES7bHl zJ0F<&a@9(!tF7}FIVS-}AtIA$^|<)a5`{&vwY7%jjR<9gQ7-!iS%$pb+%D(U|ELcS!T4#HSwP#6J zXr)TulxeW)YC71gtws2>mPk1*w#q7SYm#eqK^G`Q08|)wMl#Q>cmKfPRCP`hqaN zlZOaBp2Lh>@_8l);h=HFUR}na&&Fxox3)KkJ`m7Zw%aNC*7y@Wwzaj09#A64I4CWw z4gfFWaAnUgc~OtDvU0_N?t)?y!h_(?eq(^=Sa<3e!+4IfmN9N&LHKMG@nf2vfIoSl z0L8INJRD`=2n&0Y6WUc>FjO#(qrwO-WKaK4ck)4)rF`-yJmyWiG24zG`J+U#q?&vp zI3G}a;!vlMpLnRoDfd87l<0$yj%W6y*VPU1`^YO}eaOG0q}2U0nHFzv`T-osGqf#6 z?C$MKe9}^WY?DymkT3V(%aV9zyg{q2RXkmFBoEps)6!~H)ivI3ZLL`$OMh3oApoXY zQe5UseB0U(D~p6zC>x;c*mjh&CSVUfhwX8o9ZEe{o;g*YFxry((B8~mb5B2V*k1f( z9!vH4);;}Bd4#h+pC#|n@l4$ak9bCi{n(d3SHjZay`@=Gy$S0rpESfgBlOIh=U7Ip zM||c!mKo#5dmLe0fporWh3+URadPzl95fvxLD_otl>n5>do=JQqO^622N4GC%7rhD zK*wPv2k}4+`Xqtl8UDN71L8V*2#QdsmVQK|NOnmzJ;3i#OkBCugJ-}G0r*iS_c2l5 zkjr@5L*wm$2=9O<$(mDMnr;8P>1LCc?fu@p{1Cv(s!GYwlIJB~val@U?>O-q@8g(L z@~bj~Z*+`(-Z_CU#rF=p7~owWc$Q=Y-ly`5JS>-9I0iXi?@|3CZ+mS~(BzL?f~>)7 zop&2FihSertSpGz9cUlc1}KDlDJBnj5Qy@uNVF)i$qFR9G)cxOlB~02=`wrt(Z_85 ztMl}FX|+#$_(a=&Yd!-gnb9c>7YQlQZrW!}@U}1jw8G>yDEc%2s3rv{mm2(33IUW# zH#fIPp{{a4EGW#1BjJpfcX@e*571aWu35D#0yQrY(g$HY3MMR3%s7L9A(WKxl0gs; zOD4%CE*<2>gAhtNManPJlC}1>A}cQ&VC@npI&GPiS4z;8Uwa#~R8l6CE|YDvvT_7! zHB3i^T(yKp;Z(}rNSFrx0bg*VJn&-qb9m8(F75i{SztOasJ4uhmI{@lEMR8s2re#s z6{&sNtg-@2D)EJrl>OGWCNaW7m5s8L@p^_ADZ+JuRaXtLhI$MsQnJLfJ37?H7&nAV zONO+nml!M7S@va>m6y37>}@6d{N!%EkP*~<-<|&2q};cPS@K*_RUO(yN(91JR0c2r zl$EI;+gQG-@>B!w9fc{BD!YGj<6(INz`8@AZ?$DYOA+v=?||68-X93Xa)iY`%0bc% zIZ#kY8q@Pk+d>aeEP1tyPNZb3e;JRAAq0bhBKGcPR0hf*2B08_Q(CcJ{{Ecc4n*NR zj$sN1$ABkFX23hvHP*%HQ%I)oqf#1`RA}1`g`!<35X$Q+GmigY5Daw)v%HjnAHY5N zlZNoyWQR#UhP;q?LSj0^9$Kv(eh)!Wh!<&^yIlTd2wtdeELx9Q`C##Wm=Wv1P9 z%dJ*WR&0B}XD=JO)mXi|%3WS4(YuBBOB?SkC1)}!b}_lRQOSXF<2~=^V9bYB;QhQ; z0Dp(cQFeDZB0zdspL<2zN=K#5cH%^M` z`h>TS0YHPIL=2)xiHfoK`XLAf)~=VTUcXi>Aqyp!<$K|!AmP~sJcL;(p1c?&%%VV| zP+;vv?hG^DG(`{qJEU+_R8+cf%j`b2N9mvey(D>fli-xr^Kij4Q7H6BIrzbt5DZbU z+p}d>TeFe!ZLw_oLMtrkP+v&_Xs-~S6+W|2T3sysmnbg;%0UvM2V3K+dX>9M3M=JG z!4cm6?Q0d^s?L^|l%wE>Anmgk@?&We``n_?!Yo*6d5JaEH>nl~G-9-3a0t+?t({g? zS*!ZW&(mDj2TMxUwfyORa9AJRkbxXs9X^^Z4E=j z5Resv1{d!G^(~~_McSc%a-e&9E^h#MeGm;bD3r7(bd5_Z_;DQ2rvPCwT;3tR@<>DI z8GgH5mq3hQExHrE@KVM~&X|Cn5gs}VF#w?SGUMLqieObWeFnb4SU}mlw84Y&@kdC9 zUIK1mwjY5p;2soUj99hRwYIW;r7O7zr*7~P{@xB6TTRVU{^XA`S0)-~7FY&mnY2-XrOgl^Sn0zGq$1@H@AH*53X8C+ew7WV8{p+- zS|tD}f5tm_27JO8Aq~&WoKseuaRw*Cfru;5)B#605O57`NWE#hdX?=`mi%c`@J4uJ zhP|P&-g#=7_zFB2LnC~vRlKFNR6><-AaC|y2O}xWN^~HcD4*xD(h9E^f*D3vjG(2i zC>L0{1U^;*xuB-_)Y+*=I8z6BJy+VRwKc4|aNdmoD96@-s>*8Thfh8AjI9)ZMTxIp z)!_Vxd{OvWzK`+3Kr|fxybr^B#(9&j!4MV<((W%>ba?>h_sWI1yswADA$7ptMdY-!5B7YK^W+8~zC6-U1CnwXY%JnvH8e}u*OAf|ij z#MS-7IO~c7bi>}k+r)3erCam_XbYd%P`TbN;z95l9DLUe0rF=o!-w1`z}4H3=ZF)) zQ@jVi9`$g)zMvQ6^01CT+v39eB($@f(@S^ITNf!n%}wv=-64lW4dty|)nd=TFvD)W z{dT>uifxZQ_pq(D-b%b!vby93WOQDSOc-FaRu+0@Q*G)8&R#b3${??}cePtZblURF15Jl9ue5T-=m{EcKK4C##$Sit4+HdGY!HtKvPPJALt2dh zHW4GPq1ND&hdcmKg}+-|W|fXqRb!c~G!|U+SsT1v)337Pyje(96^#LLhuKl!Ey^8v(-{oGAIdH z8?hFO=_rq&JfM&S!I#;|!opHpvAo^p&TWuT-(lmntrib#wYH49sJ%+*E9hNo=xDOV z3tqJ0!v?9o18vSM;V314=iN3{aFgOo;aC0$;iVWigb(lItOO7jfa%ymb(dt-(uz`R zl|Y-362#Jbj2c-fFGbbtisRZ{LHv{$gtvtD%(4nnF}!hc3>i4as#!AxGps-@Jk zEumd)!%Q59^EEeS#2lM!;Ls7y^l8iHOovT=X{Ie-vdH#1a35Q_e3>;#IjgNIR~|5Y zX8y3w@@l{(L=HhYBqXagrA_h%fY%3c7MGVEbcN#?x(_eB;GE{ zgy0*}x$xzJBrjYp8p9oJ*3#Onmu*J(jMX4Shcr^6JM|JSL6Hmli5Uk&h7NJ%jh8ey zM4SWgq9%V{wgBaF9}I$wA-qudppij!gRH)}-t&OI++WC{>@o9;AIfB$eQv04a6=!n z-YBvN5!4Mu5q!9hIFS$j;7xiIZk}<32Su0dJ;F^qg}kb3s=a;ds_Sfq82jQSi*4|r z!M4%x5%%1q7i{^erMBnpyE~u506@OvMc+|23cK?r;Sh1AeB#7DrCb1fc?Q6hI5_GY z>wzLXXU<%W&r;iUw;j|b%^shy(5EQxxHjjJgtK~Q;K0GcBN$sS2*lMLv;oG)h!5f9 z!!rUs_%^F9v^l()ZClLPzw*iqmnFB{a&zI@VXwYA&#G&yTC$DkeA!CHF^`X8?|2ADX7tIMrTfh4a{wR8KC}63MW7AS zZP#-g0QeCHzvz!&-T?4+fY5h=KlB9km-|NtboG}g%75WW?RuXQ#SQT4Yx+BF0Pr~N z8soYqiAfpm`+yw1#JCCVzz<a*X1JKU6wHpAC3G^m#nx~&TTzx^h3kHD6FU+vp?zmH8T9NI%>n_fV2MnlF zT)ppnl1}d*U#UuFVa&yD?&^Di$_5LdRQ#UzC+{0%-0JE|y`$RQz|VWVrA2bL!q{32 zPP`Y=d^?WO0+m%LJUaCf@i5URW1sgH24{2$^aJGEtls-d5m8GZ!ObyC#XJmf(D zIq)MoLY83#K&!}vNup)akDhqqDVsH8nzb~p>R|w2+(Ac?{sVuEK5K)whXDYjH5eo| zrw#$s025|eF%1nZUt)s+fNCL3R#maAwLpWLZ2@7)J_E0zq0wqj`IBw3 z`A~as;`P?iywplm20hopav~7{d8rnDGCKA4{kExD{;U+8irQK!xJ9;d@e*%~5hF$g zMGA$hrBU_Dh$%@KFRT>)W%j-AU10zI_f2-d0Xy5JSNueNSt(>0DOxLpBYS#lZTQel zC4f}hiY2W!d-fa~IHb}>Z8A{G{Bp~PVHTHSou_kE_cG2)D3yS{%*tKi;AM`&DDo^| zm4Mmv&pdCVHy$madZ<;_)Y*fNPO=kEI8zF{*^M{-)o#A=R+~QkWjo>c!|bG!PEdYD z*3{UbHqNRXHHZWv`pe67(uS_|!=oT?09bcmJOuglVLW5i3dwO%$ku@OcnHwtZs%Ffc=j(SlxgAbGhxl`)-~OIK_SEbC1>4)w&UsHsS1)ipmN%>YTq&pvTc5N4F(qc;h~gS&Z?kh@$%9td;W#zZTN`cu5h!z zzp%5!w%$Npl6S- zYaDkWPPoRf;4gZV@{eqR|Cux_-=yB{NLh#S**o8^*+twq6)cL|P(5?xXB zk#iJ=v5pl`Az?0Y0$qN&miKyehhPAvB>tk>mxs3wB8{$_0f62VrTcj3RNu1&fc~p* z$b=OD<8QZt!-m;b+idNJq}J5dh)$FvS?Uk@fk6X(xsjjLxgiqDbjnHm+BDWk7x_EJ zwM>ThV>q9tvK*c+?1fre7G57#`7suuZOZX?yyEzKK<`tpukwQ4Sbf{n*sS+sWljzV z1~QN3u2<-#dHM!&c|8eUZ~QeuzU*~_H&-?(OT_O>MbZ*ktX=fpEZr$9WrYch=bwMh z=FORD%?&H<6CY*^0EYku6Ixf+GM{x4!c}JNAS_?S|_fx37Qc0^4ZhP!8vsj{^nP#hza+8t9UtCz~Lio!sPq*)X?_8TTtI7U;=|#57PTP5Z zJn-=2_VG`A$)rEn{f}H{18Ym{uYbDIUYI=9zVq!**j{_?uKY2wXatC1Lr5_0XaK+x z>-`7Hy2~2?)(xN^6gpmfQQ5(dJ_HDhN)bXTaR}oI_;?ZUVoVE*UH)7{A0ZGxhZwJd z;?Gj=j4P;N=AQVZ4MI3uLU_SqnJ4e4kjHW&u2BhRH4lnA5OHKFIft|Xq>KL4g=dsL z!r=i?AjLoI^#$j!`X(yN7$4&P`Pd%t7#zIU0shuxI!&xrw`Q)Ng1VwOk3RVY8;655X$6b!EAp4Vqj z`(!vE&(;+}&+;4lDe!^r(3f8tT&+oYha2}5EkF-A zXam~yFhz;}9@DS*Nd{;auhclg|IGt+TRR=DomTa(Es{*al65tzo=dBQalWNl@@ah;2gme+Q(x!c1AM~WBt~~RwHVFO2`#u0;P)_puY9QI) z$4Gcc9RkQ102zDk`RVrG8*Y^HBN;dO^eORC`cY|+XCr;Fm6uh&l%1moHzojG{f7=v zSygUjrR6>uz)Cla(6x0nuDFvQv#h+Au_gH=f+r2>DIZzCKr#v|g^MJ+z}HLlJ`Kj^ zQky#UW#w1rX&UwZLB9a>#`9|c<>xewpV}ZXh6JE2?g>i>KL@>q;m3W?E1-Mw_O|FP zuU_K!XW47atGD<){UY?1SI_wAbiKuo&{zDPei3@ht7rUly58bPSeLv4NE!DPCdhP! zqE{&~R$fu5fC5{we3|6UW-IJywaxyuS0>BHlu>pl6s|MqMItjt0WmZ#D=gK{wieX|Dv!aGCt8L`nw z+hdRIRqsOk-EXf^yEdzRVD?dfrj=0oaD=?P)1uD7%pm%5ydPe#8@gSv* z7h6;$eH_Yhj{{JY0Mdp&aB5EOHGXyP=WK9JL?+Dq;}?|w;9O{sP{2~}`ucizlo^$O zU|`Ka7djCF+1?WlqGQF%DxckDD-N^E_%U7>$3s|YBL2XOn6bpzVb+S5Gh+oMki4oY zYdl>gXHqb}#2bQ=o3+J@mpXp|zzJoZE87K7=;24S5vzny%2BX!_yO=J>cf?G9XMd1 z3m&u^`I8rAoqO*25+(|4kKK2&VMB-cm_^>DS-t&y#S%Oqe3_)H{euErTT|;RBpC0M zANvYN8^*pR9k`JPVF1R8hWbWdA+gVXd)b|LUT-)2_n$t4j~{JJ9`HT*O)x@~*t~g5 zZ0_7w#jhGHE5QifF`#yU8!m}Qd=6*@H_E45_k;ioBH(h@5z7I%8&qYi36ZgIx8=&68@EPT;)o|J4-dLRJT&e1SLh1UlLa=S%~@Bv7pxd- z)_Vno9iwhTLzDY)s5A$rg;{$!z1zb**Wh?J)vs!_B}`mhNl!nk z_kE+%@D&kxYf` z*d5+D?|WOU0LY3FNL{cZ335depo;YZ;LrEm7mLXw5$mPXCSe_HOQaz1S-lqjBonh~ zVNWQ^G>UV(gt1~N;8_W;9oaVD-%~8NYWZ?Q07j@~I{*SR!ZEXw6)+u*_7(~FD9l3K z_Xbr-xX19o%vZ6L4`$r4($G0YVpdpXO3Q2Q=9?e0(>`&I7+9G-GU4wwVpOeVGbJ{A z#!9>KfA`wO7yZ+I`RlXn;KO#X5hFLUfB*AN`_4Bnw1I=_?7@fsBP9TfCYvEJNML1G zoiRxYHx4_&5WrHx@Ujbgo2dhbZh=3>2il32luE9+w3S;U#V|? zo0cg~v$_33z_Qu)_EIaW7^WBdP&@2^_uF%mUb3%!>rDIlIiFEGEVpu2J*-?VAzH$X z@Dgio6B9GMMqa8bF5`2_!{*n3Plj9F5MvKhU^ z8-0v;m=t~DVF-xAI)5%Y7mG&q!e{9}3L11(T3qT%Ff+#-2paN_G{?3W3>aZ)Jh%kM z9&uKLgeCff`DX|9_HArzuxcs&Sp4Z{%3+HSBk;>%+CJO5A9Q*KG{w^<%9nDxF?@_%8oha z1jQ+}>#w`YcHM1f-%}5uTw)vv-#b=2)8@jBvg;cp+^8&!43x(`C-PIr#mg33T}_?F zgm_=3MdQ3p3Pg=HNrCnQJ5>(^dS*#j9l^{$>1ns9&_WaVkz1S~}fr7pHq=|L*&yX?(HD-6%X%Cw_cb@(H=RdJC&p1Q%DDo9eyYIfI z8xhVw|5x_m4}ZX3eRY=IbDF*{qsIK8$gb0zYX|wnof%{1B5n}w<-=Th8aigQ%XxA7o5B&v^cLciX z4)ha#(IwE;rK>^cz11N{2Fk{BOJ&!4hGEqQf27DohaQsKb%BsR(9;?b2NWFQtqr^e z;kGYO@av^jqQAb{#Tqe&NDCicd-`-4>FRpj#RCE2#Loq<8>BK?t)0o|_0{X$3$z_B z7)rw!l=F8~cVIm3LU@vh?ifqbxh`3m2H#+PC+^f&6gnnmxB zEW^RPZ2xV-DQ;_hgNiA#t;UVBgO51Uw%K+&f7g&dZ2&5~i@Gob-=w{AD*$*7xOQFB zur6U~c)fYO-uMyTX#8~8>y01bjmA%hz25i{-e~-E*y?`Vam)og4EeG{@(>QWmq1p( zl$8}pf9|jY-?N8pGGdrCmlOD|8e*)tbehZKqqHRQ0tl{Rj>Ep3Y}x3I>QD_v1Vz-49-A$p!RF&F8kNwp~jviMO}a6-=zSt%&E{;EU&j&GiOQgea%)iimggOXEtllpi0|n>?TqY#z>f! z;vs?h-g_q4>{;_|>v3Dy?t5%&58ijLEm|xgTtfViA;qfmMz-0eTUbri5Gn68WraMJ&E_&_`KuwA7TVEJsZR+Rw}m6p^=$tk!0UUirK;etzS?yC#!pu-QeLyz27 z=`%KJ(}DK#l-aiZc3apum0QO*yG21LIIq37*q(m+Ma!z+i^T{hKR44Z`rReIhwJlS z_?&IN`DVTXqO+jYzVP`oRgbJ)a>?Iq?AR@RYr#Et-*4al-p_5*O-HKiAKU2B!$m{v z84m^kmSHg-+yI~}iq@J80JX!8w2gPl8vxRPVuC^gli`YD7X26xmtA(5&7VKtHrZqo z_1EUM_10Va;b_qi07NAR7hbINN9Yrn5nDqttxY~7%ORcgpN5Xg;MI?ytZ}9`cR@gD zu(YF`p#(nj^z-)Iq$#4`!Ss*=Td%PU( zgHXVMZ<8iriIPWYqc^s__T0-?&eZCq|MWAHY{C;ys*FK)_~8fHU3cB% zs{?l5Z8zI)yKNP3mA&-hROL6@X9!rCQ=&09Wat3fO6|dE@Klv8LNIKE3fgnx#EG`( zHMYsLX$*7--zxE|F}D5o+xZLzb-*}*(mH+m4Ex46zH2W}oo46%_UGbb`?+#I^`)2W zlv7U?pQ^Aw|MAaCzm3`|2+Y%_zhW=FG}W3KSQWq)r8eL0G-m9kwwrLrC|OlmWs{zp zta1L74IetfKKP;c+1>ZvW%K4PQvbGEc}0njFWRHHG<>F$l?XGY&#?#Yf5eBthd+Fh z8xk<0WK=K8#~6YU^&UEGux-2DR^CRd zq|kGUGvCmkGUX*(x@5UkmRH&0CClt5Klzodlz?^o`;N5(4%pvDj@;Px+jl=Z`sky* zy}$kKbL^<24psZtOCWnqivNeD_z$*o&iS$(bkKgPf7Upo09vB`ofd;!C`a$;C8(<} z$Am|S_c6=KfvxeCmsa{o-`lGY{|H_5-Zci|Gmws(Hvp_JpuM95((N1iT|Jvz6Ii`l zbI{d$>jr&yCu0uM?4b=9|=BKiq{-kF5Xj z6x+uyjG@GTT_KI5k5^AlS#QJukjktZkk9MG>)i{n9T`bn8GCX$MLY#kUXTs^JNfii zQJIu|$^LqRjj|13reyqf^=qpEO+If z3Ez-MeCLI0%zbU})))X9pS8t34FJ_+t)pa^wH0v&01P8#08rJKE$T%1m*QPiRxP3L zOnc^;sdn^HdrJw}$S%9&Mk&)J_MiV;qUTL*&g@t1?t31xYp=W2o}DyX0)0>}w%u-& z9ed0^a);Wutx@Qu=8CB-S+dj~pYXKZcI!R%@FS1e!q-@;YGM#(qej(9Am772_34jE z5gH{0w$Rhem@!kz!hLqjE%(@j3G(a1Vm zxvaqcb@^R(;RS!T0}mc&7hH6ns?#b3z0IC_VzS*n{z0p&tFf&U9eMcPcHFT?O5q=CH3J9QM?d^^yZOd@?YQ?HXrDjx z{r2mh|3>NNOK8tZ`LD744%pF-IrVHMyWaNS|5UYMm<^@PAhUskYwQyr-_I_;`~ll@&u#3ZAAO%4 zaNxdfNnNyXiCuo#zwD~3?v$WDQ0WS7!s9QxP!336ae_Sa%#Ye>r=4j3yy8;h6!0_7 z_`EBa90>HRl(!%L;3xL@WAp8X>wjar?K)1(n?2kZC$gdmVZlqFfY(OI&zB4qz;w%{ zT-4kA8MoMy1y5LM`B1AFdW3Df|y)vyRU7#?Y7=WD0S=+Cq2p&%j*~$F6@beq2MzU zkd?yU)Ku@vKd1k*%wN$w4wU2vZ@B?Lw8hI*y_szD%>}6i|k3ZOt zfBG|f_~D7RVnw~mA8PyTv%4LA%#n8D@h7O9uvLd8QZr`GkaBvD-EhPIe2IFdg=O|; z!#5ga`|bCC?41XIRmIiE&+dEMmo4-zASkG)DE5Y+h`q&Lq9&TeZq)QdW0EhiB_`1n zWAD8;1Ph`lpmY$V_g=S`xBH#nnK#SjxghGIfb)mhd++p_J9pmv&zzY#NUpg23Y%d^ zgXb@Qxm|9)oOSjY+An-0ci(-te&eIno=rd@z?n+^ zJISDt=O8-I4yNQKR*{cv!!`kF{^%NFeQ~JGPbMjvpXroPL_@zWeUf zw$&BFf)OJ=lG9JSNDeu4clq<5|0unb=<`li>Hy>)ciw3OjEgS3NQrR=sVFO#dGi*^ z%dfsBFTeb<%$dE^R2HezmMx2<-{JeqHCJCL-Me=;A;Mq(_D}iKA8*z4caUeEy-#lb z%Wd-ZJ0B_mU!&h zC$8TnlPv`W#d744gJi@9AM3l<;_&{|o(&66I_V@W`vmLHe)z-lBr@7f4jp3Q74>mob0{#9-2Zz zN=w(t6<1s#!`>Sszxwr0z?K627WJL_eteyC^(KOiyw1jW z%IBbAqrol6=7jqk8q35cBHBovH^5iQN8@lm2_%{tskd|A*T$Q7lHT)OsG)C3{!e}r z8x8oi@#SOwqRQQJdENftze$jM&y5NI=r5giAYCRCH+AZd&@>NX(4nhoq%w&_G{(90 zHrd5CJV%lG90f~q^(V*#0JLwGnG%37RXVJ^@y0*Mzwi2&R4dUp;3?8HO#4s!b=x4E zA1Z#d)SzkHwqr*fUmqveUU!vrXy4A9qliQk5b%YdOEtK$Owb0b_G^1|) zd`x?QbRB@jHP`O!=QJ(6ezf}aW*4-Sd+vQv7AeVGy=J*ASh!H~3JRrn?+$W!|HE~l zmo4|+|D@b}+kG;3L7B8{T`2LaX40%EPnIq(kx`>3$>PNeb3IF!_Uay|M7^-o>wNt z&5I;o2fHO@B6H_1lF5^%DhXaEIXN-8_$Q|-naP$( zzxk#-{`liEX3QAVgkilqGp>-R@-mKl(;BqF9RdJiWAMlR7$q7XYtPlnIs)Q{^phro zNXQb7YUq(y_n62L&hgh`cyvoc$5r0YM>Nq zAHcCYAAUGe{_*!al|a6v#F#xn3iLZ@W}DkF>pg4cESWfdk__m7q=qSy_lAv768oW4 zRaDCOabvB&*{Mel>EFMLfR}nH1zx z##|-0H8N?!beS}1ybK(0lr(SNQii|xk-YQv2kKTQt5z=2^v6>DTJ{{RpGui9eww-u zm1B-R+UkQmPn__ny!P5)TY~YUOD@tn%(t{yZosjB2yhQ23drIm8X!3RnEwjE^pXEXKP+$Cc_nJC8{d!k%-?RE0pv%DuX zL+Z7j@@>s$kM7;%-1AS}k6*V(;1p8~yV+)0n?6G>!dh%wN*zpD#3xh5L#Ia)m(FU8Ba^ zX@2#p|2JZi|IELB6Lxja?q6eJn#O#2G!{$L1Z+NheMRaoa@%0^4{d>scKOZa_n&qJ zx$y?F4#8oj6T|q-4EOla`>4S!)h=q{+V{sb%`6SfDO>6KbC97w4a`+!>h-fvC(E=+ z6J_%N5|-yyEt|`cM+}g^-FAz#YF=o? zW8?Bvq83arn`^Ai(8iPPoVLw3kg0|dPQ$mLMn@ag<~HnAiGi#C`^6x{7Ka=DJ4psP z)9+*hzz_H!F-fjquv`3UM^UF=U5!Ri)S``?eeN0Z=8(tbU;p~Iv})B_N&HZG@4azK zAhTreeRh@K-0&wE^7arJJmf9;{sm`CnszpmK3yh*-+W8ssFzA5LBmH(lMhGDk}f-T zlACY;r3`!j75QY`d-CKnkISj2oh&8gWislMxssD#B&8KKGVHu0vk`7pFs}f2+ zIQM_8)KspKy6Ot`pOBFwr_0!}bCmdYmEZpEm-6u^LuKsvH|3poAD45^J4u$WER}KN z7f3uKSK^s@S}&}-6`476nM|9$MDDrwH}c{OcgbUq{zV22I>72~!J_5z_><2oX(-Zx ze2&&BoiKH+m8m3)*<5D6Q1?Zhn#}}v*s+U@{Nz>X-m|Mz>q|IA>tpbc$K>f}|EBJ7 z`O}{-GgW?O@}79=IZb1Q{PNc~$fCt-<&qztBL^L{x03upa_<9om;{UWcFzO1%SWSM zkjpMTLuxD5NTPb3CSR(#sn+^powP`^yj(kvJ3~9`k4BA>r7KoRh7SHQwQL}!gpDQ} zPuI^u%Z{orgMI4V_KRQ?ug0lIyA8bRiC9aG9h+>J1X_tNZIMY#o591M+OzkA%_?rE zhWcS65rhDcc{c+Zvu8F{;|jchfM>$+JYm8F`NJRnAV(`{957&j{QT#?lx547+RVJ| zpsW5_xa+fbZz2+zK-n&C&%*Uf- z=+MFPv+J*ul64g_V#FBDU%mP-P%@vT>4>Sd@4a_ldE$wuGc+&B23}gug4d-tvFasbdG3Hg&GN{@M^(zHF5aaI$3S(q;0|MzsW9nBA_GsU&@cLlf@zH3$kQC42;=5fCLrNy&joH%N_^Zs{&j z5T#*5y1Qg_r^HC<9yK}#3^o{h_x-)k-|#%oz4x4R&&e52>2Yhf%b>cyQA{0LmRp;Y zj7{`yi2q-}9!Sk#_m*b z)C0jBZtcC2z%B{{!HI}<0_;>hk9v0oDE7xgL`}pymlrmAHV`cSZAS6GX7??4-9&K)>qFW9 z+&MxyW z6V8@&8RhUY8Cf&iN6Upny-bv)k#`HV1=un!CVsnY_wqPdr`eoop)u%ZYU=?7agoZ3 zsq=ueSc*fZ3O+S=?QljZ``o(=w_N ztKvI4{YPBEtKNY>J$|ZEz3_mmB_r}v-%{mu)|X-^6yp5%Fk*kk2r_RLhzkkaR#Fk= z{O7XV2)^hFtv2yEN9mZgemV(Vx8$UKChj+uz+&zJCO0`v#ok@pIxLriV(z|tlSH2N zAz+~x)kum!^Kx$Qp`kbVDvs&T{)2L{XioN={I?j~lm(B3nZ4-%T^2xB8r7Y|jxV>i zQ*<9W=4{$ZK5w_RwHXp%+T%BQYyKGF>AWg1LO&$Ss zp#Hm|ni`VsVdR$vd)-)hcE8a`wtpO?g%WuLfuBmBK9<2-ASD~dK#Ej_qACwLyY_Vq zKRKVzebR%r3Og0;YDig6c6aK0(qfGVpdojc2TnFSF(8k#@HXgE3`LSY-+P`+VSSWF zX+f><2)|Z-qRnn;ek3{D_x0v9yRlzO1)VEJsei*$sWOqdKB=2c%`ST%ZI4 zLOSOMBruLQ8UbMowHs+U8w3ADlC>jpyH949)TYQ?zV11%AstH<4@e101%IT#hO@{1w&EQcb}t4?+jIHO6$w;{uIn zlne%Jo@8JippU*f4xNH)I%fW)wkqg11Wiy@I)0zO# zJ1Yg%5&iFoWf%q+2e^N~zhpzSzfjw;ip7OoH3>yKZS;QEq|n*B0;8C+=8PHZEo zW>^qG7RT!4(rFea7LePHnR7xcRZJ`=#XPUG9kPlCaEG>SxfR#Sc7ReZI=$ZGymGT_ zo~G10E`A8PZp#@?R3!fsd*L%By>}!y0aoS5L`S+m2*a_|z_#^_sb4#stDU+>Llv}C zs9L0a=cg~n~_%z%*%vH)mzTB%Em#k>!xlNlB zE{UCnAMP$~rS{Ad(^KNk*;o(1fpt)i+keywVMV_(r~3YNj#>|^k%5DnB*~U{ z_sy`!CE5dKBK;9!sO{u!(XRW3EWG~T&m=-W`t|)5WVK-ErdcKEcDStueO!ERByvlZ zCWwiMl){5t1S$n9I4Kvx4|4SYyqpglg!RN{tW4cau*J%txW*~3FTc%KWXZ)YgPuzr z=(Ze9J%Q5#ZWH6AM>yH_c^>kmk5KTVzqj9PYB|92k}p?%0ZdvR1H#0;sTr>5sCri;4i?ft-6h{6j(O87)t1u}qV2Q$+u=HXSXtI4_iLlJPb78Z zmx4ygpfZK%z)Gb!x-XGxzt7U{(4wis6Cpl{l|~((B!)?chsQ;!{BY?|&=G#JMvdgv z2Di4WYXJ+H&}b(+B|8b96%I}p0IobfM{J()6YqW zA+q5Ot8b;1BHr1IuIBJeneG@%$c^^)V6xo_J_pDr?B{#r@lpebsm-^}bIG{L^);=j z7jED-tvsfD`XuD{_gOEtyBvZfh9Q&4|F)kElZoETyS5#>EsY04JFf2sMP6_O|9G)a z&V&GG`rcDijgf_HJ=<@aFx$Cbw98q16nV7S<~8gnfwcSk^BEG?ThU3_7GCOa-rr{2 zTOZ#0t~R8$OI-@P_@4NQep-cvVhKBQ^pe@`MO-$)SU> zERBRWxME_4I(BobN54O=Pp;<$@;AI3oC6;~2FrnBxBB_U~&EVqGqN0THgpGY@?ncUYhG zbAHKL%83ESBCUqw_-Roi=B~*w?ES>c1;2ZgVuQJJ4XPksy(yM@F?4-KcVfCHaj0%W znoW_6@zpi#y3_fvR&=?U;6?~#HIas4lu%* zn#q5tV&K%3hY88jz4e`x9DJWdf^XhRO7E2)ba(F8f-Es`M1@#p2Einl)P*>5=3TxI@s+oL!{$e(-vBOL32!IQ1WblsIy(GoS0cI3gBavUT}8}6Yfqas z92d#jxbs+AmB2m^-%DE@nQG1h*%sI`2_ho^*K%h?M$ zGT{2I_VZhu_YeL&m7xgX>u&Y&FU4Ly}xZ#q7 zox{%;%o74Gls=_V>+fzyTYK*A9(33ZKUSqT`GVy2JE|SLG7cSu)>`xgaRxl}*t3k< zyAJwYmN-4RkTCxD6r6cxWp4P%-lah$`dvxH<${AEYPbl1n-kj%yINLfJ3mO%o#zc; zzTMpdupo(3bbQRsmv2Z~Ctk^apj3m`|M(3AF!@P$QQP-K%rl1(;-!9CW&!*1KiLme zplVvOktjv#mstDew+nb?tORu57Me=0c~$++HlqGFVu7#M7;MuCzoW+r$hs9mQXVeg zMTyV5r8SF{ColSU8lhh_6?83B6747dx6kQm?dmKJ4c7N5t}57Vv(nF|CYqf4bJW87 zvg_2#sLdyKmAzYru0JyJlHmyrZ*7Mb@}MrN-eDTJ{1JrAc}|nr`FAa+_)(@UIcjH5 zAvB(4%5GQz!O6|rbg)O{HOy@sU#PFly{B4<5!pOi_Wr+Dhr|zo-RUTV*!lb1PRu;7 zWf67Fj19k0hwoXP4q};a0!bNGL$J57d3RYB&x;@EzqohCqeRZs% zmH6-%PC<|@??(3zBRhQXAME5Q>~WHYkH`-ABjUtO(ANMH@>7^*9KBa5Gu6_nCJYw z{rewc8!3K!4V?-k*rkTXVQ^M!uJ@?3RST89&unoBiDql3n*JM1my*Qjvk?P_d*L_U zxQN7Lu{yhvauAPD9B`xg?_ImCv!KP+dBF65#hkQlpWi|E@#E9#!kz{N7?-!bf}pi` zdFb9BHu;Y`MO8Q9-~3O2elU3hR@aP86mDHzn)ansAqy4v}BIbWA@332sN<#yQ9`6n&HXx6ep}2m> zMQ~e@^t}nN;d7I>qWEkH3M;wNc3rH$9K-Ha&G&~U%j!ajWsGpssKCV=muL$1F=HNi z#;AOEv-PfcJWhO#Es7C0Hv|@&_@Lsq(T6qQX$^o8CefT&K!UPBc~j(?jY(u}WEg&A z7S~rP@E~wXnG46Up&LwsuZld7izNvO z#Q$XrINgB$2(8$%P9%7MJB{XV%{H1=F&caP5%&qKlyrcQ_I8|_#se07owmdJAdFg5 zvQ`#veSkpib2Ddh3{Q1CLPcUM3igTt#<3-r(0%ien(_~yC4=FE1UA&)%69I zJ_!_xov-{Kq7WB37!Bs&ZTbC9D__)K{?J!ZjD88^Q}fCSG~6FAwrds5!MFF#IbOL9_3mF{2fy(v)WsPs-@qc!&`lEki9EIQS!d0@P0 zp?Mgzqu64al-x_T^cNHWL}mNUl-B-SOO@pH=oZl67`{8d`if!|`{VMoDP9tJ11oIz zXrOYgviqT?Q2dEY%eWfU$mE+ua1GEHh|MU6cYGQi_^t!-DYDLwtH^>yTm!h{0r#y` z5WT5Zz3kEK4i%CsGY`}=0N6|_Fdd5gU7HLq4c|@I+8pbl7%>a>Ndl_#cbF+FOYPqN zN{VxaM|-ta3e%=Z`WG|$_QD-=USivB<2^=mC?Q(^|r^%dBYqFR&D?EpzArnSDs$rds=66qmEu;p0!x+!{ z1}NwNKj}`&RKfVT8QTbPP*IZ(IBEy9l92jP9`B50EK{)2vtWoW>%85MY+<}Pr!7GJ z8l$57E24K~2!)7w@wjrE41D0m)jQ5&hpGJL*gMojXkvyNs>17FM$feqrGO(9FzN#F zGt4jU?k@O;tD5fRy2_Zg0a#T05e}6^)P%0`b)jcZ3yqt|5lc=rDuYNSVPrs>gj=@c zdH;0r3B^Vb7US#Ehm(n-Xj(AHF2{v6abmiBR|lQ)V8Vl4`~BZ%xQ=tn!L3A#*YJ;w zG`-kV{VQCx)x$_TS}#aMz`F^MsevaQimuJ)3dTN{m%5t2ZAm5eoa7fHLwH|*&WUwq z`uJZHFPOKg%`V$t;|;neUZ_LJ|9X|S$ZF6BSYo77&xV*SelgL6e-4+t$K5!SYRrC3 zq5Q=hVk62;HKWnRB{T_#*N!~lZ|9viyH%|i#+7j1+taohCU?KBQ#Z)Pz1U|;{1V!9 zoWHtOHV*Tz>XSGk?!o!$8laixG@1Qxp0*tQthfxOf#T$L>J`z*ZUhJQBS*jb>Yu+d zmZ`#snEgh-(N9R<{%N4#XQUUfE=6WtJD5vpBUgQWpNn~Xz1;gJU)_1|SPVzhsXqw| z)|4v1Z{q8vb7ea*o5r#W1Os?k7 zU)FsVkF11vV~?yZGhlZEwpf(ub0PbLyPH8ksrm}I&`T;s)z=)z(q z;_l&TFp`jqFI=wK9SW>n8Tk0ikG%}r`EoU)8>S>PW>u0$Gu0&AT8%s6kbNm>?iI@Dx=;8iL`>V5>9TqMp@(IJPhbOrAi@VXM|Fzct|oUCnZ~ z8d$Y-T3Tfr`83I^ZB@iV0smgN&ft$T#@M#jas^-mZ;B7ol9IB~cbt+*b!1~EdheCi zRtegui&d08)**L>9qt36UV^Ocu_#0veSfAH)BFe`iD=3VYM~@8UAJ&DCJQsHS zx^fxSW_^;`B0{W~j@s+vAHsnUpnO|C_-LI*LhsH)`eHMQD)F*%>m6P8=?}$DX7A$x z>Jkw2cK2^M>8yBjb(zrj|9vn_S%~z}dsQo5lmc>}!I~LhMg{Q3yC<#dBf= zh7Bpf?BzGC>mey0*FFk?Lp?ZAry~%!s?A3JLlq6N(0ew%2oWh4>H23)Lf;G64^whI z`%Q`)Q}xoH&td+;pJB$4tEU!XC(T>%9AAta4Ugpsq>p^cx27XS%QvyX$!Uf~N~bC% zr3SP~^L@%G)ztcY6QmNu56W{ROVo4Hcf7N~(cy!L5%c>G$i-bevCr#IRgkd%tWr*wt9MjqwqAriM*lhJ{%$x{FNi$Z9<^}t@TmC*n#DE>f%7q(y_B$TM9f+dH6&_;Hury(45cs$Co2j|4NiHO$U_SI9BF2vD!HY_M+1q0U4=cfp8tO;APv#I;j?^TIa8|bvFbga z_85@NNQn(R?U>gP{oKM95^@&7qI8QqK5qIC_gl$@++XB~HnY>=HM3XR#S8~qTILn~ zJ=K=!Zv2|^6gBtc(=gk@^LI=E24GeHeR1RXoXK1KD5jT0M=(XAA&@v;4hNw9#?Ir; zeRt?z#CT$c>s<*BO(-eu4V=|WRc(tqPMIlI-9;KrRjJ02orRv)bwRt?$CEB5+SHUU zG9cFOBqp;++TTL%nMrp#`*n71`^!yj|IyA3w~PI%FSv?v~JQJzbc4 zG_f>qFLTV1@)vp3kbH#OH4*ueC2}SB+Ss7lUC%yh;|I;`#5zc$pt@DXXRQo$xwi(y zj3?xnVI;(k5~#N`1#1!v%$WHq^ykvMzg`Up7Hdw|bH@m2amjyoFRKQ=rZu^765B7# z8S>x7d@u{e1anf5a5`1ND?KNY4xl=|;If@xwSqv}EBa;~qI;A)-!^hNJ3&_Q?&Ce8 zq)qsc64JbF{q8r7|3UOTynic%mo^itT4wMP(PoZS9f-gEBr(apT{*1@W|C+~g~4u& z#}qpUJZnh(FM^pqJBddJaDstqv0G4{5dJ|X&qT?~^^2s$w4#p>*pwoRKw2**qVb&O zs}fs0?J~5&FoeKH$FeM5u4kW~?@x@4*ES!#H`dY(BZka}Q z7eqEKO~p|B+}!nK5*6ihIQ;KUK2GW+&;$C~4%&qcuE9y1K8ir%5?goA9_qk#T#dN?N6Cqq!xb^ z#>I4Ovx*&7o+{fae0Zsu_8M@DB1^v~5wPgi_88_g7{+ZJR}e&baBkA7UZ1S0Yt0s` z^DMeygDWd>CdLf{c!Y0>4gF~6d>WX4zjIp?FuzT7)d2#l3BZ9u_sKX()kFfWNWu_{ zc6EHbzXk2$Dh*qDr*ebF(rus`65b#Nx4Sw<;XOaGi^@7U4q`}zK!6Ub;;?!t@jtS; zA-~$?)@Z$RGX5sz3car3O}5Jk)tHtr8rw%gosDE44ie6daOK2+bTy?^ae`H)G;xez z%kG*Y9JLFZ6kkyfxf(H7(yj}_wd&PPV>IS|=g+3CWfpWzjcu05|2vP9xaYh*5|s(L z+;WP^r2TK(II!Rip5TT5Qno^fkdBI~ip{l@k0{?OG$GVs);gWD4E7%2vNlQoPvBR@ zh8QdEtheC_UE}trdW1Vhr?=XgUOekhaxBI&yVHq z7>n;7Y>3v~-h982Q138dknr!3=vqX!F;V`BW%Vg|;SamCPy_38UJ0ufI**YW)j4)1 zod!6p%tET`U6xgd;#(j=e?J@5+lPE{h)aH>NPI=gqE4B#Xn6a!GL!Jq||=BM$D;H zB(S%~?iH3}X+3wKK-82#{DY{@bnNlZ27>63{D;4Atl`6Stc|#q89NRJFh#C8`5uR9 zDVh~phnAJ0JI|NirU^QM8U5CoJ?0h%M}9m#9cmXFu|ZAEPPKS?ifw$8+pZMUOjz|< zO*?+%ZDGpYx5o5F_oZgCMwZ0Tb2}zZJ$Ml?lF=VgD+;O%D$FwXWSXH!i8+!?6AX-; z8=(^BafwVe9XveL9~$BB;%_^hlh=^AdbM9S=&Hi}Sswr|s<4?VGy(!ti%Q?hEj76D zfZ&`0f#X3&#qO1cjXD7*E6Ql5CB+eAc0JH+lBuC}e?;2fmJ6C8b_xLd#ZFbSQ)ocm z<-y|WX5^oD?uzqJ|Fsz=zHbc20iYv$E|VILm->7~PQ|M7i!Z90OopMyZ@wSB1nB zr!^$h$0bfBIcG{1I`J#R4=3{?l-n04|82ro_hvi;ue%Zx3#0|Y=^Xt>Ggo)}H@yv(?hS>k@$b(Zg$ zG6`OM>ANk(571n)H~)&~Jf8V{iH3Gxw8>Dv3YZ5ok7RW3&+|BGu~Wv8)XQqZHlKZO znS76mgXPPL1&#Z7Q@%e*T?!#+J6+Qq7rRyyJMZ68_huoZiz6=Do{+wV>~yJ-OWjar zcq`fG49I--l{M1>*?CGLr&-N|LIrI{XPZ-%ijpqOqsU@w0dB-O(ui1<5@-4uc5{5EG z8F@_MzMGt_LSqUTJS=s+%8uI!<}Aqy`FY9mrF8CTuP$aR7iZxZ%xNf1lYEyMRQ4}0 zmTj?@^2;_(e<@fM+EmjW$y#;gV@9md^{rNfNgk2tMzZzvYPXAD#)S2tQ<{uR=m}1d zLHy+hGQRsdQSw%rRw6s?dpwof(ZBMDBUs4ovCn^Rfpsy@S#JgzJ!5c9gsUs!fw%O- z4Yq5^R4_RG4>MUfd%WZnQs}|G?;`9%;;&~p3GssdpV=dPR&h%8`5sGpgSpQ&G;ya}uO|_+xCGC!x zvQFFagO6_L#jw2>9GXOsD|*;ZI1d~{p)gXp&-0ObPSz)qyzq9(KUd+p@Xv`{{|5vciJzB&>yROd*C?Gjkp%RecrN3!0@i_)z`C z&d4B(CRkoorO=FMdF(ONX4h=BzV4tf;?5hV%OvEaau++jdjjW5U16>168|(Vz5Bl9 zJlN10-p6XOwz1ynW7uZQw#_5mfgB2ap%@Z}Uo>(uX$V0Bpq(Fqn zZ^jxlD!6%Easj~yb^^{fepS~h)cKRc<9Y}zGSI59J;v9V=N7qY6t@RcbS&q&T-|3C z(>=sXDs_RcS{7{Y0=oXjCEreTVKt{6OT6R0e2b-X5|$)`x{&@bREmNX^L4vB=*_wh zk8y+kdYUELJW(t&ee&8_N=f_#B^CW$3Xi^9v?reS!1->^pG4&P?rhb6H%sBOgzpKj zR3K8QcS7nuAK-d2IF6;0`<%&iJ-WTzN!Gq~pc3eNCtWgFYQ1I@+jx6LPcS;_cnI0z z#NI?@;LriAgJS^h#s0*hW1cF^pmqa&rC;E`kX`1s5m_SUS4D6*5DY9)rive)DpH-r zNO?`PggZ%|_% z-mJ9|WRma8`i8i!a>@LVM`9|yHQHFg?V2VSZ`3tlCed{a?*rMlCwd@Pi@x+Ly^6U7 zX~N`}>Z!jQr!$Xu7yWmci_?iW>|7*!`>o<76wHD)^jgk~0jm6b*qd_}sIDe}P0((1 zTD(%=Yp3yPwnsPqtrPR#CHz|owR9o*?9h#8uN`qh7Zd;5&Nl9VYO`h(M$21PA0bm54ZRl;`Xq-DzLBSyzS@bI@RawlZ+J@1dgIo z*WHSlo=6~}<{BC-XgHniYz2-i`$zd8BA!g7&N>+wwW-Vtl#p=A^jrVyQ^CFK|tHWHV8ep&forpc-4 zkSJl{slk6c@u3IvBad~4yM7IZpN;}tN+eRJ%1S|2DYDwH4NrL4VvT{?~b>Oq(|6RE8YjS8w&0HbAn-gxSZF5Y#2IFXgXmY|*Du31B;Mm;Q46%8(&DG3&JvC0cwg@fUfR*tHo^ z2KwB|8eLmwCE`RrRb&ml9FcoaS+bCC>ZD=!u>^{rA7}ItCS2nIMPLthkg!4>Q-!8K>4#wW4<; zz?v&y)IafQsv1*+7e@Xl+#e<2j~*7?-cVdig01+)ksgJ9`;!sc(MUvEn1mKxr6hi^ zt$R$BzQKyO5ab7$0E&cM-fR>;>CR>m7g_3yYuKPP#`YZy$6^0n)m7vCnS#vd3=)@+ zRL=Rj4*jb?fa3S>>ZNAdq9>w?j^W(lV_?AjISuO2{4_-hxyOD=7HBFUxQTXks;r`# zx~niM0bGt2;^ww=;>+j6%?Qtn!t!EZpIFZ$!COjuaKVgyTg3K7T-Ia%s%`i-v=u^y zscu*;k7zJfkMhI_&b~Dst(3BKY+%_ij^b@q|LRyZ4yngz(_ZqS#t_M0rCjU|QX#cn zJ>o9A_JqG5g(0;w>(3E9{3EfVYcFX{z7%Krpp~a=qQ;ks4=*#S{@CCN16`2~tRZt_ zT=gBvZ_byOd}1@Wxy)OZ%)jL0JFJD=!r+>rt?IZ0M!Pgg%R*kW)}a~N*X$c3JlvHh z3!ZX}$462i_ar4%jwo72kyRE7ze-svVIZw9b?V~NU!~ehG%0ep0T&?SuJErYW&|R(@3OXmb zzN-#KF4_s;bjHg>_BUr6Q)Rkb%RE2E?4CY2GafsY=yLdWl}-@j>GzW9?#3IlVs#fR z(~XR*`cU|{J3IUZb|oq&zB&h|hO&wR=i}aJv)Ryx7VSjXJP}TZ1^lQV$o)H?TKaCk8vq6;G*p10;(T)Q`#@!_ zPQ$Fojhh;s*G6?F!x%?Cw=`)3CFSUWl87_!5#fo7hE8s7;TU6piD3fIEQnL5U;|n& zt*XzP%*}aQK{Ku^kW}RM(-S)HAZY`P0yeqFxlG^H9kz9{AMrp{FEM(m4OEp$ppin8 zi~dL9v&8R&w%V6XI4z#HvKIo9~3l)_&U3iAQ~~ zjnjKuPhmz6ny;_@y+4kI?p~?v&C}!0zRdIAo`o1$t8ri5nvPvpx{x4@id`JOhir{% z*yXYn_SY7AWu<_t*gqRpz}Pbu^z`>dO^u2<>PO>>joY0Q9Ugxwm2%LtXRy9#v*Afy z7!{M4xRCmC0+9GOjnqH%?Z`YW^NRf&^|qk!<1{y)_BHTgP&>1cm$S<3@vrnUQ#BHw zvf>t#;lsxx{HVA?-;pNAk>L6SzMmP(-Gw9MrnnyNT)=HSC|31CyYIRjlfLG8FLk9Z zJrAy|g?w@V)GFN4BIL|eg+qu1;l=I5BbN=1tM=Y>lg*{VE-{a<42pukN`Pb~aG}IN z@`JdWlw~Laq;r~V(;_G$)sqBNDI3iEhRa`;(BpbAx{)lL7cS&uwWL*TJ7dP>!P)oH+eXGClRiVz4~W0o_to>sv=yvc z?fs%-{CwAxizREf0yDA_K3oVCUGEFr>J_KBzf~6Qz9sp;0V5Z1l?zZ%jpYfhICa7g z7IXbY!pbTMP2bD} zXF8Okts;}q^i1^-4X`XXM@pK%$hs9C?pFXszBc%fTPU4jByC&mcvWEc#jv7ZkK}98 z@zK%m|7bl6Y3;u1FXZBW4--|;XmQcJgP|>Us>mp$k%a3#_^ocuXq@0%8*pnU4h%S& z)VcQ=Y!I;gP&S%V)o(`Bnea$F>+dhx!`#KPWhw*PN;9t?eBSA1rd8mUY9L7jc{#`= z)#+}#N}p)z%8}^YZc`w;nBZJb)%q`jQ>XAMsfJKW+qmd_{#D|42Eg#P!|!7HM(2VZ%02@m~Yx%h<1iv z6Y#1K&dQ_yWs23!c8m{6ctmEdIKQ5BYcDO8A>pKdWAl>rW3wXTHc^uDJqjNujZ0al z73CM`!L!*~cK(-d2yAdJyJs6YiOLQ{$b_)A;tH^u;od{ebj!AhiTQgjz{FJH_W5id`17wFTvs8Wm7ozf>#KAR)Otkx@hi5j zf0T8*{ptZCPii)XXzLJ1zUv222OXJu19#qXDi`S2gCLN{=T5PeVezZ}e=$Yrt{=LL zztJ*^E>xx=-ELGSQ>~Y8Z3Q_FB7*98zXfT#WmbnPJUD(3nEfs#aqRt5M<5!#c@q`v z?w&X+ddo{mVVx!L!g^EbV@Z{KVBYvDT6KxKi-7pQg$#?Mh1ZBv>-t%>Nvi8iJMQB6sFyZ!xbHJP>HDmpwT zU{*YL%=pSM*h%E-ppzXyTx7bQa~6`Iyei+7_3G@D>gY+M6bL(5M)6n1Ofj#T?+Q2>046GK#@ACb2D>ktwe5UN1j*QO9W|N;lLGSYqp0vatMm z^b8;UtF*IOkJDm(bZcQ-(>Z55!j`iro-p=LBck2*Aa}~P8~WRQMi!8z@BQJYv5eXR zS~@R_w!BB7w((-Cd+Gbj8)RWBV$)}e+i^h;2*v>wFp1xmXwGh zFYDioFS7alxPpX4AmvB@)OL#!E0)JqFpiQ{Nm6ZO>_4#6(lZf) zL1&tbmjT`u;?m;!#9=w^QHHE)!((Gp&6((is)oj%O7i1b7I$6EemNk0l~1lpXT7ei zOiopVzX(#!qWc6RrV>fFUVt{Q_!v_U@$_)Xz01K$a|+sxC50;<^Wd2H)c^Lo*UG@t z%=N+?gOhXI&Syv2!X*bp`F$SoUSon8cp)!sIG@aFjQpNAeY|v%pA{62R`|=%TV_;Z zx|p?N6syB?jn}6(&>_`}9Xju9*&Q6iP9oTML-%g9`&lNcJ4Gu~29EN($A~-iUmmUn zw-aC3izdhson&fpv5z-_To`OSu|2OGri-ggy#9$5(`&SC45lNyVVkw=+)ZyGk?IIdZEScwO@VccV#d9Rz>aT^~J7q5V3qrpybsRmfbut~#Ec8@7?E zYy0M@`qXhIHh|rw)2{b?wH0kmv*toYxbab*#S*`$5n^xt{q5&isukq1QML|`)j%91 zmfWaB>HRnN`wp$y((8+=W;a$TWwQ#tv9Dik>FtWkW_05=Sb{kEB4huMN%1%Dsa1Fq zas^fN!yj^t&gs7VA@PCgAVFwxG(qIU$`M63E2%7_4XY$PVujYR_1<2p{soOV)j7rRb&5*n8$}xUg<0N=F~ahjUh_zB>)QhAz8xxF}MOr;F)=-^ly@ngnw` zwJ*`?(rE5&BdAy0^f_Kwr1q`4N<`Dlu65C_1h=#h)pNmi$~0rH34Vw={!e@LfN|y2 zy_KW~HMVt~(3#AW>xS7Yh<6^q;_$j;|BIc)vX68kCsuN%A$7!kryN#9{2#A_-*mbB zvs=G)A$33n9tFdg(T8EjBrr5Hp7>qLQUGS%J0U% zRLEmw^LDW1rq*l7a#ZOp0nm16l70vpS0NGcSp;8ode=l9pvw&{ckUCIN#@k&bLTvu zoJ2ItibxokwrNO^DK(H&H3S)@p$^_atY@jxM4ei__LpRr8je}*N9A66JV_HXudx1f zn5W?sCV!yfcsT7?SngBhq6JRVtIVQgKrJ-_-9ox*s8L%n=(UL#S&iTYo4wISognin+kBEM^@ z=H3gNzoiq`9U`v7+FQufpAppNy%ziMY+eY$S?zC~<)v4Y^g6hNcizH~bfehHMi+9F z|2a*-ruevaveV^>1CC&mvwPwfmB1WEIh5Vv_(XQSuhL9XQ1y`W2>(w@F4GN8f55@^ zO7db$VO5cA-PB){0*uFMaq*TGV>P>%bH#u9*!>B^g`PghVOje@waZ{xo`hWcXtt<9 zl63HZGj16^vfh5pB#v=XQ@_Tz=y>EQm+@iFcnB47HEWMvQq9LWbq?*rl2zH4!xc2c zo8B&eU5Hf%4DI63fUo!&E&94e)+_>#-`S~4xRTPb4iS0~;3@9>$Us|Ie4sa4Lee?Y ziOoy46g_o)D{Hu`*>%3c$d${>BiQuW<(inMuFm85rt|MF8iv=$tyTt4G~ch0xH~1i ztUTM-Wx3~g3Z*d!wP#yzYW}0NWz3rVGMHP;KMiNzfjJ76`&>0H{02~(r%}p|l#uc3 z4I5zz|JKnZK<5EBs!4L_#m5YksjfVI`9iX2xMpii0znTSv7YP{NY&oGnEjtPIyNBza9J4)~f$#X_t4tld`_6GH$B9wk^zo z&Pm6h3p9qfzG|5BGqs0)n6JN9>0xM>V7P*iDZxZoC86uocB)TnVLh z=6ryM`6I;e9Q}IgDXE~T2eB;{-*=U*~|P-;;hd02wHG9?iH$yjgy2eE3!R3EP9B&ouhj3INl4xr3*8{Q|=3vD$~f zAP`@?!{44B0%M`Ab4(#m!GGT6M9x9<9HM|*KccCgJc4?)zB|_P4<**kMH6$kFTKrh zw=rC+_nGa0vt{!8oIC8X}%H1aJolHA`7UA-V!AfjCaQ*I$4a5jn~dBB=>_g*k# z+}1^d5}%T`HjOo7GqICe$3A_D*w1EkXV{XUyF8eN6lsz*p2Ejgo4qjnBBEI~+ z!No-A15&wkx0?)SIUtgKV1O++J?Krer2gs*={zr@!T;SU=dp+on|~K`6*^Y7jneCqlnPKDH>34-5tJZ^vV( zwc4V1x8m>E@Yd4;2q|?$Uro80-O6VF`uVeRr4WCJU_(lYAXGa3M$T|^bK{A(H@TSY zTxPCwKapQC`MGA6R*6~P509sDvJ9uGHs+Vw#NMS`Lj13oPsf(Nb`lZdF&YnblDs?a zo2rlaYi+ab7%Y;U$gVij>TS~)k2jbGPN~!=E`W8-iK$X8l;Bqp5K^Z^Uyo2dBxIA9 z|4ZLBBH?Xfva&*`%Li;sz)^zBNz~sS@rHgmjYM{teNo8LQf#)|?c&6`c9;jc{qI%5 z+$V7w+E3`uXbq8hrvIsouh#+_>#$G|4^ICW=dm76gxmaL;s`vdjY{;t6SyzVfs4k# zs6s0C%!9Fqr!8oA%6(jNMV#HreizBsL&9bvLTAmJNJ2a-n?*)0ydkv;5VOSTYa?R3 z&8i}B)&PjSEI=-%%lI<8s&Y52kPk}w5X)t*DqvZfaiK)=^P0{gwY_nFzj2E7hZ`s{4jM%dpCCW>Y+LI!;UCL)ChS-ou{- zt;RLhtumh-7HUtLKT2>T)R;}VqH0$m4H|TB>*N4ee>E1jQ^#s^jZ(^rp%p>}E@9lB zMN1$j#&i>2)r(edZUu z4__n0sz!>cN~N$3o9ek+L?gB~HlMRK1?3_uV_ESg1Fu*nWbi1HSB|KRBzN_U8tqfS zWcb}O`^}0vc&wG)J`eDgsFx$%YZ`XJB4@eo4ll24Z@-R zw`5n=UV8r~=O~1=1IGOT-|n)2WJ81bZQhSZmLl1ApDVLxWLC1WsOefI+fJtm^U^gX z-pOuU;Fn7D53%7<88PW+*Ka-hJ*RUn9DoJCrnf6y%+e$_NoPQn!@kHeWT5KGK=;dUGq(Arlpr<#sR zKoJG}IywXddxvF+a__vqM(8xMd?Tt0jUXsfC7T_B1J%o(mT>Zk)rh8yC4uC)P$O| zectbU?=$DDA7Lgl3`5q=TK9e3S0M(pMz@&GzxmbBXl!{tFm~P~+&KMg!(kh>f!su- zQ5P&bv`wG;vea#Hepe%_zXwF-ca6bcK1ldHev58U>07bI*lSR=pPGoGN$nwXxo(k4 z17#SCZ3PlrD2&eq-ETDsjl**r10vtl2+O?j!uZTXMDZ!g`qI^ zvpnyW-q3LbbA=hZ6ph!BzMWXXCkF><{oczQ6MdJzi!oYjlq_~*U(5NGbZ-Cpd-xh# zVx!0NOK9#hMxLc;-(;hXldU(=NTs_vBQncgL83Agp|UwkDGD@1`=H+1g-5lIskE+(r2@1k+Un5m*c&4uUPj^ zMckK;cMusUllgTv$*$A8*(>vzSK2KCEM|vIj?COvLfEJp>GHCA9^SmNb`xN7W(Iy1 zlWKG+=#5p~`$n*39;B|iRWV*S*TrSzrT-!qHKnMOw&=H~8fO;|W{21LXyQB3 zFY(z6AcM=|s`iUFVgB~^K%Mlq-WA~1X9mhgEbf0URPf19ZD5Pl+TD!mfy<=tc^1ws zC4+So9bBupyoS0&wMZnqeb9l|%`(_Eviq&<>7$0H?jB3brenGx-D*6=%vXV`)G zD5=?<{hhS0#ivS8_d8Kc`QygL&xh`y#JGVnrSQNmm|b_Hb9nx9n9gv;_C)N-6 z)3`4-Uom;^Sq?EqReN!47?-^!D35nwD3n9uaEDgV` zD$9Cs`6|64yP;r4gOP+TTX`+u8IxXoR2Z@#r6KW(mt|WlfNWawDXWVp z<-V<^z_W%f%at?c-Oagz%;8}PkOW)bo6%Ph@8H!t`j+I1&P!CEbr0?KyZw_CZYeUa z$>(G@Yfzs=P3;6-V}LLpw>>ly9XoDlR`WaQe~ZhI%yUb9I++eqhtZ=3Uhs zS2yP>aW;8J7m-n(AN^Wq|AWa(Wj#GjMJZ*^U!1mf zN*Tzq6cL0bO03)ql_U>K12XS*YX|1{bI{(Ktn_o)+hPxo_#*0peZFo%_)Go8iAXu1 z3Xh3i6JA~@7UzsnoGe*GY=?Jem@!$UuO*qZ!d)D(IiAYNx%$+b!)}-2A*ejxY&BMt zoiZ#lEy`8k&DD|zEZMD@1C_|*K(ik-b$4;0z7oiOQ4u^}-e~-1)6>%*uEf?h0Xi%Z zeNAN1QpL5P5L8p!I`!UbWu#O^#l){hpVHsUKRL9Y*nX;V8q>dbtf)!RPQ&~;3XmM< zr_1T*QdM=l?)ybCAb?m(VZ3(zDC=?y^mh4aV7mUXhS){7&iq6kqn^a!s6T(SHQ2eh zEj~Gt@ca&CKQ*7*@+L;%JQ}~=pomFNQ@6?-;Tswx%SAW;5r*_}rtk!AX+H~aQXF+v zfveovAGlcGT0XGRKFV3z;=+{_4Ye8^vWxK@?tX2RYCN;%aD~cgG#dyP~&N9 z1({0+#DCsk1w9wmrFuZ?c0ek1T^-av*N_nUCT>4m(^^nMwl+(UFP!vqt>S|}gXu6W zc%pgQ%1e+(y6fBopEd-27vDN#yBr?lgTnKV1;N74g5C5H5o*tbSsQ=>y#Y_x^pN@z zFQkW?y5?ikC$u+Lwi9Y(;#3vBo%EjGS6?l*vG>Lhrq@rcCpV=8Hd|h+DEd3?m#Ac6) zsx(EWl&J%f7^i1F2|bkmH4wswtVUT4NlI*X~^1i&FI5>@2693K>SDYsN=v?Rs^D@^-*EH54F8Qaku& z@7AtYnkXxptV0qM3wi&NNOd;WQn_jAf~R~*uC2vzikNDZNhmw2b!(6Ks_;#z_`$5V zvpLS_SGR1BhI|+8;m6kzTaZ3MBhijN=~(^DDC)|SYM|#x@)9hN#N2-NvsftZJT*Zf zEI}h{K2}TAZz{$#sWdDZKBYcaKs-)<;8Ft#u7IFNk$HGVM z#lSMme7o-(K_}i{u!^`!Z4wJ`4Ck-Sini4Z6turU39tT(&xB zSuz~o*5*@}wtaxtK)UA-=}(b|6Gr3y6I?3?F^b)bvrhYW%1&EDatR?YgFWC z3k4ACd2)A=|Av<&F(6+~iz4&HY)(zpw=~Kfeb2bjt+X?DR+tn*Lp-PUb@L1Re&MRI zrXo*DoR(9|+tp!Ia`6RjL8Q|_-#m`9wc84;58t$Hl2ywSE%Z0C8IcwXFTRVpGhy6}?va*Ipu~ignim z1}idOPbDY-UW3Pz$}069-Am#}Roc!TRq`6a4KJY0PqAt@m>#`6YJfn4DaOB7&d+(h zFSSZ|%_)hGlaG9&;rJ^rMp;y$&L{+b! zmCGf#|I7yi#W>pLZUSRn3V^cPWhV&~`_Kmi?0x<6PrMxGi1!jvGEslz5pR&3$*}U;&+24B59pH&*H} zwzohC6yp+A1FRy)zCE^u(JV50>j^G?kTZe{sNF#+380PvOVX%5iXmpigGJm;H0_qn z1u(nL5~DXNlIj{MN=qt>1dsi|#AhbIjFlq*ANlRxQSOyaZojkKXS3f z2ZeYI%F?_(FO)rRFDg};p;#U;L7obpiY|XCMsY*A3w5fCCLBv z9`FOX)XpMd07{qW2EYkhymLp21VgSN3d_1Og7_$p4+`oGW*eH}z{u}mdHAO$j3ew> ztCILyN!cbkM`rx(J5z6ZB#OEs96!tRZ_8*5Eac()Va; z)&$H})_^U3M3P5gO$xwhOps>pdT9H1tgg(9MG2Gavs?pI$?7iGh}728eO&$ zno1$~WvLlT!4KxfF_$&CKD7SZB4Eltqp78Hv0e27*55v(zQqF)b7mk5cNU}qU<=|< z4HVl#6=8nk`+rF11khBkjQR=JDFy>>mhHvf7D+q`dsqv|Ez<_vN1!LVuA4!#dd&?5 z7;fDsvMlSp=uL+%euT^peT3-b+Q@xH9;Frr`+YpM;_T`*y=f*FpG-raaMC~xq*IV1 zfGnxOOB?G7;w%%1%HOe2U_3@z7J{fX)AwQqj($$_NJh20ec&c$7(0-1?`Sg&!^Z79 z1Ij;{m5Pz$r~J-AKmMYC{Zb=o@M;3wn4$eq5Tdzc*`d}TGqKZU=M99)YKW!?q+IXo z-p8*!!~pf=8xsqfW=ma2X1>~T6{Uu5zIX$VR4TRE`AF#VI}eGmH6z1!Pajb@sLkrR zbq}^$J?jBI^9mZ+4klpNABr!UHQ0ryiR`$l0l@iy?Q7TvHs>K)FL&^>%%gd>XPWkT z4qBos7X%QqVlgXPBrYMXi1Ql{xCN4BT{Gr9?ms|TqFV1>($Tm@!+qGOLCBR#NZ#tR;kQ=DU1`AkGC%rT7$8}3KiMBo8RGI@3ftnO>r@QMId*Xq1B znx%uIm3QkrjE3zt$gjvfx(gaeHPRu+Py8MuIcSx25pb2vKP%ZB`xiFI8v%ur~F+!6xWO6ziNu~%sh z8!Qv$EK^`p>G~>w$&Z$L00#H2UeQRPswjcC%N%K!>>91i*K{W7EU>Nrh0WD{@~-Fl zOmL---#s{S!)^~TEOnwdNNZy@qkabe5DK;wg<-d6reA3#ckTzXZNO+%SzCcLx>vrf z9q$?bfc6{GQBY!X{LyoK-XJA{Es2`K?-=6{>L*1BV;{uDW^iEq-tJ}^9zf4)e_dNq zI%z{If?qFa!2RM&_Ospez|h^a6H^d71p`XxS@0&rZezDM(jK5NQaVDDr}741#OnovNkGhE$d z-BqCjzy@w5O&!dCdZ*o)MvC~I7^XF$pf{-G;O87$KmBny>bx?yg95mt&9)g0pal6A zXCUxRCfhe$cedUKQ43){;?^*_RF=0_dl5gro3bxbej_w4W+}8&Cb2=_#ogU z>HR&Q#S9x_d%D-#(_`b>pd3S^uR{NBm2&z_I=eW}uag$ZeP05$HA_mB}BMJ0hD z(k&9chxS{poR>)!f%O!SMn1ZL#ND_-`M3BS>P02EiZOC`L~EM}G|XsbttkMq)PC`Z z2!5@3Q6ZEer?aNRBK&k(2~#z)6Z^OY*-@a$(^^3@Lu`#UcIDheHm~E8 zpB@bgui}U?R$`09HxWr$O0c~c#xrZQMEG4usuB1OtO{SeljE5@_o)p}H;Wq&Eg-B` zMihJ!wD0Zbc4Ty);oOd|Q?$!3>&i7Hs*66=^pSbf@aXIa3k68+s4&SxcGNAIbG5qX zhjP~Z$Y%9sxn&RWd$NAG)rU*-m8sTr=cU(-2#(C=L$c)4EUPK6)HDT;nSOngbD0O= zF-HTJS}cDQr4`T5f=Z(0?lFBl?doe^SV`RMmv&sgaI<*1pi@lUdEr1pwOaoI6d+N8 zaVN%!B4)QiZy~WU^F$^~0m)pBFF>%L?EwtPx{uDv;UNi!rpr@dCPyNo{7Ejl|MvaKE3zxb}hC$?_9zn%o=}de< z6#P}NYIz7j6hHbK<5E5PSTF9UN9ga~TO67$@_B3s(H`L)q1cB4)eblA9gYXlLQy6c z*e!{hP*ljM^`jflRa8(|UiHWET}`CUv_m*6b*`!fQgTqBFi9&an1kujM>@dL-gHU*&kSlebQYfpXYtb3 z4>$x-t9s5VMx|Y%jij!rG2>ga4Jg>O;p!&o%aZetWm9=knkrY_$M*pD zCXo~^3~ss0uT1@Df6HAv9Ot={R`>@|6QXBBoCRY+_lz>88ez!GI+b5Ny&U-rWg%$S zJK+G!e}C#pf(~Hbc-7$wDf#;q#9Fs&mH|}W+ z6jb#ABf65nKpPWRnqC!&q!a6DAHVd z>~3Rwnq=wluQ8>;hFue|X<3!k8<8oRltf}h>jUB9sEE#u-5ZVfcY~0fsxaL*h8h&d zKCn-s2aLWn_*iT^8S<+FHYy=8aoRS-3Guhop3?1p8bGMlVuI1Xfk23m-HMwnXkr0;o_3l=!?{AF>o4E%R3sdQ#@9r{volO0c4xSh^{-y`pi8ZP-N5{>@Uu#_T&)vH+wm_?7 zr<(s5#m#eYu~%MzQh*?eeY|;qJb0Oyl7UDnqJctgTF`7<)8xeIsmzv2ih@l%1u*UT zm$P1YTFc}~&FIfVb%XbTKWHqis(UZNSOkSfa*4)KJj;JvC=fTbCBGjFF>;cyQRQzm z&2S(tVvD9W0zRa_3uLA6ef~r53ig|}o1^_9z&-ne za~?~UplUSv8=uMgpkKb;B@ZmB0M;ctR{9CZdzzK8k|&!m@?=Y(4?;}R4|g}QXMxel z+`Tj03Uh}{1pla-O?n}_GtYiP^d38)Xu%TfGc6@WndGAKfu@HHE@p)!_H)5ka_P*V zT>EyUOLF(VohI5*cP|QatDG&8!dd8%gn{L%7WBe>xKK&qK+l=zx5UoHoGF3uQLQ8? zh%Uu+GCwIgZb1Oczk=iJa4?{jA5Q&JONLJtM*-0TnjV-a%;b2*IO7d_5=2WGWqb`_kP5_FhUqd z;G`FRoki{(+y2juG6@ttbSV?e6x)P)}m&hdOJU2qDwEPoET<3Zy(`%k^=GZ;YO)zW+HzT!x5y zZgqpL!@-zNHY+}aRJly`y4VuVA&tx|)o=*67%=koF!M+K3gLB()#~*{MxzeMJQy9t znn#DOq(?Hamn~&cKtH$krQ7V<-Zxkx`+L3ir%f~q$^6vS-H1gQ#n+c+?Pf@hY7ZMC zkY#>;DmJOKI)|WbbFDnPhn0L=N+cs^ODk)thtToo(Syw}DY`~S5z6XtirKgiq6KNx zFp3(7I`6akDrhS4ak>EWbbSErPJ^3sgv{5A8by_41&2^$OZi45lJ<>lAw=@S=SS!s z5{v@MQ5*_QWXsZBJjS~@WWR_MLp@bTzJRDldTtE=lp^Ki!gK5A?!JS{$AJ$q{s4`X zLKYe=9#Hw4`?FSSazQUOyC#D4;{>tp_^RwZbvoUbR)JszNM6O=EJ|$SPgeD?nRl9B z@|eBKg6gdlnw>Mocl^ZT^8(mq+nd}=diLslAO2wO{*1(S+HU-AZx`LaC&TJDC9oN9 zJ(d(6-xv2-QoX0~J%@vA9$mXno-peX3sghR8ij?x>RiB6&I> z(_Q(1nl6B5wP(P~g_1RMog!W^UsOF;{W7@x!2bKe? zbs{Ow>)acOhbv3ZWU4%jIXa(nbC@`eNnIaHdRw|XdPtNCt@4|`Yb`r{z3gCnp;lJ^ zwbE!QKU3XEUOhi+E-^B9=>nGDvY(FsO6sxRpHOI+pIU~p(-U1}Z&Q-LlsojJe!Vr` zCq?Fav}uE5k`d^DJDlP*BjlCbcTk8cC6EEZZLJAG z*uEeAS}xByG3&&FL+#3M9(m{Lr74?HO(*ic|0dMatrfTVgZJ0R+h5Dv)c@0!*R?Ov z|K2I^&q)b=;Yu;hXF~kgcT7VEKs`Yz4p+79j?{$N)8_4h5svkHo$C#ExR=)+M){f$ zrqk1%*X&YnvS&uOw<}BWY?jEg%+>M|S?HWA6#2NQaUYha=>LWX%ec%1sIX4*x?)nR z%w2zHQv35P?U*$~2Il9^$O8++mJDL|g#I~T0-05LA|JGr(L_4PzIaC^gb1Uv zqc3Aw4-jX5XZ%*}JTsoiSVjw(CT2S3wv1~N7{d8PtT9^ZD~fkeyx;ffED>Ma+3L0c z`E|tS-YRMN#d}eMGIXdtU92;{N!C8e->?7=&ZCe?DUx=na$Ai$={40V1%jWdQm+|QJARB8Ny%w>RX3(_v*`)_p5q_$ zYg*Xfaejcc7W2ysuG4##-y@8)%+%h;)|iX{VrQHH`2*vevAhSFC2)~g&>W<`rpv-? zT0%1-LEF|#uBT^P@TAY{Q`H*}XO*XFXHgTpB*1v=ri65CE`Ux$Ig>>lnOkhK1u8-( zc$KZVZuR#E&kJ7b*LKX-%w$fwLU)Z%ibTUTAXOw&k$c=#(VZC7Vup<@L`Ap=; zX~@onXa;h%o?0pQ53Dtq{@0Ja8QxPizC8VTFz!KLvt5NtjDWhL+*;vx6 zUFN2x$ddo4+M^SmJ_x_&(;7po|5hWy&O&eTfaM)hubP(Jo^o)F6N9S3w6KuFadqwk zM_|BJqLD?w*zqQlq-|s$ezyrXKb)`6F$KznoazyWGwWKcKoko>CyjRdE~n*I>vcK+ z#^qtIwcvT@32%zQ?ebsO3@mDJiTzCVP%x?$6 zJ{~`f)WFtpMc1)Q6fXx{0(@oZT53i765_lDIbE74{t$)$?EnHIgqUI?vPsw{W0ze zHcTl3JrOoQrqP$9eyGTqRR}nQEvgJVe6O;j!uit{?Q#5L-hna%35Q{xDex3?7NwTK z&wvvD;;0c@!*?bfL2R5mpyysOgQ*UX6>sJM_ptYj{cbJzT`kk`7f;4l9t-5aWJh1& zMXaUQrg&dP8u&Atj$$a0+#dNww{r~ei3P;9fY*rPI zy7$ACzy8q!9%L5xeakrwk0FGv1%ud%uCi&m#j9+wT9h-iaC=4jtvT&V*EkD{)!CDp zLh(Dq)80AvJ}+dkO?lAcJ<6S#hs0P^R7%q~rI`b`hn)0g3&Y1p*3gOKV9748F3I-J z`+)BB3cfMZ;S^&7m~LvL7AJA=*Q2+_O<<*uH5ok~>`5~VPZ zQ3RZyxXtIw8@RNP)eqNT-B9u7B0vtMKCGk_E-#3PY9ucVxTfMK{O}( zyyILVTbX#k{Rqoa>4OLR38`!L6JV7cn^Oa(eV=a60|!d!y6!GHzYUGL3YbYpg^2{)?(c9p^jm#@}!f zJT=>QAJ!y-SFfjgpJVq(!N16zdP}gpfg1k=?bb$nE87}9 zBdZ4E?C-s&rg_pCt`h%7buJq>bXXtV`RC&K0EXY1FSP`xADA5|KA(wGX)ZqqELWF9 ztx(wwWH`V4%4NXxQ8wfmU1%9oTh?841>~4%vEyyJ*K|(^iIZOV8W5;K6a)#aI&Ts+ zwBi(H@t8?1D_-?@*}68)c!|QLF@Llpm~j#>vVXbee1s&NWr7(+f@|xMlKnBDXXfDO zMSvea`}wPPcq`g)?o&1f_AfV5q4OmUWp`VyujUTJBM9UwkKoasobEy{P&xV9I!t|f&Bf>nbCj=V-!Sl{~Q;fdjA04VN)NkJLpYx->n)n$=EJuvHx5GU*+m~>0 z`ikY1=b3MoDJmQA%MpJ-r$gy4SDkxXh-llOnLC}ZzL})1&Qk*Q_JrhnP;L978)u{o z=Uj{^dv5v~>%9AWCC#M}JRE>*x`w9{qRRLOM9m`SWc5qx$K>;dIL3$EQtlTT_uBL%54;2zcbFy0YC_Q}m=_Clv zrGs|0TJ2+yE`h0+ghWuny5(?_D?1eR{C^%2hUyHLMsP;w^kGQSjz1$1{QDn795n40 z$0D$-^Y{ecFX>pFlz{pGHXqq@$TYL_&$E>a-v-d#`8W7DSTF!tQK0_@*(5XaxDvte z&P%Ovf#%HuOY_0NjL+#pvc)g`6xpke51IW>{~@7P9_OyVgg*!`fpzsmCkjH^tB4oc z_=R}WtEO!PU)gQhF>G{?>h8jc+eie<>4aa?bBSS#rt}6)^A@gu_~HM%P-$O|RHx%? z&|pw9GafF4Rr5+kd@3i9%d>tB7n0amCPDdx6;7lBZiQpvk_?`k-L z_`Nae=+KZ!hS0L16!ZPiy%Um-G2;x#amH)ABeKx5oygO6_mt z;8YRx($SCTNl#Q5fFK|h8n^(FB83qnu-ITV$R&((k+BtW3`SP6Az&y32>EF+lY`A8 z;9Vlmt%1mj`KAQa{VNJTN$g|Z7tpS^tNo^#nl(1F++Eox&Fwre18nj{-q2p&HL)1F z*NQFKi^hieg{c4I%{|Ofo7#`7o%hu~o_;Ah1^QzCDaiR4JLfgi*Tw)3%rPNa5c-TL z5a%%sz3|jXG}EoHnN;X}h}@m982f6zD;u#GRM7JGn!g$0nbN*uu5(TQ+*yQq>%`H( zHJ;rx9%t7^ByC2M1M!eOa~WNWDY+5=A_D(eSZXwFJ!fT%1>7%9>(zyV3+#?Yy0_Jn zMj6eWY@WU@-On+BQsgiy@a*7jyX&zw87cY}vaBkA;tQG(LHudR%0f#Kofnckqq~Zr z8iFBED0m1I|I_V*(zj!jsNvz=YF6~ZnJ+N8GyqrMZbG`Q(?xms5g)bt;a;BjU?dA#|cw?U~lxsN|G^Ii1KOav3{3O7Ix%r&YunSOvbTuIq5q7C z|FeXtLQSLSJoVSkuOS)@>~KvS-FHagG57St75p3VT^#7rS{!!oqCI-@0R zZtCr?9$*eA{8JaC@%OSY&E^H#^D2&VDC~moRIquU9MPE5DS0cg$5$>AXT;6vxR_S$K%W%)mAvINHV>i({* zT3usifuG}@-Owi4hkmf8Fnd3EjN0x**VZmqaPQ3=2%xk+&)`{7r@}tOg!l>mLm@=p zpA=U#QGlh-GkeIJw;z7oJ)^-JUYU$QSy7AIGcJl!iVB6tnhqM@Xt{#j4fp+m8I35t zGT%eS;m;}BhxNM`kM;7W$Qy{5j$gx=q?wf3|Vv5!Yy9S11(d`*eBK zIaT6%vbAft4dJpEUnm}@E8FIr_6-mutaZcxYhPS}!0taiPp-;a$xpotfn@CM(jA3y z?6~8s2WRfveF$LU;6Hx2GABOIhPPY1fNEruL80Vu(gY8xRR%v|Vsa{w=u`{|At@5a zsdLiPN)9{8gM$VMgnYTm9rQl5io&?|<8_ESOGPfq|D@5M5#i(Gol$3)AD{U{S?u8Q zZ1?x~(q=~!=278k#x8chqQjlJ8DinWt&@5jGix&&o!uitp6WSgpCU$p$Mkvd(o}6n zXUULX=8CJtIyghPR^{UBe=*%WB*Q`smiYg(7J%~@!35*ynVV~wTrVEJY00QN@#82F zmn#$ZLxH?9Y}_X8V%HTQTR9XYkJMkZ{R#5SUkfUj7HWoPG4wt{wFMj0GjlPwGDtXZ!8kj?#Og(jC{<~W=6dZAGrd& zx%3*W0}!BBQRn@cIA7Ch-(sCiaYIK(N9o-ogJ6W}mhjxK2ct7%iVdjrLDm^!6CoShcKf&9ol&=2y#3#52Al|X0bDWHe(f$@#ctb z*cFDu^?&RPJ_W6`DJ)pm(ncZw^-Q2#si+jhVFpywK%ik;y~p}=Xo!3z4rqhee&1`a zfQE~DVPt`+F#MU}m46&<1||d`j#qksVrzq*TdhA{%F*bHQy-m=I}va@z%KbS=~zJl z+TDdXUlh{zs3(Vi-F)#a08mrPxO~3jp8biyr4l+R9*Ajj8-Hpi&AL&$9kegE;@B2P z=x%sm_}Gx&5T3>@+Oq%cQM}PDQSGE}-yC@f?(cuD@LdhJv%T|0Q-Uv8EiR9zr1_z8 zLE&h=>)-Lk7QOB9_13bXIyW?YSAMx{EN`xk#bd~V*I7_K?rT&1AH2-)lL*pwi_BLN zk$==P5A~Y@TQ)ZE9xi*4$ww9-4|#bEts4sS%_$1deIsSm3kEAL788WL z+3ZPr5F5Sz^MB}|GF{+X=%l0F^1I->YnR`|zo6zfyk8o5S-aFLc9gMMwms^0FH zahNJ)js3B2i9AE-_X(clyB>Lcd6l!M3v#f45uyVW%@b+M8i7^-3f=JoiRxMRQLUnT z>Y9o+oC+c2oF=yCOFOuG=)N%A$^AP@&%k)LFSB4ol$TlKoAUETGI&|~MGw($4guNA zZZdbeu9^=80D9n(sARtAsS%$Qzs{!#GTNczPuu~x8U1@+7@@oMCu@35scYe5?dvmo z2(&DzbKrZEd`QUg;E!0(f05%)3orUUToe2g&p`G|(GMp>jry-0pDby`GAyUwqxy5# z5gX^|&xHKhe}%X%n%@2VjS|Et1R4`CKCE7f5l8plgA!vBg-vZkSe5{7D$cc#uxFU7xnRU{*=UwwzFti)I`akW8Y~xD@j-zU-m(7fno1Z=g7>^nm+g6vMN8lXv&;#% z%dr%vD4yRUcO^-{>HA=+#(Z(+1=%w?>VJDLvcjkLX=34xp~MjzYxdD__14GOxHNu> zBXsK4n_dcInIey!LKb9Hws@`R)5${}m3Mk<4<(>JC#)ky-Yoj_tRSaa)gl z8_P?0z1b6Nz0lmivInvo{_ol)W(xHs$|fFXI4xkiY)r3>4katRd{3sjT_4?_sKV5w z#DsoNj1gU={(S{T^@a=5wavwZ&SZp%5k-rEcPsKXWFwA-nP`$r9*tNQchdQ*q1*&g zZA8Up2;-)%Pa8o;%}*d(!vgfZhMDFqlH6G37^d|9@577&VoPJoTA?oA#s13HOi+XD{hd`$D;Eoyl9=Ppi{QKu zTQeGR(u$rDzR{e*eE~D%z+XX-J@T&Ok~cr&RU~G{o0j`hi0Hqsk8S#)FZ`<4m1id1 zMyWr;;b7|>YFCnRxQ|)cd)^4|{=(lq&%wuh9lu^Mi0*pFM#_bPPsbQuxl?R;d43{; zRu@AT$ty$85zFEKAxscv6 zr?~}9CI@o2n!4t(swse*uajNcnTStJ0W7gGTwXkjOGKm^6D4yz+=7Oiqi=J7Er#mY zYX@%uT4h7oj1C{S=sCuEx_K*)9P#7z_U)%rPffyDE3YT1dVcNLs&*dbzgZPI_>i9Qo%aee$)(I6_*mZ=;kG+? zyft?t4LhsF35726EzyF~&3`NB)rkQI2l6evj8%ofdxAPgR6K7)k}&}VWbMxD0cZ@; zvB;GEzs@#nG3Pz1IVPVuR(P7SlsqoRYdJ{DPjzBApOToIAu2~aNa-s6J{q-`1}Ni$ zjBx7YDAeLVjYA~s-Qh%-<-i7!JyjVML{9&*DJv)d@S3t=oQWy(!|ixAat*9<=t9p= z?`bu;IAc9G4{Do3+1?y`JrM2vR{d4NW%!Yg-=tWf=BQRnV3>B2h*@>UU5#RM3CStv zre_t0*S?yb7nTS5NZD)$T+9+X>7ussr`Q1pUr#TZX}bbbXJ_RXdpZ|8k~V)nNJ}`5 z+CLR@ZH`Y!_=VF`cybK-XFj7^VEykRK#nN1xiI%mLZl1j5H`kN=DPKDc0`B!fokT{ zK- zInCy2^dkMM!7l=QMYi*FqU-#hBBWdv^vb`LdT;Niz5U(U`P*SvtXQu!#{WW%-d(eF z;@pJkLanNLJbxn9FWnx_=}(xd@b#>ZJcmKh@`Z&WadG;r0s&xlt9z6v*lGRWRb%kR zU`vy7;PL~T>g*>*bzg<|?27(%{}P4&StO=NIm8z4hM|>FQ?$U_oeL|@9&*OI#Ds*D zAiT$YIl!;w2A2sDtLxt+rZRV~%SjIu15r3jwqB!?TDU?QELP-g*heAZJdA?6iA ztC@bT^4SAJ`%4QWl&)cN?vS=oKIve?#pkH;Kmnb*I?zPcfuXa$66J%8wNcQqy$G%`Mp&5SGL(b9bC9MvJUq3UapyeIwi znq8x0dj#j=)>{FYu-7S>N64$pgO_LCOHNw_Th;+cXPD@F`_vAmCRdb#l&)`w@=V#I zV)-8B6TC3oD+dg3ntdkqsE}{_z|!aNnrnyR7ef5%%kL3m4m01a1}L(&MT$*yqedNA zisGoGpE66Sj~9K5iB@D4ys|d%X?oM(?nwuC?rugCk4nyc|Cq=N7N!5im%z@Qk5go5 zNfHM$*AMlPd6g3qBzXH03_9Iu*qz2)fMy|%a;Kp9XyFl_YXu+7%Fr3-*5ZV+qs=Ud zp1DE>qEDw&;W5;mlcuP-&b?^9pamb+D5xF_rw|l!%qk!vBJ%}cp*@}QM>;}WFe>1+ zXm`wxPJfg0CwDgEP<`oOgM@Nca)yAZ9QXzLn9?$Qi0N!4;{a`ww{M^Awv=KT1{8;z zolP}I$F!6w0-orVjNWejrZd_zJ$yUmj%Qw@_#sjC7(FwW!l}{Fy*wW*$On=Wo+MgltsPN-5iL6;>uxmFL+52d*p7)=2FMz^A*Lu(?!e+M4eT`pMR{!?*Z-26a zX<{H@93la@c~dXUyzad!SN^-HVX3OAkH*J)QY&t!>`yt}INkAM)(^!rxLR!dP_c6` zPZmunmnzgRtAFtoJ>~3hJV6Xr5ksf0ln!s9!$&sZNu}_TQT|2d;u&E`rnzHkV~cRm zXoc#`K%&q(W9xeB0!!7yQOSl*2yjj?@C>2a$QHkS;>i4AB?+ul?sKbK#0wfcr$zmhQm);0 zg*aQX$h-i>wqs5{$duiFVt>9G@urNskx|5nGWQQ%AA|OlJiTG;$bAqu%FXY_`h5ndhtgAY@j`bfSI-r3RG};1`|gexU1FJ?hYG zS}hQp`OK^S^XuuS!+9!pnghM@QwNN{;s%;;3O*@H1b0$v*UV4ziQ11x2?<)yz6-$N zM&Ia}n<+>DU6TBV*q`=AQ2-&M-lccI2;zQ!<#_MRYh`5Lx#AWYhwx7xJwy$3$x>U4 zKf*Uot_3=Hx@5lpuS$!2@^T14diX)ia;-OIA4$L=_xHLuW_s^PUV_onpD4)B*L(wy zS*v|ZGK^I|bG6BMbqEJG(zg=WI6RPTw)zRtIMA&I{0KKXnCDWF8TX+yj#j> z1ka{bZOBsLI#lz*!Yd1FbSht24@MnPn zgusill_u3Fb*o+6_qTP~e5vMD)H2t?M{310*|&vKpBU!V)^qB!5B)gyr2Ail3j$f- zLRfR%idpQ5>_q3);;I)6a8gjPb2Na@Q50Z2qqH2P%o6I|Q90)F zuB+@=v>==&`GYRS*J+P7mP0QlST@w7GAFm(+Ic0_O=`C}i)XwO+s3zZ>r>OccX-Lz z>sns#Oq#!vSc(18T6tt*ZhreMkoBJFnp~4CNq7GmIZ&W4>eh9Q zsk3>;7oKo{84G#)G@pXdl~35|F%%zZ2e31u6j&AaS@&QKKSIV|_aj_XkQ?V12d)sD z-1h!IRJ~+oep#bb=?`;v>rn%aTA*=W+N%FqErY9G1#+G# zgm-;m?l}*kJH+<3y3XJ``)7q3x%!>>`)46LcA<$fx!QJyqFX5$)pJ(VVnflg zAoxxGXuxuJ=tY=l*@nWy_U@k2JvK#AAt`^aG!!&~jKGZ%JUUzs1S;l`^;roOI{J8H zT1pbf;Un&%gaU0cDpe-}>NP&+s1yWBaEsKxwIYW`k$HC`0}%$IR~eLxFGLLtpC2bN z9|Z`L-P#fp5#1I(2ua@&)?_R$l79c%{(X87DCFIal%tAgq6$)0oUKa6tP)ucxWfue z+=02eTF~~QEDz8fTqvh0JF0CX`N8CKCabD_m`MKhQZtm&SsbUS6{&9dT$eNLym8zE zl6j|nzvN6>@vw@X6A<-8LSbq?CloEP+XglcyTA733@gvoh$s6wu9_VV@O=>R;X8HV zR4Mh7_|dVV!qUPwrR)*VLy3!ec0F-1mCeG(fGlk_JL>}`EXUx#Nu@vP-*+9kaa-L& zM@JKAoUxl)pFY9p_3A$U#3X^0_}?A8N+o)bCO@eBFo8R3%te}WJ@vp(0zpySV8{Sv%-V`2{ToSH_~RZsJE=Ecryov`mF2q~x51I8t! z+^dsd?}7+?-zXCZj&~TjA9B_U475N|1W%YB9kqh@y;jlP_mAdIeULiQcX%pe{jZ}r z?v#z*3moG~WXs}da>oc9W`Fwr?M1Qso@)J3b=$zIA3PZaM_B%jic3OOaK}PuqhYG( ztOvbfsrtRHZjq~9OU9KFH7Bn7`_OTv>;#dHKgr|f)QGF+4EcvRb}!BP)RYyn<8?#O z@3N45v;_uAtf+1=BxK8~xyq-RiRO++hy8Y^)hIldF7c6(?hf5sUFM}g=&zpe z=~?RPR`-3Uf+1FGy>{}^sp2+%g)1B^&bU3y=nT&27_)En$JEv1Qn|XTkub*+Fi-1y zZ^rH>db`4X{-|@@^y6IhLRKnFhD$XWp?o^VG&&~N1bUqgb;bFV!@8mwVI+;lZB~uS zS)8h}u?TrLxBB61M109ivvGmP5JWBf6C?@2VaRDB8-q}{8p}91l!DH(it9MtLvweA zauK@50k;f#?Kb&9wFd;&9RMHt_F9RJ0@k_O0zb^qdykO^xBC7|`-MIBe^?E`fyE=5 z|E?n~-JAp0RGai`TWUxGsxbO%J4m>O(X^nv>ERL6pwv!FGG zny$wm?R=LiKD+5m+hJsZbU;u_)-gaYdbZO-h7S}E%@t@~C}=z_=q;q=sFB4{lD&pi z52Bx?cn#NuVmRXpbMg$gHG8G0Cm3nkXHYGWGRk3{rK*rWR}#!|Wisx?6L7>3$&svT z5>VwE(DLIRV0BkjZQA)P3JB(g5QV+~B>9>C@bIJoWhBJH_I8~2@3|&pP%(wIP5On~ zio&aD^n3Q3Xu<%>0ggxVyN&S?)MrMXD&n*8VN5nKeGHk1ih zp;Qu!Nh_s0xgDI}tr6~Ooy?_h=~mY7l747U!SJ~1z$MRP=6An;ABHQ?lxqcqA`-^iwPbaU?wpo$z2rK`S1xV*<5-qnZx0v(KVBI&;+4HZ~?V#SW)yv$6kYl$ozavNa9H zP7g+vn5DrA4EM!AxyGeKNRsOoj_O~%WN+!7z037G{Rsp1QWDqwmA2;Jk)KWR(7qr= z5D~0{etwPeg`wMScIrm10{!50KuKjC;-8iik18h4b*mpLr#}}9erz!;N3A*Qyw6Yv zI{$QENPvM>qX8gFP9-te3oT-<>(|?WTwLc>91EPuFz^|P6vi75tcQjiyf-Nw4iQ3*$n=bly9Yx!jTn|WzqTn43i3D-;R)>vg_)>7gb#i8h~TED7CS0)XQh99jvh(Hnb(CG z^aLiUUL(H!d)E7M)}A51Y-hpSBIDd(tD63FuvnBsyqRuiDXObvDpt#u+*+Jqh_a-qIcg3 zu|lF*%xGkmrID$5bBdm|JYaLi(HR!dYQ4#s@Ylt*%R-6+o29!qL}euug^iNIB+(DCI@PV zb~tjtlaa7jz5fQb!tZgyzt8{;$xb|%0VX93`HI$h#d_-W4D{I&bG66uR|8Ytnf8wc zuZR>XcHd1J4!ZcHPl-|+EmG~+ueSeeu$!68F=%$6VQVz9wDbAV7naTO*i>M>IfLl<&-)nF7**ap3RQ3B_0E16yhX`x=EO6p1m~KW9XqSqy$zq6ND@F?4yNR;=gn~z9Gh1hQt&o=#}^2Q zG0@Jvzl8KqnD_B^O9V(5ms8Ol=zC3ruiJ4BhqTscG!!2ZzOGBlY&kSnir5ubja6^U zlb+{}#?d(AOu1aS-E2Hql%5(fD3KUBdW7~RKS&P~T#?RJ)H6-V=?4E7VDP8Gwkcd< z%*Zod$HZsB>gSl~g|bKw601p_lx*N-{PSS^56LNT)od@$=#Xr$)rA2uNJktTAenT+ zuqo_#pg>n&e*4{F1-IWH%yO+wDu)Zz9 zTTUk1)Z$Ci*1s^X6!xt9hcl>wGj>Yo_tdnttyq!K2CNwIQ}4`~uE#y`R037eiNm0o zp=7s5I7b|;o*O7&SW^JlqN0)%zH6>@PS=7c3K7{9c76JpWPJ{OoOGd|+Nt3bo@vkN zyi)<~Q}SMpk2WlG2g)~RNcU^iPmNJEjrnM{IzH=|{Gi%H&}ChsV{DRpCVk!fG)oA! z7W4oO!A>>tDCTvZnCxV++AR-~7v1qiocHg1_B)MtHSbr<^gP*~Cs3`0PvlGc5ir+A zZK{vFBy*F3mBW8$tZCedl?Gj>H`uNj?~Y`=856zFVl}Flxt?}L1b@Xz*j2o%`T6K8 zbhdn9aecf{k`8>au{lx5GM$<#_{xvlc~umsD~IkZzZ^~drl0a{T0!3^%%bQwgVn`h z#@wA^xmrcSU0Rb*KATfODX7m$i~bC-X#e+LlSom5JLq|+sY}t?KfyxVUDwsD!DOAe zoX~nOitYvbqz3iXpQwI&c<$nW3|DPzRU z143kdKXh`uo_Vg<qK5RPo2Jhm^`Aoj1gbi0I z)xf#)T~5H^8@-Zk=i-Dl^wT!A6jr0RayY_6)03sDnT%tA3kxbZkw^#XRALt@k;^il2K6Q zs@LK2g4I3HD8TBq=8<}-1q&=na1Eid(fCX0mc%Qa2VaK7o@l6-^xYNWh$jK?l8iCX zD-Ew|ZuGAr#=ChzG73)kKWxQ_uu`tt4=y%xYhQGi zWZCRdTM%E5ij*Yx{D~i4r+Y;V+s%Z<&0f)usGWg5Q=brf;`RDRQG)YSX2VRm1Is@z zwhO2bVAY09pcYSR#*$zu4%7Tb#m-?*;lP$_TvBVa(hCGxk+*? zO;5ciD&0%{h$H$pxV%U$OK^h!>i!qiqv_$(Frv^6Gp&&^3UDYY<e zj2Ra}!t@A<{32XP>DnA*c(fAlde>iazEBPZXB+LO<9R-ww1``(wrgSrs*ru*;{D7~y8u9p&I{6mJRu%g371a~a3{J7 z(W#Wx_me^Qj?IGzp9_n*70<-4*x+f5o0ht*?TLQM=3*Ru(^mvhH`Pt$c$jDM0O+YA>+~QRHghOiE~WKXFd_DibVow28PF<)cxJ?%bO*@%eoiX$flY*D(py zvpRwY{-p^|OZkH*hsB*QZ@7daMRi>;Z~gS3Qrlmb14N2Gpp4t;8oakdMoO_&&J`O8 zAwKsGn@w%9z1o6hI5c~lw(`;aA5^)?o>)jL@5{)p>u^(jb?#>|kvzx}TpakYnIy}u z{S?u>^`2QQsHj)w1E^!TN)h<3AJJ>~7S5Qu-Gfmqm=$jxcyus`qzEHio!ITqlGWdQ zmYSi+2SJ9K>N4u3zDqqP@=yg!56`Qt@mosgO9&BdXYgGle@ONmYx^R)C^B(lmtM!f z-8kkvtBg%GZer|v^7{4{l~X+!Lw$#e+ae-k+jHhMZ&vSr@cwo?QH@tN-f9Hq_~-5c zzMA-nEeM^VzInwpTokrn=$2Z-XSyyiMJz9^t}zn-St8qbKKj1ASB`qycHCf*Ig*PhOCer}z4 z4QQama$h~c!*H5~7wi1IY$xiAKPVNjn|T&nT53NXw|3cGk?M7REFR9{lGcAs1ci@@ zn*c8m7&iQJ4EmIGY2vxClTd1zE9UW|a;BZhZeoA@O!_E<;YDIHtMrejdmt_MS1g!u z&e*Ri{_GRm)&)nqsT9hp_#zHV3M&`)$S_#$nr3)Iq=-`YyV`2t)shL6#5#xOdB@pA zVR-xPEUwSVNYA8SteD$0SN{-+buQaWBDMtk>Q4PX(YdCi1U3rP+dsD_l~hdKfc``! z95w+DzoCOt=$0DTQc7ZyMn#n~?|60Gc!9poD3hOi3+Nhsw6)_>!C zL*aIgI;>Bb>8MC(7l#If5`clu^L=7uM)Y&2zf=@8tszZXpinS6+?W%0eSPM}kMD!G4E0I|hZeoke5HN#9#$K-m;<>l9bb#qtZYN)@zWe zD3q_AY4Upo*;pI1t=MVHmgTJ?hH;11%=FMD36JIIaQdWQs?oL>L$lxI>N^F$>hc~y z#yJCwHI}bmmrTZRzTx3<`f)e>iHPNS*zzghIh*zLoDjTT@G`L%AKvWWvVCuKkdo!k z?UeOt?$WvK!Bf*nZlLd~5;9s}%rv{o3#2Wy*E0t6Mc_5nQOaBeKfoI)5PFZ@Xy1Ym zTU5oyEc+t@YoGd;Ev@8RXXP4qxulO!CyjNN4d1@4U=_D4wv_#-mk`|j9qa6E!%86@ z$aYVNj%7+-U>mrfaT2)9`v-0m2)6glW3;8f(x-^MY#8LII<;%nx1!RhQ;Hi>&%i=A zm10`Nf>b@xuuueuggKheqV@dv>6f2^QMUhxBP8n^4S%f$%#Ci1%_8cfzH-}tF0OB# z4Iy^$9%z$^rs@f^7b%-z%D2oHt5fwNmcw8yLLP3F*i5 z0atUOm`GhkD5?8<@#E*~rvWQ;pufn(&Ai>u@*M%z@^hoBOOuF>0e_y^JZo+Bk4dXo zA+%ce{+JX-tS}xpbheWJ!-K6NC5L*ixJ!5ZWY-#qgm>RY=(Z?vJ0;V(>65kpb$W?r zw*OwWzr%5OhT!@>7?xhTjfVwL?{*>#U0J5;<=cYd0&`jiLXlrY@3-!*52yN5@V3jq zp+CyY`2+^uW}X@OELgfN=b0BhZ9G_xYkb|_CQwVtHSx;6%@*)$(n?Cz>#R)SGhsE_ zpQ%V~w1>RcG|sm$*`i--TIxsv=dTfntoH+O{acL+`gX;)4b{|5NuSg2lmZb1KVeL% zgU&&>EI)y|ngR4*;n0HHmkoheWQ~yXnVJ&o#sbTTql=C3tHc7UXHC|~P)=qJDA9ar zp8tw4o54>lyIXs29SM|7({~r<{X&O+g`zeA)LGIt@v>y^pR{E?fcRH_$?P0pdsi~M z*yZ+F7Bs+jDVUv@=qFF~$7x(tbz&rq5&S)GLL35U?zl~#=+ zY7IZP>$frLFLDYPa2byNXLN5O;=EpL?KjEn))_?TU`-KsI*6J)n?T6c!a)vMndmgX^r$T-mZGK)vykJ)Gdm{G&-N$%qnU ztHQp1q25AJ(| z9q<*Vv-XQ>#)cp-$Sn3X8wR?NzS5;j;Q*XH>ax|Tvoubyo)xqRA&}wUA zlW`-r`n4m#D}zJiPW`#J$`>qx?7Rr!bw#5OAL31_3`U50pQF+z>+68<)esKbBy%ih z$-bvWV>YhTHa+9k-f?1%AS4va-GF#Xc)Q%>JHNgLU+>fmv|g;qCSfgge)KuG!^!`O z4jeI#(4EKt*S+a{f9;Pq(Xl+fD`_hw%kNM4cbd4`O2T3V?7Hu)2a*>!MTYf{KJlON z#8`V`j%T+SC-(3pb!*LOW&QvL)HSAm(O%ni{gjD>Y~OYOs3`?7x#+5j1BKixegbp^ zIWlfnUvGm;o}Hl+RGB}Wc9PnFOfIW+W!DFq3D8=m&{_4;1by5nqj9DBqJ!U3dr^oq zq_Wg>4h?_MF?yq8wwjhqm|#c~uMus$Ghb`F}Ji(#{m_zFW#@ zwYF%vI8aEXyYaunRkq5|sWh}bJeVgS%RnV;`!iACVSn3$6U3ZqoPYZhrudUPy+(;o zT!*nHTiBz?&0sT00mv_+ZkR@w`obF!W1CTOH+K4D7Y+)kcuqgi7DhMrortX=`V#j? zz*)o8j-2>ie1_8Y#}Oz%AlG!_f&?93nw}X{f2=M{I$ zDOO5U@!3aSibL6_3dzi}(PbppjqnCrf%yxuadH|kfH-$=*0-BCVYQ@C{x{WGs}j61 zXGNL`?%Oy2Vf!AJM*2qyXF17AhO*|bejv-H%NmVGM5G@hk*vrM`5<<|9g>DHw`%0q zV9_j9Ny(R9OY%GIkbAsX3mPmM+}Z(d(Ik^c*d8n~7amY~4((jn5znhN7>_ULgT#Q)TBjMBG30};I`um{{YINNr8%A% zh(m#{_@}lV4mapY^Wcp5LwT0VWF+_BvOYW<^ay%Rp)0M)6z zPY@-W#iF@-6?@yI&W=hA*x2bqr4jtr0@4~Q8^h~{Js3g^p`p}A8u|X+@uK~6KRF#> zhHpe{s09I$`E4qJk5H3EMn5@9KJ}Q%_BtmjH`4DSG$h5LCOlA8aGI&)7Q5Z5;im7- zykrFUdiygcu4$)u1RrXvY|VF~yu;jol&$or$eHLr%~o{#7$Ab!ys-Nl=Yr~5w(5@D z^PQuU)qQuk@kWoo=gxv+>38~6V{oit~AHvm~FFI!}i}^1Jmz4BQ5h~6=pU&X9E20t&&xH{Uw7Fp}JcLZKG7Foq_ldk%r8cY$|P_S?X~71wcn zN*DBSbOHmOzx7xt|R1BoQ)Yk(E4E!mr`$6&?~rVnwVm_D0Kp91!bP@T%SgnG9H^O}xgwY5&qrU%PZ6B_3Z;Bd_5H?kVZ zX5#32Y&E=?${l)B8mJa{m1zP+guYbX>CDGmH9?ii3N_!w;!Pflz z&QsAKR9D+xcL>KT@{$^L{-Rcu!&yR_A4#}gma^)-;2So2LI5c%hvg;ZE*Df!7Cv^XKN>LwH!&9K z{BSaRJSVkY z3%E|kk&UXQBclq~#ygnq>_BXdiWI-A(1v~e&XE#uf1TVMjv3#z8rY__e_v+7XtIXa zPcL>iF737+ct5zXmt}tcLJ$i(1e1%$hW}Nw4PY5ijZ0?HmLJOjt9bWXg-k=7q1|QT zW;47VnNEuTzn9Gb(}a|##Rmn!H^@w;Owh|Tp%p=BX3vEcF>7+!%GFl3luFdfS|{a4;#~p02Pe?wv*_J^q2hFPGN5ddu1{`v z(H61pom(6P*)obo^mFsMF%;N3kw{vF;l~a;WS+dV@%2u?*|18PCt&2j1P!8%P5U%nUX;2C-xXrP$xphHHIy{;A<9gCFSIw!F8_p>y4=hcGH6NxddWH^f+cr(qM9_8bYQ@%qE z>7&2nfe+h43|-`s5r0sw^i4GF`#}j$lap@tYscMV8vc$;P07G7Q0s+3Q<4B+b2*q2 zhg>?)$y5=o5|DvtUzxK7{KM-0@y^*m(u3GA?3>#?+Wqm2T=o6!n6lvKKizF-oh*qZ z%JCVbrDi>UA_N{D;cl1b{Yp8r(t{a%jO0SMmpt1&7T|&u=X)F*{Ve6+Kd6~ZK!q8k z@K#q?BR^30N3E}8?<#I^dev4=PsMb)JdYmZMk#}9_}2Gpw+Oh zUU^{aX-i>o5B_rkknV`&O=5>peE^w1yg8Xhg{L#w>Oa>Y^*0XEdT%c@Q_NTzqWR*m zUtn%|h##WJxQA$gk1t{_v+DIU%T=a+AS~-}_h`_hBfxI{Rhbvsd>n5?2;H}0h*N91$Y#MJ5wr5XUQang`S$`6iaIy=7d)xA>qC8kNqgvPyi{G|e!% z{rA_s0^G@no`Xqq^3aZf4lDUq-{5QPkf2CgVe2UPKq440urRWuu*aXS_zj#cS|Q>C z;#5$dEkoFIA#k9nreIskfke^DGvzohRoXovHMRylr<;66ZQn6Qx$Bi z)CIXZs{KQ{)Wj&+gcN&mz?HeS&uYJePs=I`wL3ozeuQidbQ^=cQZ@^umK?jZmrn5% z-$UvlRV#~V-Y;fbYK%LFd9i9sv6sA#ZBBCiZ~1Os?v5mK0l&xtlJtKlvaV1$%3(;0 z?o`a(W7}Cf-JGFURhIjzPsyQ){(C!Dekc?oN{v`g-vOD6-RjO(8C%|t3=eawe7`hk5(=u#HZ7Ac&!*-9h2i@lNLg$za|Y`1!D zhMK%_R1Q|xc_5CbIC?jl8`6d1It(<-0xSdd?~zPsUSUj9I%IdiIyZn3;O%DWfh0U^ z@G<8Rjvyb>2C`#vJ;&6wTMwLr^PbA&jzH+{#=NM#_5G4;MiB!yy>_Y2>C|BZg^s;n z)#UY$6EU#T8H66p_D^I#?Mw1cW1qZuh%dC$hcxLmX1r*1z{gkFvEq#OKdzYC>~0)e zVnw0N+EwhL#anA!kEJvtb0-z70UlTLCPsB_6JryiXfsWx?tYYoCEjJsOaew1Rx2MWjArYVvxoD$h!Wni>AxHSv%v zxSCkU_!}msCH@HW(jYgfN3aiE4qi7(*=tne=oFn24IAH$2)~&Z*$Pv4gQi8yB2j2S zfi$xMkEdRf*14T-kI#taCj!X@bgLM1c2Rlzl>BW7)d?R8eLVf%{*6um3Q98as400= zBAFNJ*V5K5cQ6C=>&rY_e`HWUsH z7&ngl)V7FKXlrn;n?-N|!gl?9S8NSxjm2NE8xwV6N> zD`oPl=>JLT=#a;@5WuF8x{WsiBKz&l;SOsuAu%q_^1|IE)s=`D7CM&>>)HO_kkx4x zBU^8N{Fl#rrw=7~d}?HhM{|;Er)Tyh8fDS5KL|(ckh@y_=_JwYPi{yI^VjV}fHRE_ zs52UCol2bpnqZpjhZ51+EFSxZ4P5wpSP`A!(I~X2Bxzjct$0s+Iew~?KHFvtv_9M} z>+znCH^45>veJ5DgPLE^I}%thi^F9m?~#HRR-}(cJ%17pyM0}0t>t{h{m#_#*8Qm22ZTjd+xYwOf}8>b z(Gm=bPtS)j2_!ULle>nSEILHvzem+ZY~|=Vz?6+NoQpy|U-;0o9}JQRx478$PcThBc`r)8*%s5 zA3j9x`S!c~Ao=j#{VI(nkx2yzWD9)f_VUHHT&m&m=2W|`S{b}aBQGppEzcny4E&p|9VKOrOG4RPCfOF)gA6fHT3a%TlCxaUwv9b^CqrPbm;ulob?MO~e z&7^{f-ZF!%+fYtdQaNq8UKfYnhY>qoKaRCA#+^r3`gX1E-618hi8jaUb zB`?+VNdvl?-mp%3J7XmMhf*yFSkymq_q#e~JXvbOU&`ov3~7*l|a7J1C9f~XFo+7fG;l7o-8#(dcY_yFmyv9+WDxr4R*1?a@WM5iJO8m z{9Xv#uT;9%xfSA}jVg}Kls5`&;;2|bj4~Pmr!+Mn5aND&NO?LRN}jxYa|eqECZ8+pcg%&vyuz!6 zuht#?us2z0JZ8T$c`d1qtM!eyd=g-+P~~ajat;D^pAf6=V**~C{7iAdywr2R@2ForK)}%Do9u0Z8pg&fO%V8VueF zLL2A0<3z@K!tt7_s`~F7t>a?nb!rO{6Lcq!_oq$YhDc2mHhL*;d#X^{QC#;tcAbYI zb7YrL2UqH#M_}*0{^}e64SYN@Sz5h6-eP$zd@o#;Tk!(zTUE$wkZ;&)5be{umG|IT zol0R{t?Ewj5^@}nzko@?Z85-!deHO6v^#^5?x&Y5>w$*SXFP(!jQ!W6>)~%|@J*2t zM%-6^<;g2c`r{OqNTB_~{k9-zmDsxqlYGecq(d7)JCO}FQvKnjni&H3rQQw5_s3cL zJ-fz)KSzajZ0mOb=Pd|aH1_7s)U#sv&Du}V@b!x!Ckj+V$yFSFJ9Zne0hmT=|K&~S zbRu3a0ivRn)gLnz??4rZ@h04d{J>CWaDs#K2afQ}bIjPD)T}@1m?;zDogh=e4QNql zz7Lf|$2XraFzPd0sQANyn&;g?>AkTh@ULWU`Rg~Ru-|W4h8%jew;Wvnli!wkyxL{l zq%s2GO6sXIPMg3oN!&Z}hL%11PXfKfEL}&1_HKs7tWj&1yy{W-< z?Y!xIc>>9OY?zsuoyTfkwFA7N>UwZJcl)-nTK6&8{?)V~(lE7HA3AO2;aiGhVsa_9X8~W0faih>4pdCawF9^OEbACSy zZsELOP&P+ip* z16|+dyy)+nblu#wg1+p&J6hLqy$oek$=de&Drp#Iw5@|on}$&& ziux-T*SPQQP!-!PL1rqRJvBn=3Py#cv5qpEObJW9G(WX0V0zI}22vZA{Dcx21!?1| z+$R);4bWXLj0MgDoTTyGFYH|g%PhR{mqHo=)XVr474!Cvn^07Md#)*09&1vgY8=LLZ@24kg|SY z43tNBa~(FRE;lLPEZFOwJnK&((W=1H`*yMeXbKa50_BJ9Q9XUTt0Jn;eGdB110yje zBaY$39qC`^d}nn_M`*iac=M95VAGkN#cZ5xm5ZS6%rfX~U2H}E(dVwYP34wD1`HQR z5ZzVEkn_q=G*=%4%8;GL4%2BMPpsl@hrHJ4SdBP9*6M<>!YxICXrn`aoXnxBfEpg?jV6LOrdSc3jEWTGq0rq4&oT zsY5vUx+&Iw`&ZMMv50|6@^D)VzM6;nNro`4|AIfF@FfU@OfnRL2mrkiU9hfNYH8%iPClkipkWbUs_{Uq?@=<%_e*QC8;&2OPAll9c}G!MpdkzKUYOa*KG3moYn>i<6f;x-x!$K&YtC7FBSaWn-- z2bn!ZN7CI}>xAzK{pcLAF+`? zrAA5uA62Dbvaq8kp9;l%Gj-49rMY}N>eyHM?BKc0kJnE;OED|?=So2|63^p0{)$t- zM%y^Y@md~HqeS~bbaGUKwoqJ5s+-t+CzsA`Ph7xfYDrpTZj4$!x4!hi`oeEKU1-;| z%ca+g^QD;Fdt!G{#FZd@#A7KQg0kTv7ITQN;dA3uGW$hYZtkfK)8WNRW*p*jSbUAS z_oD*e{jg4rv7`NLWnD6h&SGrfC7s{RM)(T*dbe=*3u5tLHoRWJTNVwHAC-Rh-yNsZ z&iP%3K2_M-G$DLpFZznOX zzgTwdDt|r3jd^AH6^SYm{IQRfJ{MORRp_SY;BfeTLUN#8S581j92SE0>g%xX;|Rs^ z2K@~u8Hx5Y`k_!{4ZPVrQ&S0)TYs7QmjkJnaBC$$Z zD_noo^YCML7t*0rA1I}77Ho{-IBTyP4*2#>YuaJoGI@S|qqLY%^FDj&nB_aD7$^2j z#B7s($#d3WDKHi6aJ+pmJ2_G8t8NJ}{^2U=qCIwRp%1v-hu^r5_8l})@jxNMO+R(p zWZOM)b2lQUO1`+!*5Hk+R|mtQPLd~!)cUYbzQD?=%g+fe$~l(vK0mfDdg+5C7S2y~ z?my7V@4F!(oAQB95@w!dNrPP4#I_Lu*`R~i+dh#cTGB&%8N_{MLBVost4LL$!BwLn z-q`=SrfRS-mapk-K6SfNb`p6y>mgc;S3ESDJ z*UXK><@|BR$X|`&cEz1aluX3B>g2fY7%Q7&w-<)Dt;?|<;mTrK+X&r!F#gCeOf4nR zTUiug@~)WRmC45_qgZt8Up)BtHfXmTY|jPI^4wTZ{a=3WG#dC?`R9%$ly!h&EXSgthwsG7ZF27bg6L|Mo@VtBW+CP#2u$IBj7?e_4#N+%@wEB0R zZiIYb7G1tEM^DUh!+%p3c8%jzibM<hVIbods`!bcj7JaZiB4(+N;&g(m!;%A*+`;hRl=|K3=f9WkAEI#@MBN&6;@C+rK z={8ZPD8#~Y7aXU5e6X)9{yF%^8O-%Y8rzl?4vV$Sk0|8b(@=+IMAVzx_qOv zjL&b)(;oi})E9q)XMLA7G^E(oinBpy9S4vR5%3D5OOLm(|8q{7L3+kfUq4r%zV4Wv zSSYe?4w8QC)%->hsN>40n1Cf6Wt(oD@FMm;f@qMaH$@bllI4>R3ybf zjP}j*omWoCra0UvZV?}|%qYRWpQ!PTIljb!){Eyz@CICde~cKD5HDgfG$VWl`u&df zsS@7>jDhD%IzYswyXXH|GT{{-^p;8wB!Qse=W?WZ*Z>=?Zqt=ENN?x*?2?GLoB^vc z1X!R)txpZ~^_NvYy&NP5q8=0PNqDU0j~5`0rP-eK2UDefJ{mFPMTF-aX8~iQV7Or> zP^NYN`Nfinlw)}%bMwJe$$TboR*Kzh#LkB(XgcOK^lI}rE^MidK@3jYm!K}qE1r$z znv9EOcvsqbCBihYwbco`;$`H#dUivI09I0y&ix3g3W{?WohsSOA%Rod(q$wc6}^7` zh-^~4CCUY}8WHp-zL>J68I_Zqa15OBek`wZ6zAP%>$miN#01!Zh1AmxZ<=T4^n@0jB3 zFXOiRtLAU(yLIW#zZvcB7{n+uWt;fQSR|HzR*eUgTnI4UoGV3?A4#)+HMynh7hL}& zu`iIuAE5x#$L+!GC5bpwhtlMH_5IA5*vx7~McRA=rjH@(+r`)DmHF*mh5jzCqeswr z=&x(p3Uv`pcAOWESTy}@n)I}vZ);UoEXhF+0dz~*q8x)NuO@GBEHvEH7Qg?1|BlPM)A_JF_dzK@j>))%7p7JU7sDRLM@((KayA zh~#U$n*XIHYENY189FmPyFe38?x4w}*06Z!_F;mOZ2#!mWuvK5z)?!v%SZCWq5L zAyltu@R&cg;oDX<%v6XR=d@AP|9(lN@9b5P9Rf0KJ|RE~uG~a;NHK!`zwLsAyQrI* z6B~;-K_=PMs4$GCFjW#B#Z7%~#>hE)gbAlHa0g8R`y3ypuhL< z@DRTJ3qMtzJ3D>;mFxO5kKN(P$*cgq%BM;AT`4UwdYV|PGD~oW2ZQWgWTTDWisw6O zzMJpJAO_8zupVdX64y00Xu00vaO5N_$H~QKK3ns0KT$AMo0%2a;rnBs_a7i>()HQWfd z6vtHF(9-^(uVbBBI-=&Iqf36hi(>b)FtFA-cV7~l*dKCC_#`YW7+|ntq;a5j7*qON zl2u-5K;*3q@$BY%((3eK&$rQiBWg@==R+gi1ah?N`lT_E?XI`yO!!PqR9gBUp6TFj zTE`F$8Ao7QCNuK3Z=hTL=`_>MQvWlJ0_$i_otoHDbIIzX`jT7}t|ovQ60Z1Z$2rOb zlSgb&NuG#4=LkxD$=YabD|U7~)6eEJ?7+y=hD+X^eP;eA>O9>)LhNjKxxZqanc!Fk zoFeVcM{0q6@#&5Z1A3GxVSJ(L4N(3jCv#nojVnMXz&y88(7ajy$w``dOcM%@V0Tk4 zAM{TwSt;iSLPoFmtQ5|6M@`{WL95m6*ZN(uPN&O4{EmzC720j}fmhFHE&B>4<2GFwR-oI%J zu&ZG>-20NdU-!}e;quGOEb9`WDIB;IoP(IDEm30!BLBN)4Yu!)yNtP+l?RLC zZ+1jC_IV_V!x+);_)C1k-J8g`z7yuIY!~15^y1S-TC44dl>Ycnf1}<~mry+U!0+f~ zz%@FZY(>*UN-R~<^snp5v}wweUj+_(3pCl_qbupE(O8| zp3()3xY}L<_mNPrL%8@C&f#W*KA42g@70Qyx@e?(T(1a3y(KhjnkR8AN^I^(^0AzU zbz*Ni;FVRdx5RRPr0!Hn+RwegW3XDaKDmfzB_BWkoyfM>B2v-w?alW1ZVJnR#QH+) zDQM@nDm*5qXft=ezj{4HlTb2)}kPn0*McnAe_hTb}9`7PL5coK9Xw_zL6>#4BdlgMpbOU240Dkgt zIHU~v4;*$Q^7-EjWfVpqpU0>>SJqP{1OJ+$3yZ}23OmhVXA*p!OwK$*Lp#M7fKel# zC69CWaA&36m6;y!4D0sFEJ@7Qcc-afF_NkRWj(@j$I#&S{W|9M`hYCu_CSy_x+0-} z3K}2r9QlhEpcnJ*%$^Up@)4vESu=57H6krj>K1j0j4E2I;eBbBHeQV59WB4=IoOS) zav_Ks*XWg>dVpTlJ()Zg&mt1dNN6{Wm#RbZ|Ksbt!`TeOwjW!oHL9w$Y1Jy)YHeb* zl%i@=RIS>3i&3+*M(s^edlNghTBY`gy+>k1#E8iE^!?s-e1ClZJwlEnM?Cj)U-xyL z=kGk@EC@Q6A7+n8APV;-pwACve|U~=={h2C(Ap<8by5U-%gp=E!Ey<2bcOv0A?Jm> zS(2~#sww%Grh!`9^4ARt)WF9F<3pVg3k$ky<`b_#x<^eekElB5ozYkHy%P4 z$yP)|Q$yu>Z4)K7B}U}IM+6+pb8{B%^{0{YO;?%>7Nk5ex|HGx>cdWJ^pRIws^+h$FYe)68w=IG)J|d;!TEL@7^Zr6VeQ51_9o?iuQ;H)MKU zX+VD;Na&@e-RFP0yv+agf9^D;AXCblPrXd_ey}V&8hx>FpGeDT6r~h)|H`7TSG zhvgaj;Uq*IYy#zD6>uu4WEbKCEn05|Mi&ZQD0)9wsxX}Rd1xl zf$)#ig|>;FY>oRTd`)zq8^ZdaDhITi?B_WX3R5cV>-FK6E9tF)lc=S4@D;*nk4=Kh zo|eM!DH>dsZV0nFj7ut3BI0=nvjnva`9fGA2t;t}SSGe(+;(A=)pP~i1E*)dCF_4V z(2$b6Pj<{19rCI%|NGOgLc3@2eRRn%X_`f-4p%qR9kRF{N{9Z3mQ@4}$5bZ(yO&kT zHIYf7<~4C!{;ke;jh~)O&U8gs+`+9ef`6_AxvVg{P!%6)d&jCnB3Xz2vQGd_VH9xw z6xiccNaANo5c6H$q?DD3b_<&#_*OG#Obum5dy9$dAMQc7ETOG#*!sjCg3zb?iMq+N z0H@wou=VM3k^p2%CrY$T52k!fLCA(m0q{>rZ&RLjCht4e{t<3!yI|@IXThw$14|DO zE&Tc;GaMXI_rSSZdP|aE>lgy*Fh)n!Jv{2l_Nrpq+?nyFMDyU^dN11(?NNORERdto z5v$HO39~h5LFE44hS!TM?aUC3r20nK3z?Oma)(Jk7QG48gIbnB3Ag)V8anTiD74Mk zB=sd#fiwIIs-I!PCo1LcQ??6F`S)y{_xdtufT+>&p8CI9^3?(8IN=ydEh@uyG~D+*mP%-@jYF{Xg{WY| zH1r-e4E$?a~>|WvT4EbgCl7; zR*r3mZ!qJn=+`}qHRwlT@NNl$D(vDNd(MzCpcXBgn zL3fLd_jU;bU)mx7#$R=>&0*QK`0BZtU5t?@S{`IQVB4_8AO1g2r&;rmRe3g9)6c}m z^v@<%B&bmi*;9i2QyrO}Tu!lVPg@N8>cam{_i1Yq2|Nmnl~ZGr-=y2*XxVfKpL?HV z0zfYet&$_a*9p$zt}V1_8hH$K*-wSkM1y-G`gxdGi)gYGg=Hh~P9JmBd6QX99VPO! zJlBYdZ-u}{Z%7`-F35b7fTVirwY{^HS~R^Ob-G&4;d(!>#nFgrPUWKhd%3fw;?I(~gY!HOkUfST#K{zX36W4rY z@%$_Qc`-7bOu}@E2nGOGCfT!@dNUViDX=DxJHgA%&|!=_hHsfU;Y$d@ab z>Rb#ld%W1`2AJ8Xw8ZFHt*4t?X_-93>}3!RfZxrZAFun}0~=@lz6EO_(+NE14R+B@ zFuhwrT^I}Fh@o0VefNKBqHxLR8Y?`iI6u;iaQp_Q853YbYJg~lo{-b*fVJ+S1QvwZ z3kKoK5+8f*h+=V=3IfB$c{BA9-?56e)yIi#bGfcm)z- z9X0VobIo5yJR6)@XDplX58|55!O2AVdZ zlU^}ulZ`bhrqsmm=A})C2!V`^>-woAq>e-W-C-Vbt%?7u!Ql4PO@;(Td$3CHe8>A! zHh3rncM0{!h|y!eNe%h23+{w(Ua!7;uB0+sJ0y)T=JI~Hrx?OdRHKUs_UdPtfmMsN zPTVlHun3KxiH;V=hrI})QT5TI4Y##sm+3jW9dH%mP1B(i#zA8?P398p|CA!1R%mU3 z?>X_;UP_grnKJA5b%YOkDK}_2G=DipNc4yeza#s^Og$tQ8CM!y*o9J$ux9I}u0U)1 z2Rh9rJ-h3-y&rn+Nban6gU4bk`Gwq;SVXj2PwPjX_9gS$*?kH=$uH>wl|)Z)zgZ60 zmM7`PS%?XP!?$Hyi$g<*s9_%!4CH-?WcwDnwT)?izdIy!wkr5~xT?E^#&|Tn`&Ch~ zgp4IceR+BuPWOP_j)!w+y$N#Y-`_m{bUgZ(}{@W9Jah8zD9an(FA@)={#{F^E>+)xa4U$++pO4Qy?- zjMpnsrV?@|6@3)b-D#eK!GKG$B>cpI%4f~Np`Xu3`pNk~Iy~yE-YAlmt+4bmT{X%~ z-y-|&n}NzYAJF}`H<#>t3vxX+JILl}v#sxrN9kqbzMtBfA*c#XtnI$xR?&RlzgPd~ z?j|xJD9v1wXZvucS2(!CRaG;d)u$=K5Tu1y7d_U4yUt|ZdM088GXL*Be>daZTa5Q7 zWz1i(k?OJh84gGuMHgD(Uvf0;F+|w5ESHYlVpZt`)bC{_KL_UvsH%hAWa_9NeO!7s zvw~gMe@tZ^!c=Si-tN9QV?+TdR{BJrp<VF8e`s=LBv{F7!!_LYm51&uNV`X&vNb zoR8SOnWzW56XUT(dXSD`P0_MwRG?j)F8TeGQ!bVbh+4{11ySndbyuQ`WDuSkPSEcb zv-i4k@9PqK;D&1BL1ho=T@i9oxLiqT>IIcIQDvDHY_;#rFEo#%<>dg?-~+hk&+#u{0e82ZgwpmWFi2W+qMFvn_Hwx(t`bi?@ik!Y)1N z3c_~^PC~BGruEm!Nm>R0j$ap#8q&+0d$_?y?J(1j@1O7U`~dfnut`M*Q?QU8J>*{7 zG3I`|;?34mr;teM{M91$y3hF0>@nktZr%Q|YL!5{?7SnQ=kR+_gMAYPp^VN^RXImK zS-?|Qyw;W-GA?ZR?qfm_j`5=e$>tL&Vi1)Jsf-%v=?rwvvg9)1Ip=HpUnxGXrGDgc zSv-Y2cz%mjOUPB551Q%*f72e0p=|&?aU+mPW)AS925I%%d>}dUVW$QC=WP4IG-+ON zuGxJ8)dbQxjuob9dUEha`;ack>5B+<|3ODyO7ZrM+%M!+CRuZ8mKXT*Z3-M)9WeYI z^H{PVyZwWZ$Ee;V5&qRYcy63R5camGqMtI|H{$yPiNS&Uk7D&-Q4*9DmmkZ5d#FCq zQ-_N_GB58b`(AJ9BD_H}{)p9`UA>DR9CX~Vin#ecPc>V1`JcLTb zyTAB4BLRQax{VzB%?fSEL{a*p$E*;kR@-xvJn_h*hmDJst+45ql=00nVl~ESG(za#_rn>z|-+rI>7VJX6{x&E!1G zWDA^qnwwiBN1puIrj~)eqGsikr5cG;DhI{30QjleYiAPB#i+<3IY?P$5K>B*Usq5t zw{L8=P9ArC$JWN7CY;r8GD*_c$+Ze$acg zRXM4beM`6AZLVA0iG1bH>b<~js#^Po)K62|o3RXh{I9F>n{%$#Ou}v%l9Gd_9l$$< ztH?L%mo)$(1a3qQy7xpYV9A;bc&~tj<^Ou%fEXT}?*w*wIY zc^K`^b{1rs#qWqlVk0NmethGr+ErG-^(z3W(hadZ%UH&NeJ9eRA3eU=qL^Q`0I(Sj z&XR<7JU^`l3#>8Rc-HfzCzLDXk>7T1ASlo;!r?f^^Ez~lc2!1|aDe@Kc&DZ;9fzDT z!2>J6q_PG;jBD7-kA2+l-s|!Ox zS`amS2zy6~xe@V`TegRvPrBE#vcb!i!zq?R(9|uTGQSQf4T{}ca`bE6f1@FXQUi;} zbQXy)H~-Eqdi$}Tx_05r&{_ZqgS~f?TxjC~xC@XT#i%J|x+z}-EQN2eMn1QEoK1Vc ze(}BjyT=MU*K8Y=QawI}0&L$}iaf0?GT6E;72s7f>t@j6qu*hdxhYc?w&*E7~xYzRTEU`|Rss zEV5C)X0{NFyOA#DN=orwGNZ~T(1+Est_>zbc{w+tvHFD#RTdIVsC}>OR<8eD zx?E{7X_TW1nNXC*-Dk>kqK2_Ps*4uX5Xe9vv|hT=R+%fZS< zc2eB`lvM%X&*nMLq~)z|4?nodd!Y0HTmDGBu$1XV*(?2`eII8=e22PDW|*+a z6f<@>MPJ>|B@s*rLKBUJie9?7#=Tf$PRdQ@Mh5#HVd+TunD1-2ySW+YziIl;EH$#^ zGFa>ZM>Y%zboVM}w=LlVjS#^4g4x$kc^TGhSZod@dK`Gu&nN0;*=jyktMzQ(ru8`P z)t!}C@-M-yw$|FIo-p_Va27|;1@Cqod)J8Cc&IZ_= z!F5T0vqSc~QKk{h!pwYKsT5Ej<;6f+q>d*aVmhf{-O^`Gqh24@QH~B0Im6V-IqFxl zXWyv_T}%u$%}%m>$1n?46d0UPF<^%qr``)o`M&@3lxY zbX`q!%AxW2HTG}#a-I*C$al9O)MJB&3vOKq>5mq}IMJ_BCuOg*RnlC?lIjGX-y_1A zB@%Vr-6OSnC1YvCt*Nou1*&M`9W8d9l-b$@DZBRT>Bf0Gg#n(p= z9il0)HoY`r>I<2k?$e>HkT28q*AaE5=$R|cQ7-R40o97yzV*{r9?|*oc=Py2FJIX& zol8#g2bYWL!^c4{*wCGS1`|uQsM6b{o%)w|G|bE^XOf=iTdJz^OTSZO3rbhpbl3Oh zjxx5eed8Rex?oeo3>lUMmh(0o0AUq-O&OX95|YH7{&bmY5!f^l{T+092b0TXK5Z)~ zwB5$r?WFlyPqzCsIm4u*60A8ztIv6w%fcamP`T&Vo-#9h_%anRZ=eK8O-r|y51t=0@^gi!uU9&9SFpkBvA&>?{q zi6*JTR#zmyqu32~dq95-SCcs0YF!yux&BDTT$5d2_fmq#oJz#`(;*P_bLaQR(qfD6 zO2*}{#c|V1V|&h@mOXT>3diqIQs2T>$O2Y%A#uN2LYZCKvkvC`RHBuX;@ia9!Qusp zoM=588v~>q!9lcDfTy-aIkWeMGf>QU!T}q+DRvZpl@-5}$d`=O36wZ&UG#_aIc`?W z`J*NdXNT>rxHA|w$F`Az$sZg5i(^Kn`*bQt6As#~<~w_JAqXhS&Y7`m^kAe)0eho` zvZJeQEsAX+YSQQYI`U9!UJ?Tp4B4HAdVl@yBpz8L&m%hH7oJ$D_np~#Qs z$J6*l)2T=z@2@6C9EHOQ506&Fi6s;x%b;|lGh9@Rfrv=(x&--Dndg3tNUKDWADwV=Qa)w4PnhR z|0=ARibfQ#?^(;TsnzwC?)0y7m(69K!VEhgfF-*PAbZpv`kgI9dOHB!u0u8skqmT_ zpl68$Er{mYYUM{|O3zr29+K~C7>6Ws4c^q2-lLJ@7*~Jw`0CE4rhajRj94i_Ndl`W zqf9_M)9nyp**5o{ZSb@H2eF1ED|bm=txZ7_ACzZ8FkNdF7yve@->_YnuxC@e=lFH+ zL-yreVm~9PGSE$=sC*beI#gSw6K?nKHMrGvnp>vxGbTs;;lkDe!)1$+N2*0USF}4j z2o5qHO-uWq>Omg#HM|vM`Gozw^vUufd)M#G>qRxYu9^)t@{g7Ef-N(FObtwK(=&#j zz}Nvt#ApC)_8z~19pEr)WA<7h&@s_4Z0uD^>cex{N-@@jmo9xPD7 zwBR3Zk4Q0#fex13jH?w^C+aC{DIK~YdVEWsZ9Mf>8;Th8Z8PO|SSyEJBN7Vt3%DGl zQzb_&MyDZG#M?istP@n_LaybJH36131~krZ#y5ClUNDF z*@vNy@wnv&9;>hDf3Qiojj)fWn*zG04jbsV1gkJQQ+Z1qRAw_q4GoY4;iSoj=H8dZR(9<;Do+$P zS!E<144_vWqSqr%1-X=-_5WSe5%bNV?7oE9XvMi%F zMHjk(Ca}|%r`Fdsv3+^T&z&gcuWT|p|G!oYPelGLw0>g%_(Sm&=i2fd$=8GNkED@9 zyL+bZy1BVq3rRpvGArw%h2vU`whSiHURM0R<7z4QST*hQ*^+B==H;{|5@^NOjsg^K zkE2eq+4SYBd#SEJeA(W{7W`BHU*neBc{rNWzXp80g`ZXvy;fy-n>Y)MC}u_fl$axP z;4hy#sN*Iu9jTwXQgO$Xu0M!2IMJ%xoSN{D&?*oWA}1rLV)%1O|2n`vV+6g`j?$&)W}<02X&W zz)xMW{F7l1WcW2m0r7+<`K=jOx33W`hb$f!76DKxjO1UPGCdpc#X!KU@A8R&?FrvC zTgOAYk%e`IZ-=$&{%dB!RwJDrd&P(EVKw!EClp$gZA2cesN*XN|9!6aCIJBLq5HN7 zyu4wF^LeX`H5Y5-s}UXtL;KyZdPwZpIK;C00AtN48w2eX+LJ{MB~;ujEh}>FS9kwjo3W0S4o0!%zD*RFyqKYSbN9c^4);qQ^(=+|<%q;d!LG8UhU`cJ z|2mEP-0yirgzi~nyFYmM!c_5J){~&UBIv2b;3J8h93n&@5$06i>)exV6({VnK@PXd zZrdP5fj`z-j-sXrYZYLU-^|^5uI))RhNYJS@I)A-W57&B3+6GSkYz%+dj|n_F8_@o zyzOkk5q})adhtz)jQDxaCv7=*i~2(v#dp>0Y{Z=`XTky75_ld$-_m}AdZ4p*;E~g{ zy4Piu?cF&dd2;5lyO|6hw@@jM76RS<4bYJ$7#L#fF)Cx zY~nxn7=XNXwdB$2k@N0K+Z}ws&i)2(35`A32LtfjG8n9ngfgB>y7jR=S1 z&VS?Wfd_@jUA62=Wzm&Dh#eMbIVYqHd#{haTu`TZ}_v0 z$?flTWb$B)*XMkdYL`DORn z{8T{#y!qsIPE<1AP3^t+J>h;qPxFctO~sIb_7bj)a1Z#dkJSUOxb3NHEUVq2?;+U- zCoN+QYuyjd<%>T1_Ik21*sM^H6yEZ@2c@>mkS5}0H; z$q?y#a znH=|ndud7f>6h>25CkYuon{B~HoX@r>cnvM3KgH>Z<04@fwGumIXAx>58P{J$cmPy=hGGQ6hSXF0Wt;LXu}Otx9_?SuO6X|m6gP*Ii4q`Q3aa&7)n zvLA&0s}t=)9!z6-Ndt0PF=`OZwR~h;7WD00m5qnN4jUP$ zvs-Z~0?9NXM*bI^82t4z{-oeySYe&Y2FUNN0fY&^OG+B47Or#x_bb}FVArRDgG|1$ zvfhZHyeLF*VHOl{{`D~IDb7NLe$82debaEqS0~8Gq3ch}ml%;UD0Cz(Z62{#T3JgX z$dAIU#U9d?>iT4ekj^?#dcW)KS^8cncG_1 zx_^lT>fn1Cho^0)FY7;WdNl#wN4F-v>KF)`$OHLOcNTDz$b$pe25b}qz`DycZq>u2 z3JL|qehB0)l-YBB4mgc_3z!#aUHh-6o7C^)Jrc9+ zMmbi>_^3KQ)rc1h&~BlS(^8Xq=k?cf6YAhXN&T{C z&n&u|sJC`a!P0W~LwI5J`K=54cTSJ%M*SCnoy-ho9)OtDzyR3i21dumzAYAy2xh+> z|G~;LtTIv3A^7@y-2?Fb%`R88&w0#wdtxu!A)TYoL=P91fqj^1#h=w3ZHj4NtgLG< zv9sOdwHp`@g}%;j4+sQ${ij_plrh}0Pm2-kpTKW`{<-M6+@|wOL)tx(tMnuFyA@Xa zCwK&#(c}$!Vx_n@`7!oH+##fOZEVC!vAo*>9vdZpsEgFRSc(ocU~FDrI&%ClU~j?G z%b+7Zrd#)?ZxNFWe4-^7t-Ed>7M{Ak9ER56PE+lzvHL>samj>h|o= zmrvH>!JG~cs2k$FQ^ZU=dT;TVu1Rft)!eZK?6kc#+Awp-X^Dpf{tEony!{V@Vl;Fw z%|K%9C=Y=es;JZ8sGBkIY-@Xp=LEY^t_||wnDj)vKr5GHlauCvRGX8dx*QX9*1ouO zI?^!Lb0gm3{RZ|J$OjA92^ag5ewHD1iWZU<0vjB!tdKCrca`5Pi<^V%HOLe)eAX&XsY=$l%uY2w-aQZ5{%&; zWRHuyd4aqzL42XK#L@IT#cVh=F@Prp6X<7-E^_@Bd36(M_JGxzWZc5)|mYR`h1IfLNY%4Uf8Mr=3Ys5?3VY^jngIKieX|FJE6 zuY(0oz$jKS<^bDdXgRC!MFg{+$MTz0clo<+rDEzUA&W5V;^F)cPQDK*?~2hb-30FP zuQq+$c}K%8NegIA--=c_ZS==YFO1tEkw_LDbqJDPCaSbIiyFqAC~Q!qIl4egE6RcZUgq%eRXq>OsP&#!UK_ClV#<4%AEN$-Onqe5KNN+DKt zx3fBLH%Jo88WKj(2;-lr(Uf46_eJ(q~+(>LyT1V^7*C zQVX=^VQ|%@lRsB2vHI+7r>O;#m)!>sE~R>&NQS2<{>KYozuB+zMOB)XjEusE6_`VB(4Fqu&_~!R~Grq|O43sQ+HSy$w8vUTe(z7?|5p;g!f1|bzxB(AgdPvz~tHx8M zW+E}?agMGpEJD~P+ONr}$##M!Z;9?QeITG#Qe_ika5|638})f9`pHn%*QzD{k!4AX zFR6k94KMnuUbQ0g8aMoAUQ5GJrHbnrDtuxGE+LU|Yf}^zj^q$y7aqy_sxRQ=Wno)^~)+I z!}_8}0&C+b-nmm3x$;^$Og^+%7TsOFN4iEg8t23w&Y__txxxq1Bj_}O z-!09)@y?k2CoHq=uQG1k!EGSr;kBn7TIVYv5gntefyw2o_Un7$fjkE^BrWszjQq@~+rCLuH? znSyp*JRk>rb;6=v6b{#PEBZ9Xnlg%^47F?n;1NxkcN=`5)?pfsW)gAMM5~%bxr@=- zo@|?k10t8lkO=*sDCG9A@L=U_xZvlcqR)=~wXs=Qj8=G)Cy0!>*CB1}?WohL80B`Z zNPg+MvyXkkVzA=ITuALy;VAZ|W@5h0}Z66b*Z$8HB4o0tDTy6OV zzfaJNWZfrEWp~euS4NyL{KzbR+g43?`l6)%cHRy5EP}hrNb`t1KUXHp^A>g^;q+2e zb+r$T{P54h^gJlr^frXOw$AvQF?+q*hT-tbW(A9LEa7}nr-w}kbA*!D>-TF!EVn%t zpmkq7?*CmOy%WMBPi`5U8F()-V&zmXl>9|LjS#8qa8|czFnDK$steSAhXs|bPa7uK zD;=ep*@O=wLnIkG)Jq&Tb_1tl7Lz0h9zrGl%&cA96Q$Ti*G1uMBxtU-pc3^8J-JEy zJFJ=1L<(g3h?(I|Wd6)ozXVc3xJqjZ!94;ECb|S#E#XJ>i8j=Fk5o7#Ytf{7zn(xa z!Pu$L8>ZjJ-lL?b{EB|zgP4;0!55YNPK4qfiKmxgqBUt>_Rk`vvLAT4uw~JO23d*e zBENDIDLodN+T0{(YQ$z~vrsR((CBe|HykWqw%NDo^7rWTiWCa|Kw5e0!>NtMTkG8c z*{|dZqU2O--^3I$rf!y(mwNyYSzrjTXdWYl34t#<7cwIf8nQl_;QK^y7@~36U$u~+ zx`EUy*(kq|Ko$9{u!+T&%E+yJoJjrJc~k4R2kpvqP#` zU`%S?HEq}emL~W7!AdSh)#mHJke=$eeJ81QIU(7eBuJK8+iLwxl z?yPAq2{GH95FlfgVC`+wc8=phUf3u8?*YoOeDZVw+SD7#sChb{jlu-l0G_=ZK3p!Y zk+EJ;lT{weRMHjst*az4JC zvgcEpr(@%SWAS_jQ@%=Iat9N2>Qcg-+OJ}ptQoBvIs(RPhF~KbD zv(UxigKPgBr@WiwoOjS1sj@h7Imsv_S*6mxv0R0}dhv?Mf~JsKfb?xf z;L;Sy+)X$^%Ayrml9S1hrE;tzObV`yuWSs_wUDhWV=QzW_XQa)6p}0s|Dh zJ<`}z_45G~wKSd2ZH?DX`&&#K^-SERN;IyosT3*j2?6R@gP~!N5vR%NuBfX z`8@C*dt_P1j2uC(0O#`0k7M3X59x3%?hdVKy#0DCV3 zG%0EJ3yI)BrSNhI%?|}7_6%xhfAh^SZGsJ+kmZJZPg&lsEsQN$1JPw9P`f#0U?+Ks zZ5-Uo<4vdXKf>|0oaxKU2V?JssCH&<%j>hPW=Md%x!y*I$}v;A<*R9sI@zzi&qr%% z>u~$c9U^O|N_BuC?eZ?4Oi5{}^=Qw_Ga4gz zXY8H6HQ1mKrE*^X$#ExNtsM@ zh%wRO9Zz^GKXD>-G#rt$!;M<7;MELZeP#4Sqs4OSZayo4O!4LSo4dy&hbxRSpqvUg zU7YKtZX7wf%wJ0Fog2PL^eqM0?9!#!maq*qaA^GN`RQxz$qgCN`$r+Nqw`2=360~} z(DU8zfsPDMk(}2@=I4byzc6FAbBboJTFnBK;mQPuGoh!cLAO&Kshb847=l>4onsmr_r zSz}yeJGz+d2Q|i3Gkg@Hx24X0go~V2$s;ol{lfpG3jH3H@&cNnbPWRPWE*J(Cx0b% zjHq>oXAfk8Vl7ek+Qm9zY9INX1~2?@G%69y0Pv$fOKUZ)z2`?R7R8j+lbL<`gM{7p z?zS9WlOY5HnuaHIG=q(%Bo>Bri9vSyMcnJJNjIAYA8@G8g}}MK^jZuh>-$=jYR@DX z*c&xb+-Ac~8io+{aQ4w|;`8b0+`B^`57-b?CfaD`3)a0vgOIlq{jTF5ZYW6qbTHTq zD2Njt(E7FXIdVB$Ztt|$fE~l*0^xXu(6Vi^ILWC0toHfeJYIM%1KfhBq+4J=QgSKO;MPa8ZdE1ed5tk@(ibw!Ig2?c z(!K}A;CFAki^J$b3BCAvjV{9EZ_`E?u$QTTyBV2c6_u1z`N);oE@a6;&zy6%FKOPi zper-XUD(Sn>!M9q!JoN?q+d1SX#xEdZnx z5e~krZmV12G#Qun#XMPF9}RLYcou_R9_8Qp?D<~x%F3>#{yT$_Riyx=ck563c7A0| z4et%jb_FBm>G|n0QBR4vzU+eo0^j3;SD34-i|IcX1Vn8*Mn=|~betUZXX3jib)Vx< zXZjMjZ9LyNtcSOBmVy=2Tyy!Qu_`=k|ENmk10%y8Lh8`FA;LA-$YU37IEP%I9JhfVCj2Un~aL#|9Qh&=L3xvTUn4_tw@#-i;wSRW~(c! z#O8c4np$^+#A_u8i^u{@K*`2Foj@Rm2cSM$Dy=ataiQ`>=m&MY_x}l>do!0l6*>7k z7zCgnS4D(YxXjeiO7s@kezTbQiBai-=J$3(x=$Jy9hy70_}VQ;(roa@tji6at+>0r zwQxtm#`O`n{Zv|FR>Ykt@OZ6{d+GB1vAX8PzHbcco3Gk(S?U@ZE=&XS0Lng)&b9>P zUs(d41t)ebU)}UVDqjUMy3w)w&z~g`*>lH2LSB#;%&v9lkj!Ur^=r$#Xa3jyGS%y- zT%@jI`zD|QuCF*Zax;8mGFfR{WWpdDn(cU(k&qOE|nFE z_PRF?2To`IdAY8y55DCd#y9kl;I;!1w`V~=aRo{NA+yem2#$6ZHeP4Cb-(IBdV`el9}Fm z7+#kZ{etSlR9K}6c>jqh>&K)SUFq_d2};!BzxR}B^cIREKX`A}dmz%6>?25=0wjAb;!y6(svoC)#`~6)7rX$ObKZ&a; z)Qry?U=u`;(_>Qy)`YPG`16=-KxNc6;E&D**QH(B_yTDtHt~hu?ui}LgRhS{BrY}@ zcp>3%MQN8bpo1(IH(@LRFf9MI@?C3K=Orw1O%!x^xZ^T2kh?5r@JkY;iVRZc24+y2{Kh8ri3% z^6Mf?0sB+Cd6yOpY6RqjL~a&BDf9zmCO6n<1Jt$r)WHkMcHJ0m=_cw*%MlL7Cw9GPeVsDICFTYi}QlRV`w$z|3Qq>(hQNC zoTUoUG|e?yX;O!K7AmB6SLb8@T37Qnwu%?uTy%BQM>}+)E*cur-wcr|WHq;lXE=?d zJo_`!zH;WVmQIxn7mt%wi#nvv<*Q-#T(uYm$Rj z$;)R!@%Hm|Zz2O?5}yB5GH>}gER7nYnxj!$b?ZrWI81-m|*ueF^BKQZ++W6)s zN1`?z-Sppgw%ONcY+1E)0;*z2r@{uhIg~D$_5C3u0!Tuml|Z_()&mxy*|e9)>8S}z z3yVd}uXW0Llk2^04-}8%jd0?mc0%1- zDK~(KLNxCBH#1l_zoiprMbWiUypCwcpM_%v)crevE#jP)j~Th|^CRHA!jDp})=0)W06ODUba||CPcwp+^qMN%M1NMkS{mEEtIJ+CdhK*c z*C`?gy6ZheB?;~tQ+u&(#rRpPyF*k5xnoq9AU+2gEYlWA7;xI=e!)~&Afpz;u1nPQUlyU(Yx3H77`>Q& z->5YDAd51NJHjwI!XtUqrN&M|mvzzM$;^>C3BlRl+J%gQsZw3r1om-F4Q*3JX0hJ~ zjW}sw=HF!hkfVK_5*~#PAwmEZ7y;LNL|m4nbq%uhgc9Zx7>vg(dFnDYOzAa59R&d$ z|Lk-}ihF`JBOW0)O}D&;i>ifvv2!}wMy5>XeF%y0n>D(b+8}bmD|74@caI`tHpf@6 z48PT`SJS*dtZ@t%=+jyBZoEPo7yR6LeSvc3EGR6D#$$-zbC$32Nxi<1)htjhefmJt z&*BXw1|rFuJdR%_1GCt8L?IX(cW7-zK}<$^kI#$T+?hw@9-41BR5)NsZZn&_h5WS9 zIS5QqDcTix?I7Oy+;zZ3Fi4sMW){2o3aAH= zJ1p&Y8~YyQN~UZ%=Q=p`uL0^Fv!Uclt!ArvffmG$l~_XYI~LzHXI}tr%p2|$C1YC{uW(^+ca!BG2Eb-o&7XuTNqe8} zy2E7aU;{180zz(EFC!g2c?7j_k{;26Uuwy_pttv4oEDXr|B*)Lj$UHEp0#e<13Nn4 zs&DIQV0u^Cc=5&cM(Y>l-o!_-0rW>j*Wqy@;l?$+VfIYgIvU31k|jSvbLb~pYl6$VDL08yN>*?;)ILZ34E+n3-Xz8_P3VzqHUS9^4H%|hdU6>MbF zG#opUm$)PJ^tSqfDc3{6N-%eno{sgq$D!yd6*0Q!Di8h5sIZNE`N@a6FNkWgS%+Hl_?au6YR{l!fZwN5(}M zQ=)d1nWLJSqa?Fpdu!>8(L#`!h*AoB6_6C!X*zSX7zf(fzBYmSeJ^}6f zZ&`fU#K;eI;>FX_ltH_3Y+_?T8B~$D68;khb`m>`hFm7 zKT6j^4gZ@wu67s@2Hx9$m)w2qzZwDF0dIiGL2`M>EmSIt~?bjbd8fGXd zVJIaf6_6T+F6q3H77(SSW9XJ{=@O(%8iwvhX{5VhsG~_dd!N@n*IK{D z%;pCRXE3RLbAN42Z9|0vc~8aH>Ihwy`5;q%C4B7lU+Cl1{&gx`qgpl;yaN>r!X|j` z-YKVufl{sw}H%qU?o++d_Dtf>U9+~oF+Z0*WYIJjtzbcjxs%Xe{-Z{9S z9nE_RMxeqT)?_u=C$3T*KJ9QSBh{YCP7s41j+&cl%O%1^zY>R960Oo)DhS{y6oB2h zljv>oJCm*cCG*B5Y&Qb?r!UV)}5aDfV zJ)rtBvbW@lJB&VCMyCBbK0HLUEe)rX*LjS$uQHcKTI?@vRXAXrAAISUtIkIux2@Qs z8MklB5y1vHbBik*AAh&0c?-E@z0uLqx>e?NrQgMQOW$9Rc^bygTvbvs#MN}ehtdnj zYS|K47FA)$Y{s9A?aN1uRi+^s?nxZBoBBUV)xtj0=f_%ECgl48pm+gjQxR2?`Zhj8 zQdvD{P%Mw(Aya_!QmVlF8u%s0Qre@s;8P_ zqxl(s4KTmeP!6{F;|6}G(ND$ulUg(L=aW%+8|~?HEJ7&7dW>WYi^(&z;Tt|Q zi4b3z2`;sJogU+`*?FwPE zsh2;dg3=$rdKV0a&=V%A4q%0r(Z`EsvPP0YHyP4nd2pDeqck5G3P;*Q?+#JvL05J&kJ!--+BE;vWthKPDGN_2R5|XZ2mKZ6?GttUNqYhzF{q76iV= zWVNiAC;Bmw@jG5M_Ujmkz8nWTBaDMoo`o4SHI{izOFJZ0=!M#8xBptZzu>MhzF&vi zET&DD|ETY}NO=?5I$Ife$XFHD1LiZvI-4C=VcrW;@EoXAXOg=maT$Liv7EFRgHWhx z-IR%zay3!`u5D2=v~k4*(^w*~Aj82UbXCev0dlt?_wCcEGxV548|!9;3$lN3AjUNZ z#gS}Av(B-Zg9Fi646DE0Tj^eg6kgBe&tpTS26We@s975u*G)zScN_#hzB5oN9b}Ww45>GI?y6+bV5<4H(Eq1>4Z1NI|YpO9e)$nE4Vks@p zD^uL2=3u46k=DCXrS0NaPbLMN(r%jnZ@kW<#;e4vqTnzUY-YMJx@mZbeb)uSF2Q<&+&=^B!wgGdXDrOc2bW&yOc8-GDiJ)-W*oBLxshC05DO!NNk7p)&g1#P zY0gVJC+O@zO?K8|tef?*SuxszK~Xp-Cuk=%n${7wHG{VsR}57Cn8-H zV;hDPkL7n-mf2#e&S#O1*?NGD!wf?2rqu+y zP~EB*NBG9~KSok>Rm%E5N$+?F-EM9iW}woNsu*3-RqN0h3$QOPhfOdgfp3@ z<4#Y7e1T)Z`X9U3uV1VDm%?pmYL(#d&AUpp?& zbpGU#&Tm!WgQ|w82`6P~_QQm}w+CA>NtbochyUio`xukpPnFaIa}{sZOXuNUK|@U)WRo<3z%sX++Z3i{E2+e(>4~lSk-_hby;9}^ggi%D3pgUQ4IUjs46(X75wQhp> z0TkOvXfT96WB3CFLa>;ll#rgf9r7A6&I(=ty5_a5_8q1?U4JpCHfypKa|{^GYReo= z1tV10E^vIInVLor=1lL= ze$G&kS=@V5cp=!s(9Uvtrar+EWm|s4g-IXXX&ATOw6Hzy+ljK}QE+greHQs)ZYDaV zm-1vSEyDX=!^p^zd&}OKYs3baind!rNlmpxdbE?Xi(gblZyRkz zYz;Un*{^Z^aVi(d?1_7B&9pKL}kT_CuQrX4tRM&b&SFuNrz1%yLdongr}SGdSJp zO&HeY-}q6C5Ro?7L&TrmPwN(d5`Ct1bah#}7Iw$?_u1h)u&$sp0gs`NC;Ze=B48B79X zv)&gjx3zmYNDUQj?LS$ zrFa;g+Q0Kq(M*#Sljc752q*qKFc>`lf(uB+B!p9aa?{gYjI8(WG@Mz!EJ=EfZ4GyG z+;2fLJoS2)UQn|pNJbCB8dM;VoJRNub}oDLo4vM==l@7!KNezGKh_r>$&vA)TzX7+ z{|tM?!T-E_VUm_K_SwkNwd9bZ-kBos+Pc$&(1Bd@ID5I`rti|s5}~My4$a4Gs9o{6 z_%_MCzpi6z2o|aUZj|S6;G|tblF7+|1{t`V;iA9hSNH-CJ~W^6Bo(;MG>4#0K>Kj;&zIWyqZ0cBZ{~}nsaFua^v)<1wImOo3nGyuBUg} z3lq)L-~93urbwX=yl0WGBrwq-D{3!nd4x8Hs%)@75*E8G-B2P{ZSvqyNU?koN`kgO8; zv_*4K+_B1E5L}L9$}Qma^Ia_tdQndKufow_s#YN55rup^xz=3h`wVPdaF5V4e{9!V zx^Fw60vurvn(L0xgv)o#RXxCygQG2PjHKMY{~UvR7g#}K!p{Jcz@LHzfYm7M@7OXC zYOm^viEt6!_}aev2m7|YL*$<^GE_UWe3niZNiI?zm5&jX1qCA|?0V1+JU_muTx_d{ zYKo@`55cz(JFOb^@rZZmo=cNmV%RZ|fyqoZFzq!_4& z_4WQQVt7o#u|b$;52zKQ4L~(>9O;NoSiOAMmniK2!}-_o3?rx;LArTxh5(m+`tg?% zvP6L0ZIaD0FuRc!T)u;XJ;l(tf&gR&Cw{PzOAIl!A^KXa%a%Ubs7#b13;vY!XL>}j ze;|;W4b~AzLGO9Qr1^JJ*ZDrpG?Ky9P^yIoYwV-92Ix$i+cbyn(3~YUNY4aU=KZ4@ zOP5wGTn3|m)d29gwcg?NANQnNO(38HSGpaTj@N5&iL%=DRDhO#V<(5x{(UfZzYcxE z4b*ohna9->MXk#)j>G!Do*C~~EF;36 zK9$-RHykyjv-zrA9RVEcMQ3n?fNQHj&%lr0UC9={@ZfjYL415F#s;_^;7rZIt&NRAn=>;%Dfg%MC5$dT>9PNmi1wo5?MD_xwq#+*;uO9FoS+eN{-_i zIP~w+cC>o|9UxqrMRckDp|-Y9r`;1S=DahHob>Fa{#=S+GFr>juFSZ74xj)OYaW)y zS#9kv2>q%z95-TlT6%Y2$OKWlci)C|VvQm;$Z?HS?1hdh$2sx6)a;p#TCPG4E5~iV zP7&8V2s-5-niCJ9=i*J>j{wN-`_iRP~hSEfszrlg9={o*3TkUa&lmMsn3T`LghGPeV31EjZ`=oEz=n z*Z%@1ZHk^;W3>V-rA+tWMb6=kccQ7%iqFR#aWkJR^$Wt=K;oC)s zom3IWwHAVpxjqNO8C+UJPoM<*YhDrzUS$sQ-U|2QRgNYC@5VM0LSsjZ<&2O7tz;)7 zr$wmJnRl0o9DmzU(aS~f(+$f?I^EKq}pQLvCwwBWVp&<)Z8M);J ziB^hbUivaDMRGS!%3kXU26%J8& zPlfz!S$KW@-|yeQOV>Afav`5NK*%;_jE#j}@D|K6m8zM!L-<%$Jt7S;EphR)^j;zL=7cO?CHX{SXs07WYQr5~DkU=2sNgd^Ho&VIc zVM}+VzjG%U>IdsYW{W&1TT%Y~1@N^f_ zRzDB1pG&P=temC3Y98jc_0{a!-bp0o96~US5zKs_`BU$_^%;d7Lur`fRY$JkOA(*z z6S`%8Qol2ME&{B#5yx?IeADTe4*@m52s7+te4*Z?i!kg8%ZEi3g*o z|ADHYJi+4ZSHjj_fh(=p0ZE#>{jRI3OPfHgNqiWgPv3QzGT`(-(1Bf9Bxpo_is2Pa zSFER^f%;6uIBWWax~o zV=K`DS4vK~zWa|z!G|vX6{mF4|8^gtsNDxf8{_d3n$QH>uPL4K#ud7z0~-!*16y-y zxka4~7Jb`M*2`%m^u2JNKP)cq@1)LeU8NM3Yuj^u46EC20e|R#jRfTM(L8fya9V*6 zKV1ODPOavJ6((GHhPHXYcr(UO^2l(oVHuiLcr`pmDOaSt&7V8Wy?K~g_I<;V z+q{(J@(49 zK0#kiJ|tosc-Cb|FSyG)APMLY412^n`Q80fD6*BP_ph{X_tTO{e#4t^`F;+1Z#feF z7pFWkcvh@DQI5Em)eft-!#UH|gKiY?uLZ{A@}E=DUbFpF6Df%m^D*bbeyo7w5TdX* zIMd73@tv1v?^69gv>HOX`}{;vhYR-hD!3?44OXj-nRw0Ni@b2!5hnV~amZ7v*yV3c zRKfBEN&t;K>cj>oE}I$DIaL3u3u;-!2tQ8p{YdwXw~&LI-%@9_bWhB)Ye%U>m5a{0`- zwyxYY>`z(dSSm&ynQ%IwK;4!h>L8*T*~aRlO5mRNrdUx}`eR%Xk__vDnf^?K7_b_` zWA52lMCVJ4?(7s9P!>bUD|xp4`CXq1+mk5#;sI>KkH)8(q%@Es$S4W3d4X4GkVE9h zY#)lvZl!IjW1g7&eDQpXqdc!w@x+2%M3Fj|@cK@7uwqE%sKcIsbv+||B86BNveT7M zJ``AUh18^{eIr!~l!}OV!Vd`hKzm-JQVARUHwkB>(X9YIV8g5Y@|r)xs9J_&WK>d0 zMRi|@WBug}e|f!YnQ%Fti-W07u5V5s7E*T5w%qM~?+-9v+|MkMhp-j^D%@w>3_b3|qb3()QNlzuT%7;$rsc70R{3^6T%nURO8>lvFD3)L2c(-*688vT zxYATrljk-wKcsjwoz38hB+dQ;eZI^oEMKM5jK53BJFS_$cXLV&(Oihm$a-8Q97x-F z$36+P)%Pue{kN#)fvP{bwJ<0{I~{tPIm6=_GWz#Oo}(n|^)S=c4;@$f+uvU*tj%00 zV-&Z@u`xq@e(ZkK13MMQp?d}+E;_3W9-@)#@&qNSA3MX_h6)=R41K0n%i8e$Tj_$K zX)QDOA47&ZbGU9OR|VSEtG|RlOs&a49zUip!{2ohWUhbJyn=&<= zmTM?sZw_KQKC+T0aH3=u2oLG^e?snf-pAc-4jK?O0TD?t?V{<0m8J$zwHt8PX*s^9 zWU7!_q<7?aW2-mFU7WcNv!|OWS+adu^7yd{+NN9ykbkO^;z6|uy_T$9`q#A@{}cfE zAG&!^j;A9N!D@{BVDx#TfqIAK4uag>sNdYu-NaT}JIn6g|D@SzA0+XjMy~C?1N*Pl z-BClOv4x-yQfuX)V%^nE^e1)=R}r#EfJSvT6ybL5Om%(O;y{E3;IC%AO)pg{F%SD9 zB|`7Kz(PDZ4V))9VJNGLp>eBosYh3v^=fXa6f0X$u$UAkzTkZgpoiqc%Etd%ZSET) zQg2?KI_Ic*BR}Af>OiZS>FY?Z(si}9o9O+H2dC4dytxY~a!(lSFoFDiRzfHptMHy4 zR&9LIC|8>r-HH&Jh(yk*CKe^l)_I7}6oMrTx7B8kkGVLw&7WX#_|Xi=q@+LW4NeUh zdqv_{Q(%Rr_C0KmOUUneP}XdwmWzB~^LITZKN+$tX}KWiVzj9Rs$rq~i=6*!0P^Je zrq#LN^q`IN;N<%%Vc77 zmCiZK8t&(PKJx9@NMweHg;s~e7#QhZ)U7%1b!!f3r;uEiomr3BQj;GaJtv-~B>pSr z>KWz2B96T#KoZ;iP*U5bk>NFIW@yVjpC@x+*uc0`MezE53r;?J4HPtyg>4;EA0Q{EFfe2;CF z5^tmt8JP=)x~IM*kn~d{nmakMvXH$Yy2OQOSsKNdGhZHOi<0s`MPF_3&#VA^FCe=t zt_Tx{l$ad;;%uczh(iHIW$GtsuQRa+Ob^dVBoF<_=I|_~7K!Bz9j8CTK<$B=I1xhW zrBa<(#LXx~Jl-uU!<`Om>@x?o4HLiwtGqENVPPv-|Lrdpta-FOJ%ZN>eybGCx&IOW zxIgp5$j~dPP;*;nJM1($CAQtUpQM=ySnkO)pD^Bk`6vmR-V{NOdlesaW=kR)qvRKt zL3!ZfiV7}+X6K*d+uW#avysOZx$n;Bck6Qt3;PjmC%eQ}$=|<%A5esej4~FT? zrr%K~WCWSR8qYT#sblf63w%GKJ#vi2vTCs(i_=Pc$-lGm5Bazb$3>6^L*#Ps*+@uw`PBxNEpT^)%$XcUJL=>(yB z9`FzE$>gNKWH)^)@h2f!lTY3a!6P$PzF+-}HL_+#gV&P}u)}tmJLwmso)d4d;E<5x zzTwaB?X}p~7Sc*C-O~DTPSiUm(%zp8?(q8LYjm=!gM9?5+r#G6lNHO8WvWy5bdQq^{~FdQws|4HPu z1A}bG;k%e?HN`a5Gzm}Y7&PdVvDK%v3>`{jg@p+Pa9}iVT76jKF9sod#iesKr16Zi zAEPs4D~S>0K5fvIMUhi%-wB|nkRwUzloHdf8juA3Lh1nr$Hlss$_3E2D!{hSoMqi$ zU8dwaOy3tS6mpd#s)Cdq5=bhP6n-BJT9P4XCOpp5A1QK957RT??%@!kT@Zf|yS);J zUQR#b(0DY+^;<6~I9>Fo8or$$(%L?nzsv7Y!F=o!dWBXL`}FYN8u56y!)+$&@$hvi z^TF~XQ##*0jEH>Gq378q_O(BztfY1Hb4f#kW5U(1p=RruX=ApQ7jAjropsm&C)7scHMVx$t{iz7K~BJICDmC2m9M~TB@}aNm6jbs=h%@=gR{9;Zt(*g5%nCvES~`k z$#gA6ZMbq!3?8KQS8{krkc=ooj1?0gdZuJ2U`F4rJ`mh3r~DQ3I}U(^!Ou6pDi8ob z@d%0LcxaT3B^)+7H`8B2o1#8c1-edLaL2s3e7*DWbtkbEj7-(} zbqesWA8%g^3_Sz%r$+rX*6A;aP8rVrh_m)yZtq}289*pD5C1M5pB#sOOc<qSjQ??>ajn0cCG5OU)DH2R~z%0;T*xr zV}XmoyXoI>21L3zW~{EdFC<$V33-NDM`<)uP# zVkbRRwV&qn{f7<|R7ZgVKyM-e@LNH(2vwsHCY{%}C(Q>HD)A0dO_()wm~=)eM&jww zl$B5!sw*}kTlPV_Bm*+c8VwZ4wc9nI>KQ!(o6JbrK+Wj>oDC1K>GGRk`<{r&_Q!G1 zQ|c}pZ~4IWbbM`_!KcR&)VMD4fEgsXOL0cyoLo1<8eWF?UO03zY`P8u=J(uF{qppTyA-No9 zuQ9S7Dok~C+`>*iscXP$sU2&-mVcsvq@91?55#;r5B~3;-F%hT`J{2F%1*5^z6HP4G<|fL8)KSTLUz|JvB*<;sBz zcn%$7sCXDZ#4)EYp){=v;M}NW!b3-cbv9HhQszj_1vmSS*K_?A>bMXl@WL{V%{a-j z4BKdo__HZ>P^iDV4P7-%j`6@2c97FH_8s$0v8jWIOdB7y-4W6k8?=j!q^h1tOS={#$_vQwtE zAi5sza}9&q1Kd_%K}Ho26V5=z;B@r0ypSG_e`fB-&Ql;0z#+-oo(>WCGUi5%n(kDp znrkIq{tjr`PRppyDsvx(c6ibL2u@pljdB4ioN#5hHQcV*(w(~U;I4%VP{B_jt?t$-!c@r3cN&h~}oZ3@Haf86i8Jm9aA5ZxotJms`;m`G7ugdX?eEQqD@Z+>! z*?bleM@>6f;*sMccc@&ePo?-a4)yv7L|W7i3fOa)?yz4VK33-)yX_EjY=BV7-#En=~K zn{jUbdNW<-j$O{e=oMhj9pR`~tmxOyn5i=$zKn-){MQJFF!cOopaaXjDQL`(wlA1! zgFWm1*>U!l{dB9Lkye@s@MomoeSwqIuE5l~Mi8j8%hlSi!TR(Q=?v*o_U59W9lrBWj{SWLvS#U+3p9!4O5Uv0ukFJ{MKs!Xm9ErxO^F6W z5Bmde=Dfy7kcho$A5|Fh>`i~X583eXyI6wt@k2-tRs%0=?pYh-b*nkuMrbCb+>&%2 z-8ASSoV{5J>{TXiLXM6s;|bgDiM!s#3QoVF8x7O^uvJyvu`Em+g%zo2+UwZ?o|1Y( zXOmOf+cwysUf&5opW^gt^C=TucauK;$h{3!*~^}#-O`uFc_qzwtqUtD2}aSZ%;H6- zC2~MUT^I#MmvKR_A;zj|Mrc8qt%M5Lw%;Dka7L>*+O*C^m)B%G%7lsAMIB2B*WOZK z!5=+Q9G{h4;3YS>TE%p>;hcG;G3f9s(Dx?V#Y+va1D~VA^Z<_p%Hjo1s!l=P@O6%^ z^8fF}6jyEW4Db?JP59SNAVd`aaLhjdFEqggST&l&?r4aiPm?HDj3e;Ys-x?xVN>$X z*u(HO2P{FHq`7HN8HQphK)GHA!22BH9Wvj%RMl zs?bfH4WqSr`?PoG(31je@IEd6)c5i=kBu@@;NpL5o9Px?X-pI1}koZ;i`t>T*gA zy_UENA53jt#Fq5I(( zL$5IzMnW!V0Um^^Pw7F}o#r#?-Pdz5Jn1(14yI1*Nh7V)t%m$h$yj^LeUPCEwG3KX7Lx`r0*5fjbtOMCkfJa)8Nm zVBxp3KJ1`pK7r&+js48`s_l2>1&N{#6vqO*=O=Fl#=|7Hy+fUIv+e7*KpPo-InTN4 zWOTOFl5@S8&Xc()COFosK~T@#uO5rpd&hy?L8^(C%r>X z(oMv?^YRL99G9bXCq%}{o^pVWKt{~VUzmb;e+z}AduoJ~w4?z{4C&wR{SI=j1?oBv zV9OJv>JxX=z>L>p0Q6}`a{fF*+b=~=`;E0%y4@q7!t#eQ#qG~Bc>p~nZU&B^?U3J8 zZ4%q8!whFWOr6!NMzVhX6GSepp=6U7bjs-j!9M+6VR z7?<-P?M|zTP#`@y;EM_KNO7fDmPUoN>K=--v9?jGmv`qf3pahL^)#p7q?6qaFKB~U zp&*>RC+n#eu7ZtcX07KNDe08`pNCk-7h&h?QGh$wUFjVP z)cMT!Q-Z@x^Knd-`Aw{EB39xa2F9#p6?p%>GflQcVBr$bp3h;3<%LHu%{hnv4k^wV zFqDYhM|@YU9eAIBx&q5lHL`C!L~4{jXiJxYVF*1pp&A980NvNy&UUSpC9Kzt6V0YQF{-+P=V}W-GI_Vg}alZ|w z+HWbNg=7Y@qfk{1R75|4KWknZ*6}T(ap1P!)ArAyb-loEbfQ_~+$(sQ`;Jf7EC@Utt#^!N=4%<`5PAmMbd|M_0u z(D2CXoZ*IZWrx0<)^)BEmFP@0xKhbr=&2+8%cQEH~Z z2!H3fcRGdKJ;U6Uk@j8p`X=(|ZjchONH!JbsxQ{zH4^C3D@b^++K<-L=)WYQGc|)% zzUe1uU0F=WR!L&wFGaI)@~3(2^7Yf}aQiTR4ypJ+oJWNI7mG^m$xzWr(yi9P~vfp{Di9u_98n_7=;{_qeSii<2J@7V;a%d0b2*tYL zVX;Q{5zX%5Piq)$#d${6JJWvnXpH_>sit9sa;KVSgK-2|;l{_6X5aPPpaFON{W)M_ z1{E5~F#ixHPr^sk{im|-Z{tptpt(%lcv@cd)s*N5FAhMhfN+ZT8@lMVm^8%|D}y7j zV3vIR#-u;6-!k5kE|ILcVuDD3R>rf}0oDZzn z>QC*KagTO!{&e8e>j<)&k?eh`?+y|;SXNKkPECDdUhaJu#Z$}b`)`ZDxOAxHVtfu4 z0g~p(Mx4x2qv2s0+Q?uimCK{Kh9s!>jWHPRAB27Sby_KB;scb%JgP7&8IkOZo*OUU6~NVXxQ1}X#~=dUq4|J%!p-WOhi*D zou_psb8`WTON#4>nPmU_s#I#|`w(@t@q`R-JMB{9+i_?G5xKIcWPDt-ZD`AGhM^@{EI*%(>AoF5^fJW#MLvn<5WH zH_?whH-!&Tj*(Z;-%5)Z>XaaRY)Ya{`zYg-h6oKJDR)!6GP8AiwM0Z;FYg?YMf7?m z7w7v0i*rN%idE zzB%ik^8Fx}n<1y6lgGIbb%AaM(orOWgaqV2t2YTDBqDH@$r7@aOU~sV*gDW$|8z>(2s% z9bOWKYPq=8>V7AU+-i_##?S`ygmXHx-JhTH&F?ARtJ7Uwc?f@SnCPdUC`%M8_xAc8 zS)O0J9HAIlR*|cMvAmirT2frBWrXl-|5{9@qj*vI<#%GAFB>w9E-j1Z+*g)tV(wM- zBvQq4^~P8QBjzDShMF5nU&585))lCJ{rpR&9#g_zURrBl&1e*XefC3?jf5pNNT#L> zAmU~ci&`StbsL(LQ+(b6Kg;bln8Q9RpShEl7zTEpDp3#^bt42%V?7%7XFy7i{q z8LneF#4X-l`h)Ln;J<;$;8d;}nuY?3hDN3k+M_iDVoue8QPg$XTJDUF_<{)Ho;P58 zNUXzCdU}E1MPdrFe1psK`~8B52e|9-IAmAr)m{4^;1Hc9?UA95uJM6~>?1MJ<4ya= z7?R;~CUrs!g}$$v=zENiU7%TOD^QL9Nc-`$hx?vc)jh9j*wp!VU>sv(=}g&q{fJ;h zm0pO-hc+XepkS)&v4j%_xTMb)Tif9zQXeYE0#(MmRBVVm&?`4>ndANWK-rIw_Dm$z z5JgR(hnH9ST`-+#&4(-)>67=iUgz*NGdz7Oq`gLNobRMX=-W3GZ*;d-D;w3VV_oE} z0N$R2#0P>mhr@`YhLn)Ab{rh)D>_D|g3Iou%Z~k-LkH~XZ@<=$CVsE_GvlOWthWyX zx$5iR9Ic6L8%ht<0=WAL0e3X!Ctxa6Y^0OZh=zvXm2e*;+=X6T5c?qVw^|Up#vE+o zkMXa3P-WD$+uWK*+L)TG$Zt19h$X`0jOdRs1T;fv3rPo_+c4dKFs`>#B>5NGT?3OD zCU`9(-_~HL8p# z1l{`|YJKKeDTG!mYTgr5OU!XdOGIKv*u0;n=19>G#%UfmAwhe%iq)}{7ds^R+?t5#Ss(e_lf z!;6NbcyE25jg zmt7kM()yUGqJ>6GBNt+i4|RsW&a#MpS?%){kTMWSH*2}@#X7IkE^uf|TCiNB4h?I# z^qO@(BVlBAJS=UAF7n3m9Io^|sMnba37rcS3O>7Jw990MJmVlSURuLm5uNO|4YL|h zT8i6_pPFDfCDe~T`_V>>_3^pPoxL^gx^6%>!EkZQ{YpHQ=ycIKq-5$p0>zdfxqD`@s+TBOO*! z1tK%4RDK{s7Niv(*14P$3l;!<_Q}!zJ6wCtFaH*n;JQ?JffwwvWZIzRSn$o@zjRdn zfFqZLe_g+Kf?yU!tPRq7s6uX=Hk0-*#M$+yc#`fAc)b9|NSvycvcJFYV=dl8D{`aI zo{Iy9GhF{34<~)K5U-ok2qR-;05G%_y!<_?mdz@MLMaaYnfcLLSyooxN1XqArI?dg z&0+st+MbVGab=JU-A8w(E+wU$GWQr&Q1*e;0u0j=@jlUmp>_?+lz6PK=lW7s*&Zbr z!L|-$T7nS+!#C|s9mZPH?eJSutAFkSxPW3i6Z6SC2|!mzad-2=_F_b^o1VTx4Av*} zvU=0JB%L?HxCQ)wKywPJm0{JSOqbO-XsJzX&v|!u&0JN2lrh>!2-yt`{wr_(@gGJj z57R~$T6VZ8z43OS(@6mp57Mu32{&h)ZkUVzFF~V}6&+UY$QTbLM_hIxwKS3wW}J}} zF-&6t(dUcIranOeV&^k8h#%t5*;%OD+HSZZjPOrj5-KH)zQ4L1UQlyuxIp~Y(J zA%~>lGG{uTj&dMnD8(7nNk4@Q>LgRVL zxrB0uCe>;eQ9D~cT5m%^SywpRTH?ch+Lg{)!)QT2h9hL`wBp%0+J^09UiRdDupDXs z!^$<1!m?CB+=zx-#7bt>u~e?`05oS4b5<{|f5gz5H`&1pYK#XS{&s+9eoNF}w)I{DbRm5ILJb z?}zg-1;tG=@&^%F6NMM8FxXc`W~RUu$0^?tVJsXpNE`Gw^*29)HL z4RxP;a=0xC0&@$Z)`)_f@}hP0Y+cHy+NSBdx7nxC1<6@#$eHd!r^kY&`-Add?*G z_CHipBHXo7(nEnRXhl+W8zj?MO=RKTM!ay^Og!q5$66#`JS_n!nSfyRShX8znb2A` zf&E9dj2g@+MOWn6`x4x${?Tg*1H<8dtL+mdgmc zRF!_$=rnFUmb0=DU)9&Vaww`8i=GO>hhyQ_w>ojON6U|uO~6^*4a9S$FC}OdSzNp< zN6W+dPM}BS%r{M-&eT^(&D`~}3Pp%YH+1biy4pB6JzUJ&z~t!1sdEI%^+_#< zymeF;hH9tI`My}&{n5lwA&zvtRi(TnWO}3bhu(;;>Ww(4vFbJBNI}h^5r*p)2gY8N zXTT|aFLl*0k%z`%k8mvUIDhZP?T&Fhs_L>o%Lf*2+pwX0%Mu{1znZWvO-Iaibth`9 z4Ne@>AT0B09!z&?d8lAH91{UoC(j5hdJbV8kn(bJ=>DYeT5B=hrakf8ffso#h}eDrPm!fpL9iIa&z+w1 zU30i(&v;6J5(I}JZO<~9>g%t!3tV7HWf4aQl2R+?_SSy;Ll2Qt0qIuI3+4b`v0?gw z65T@@`!cYFD&*pu*l9|e9$1$K^!l6) z=S}wz^?BIQ+aPSmP@&od?5|1n6!?E=N>9lcX8IlA+)5{waV z3q5dYTJgrFX|XCIWV4{b9*@6!1ud}yNv1c;A5bGD!$(cLGFzlOpgaIHtEKmCgSDxX z>#ex`j)cQ+EhoK&plCU#A`jofP9}{Qp4DsJ|Nkcy>iXu8wZ@3oGTC!RtJ+vIurUj^ z;x%YeJ$>!KUu(RN@wcSpGkEjYos%8bKJ~yAU&{z5W8fRCT1LvlS!uN#=u1-`)}U39 z!Ib3+SCw@_4DBugX@dAp;CoZ`@H1v1=zUzoj6L;jjkUZ%e0=X930rT?{@R?-^e-9z};9 z4I7Isw_mr_mbEEuqQNN(I0$sa|BtEj3}^Fy|31~CRlBOF*`cLqtEd{GsA_9(YVW-& zY9w}P6;-Qhw|49iTh!jEEka_}jGY(}`Cs4PaX+{{a~$ym`FyUt&-eLyDR>7y<9k(^ zOFoE7rXWrI`F{436INPWht2lQgWp%TmW=j(tT zCMD%&acPmJ)vKEb!Np=;p*PSBUmn;DA(UJ1dWPJo`t@3WxJ?xJ}O|N1Z`)_iz zkFY197V8Oq+Br<~-^G|tHa9sT$FrN0>hOYMHQQ6_=9TY*%0IGe0dUL|z^WA{6eENB z4N4uqXG_4HS2+WZ5(ELi#6M$S{mi<$s;9KMpAM9a=gZ|S>&|m|!_WPEy)bHs$r2=g z*^$|*vy6*@6uOg9&Yf|NT$KDEm~->hU4QlnRxdnF$lQ1LvG5!(t>-Kwh7?uq3SnNV z<_9h0HX59;#c2U#nG00O1~VvP;EUe=5NSH6+%f1kq;$i+^y2w$3mxvQ#W|dGaU5)b zd0JEcqU1qv|jc>8B*@JWjIHOi(j4ycp>J0dpSxaFeV^8QEZXf+=ho*L z4>lb>a{ul3JpEgD=`6d-V%5#Yym=nvVawP}OmjQrpUscG02O!B?M;aWSNVC*c}1vm8G~ z0_|fa`@h>%>hw4FV?xh(?Qhw8vX02l0zu7M~x-fT|Ypqps zyj1NByAfIe<8^Yw$$`g*{btz=F%C4mPkZA65BCl9%nSeIq_xyTBh3s!J?>3AlEm#^ zgjHcSw3sb<(q#OL#23}@zK?YsJNmP$&D7=i-#wq7>C2#A(TcL0+MX=jQW8K z&mCUeVIibtRrnu!T9d>AWH=PO{ns*#~q_&mJg{@>Te0gr^I zD9r5I7Y%%4@95ta&|qR}Q++nmHySJXt7;@bd8*Iv_2*Y}12m{{8gN>-pv9BTNlT+n z$f{}KLFt>zfPD=z$$LU`in@<@!NyKFG<5oA{>Re7K6^UkoGzOjDtEr}66SsjxBrSy zJNM~*u^+=x>+EcXMy52xA!1p6veG}JD_YKe^Y|Rd(r=5}U^1Z*ev*8DYjbp=_1)_I z$$kymO%uB^z`Nx)knIINEYn1VMOFkDD{=C%hf{^+D%{+Al|rM?#8*P`^v37g?bpXB zb3;!QkNC=*o_2_{DBC~j_RVN{yoEd<9c?2_5?Oie&t+bq^*jKI7seY7;j^{A$Ka-3 zk`zuo`2L3~cMe1KU0%icKIY$-{+PA)TnVUko0VBXUTwQ^iR$R_?_f(ch^}tTTy3A2 zy-nv>fQDlf#n>nQgu9XQVb7|t>Ec4p&ag6gdCv>w34zA&g`S{0j3@SD&ovJ|bH97wjSo1D9f{1Re~w-JJk@W5bY_006KU(6ELxcozMs$T)C>aQO1 zx=iu{E{J=CP)5j{1{qu9dOlNj{up%Ds$i}pohZuCa%Utj{3v%_{ImeW_mQ@P<+Xe2 zapV(=838?G?ZN{NI{-mSI8qJ0`j08-;K7t!%HQ87|GvqcbE6)QIhXuMD})wl?j5+M z1lzQhs`=2YNffn8O~ln!kkL{A7vjXP8Ak}5G{gt+oH##87Tfq8?4SnfV7}Zjk*3q? zgP}3R%boB2_9p8S2T~C(Vj>@n_e=HUr%mf<<-OLoAB_RS`IB(os)RfBaKwA>*m)mh z>$PTWv%BIX#g8w4=vA8JN5R`qpG{7(85rxALsPLo-0?0VQ?n&dRXiQPk+ZfogZ6V4 zw8v5^YF|av zYeYz8$;U!Y=)-l7eoThletg)MQ=gwdNpnJ>NKs>TJwW>5Pen;_?@7)_)vC3ciw|C0 zu#Un0@QG{TxaZ+b#gi#5)ngYpE<|l6IL*0v2i__M5_F$ouTMz#7A`5RVN>sh2XTZu zlkR#IL4(uqzD}0dKOx2u&CsMQJNUu~k^|y-U0Xk1EYV{`hJhhlrRI{RvJzP+uu@^Q{3)i#>otu1pdB zI%26C9%Y{JVdVP4^@u0Sg0m-Ab>DlAjaO9Tc==!QMz8(Y*JWd0jjb+4s4Blc<-_E* zJOE&z>eY=t$CU+>u>YQ#RQ(Nq$ufIAeD>fNHh?(^$y3qMgcO#KQwy9Hnk&r|Eq{}o zWpkr|MDr3Hl@f9&%sU0^=n`g62h*T7SjPwXeiqgssUHu_`Wk|&<1zd z>luwUmAO|EU!P(P%NxcDoyC)N?@J6LN> z0%(QHX-O@EztdG}uk}Qr_K{4X#o16H!b-PLy;2U0Hon`6QL`wXeTk@siAXP$|E`-h zH?E#LEK`FplNcgy^3yJAgKPBwA8O^=UeI#%w?*ye^Tav8PYSn`9;<}-?}f^PCu(41#W0{Nv{BZpRxqI0P{!la*$!MxHP+B+$h{o6-K;~H5Z-(ix zn}B^|W@?POVZI4~O^w~s@qLsclNUHN|?QuHn;@(2+vzC9ex)Xy^ z!g(}f0U_Sh8$&}CG}_%?|8XlfYlHsRz42!bY!jiv4<={iJ$hHF?qi_1DqYrq`6T zUZpYSax@(B&FfxCX`>@1 z2)@xC&QN=mRnR%4A{45Y{h2*_dqBR%Hxn{7k8#TsfMv?vGk9<85o@aMD-LvJmyLvl zw1Wm=r3t9Y%@;7Oj5KZsdyD?DUHY0LCMkPk^>Al<(YMcj;OaO}N2igER|G`A$V6?O zDx^)aa#|WrPZ_n+D&c0T+AdM>Q@}0>*_r2_+tMkhE45B;Lb`rD8Tjp04Vrxw%kxlR zVxh*PRP+J!#+q!X^%D+*t9ps?cTi;c5r?Bdy9#*Q$R?L@a{JAz%v!5lM1*w1^C@^n^gk3Moq`~Qs1dTM4{^^WSoIY9s(%@^^YYT$r#i|NVw zhG=!qC@UN0W8=Lb2G`EtEc6o`drCLnB=?qj|5Y&eN1?|5qmnkmPLT*lc8j3T`ti5Q znr<>!n$iJLD5am3LIBf#59Qq}ODWWs!w*7^M*eFo`kFlt=To=6ZhiBr}SX^d(gV3vfx}P^T8)7%CgsP$UHuBKo4ncLMeshlNyjb05^9l)m}lUT`nmvz`QEL zMZwJ<9>o1En?idSVa)l(BdCP@5?rts3G1Wflj0}WC@x<)S*0-+5MgN`#MUZ0ODkQf z?&i3|3OE8My)7!5;+U>4QrI$nzxMDxa;fw=p9Oyt{vfz?_WtxLzfrrWe}gk#$h6Hm zvYzfN*U;R55|9-#j+r|7{2Qw3*Dd&HdZ%J*vxF_KLzlDD;CJP_>;p^tpRB8y>%vfd zHi>JkeTU)lpFb$BGe`Vo_g*zu!bN{$w>wJ6Ej8*JGXm*sC^2!ow!h)6rOD~c^*(`p z?or2|po!#ysrz+@eDCh@GXH%y=lqM#Wz%WxTH>>KjxuN-rT6Xf1m#7soma)XPI{a@ z#pDG^h9O$2Kac$T77Op$F@Z0~Qcab$*!$izBs-xco|=7s32+>LrvGL%#yF{v*JE*36c>-@6+GR|NAyJ_H?9L!E(3+c>7Qh zn7VvR;$7hO#WR>OF$UoG- zBE5`{W~nB08%>?!F7^MltET_lY@ybo;-~K$XRmr66&w-yjodE2H?`tjVGstuhh;|_`N^7_`}*?z)|iv^5{!=%PJ zpA`=)Z=QB_leFX;@tO6L|0Pi+jY zjaaV1lZJG_w^JRTaIcYvUpj=0 z#u{dn;O0OX4tKb=k{r1ILo8PTrf3V)L~-JFX-%-}BwGgC=^6LKIIzC+8$WNLJK0!X!V^=g`I@=ox=_Mb;|oFeX3% z4G|6qlp2FIGha-CG5!u{-)S>9pfp=fvxo;jl6vOT#_t{i8M>ZjL>T(&ugNQZAR?eD z@bc^*G?@4OYQ!B|lh^5pk}`Ifnc^7vAQdqS(70V{?A={>iF?HDIZ&1ZQm*x{LrQNf zmz~URbvUk($Ri1z`{?54;j?tPDr~MM>f&FzdzC(Hc48z=O$`3TS+#k)x&|?8OzSg`tg-#mjFG2RgcK{>v}9WeREg$Ahm|th(pI+x6sXv zxLp%J{8QpB9?@sWUBz}uXFwur+T5p14zzp4#buT7nG)^XaSQNow*sQ;<3wJ89B#AF z?Gha5=@0 z6`nnx8j(AG$2DrSdq&&*W5c08_<5~Ft%*SapC<$M!IeCZ%Qg49X}vd-crK4>|GkL| zJ$cXj9lkPii^w6#vGK^9{gcGj)yMJQ+U)c0^vFPa04!2qnZ2bAjw)*(;uDH^f;i~x zpEk`lev?}#YI(2ors5DG*EmD;Yi$2H{ss@EA|A9S$o&&Tm!{I1!C@3niroh&duv1O z0oxv5Ex25QMZ_x~5_Ij2XM!500&o>})RNuu*hnVa+V5|W?N?VSStpySRNN^aj4l*^ zR0tn!(k3itpO1((9(nu^7GHIs&s@hY%VDee?M#EsKXQ#R0jmFZ+MS zgnIODL$+70uj6BKd${I|QoO8{#|voryzlfK0?dM>7LnJBIlQPhGIdBC`$NLAftO<$ z(edQ1_okJe#gKDdk9ywoJwpKu@`aaiRdx60Q5#M9!qBs;oPRw;y!T4YJTLMG3b%k; zPtG}B_MlYmVBLqX6hr40IW{-0?<($qv+T|%8EEU~D(>im|9Oa3MaHBSl{P6yh#8uL z+?sc*5=G2g#-L~8*x4AdR%hOe^?rjgMY6ai!gAW&FKR64cb4C*TRq4s9#q}}S?3Uo zDY%&;IUU`O)N3=Cy~l3mf|NV_j;r1RgU{7`N}Fx!sJocl>|-Z zNzjP%^O z_*JFmuVgU0FXZ&$FBvb@8cVYxBs6<3BHVb}AWOXwA~5J)dq*UlKCgK#V53n} zc4ND?J0|qKe4`9Gd(L~s`5bk{Hu@TjX0m5N0yR#G4HIwJc~?MU;V&0 z*N`m{#CcxV$i8_1)UE$7aVccUfn^4fR9rcup3?pM~0Y(k(20_eLc`tkMS>m?dIV`S*<2gqy>f<(%Pv z4fuf)wzZw7r_qf9gVWJ>F@C$h3GJl#|NN*Mr&T(>&b8ZLmrLm_LbaS@*jruM%|3p9 zy_64Lrk4_Cp%k0*HNc&>oJ^sMYu5D_0 ziIC%=0Cs6FjLYu4ilbjm&BzN?$OQcW%u~J-5Kg-?%Ab7WhR(bX)WMylBF#U`BLh!w#p*b|u3^J)cAcLnHOPBI!`%iq3I=b7kEc!($wc=%i5ow!DL||v= z#AJ8vf-X*j4a`9<%{$fUWjZ{N-Da{K5*auue=*8P^bHVe-TOZ8J?KVYPr$z=dneC( ztx*y7l#)i50kHm|b8m*Pj!TV$+wP^VL9ynZtbk2pG_)B79_SY=!O|IW>R6DrQ@*n# zV+BBYNQb|H!{(4xeI)Ba5I}XTtkF*ef`N$w&2;zi0`u{IpTz$lk()AE zNf+ijj1ava-HbGV2iAy?lKW!wWpy5s?_vYqDRk?+0HIhJaaGu<2wR(|*c=&>StKy! z0P4Kid2Acx#vt=4(S!QhMz;fH zY43y1f1#Y=UuccFdl??;HtE*db>i0J{ZgMgyk#?_g9)qig?Aa3Z{Lc~Q@hE?`#UEp zZR^b8TN93(H7OcTE7wTUV#Bu(%wO?vk?0`j1U|4?V7n_Fu1%% zmZ9v;&zEHnPFTV1e*)id-_?=87?ir#z$y^)P<%Qa?v&jSEs1vDtvRN-U5iLIl$ep2 zma`-uZ_&B-SKDu?w&zd+|BD@K8G(^zka;BoW2sSsyr-Cq=g0+o8cH;E>%82&PY}dS zuf4a1nf@#*Z5l9;@I(1Z&3OQr+|P2SM>^?s^Uq{f{m^WNDu%od~L~_gtj(~Vlbfi_zGE}@~A&|g{Nj>rLa!T{X27a7;CR4vKiW!9%VO^29tWs^?TAi5aQj{~VwvwKgG1%dZ&^|@(#)mK-b1Jd$u8i(C_ znZ@;L0u8upt@8Err;4N1vn4tiTN|4uEY zM+s((_@TY&4eXdWza{Nyi>(K)7OtUTSVZ z_!4lXi2k@&MTL z_rtlP5sAUSzc$LW38X#LA1P`BZrwg;AVFG)XpQ#EmU9I$m+7n$)ujNhBnh{R8|~%s z`_)$x8pZQ*V&nwxq4J(=AA6?$HTwUSold9e#o_EX}kd6`1u0Y_@{+b(lLk7^u+_qM|4gS%$t1;D5(0Os* zJBagJd(ZbBZGBILO#timWgJI1B+GSXK>|Y6vtJA{$ZO$A3*ivDPWox=V$B2+RR8xZ z;7jRy(#-eN)LF=}T+XpKpxPoS2T8w6;*xE0-9AYG>{F0-46)76Xu0o2y0i~h`U|&f z!+#A?w*`XZpPxVGlCdv6P*cA39c7x72b&Oj152t{+*2USY1IjRzu0Nsao4@CaddmF zq*;kkdM-|S)6)Ws+&B$xJvSjDva{_p<@Q@Dl79NEE5eV>iACNiXp4#l4D?`mJb6ts zTG`M<&8u;Z7vGxSh`Ioi)ZtqrGP4O$ymq?xHB-5gD~3+ZbSf#aA3T#GT~3(aqJTYs)tOFKoSUD{qQ!G+^#)pJlbii!vokVtQeLu#YQf6CYQ11c z_bH;gwGOUNlQ-LV(WUYH;yJP5EW*qWGs&Yj->~Q*g$7Kbrf*$R=RXYMz>^jpm1Prx z89@jAo2(jjnK%5-+|C+Xk5Om_kaf9wnxxvPJW77QI37g=o$v@7BIXN+^5Uf8Zaw={$)I^-s6#Z;5LCk<9zVHmYla@+_{+-T-=4ZGg_IEZZZC+$vvF z^oj2DVl67!BV`IHrJ8SksQ*di%ZK;^o(Xbf#SB7iRIJC4tp2U|xc=5?MRoV%N#1`0 zqFyV}n%|)8pOSpDfSm{7Cs;?~Rd0gg|M$&em@KhE+EuIl;#*||Kh~e%1Kl@kuiy{R zktXJZkoc{xDzzPMubnS7hgc{bvp*b}PH*7u2Y}N8p`a^Oxms_z;XwOz76inZz5L>_Et}qs&f(4URGRJPoo& z#8w%jcP;DZpiySf)mVVt;YP#Lk`CEw#@1r9{ooVE;Mp~K`^3U`wQE_7$1nWAF}BWH zaA)5d2`RtmkI32z$TA5$(g>=x$UfC2ZXhqlH6TQEX=7P057adQ|E1lFmrP=mbC#M9 zNJs+nT}h^CM@t;F-Bbn$KGGMh|btXZ*EHCKbLlH*=4dJ^P`rpA7IO z-qkx3Py@Ghx?BSo!x35Ftqn)GSnx(CAw?H+SHNA;Y2ZflQia28ckpQ%u89a1%2S|4 zH4Rbf-+2{RNnp@0R5j5Rt?``ai#%)P4eI#!Wr8(+9*o8S(y!oTDe`aGTONiMKAH2- zUPwS-|mPBc14`wr*TC#3{!k{vo{~T&uwY#s?gYC{}X*VQ-m6*0K{kd zPX(iZ2dZr1Qz!$A-i@T2ed*Mj0xd&bejgZScmxcvXU7#YSJ*S`5GUQ5I8gApdb;?r z0)1DrTfZ=D75>(#@YlWMw`?`9*(%=k7nRz+iY0BlXSRov2;YKH855e*A1turl{Yd7iYe-9`*GZ zjX31Yk4eZiPT;n^R$8$#ZTlm6OKAxreEDFrftTaTDB|>AIu3h*!)_<(YE%Ks#hnB| z7NK*QAfFB*Uzt2L3|f6l8;<5`fSEy4bSwhRSSoJ3rvIl+!J(ows{88px}oTSGs&*! z^!o6y+d*J4WKG7R#%JWTEYqt;Y}?Hvux82Fp`vZp6>&Oj+%_NOqL`jO>vnozpRkJC z_Q@tTkQN!&X8hMKMu28Wu)SdBhhGvBb!V<3T}cpp2A#qWfM^2lb{Y%(*;% ztDba>9&aPzJOE(q$568mi`m=h*pr_gb|0abOT?{YL*X{{f#s*B2M5CPiO9()VC5o~Dx4ywk6y1r1}`QOM*OliPoLRs-fcdrro(N*MC*Z14igTo#i^w) zL+|_CyhJ=eed!=vW{dKLaeM!rXAIth$oyNkQT{ay#`>~16MhQgtm~3D#vNwx)AI|$ z)IvhA35#t<5QyY3&r~iaruvSLHnD)&CSMuSMuAQ#fnn7ynjKFE3vC#NPB87b|!|*fwP` z_Ol-E8kO*6*irnM9(zePE!k~ctDk1!_KlH`X-*t)+fNR_v_Yfso?@Sb) zX|=ivmA@h0&qev_(3IMFq7{d8t*(7TKUScQ8X%zkc)3u|bu!cvbnmjaoO~BC+56=t zz~xvwl%q3xXfD>V85-c&MC(xo|bq2Mu<|HszlkaLSYv{dhpUR9Kl6+9-ogDLIG*U2J152jGg z1a^iFRzCxa2U5w4qDLcf8i7ZPs@svLhi*|gd-R$n@hj5R`^uuExc!&8Ry2k*!dhx} zd1Vt;0oQr5Z+)4~n&n&5KBpt%w2L*lF!qa2JuMB5z2a=NOLm!Y>qNE%d6ONN73dBZ zN1o;Hwvx7zQ_&oV3lQy9qL=#RI5e8^?RlqvYD^{R9awm~@6K@*kb;kYP8WP>OB?p^ zVu9wyl9cV$u|Y~(ND%Q|L$zVRH)RILg5zyNVAb47BrG#$?!<09)y}iGT;6=ZaDvZB`Jm^Dr|1Pefzmz~MWmuY%R8DgmQw zdVZTueQP>`X0+5N4E@3fB9uT*Qvgf=1X0?m+;*VzMaGFwJC&0z24`aq3=N&2u@N1I z4l}7fnWc8$AbyP_jXeJz$#KBsb4JExUI{Uq#N&?}Oy@Eey7&}41smWEbyuz>{mR!1 zNf`qr-F%aJaoaK!IolgoBhg#7>g&3f zlM6>;0#Rbnwub9TV7P$!rbG&b^L>k)C-Bd*@1 zywLcl7JdG#cnCkyi4KW47lGFMuX8u~v+q zOvIAyci%xLF#(7ArvCW}q9N($l4vSSHNO&ZmYjKEh<2?}*Pniq|0YRQCcxt5ta~fo zAYD8)@x10-ODkonMhY6qW>6Wlsd8fmfslr8bNSLyji{9F&<`b0RAcFsBmCibVSpS| z6T<1-6}<>PdV+xK8=9g91_w$#ux)KBmSobgZwCo*1U;npNy^^tX4Fp>dGg=r0iQbm z=~KX}T4t|=Ch5n|ue{NPJY7)O#X)3hR^8i*h6w{x8~tX0b+i3d99d}->{B`qUgK_S z`V38IOSzy{=u0E34vPW_OOo!*?>YIMMm$%U4%GMUi- zefOS$SPw;|_B}x{rKo~E{=~Vv3x#Vgme&>OBOZ-ki)p~T3++$*74|YsD(3yrz9J0W z&iIfzbx7yQax`{DsUmCseBnvQU3v-q7}tdmsQevcL#*@RnpAWST*j(@nEtLDB4?uK zD_3EQx$StNIzGHHnr?pxiM+9~QGO!Ta9UPBXA1&32Fol)ux^VLX8p!8&bU+ryVBj9 zYJw~wLqpTrb|vys4|#9N64~r0x9>P8yt`cuQK7K?dGwf%KvlC+sbZV5)n;_94JjY! zVu|NtM2!jcUG9{bO+@ z)7#n6@$gkxS|a#3`6S|_>U!!xm~qQ>&|`XU^3;kZE-ZN7QT4WG9(Ti97I-E%Y8Fa! z+cpr_nmr*82L?ny^s!?{JoWJ)rC>0`f*}H2EvDg`f{xP~d@lPMQHu?E4Ouook z$6c)DBn$^9x`R&^qtI%CnL#Jd#_2jk3&LQLSNNc)^MwswQsLOwz?1H?bDZmE8kwGRNeXT*|0yMLbe!0FG9~lZQG_s zx}vW=hxMK?oS4uPhJKiASUh{R>r`65DLu{N%>wc9X=S_NSsv!v&&zP);<~aR=X-W0 zq_EW37~b?=H$3OdmQ-K~>FeV=_V@U32b zGbPEFg&Wrt<)dVLBx*m^joFlbcT3|8c33ypj{W(8;DSh%_;-flM_v0e#f2kj2kI$0<0|Q^+ zBB~yD=E74OxD(iA^7N-0Uc1xvq>{}wauJ5Eb@JK%B3uE_Xn7w<#HC9x?bsk>7T?Pp zmu|TZd%;j{^%i-GmT{BQ5+*5^EK@d64i;6Je$q4jORUIwCmYo=*R|}x{~ofjZVHGC z!dd#U5hRxOGxhN!A9l!OPL1OJaGk+mUB*%1pRC#NJ%tg@FWOKS4aX^2nEHHr^+~))y zPClOPa+9p(a+e#tX#lm7Yodo|b05hx;|c=Zh&Xt4jF|M`BbPSnK?#9-#s)vI^E)le zSBc%o`1-Jppupu}F4w(EC;`oS;k0&fNDbQCtSa=VQ=xNkRFK8K8Eh8*O5C3LtyvRF z6^L^2z&v7^v}ME`mzo9QNkG-a<76rdxR}*Wr_l!HzWRX|k@edN+q&x1BZ%te}lXIm76y1hXx>6=4Hyn5TLi&)F9$mEsLshu~@+ zSO-Wzim{SevK@TNSTTkAfHP7`!p=woS}aj-YhtevI)J;A{(PUWyL&rVwY>6)jX`C> zCrK+w8NFv4ds~L9O?)Qys!NSyYp)pa2UoB1E(USse6Eg2lR4(s2HbqfX%eeBGJW*6 zyidPK=cuc6`JF5B{|H^TEt+?4LcIddIt5qDLjniPW8^!IC}!^L1Vo+0zVI-LM>~` zx*MALCd-|z+wkn_8*-gj8ADmnuz4^}f_OB}0c}`)BOJ%XVLl9>vA$#KQdU>$hr~d0 z=CUhIn%#8NtyA7p1(=`YE{9v5i7rI%GMX?fQH4YX~ruKCFZ{~huM z$^mVuymkTO>h-gWQRG>NLF~und)ZGw7bmQ^?{CX1fmFSnN9R4$-AaLt$~$pYT<#5j zuJEqhxeMa!T5Tip-0&hdo;6$##3wtreGb0}Z&#^?vl1@c zG(vuaQ8Dw`1{?d47qkoL;y7r6NMGsrd%qfYeq!KWg8jO$9x%Amw8g{q)V64IVM`;A z@%e%SczL)U1sJOxr!D+Gixj=jsZ}iMd~G|EFh!!Be%liJ(MV1#F6ede#;@5?bA%V z{Cw#HF`0(M^vbay)QS5Q3OQSo6{LWrK- zY}3tGK*k*-=I$v5&V3J9epp4FTmQoEjE|Q$95Kio9u1b|77sJLur*|!xR`?VG9}>I zGKYA*PP7e767Gxzw9?<6nAVUxy+k}lxHJ8^RZO|cF;x+)iG>eCj$>oh1^AG&NGJ~> zQJ%0;Ci>v{u0<*eNT>?vIcJbrkeyfE3gIrkdZ^oRDJ&E#PY+$CQ_`@#8lc0cL}D8I z>?SPc5yHE9_y-|0+3?6`_0D>#5L73{?#@3r&^JdSgSSs1GCXxSkQDqSqp>~qCfl9qV|jme5CoO{zk^j8d; zi%{-Oi}Et3d5D<1|Il<|SW7CJ<0|a!U;y*F6D#m;893uA>Nhu0Zz`hw)Y3W{rlCID z8&kgx#R6>(@F{{XKOXRo`2JC-|6&fGmX|>f2-E9uUUQw*jx!* zO_nM84DT&RR1T--i=jILZ;iFw`fQ0K$v*7JjO4eMt8q}k%aixG$K#j&Rk; zLMrD9Y-RS=_8{36;`(Elm8?r*+jmR%NK?7*U6L;U$i2YkN0-wHi8Mx)_meyJ- zV(P26-xcqA{Fc5}B17cwue10ShRc-gEb3ca;rFijH2QmiqLsBpfx4_V?L*+uFh`w+>+9W^{T(ms+NpXS$YrIGjE^3Pitg#tyOhcg zP+z}gDW_7&8?dhZ-)9V!ofzdEb1)?ZLab?>g`Hx~2Z=Lh|2Lct`?z-URkkbMhhF~l z#3qoK>9;*Bg{_On%i9gCK`k*qUCQt2Tu7N(bYsjAE*ojFY}=IAFm&NN z5(ys2zCgaZZlS15mOh;8zj+DBBt=+d!TpGiA2iM&BWfV0-FBfNTU(?z;CtYI0+wB4 zhI>CdMxeTWZU&^w1ctJ9cQRnd!6+vhuGXGSgGSHt*5e&p`mP_{;@K#t>5v*fr1uuK zB3*=q*?;|ys@uP>X*|3PTLHWCjN2#&^F212rBX-d${$vz*I<V+soS$DpMZEKt4L7z?YK`s}923)l+n(~u{Ww;s9sQ(!)%%<-}*}b%~g%Jray~u?K$Eg%>0gjz*wR(;mrn3x5y-n9ab1= zE5^m%9yOGYZhL5c5RPOYgzSCB8JuNJVOSzWxF*G zPr=Vhgkx->*4far&ucCQ;PlCfsw2aVrFN?L@~kg+sC-kxeQrf&)8tfJpNjau4tl^U z#>H%WS*~mV5lQzCJuEe!-*VDr@ZPJ)t>Mottkn4~ohUwk6LVWH{`{LFgq8MpaoZF= z&5j`=s#5={kTNxCUBcyYJl1$1#C`ri*|Se`gjT`2NA*6NM|>^D(JUZT`Q;<&!jKa@ z4m~W1a^*%_+}&eGoagfv93N(L-}SZpxOuFoLvwJBLLPC|B%Mhk?8qQJP$Ghc`@^^0 zz%|l0C5HVqOyI8De?ZKYDab0&9tBkh%|U(P>$1NhRLl3q*7#0|}00Ww1^5GG+X zq)%_40d9G+>bxvgt9WQ5Br!Pn^t-^jj%zzZ0LFZIO=}2P@VNTq^7gzRmX#7Z{F$qR zI%RqJlN{mpk)e*x&c>X|WuKv$QMl!wONerHwFJaa*R;Qk_X8nU;iVVSv)nXl)=`Iw zJS#cxm|qe8?A8Hk$Xu1GP$n^YI}YAcKpl8gCD`#Od=u*A6pCjV6%iJOi`37}#GT`< z2tXfu^x~*6aeJ?mQMb+AhRe0Gyn?f+=)qw?x54FEKK~)Mm^z7Ve!;kJt$fdN%zftX z)>C=@dLlj?p?XqFzsY4v#hGprgl~`Hg)E$QRG;`^1A8$+Tl9WZMNzcuGvEef8?K?BGAkvO!%Gr^PqJL6`Ki4j+0?nD;4- zP%KETsyL`L6O@itjNQyKMM_Jnv*ZHNVvOWQTw2J(+y{^=sa&4&DS6KUfhY;lf zTLVQ%nfhBja$FN8mx3gW&q{yXVNf~aCv3zRh-%+qp}hC{8{Z!?pAP9))=}-zSCP$z zH4&p53`SGO)p;%H`1N^Y)A9D5$!Vdc)l+UDWzy$DWK5sh79S z4kk3la@172)!^<=&1o%%f84PwFUfGw1!X%WV$Ub;BS>HHrR)5LI7vp#pS|gmrv+%@jwrXwQX>}*~O@EUiW@^EZe-_W4aAD-Tm9%WE|f12yIg# zQtEJg&1ITcnijLYnu`z3h#Oz0^n|Fe=!iNKsF$T=?K)5SzKAnR=q+~=5pOWt_*U+@6jNsE=me_a0ucR`50Zx>;C)@rNTG>9*#gj$r=PPo-uT>x4;yHM2lcbE(qj8WMCs8-9@QW|!`54Ol#|*5 z#jhYwwGW{Ubyfp%NFy_G^X4zK7hZV9o`2y@TYLNf+j{Fw+#du`2&Od7cT(wfJd~&l zUGS)|Aj4W4=GcPyGo7I3W|gQO4OPbVwan}iU+NDh#+A?huuKw*H(rFf z&Cfw#U;Wf+)9tOvlkL+_Ke8c12Ky5BPe1)kec{b^`|Wpmo*!_)o;G&e81wp60ajaIYlVdcN=Je6VzS+H?*q!80z2xcBVAC#HVyno*x0RmnG@=dKK{tA zy6S3sdw3Gll^!7te4$)-_a@;E%dD`bLPzT6+q-wvGSk8 z`YyisDqpd&^2#HX2Yp>w&`oi?{jNK_4zP9MzytU96&kO+@{+yu;#)R!*dQA@as{jC zR&MXT|AFe&oi23Pe*1}Pw_K&DW~w?(y`{adO@x&i92$sl>V@ZDvZtPU-o~%Jh6^}3 z43YZI^*IP_s7oE(T`vf+y*>M%6zDNT{xfpbSE`>>Ss@7EONd((`L%N9o z_2|*lufOiD_e3S?N27Yi_wIg^Sx=2mdi3Zf)!of#8=Og3-mSa!(wHR#V_dP8_zP+7$;fc0j)(p$i zAPtu+pS{g|Em zuWRkK*FO{Q%JS2+o12)y2}_Qd^)4yPwln{6xUIYPn%1}PNW1s0C+yf?{nn~E9IybA z6DZ^G5xqoK%I%4#-t{mad*()wqZMt^>#vJg-DY>*@w6R%)Q-06&O2&=TPinUrk`2q zriKQ~$tx03uCV_*<1+il*_SHAA%IGo?A&zAzpO??_`(aWvlm~6fMi;I6T8maZN(K! zt+lz$-g~>!XYyWs{YEP(Ewo?$@-(~V>iabK&ai@_Y!L*rXP>{(Mrd$<)|nUC-_N{6 zgM1FYQ|?JYJhGHW`8jRMpB3%OYcA4&yw!3Ga_z(u&a;1CaFeaS;aI!(p(||RylF~f zt(BDbu&b_k(2hUqOzS_em%Tdq1{dyJcHxb7{k0F;hab##0ZLXbGve*m(4>KM3$ZpE zI=ru4c;Rt2YPGR;_#r3TefK=A0s7W<;l(E?UbU8&-_3U0r- zRjrL%b59X~O68s6tuo$xvvus;bAN9W#_ujNR%3rV{W#wu0=4OSX6!-vZ)?gnA8{|Km6&1{^wz52d<^S?0)#BJnA4CiPIlNvgZy+=fC5Ra0 z>7|!m@`x9GLi=2y=1ca}p3 zbJ|~wKPisD4^{AX)$@!zwaHSokrPDdt`M;=whZ$6{Gsh`OBZ~gkj9Q6sUtwHGe)Z_Qss4;8EpY!ab zll~%o`h+YI`OtTg=B%tXrFppBfB(J8lYAFe{OM1Bv;RB&pEhpn8urSIkJ$naV^!x_ zTvVcd_)a_IkfXe=On&P*>(R5P^7C9jUtr3VnW=mt9JZIVdRid6T_uTuS?Y`R%>XZKAeg7(}uj^+3g!-Im>#eu8 z`rJ!xopm;{88hbCDW{xh2On~v3sfdgenVtMP3yv;zcO+}QB(N1v+xTxvJmaF-o-+@ZG5-g~%kw6UpP zd4RAf2*W57()DFTO_{gnsH-S2uAR)!D^xpR*#`9uVUXU`7vPUK|1bF!+fr;>srHm0 zL4pMT-y=14@F!nK`ZtYD^hCE++S8`bvGe|Yt(8`YY3u-e3jiyvQ}jHVX=H2}8ZWhKtij~g6Hh!NgH{{XzpqW)d>tFm zr@MZt)oCnSC=T~kE$F))d5CZ@!v~MZ)_^oaBkXJqB3X`}p9k@3w#_#kZx>&5ifuD- zbt^65s<&pVm+ITQ*nYCxdUoa+$BNvp;xjw7)m46g)nSM2ZyRm6s?WmL)wEc*@@)Ib z?i<>Pzdg{l+h$GAkV`JQ&c2vA+j5kN8%@2>Z0DUe6@lGN z14v~AIiXQ{P4yz{-@lJ-u>J%m7!N-9fHk#=Bq`pU8<3NquK^>c*oPDDncd%T!%?>D z&Kt`QW}cd@h3nB2#(D~O-+gwrHOH=?xN~xUv#l^Z*M5G`uD0X$JGd|*KUcxFw8*T< zCT=~!w%lSZWgFLr1%Fx^>Xd)Yw)b8;+BxU^Uhx_s^4e<64IF;gVk?d8XNMoQx1Dju zpRJ;Mx!l!Rix>q5<0%{DhX(5nwW+W~+C=(fArw5~*ycKGtgp2#H{Z%j-(2hNNXWMwA)oj7sx%RieaW+Afch1U^RGJkZGxqPk{e~TT)R7+UK6`I$T2~H5*zjjb1FLf^JmYSXOkwqVRs7hT7&S$Z+D2Z|5BlODIFpr5FBP^b8;yZWsTlRn~Oi>7oaZFsDjd8*g{Gp^$3dJ zsWARi1({%G81NfFZc&g%wRaX%i{D+Ml$ITiD z+Em|H7%XCVh+TNm1s(^kn5(U=R-0Mh4m{o+7myeNKWoS83K; zVPU8jF<-accB1Ok0cw*g$(;T4^m}c#_uf0%i6{QbHrs4{TextM`lYjN{@i(TjF3W) zwoJ=aU5bJxwJNU*tg_)+L&84%@csNySCy#e!TaxjsB-_kaU004yG~SIucf@mRXH{) z@B7)Y#~osvzi`!6SK3WC-Jmk>FCu@W=YM8a@ShbBoG(N5^i^H-b$UnWIO~g9_UfxI zDgN2YFV2$*hX%3*f-NPKA88K)fH0d+o(4r*!%wvxwFk~QSunrK{`{xYRF5{Z_153O zCT_Eh{dA9?+QA3^!f#PI>7ct^t(R#O z+;xQ*2kI8}r8A=0(##{GKT8WI0`utSSJ~~17)CnqV_EU)3iv^Px3oCKIN~qQ&UVtx zqUs9RNp~CL+S%Wz-x=tqyN_X|>vhIgnMKt(9?R>lGnVBpL4t1$RI}x%YK#?Jkerie z4f?({G7+P15;wQBs+rc;>AS6OO@{h&4e}C|s2_#OK*2Lp^**Bwecm;8L@}1}XN$Fo z)A>ZEI8&R(M~tX))TWr*kGpo@iY%sw}3(7h8T_3_s`|yMJ zZ2Gi0-qDnm<@=J-qLNY(rdOQ!Y_i3AB0_oI8NK`7hj#KG|7vef{!|0Fvu%}?hshHk z-C8dDn8_9ed&1IfCDmA2XD6RdCFfi`RAJbVAW_iTX%%BD1A zTa}F(wYmoP`8MhGPpm{lcfEC2w1T1nn>Vl4KKb+u<<}f#AWONMMZDLtVv$=0)m4jX zWd51WULfM7yv`8uC@U_o!9xbw;Gx50r$KgRT3LCiz4zW1_R)u5_J zpw7OSJzr#Pwg|~iHtD6QHfzR08!))SRv*<%q`6(BrPQ8!>NT4&bG8i^@f$aO6{}ph zQ2tihv}u)AQ%nA}D*sxnpfJ;F7B-8x_O*U}`>K4EIr=>0=H|=pRQvG5X{vuMHe%#Z z>!q@tp#l5{?|p8Kth^ARU2XN@Hgs?gYi_9aK|41haP>ufW2@bK%R_eM<+s`+k2Hfe)4ssk>p!&VpS@*O3+t_0kCklrs#{q` zj|npCW-ZiPZ)mIlz%NxMUje}CkF*s4Qp?u_mk)6ON?K{M%s8{x{>B?`^jTY$sdH%D zz<~orVtcq929HsIfP089v%!!f4HxAbM4y492!uM929a|}k>``LCF~my%FlQ31mUmT ziUj577Rm2yJLcFE?aC{!wM{qO*lxMyI(zA*7esIty8E)y5*s{tu-{kDb`T^e?3;#g zu`K?rx87F$YY;hZutN0<0|pN88Fvm3{QT4DB6JP5*(RH)ZGBHn|3`l?80 zjmk5u;wUK0Q(pG;)9#s_Mvp!82roYP;6wY9NZ(5@y<-2q;Gee6x@-B(8!>-f5Rjec zX{)QPvl-K8+LWnN6=s{-My8D)&uWY^Cx6qX&9E6WX1U)*3X^O5h%@IU6sf&!J8?^E zQ8~?~otgzjCtjty$%?(T3|OT&})jl|_@APn$M72&b}IEx#bw>jJ0sGi%O( zi#UGp!AELWpBRS>Zn)vviZkSb)fPD-$g}O8$?vL9%du@HZf?~zw5trOs;;(AKlxm7 zUf^LBE4_n<47Q@;B9Y*QHf`z`Dx-SEcYB-s&bu~s>NMqbe;Ye?b@dtZtbd>W_UPkJ zs85^g%lF5vIofY+SSYvey!(MwSA}a1x$d+_w{n|4bC&Xcu=<4|D!XDQ_0;2NpZdxz z5`EQY%$PaD4|}BkW+~nyM~<+OD-BmBAV{wE@^gVqLzCTn(;ar^-~Z*;3!Z%P@0ACv z=wh`=v+_aZrtl%0p-se=8=n4!)VGQTpqgO0Sw+^;m|?fwez(3`Z}?$~2p=2j>y_V4 z%D3PbXBSYW_{ZuS1aWL@p|A6^A6zh}epdA*wr_xa^jQ6X;%o$-+>XGRAN)qK!U4sW znrP0GvL@{)-aFD0{7xsT{6?kQLm!1+`fpT3XS@84&vXT1Se@enFpG$8qMzw{>2Z!i z&(8MZv$I}0()F-Mn*}kiIwOYBIqp#(6@htF5z#!|UPQXRuKezd&VJ#>`zQgubUz}N zrk^0ew~AO@`3U)#fv4)R_n{pt02n$<|6-o~`{J85gvhks{rlQjeG>)^8E8%F0~zz? zs?LT3&=Ms0all)P`svVKLj8whu*EpE1KJN9gSM1y*?Bqk!G|B&gAY7rc{!OjV(=i_ za?`bKK<^$d1c2W_X}${Ip#UJ$n%Z-$K!XzoZOtup)*>d}B$APvpKHyH%vNbIl%s)c zTeiqYvy~K;h|m{Ui^xqYl8tQnFS1=%yGR2f?sR7`o3BA#iM6$8P_02*wgx@5)pa6( zt;XS4oYc<@Ap2{{u;zMYq~cLnD8Ds;;9KaVhjc3G8dCVj9UZ?`fj5~iT(roZdG;my z_2FmPkwn9@GB%*-;z-eP90)TuMWH39#Qq*?Enf>LgPJkq#)X!OdUZzzy zRQWhEFE`KHn=`FNs#y6`TRlg9v?{$t`k*UcGl@roV$aMD{t#I&R>fWZYy6X+UuYbu z+N8lP0u2tqYi(8@H&^@M+%m}5T={1jD5^F*-k~vpIs9I#M zmj=;g%2y4rax_>KX|AuHE&EhF4QLg9rYc&S)yaLHwbYeZZgz>%Q)@N#Q!KAQWz}A+ zFcc5!4>S5oYrTk2L4L9FsYw2ERTi^L449j&P-GuM&rCaIz_k^S680oB|{xw|FlS&~EX*EAU0RRJE+G8BZ(PZO*c>46|)~i=9Cpytii}K0aFL|08xMCN5 z2#C)Hr}BWdKpNUaqL^)Ewz#>a(MeHzOdodL?=Ub8;fu6o<@s42#~t^3yW$E202|po z_uT6CS%M8|roOUjgZ5e9hya2s2#H&WE9G4vKWKZb@?kYVj6W+~vU1hNo@OB>a+9Y9@0b@#EbN1 zQ%3p{kTx$@`N+YCkm0hDQZG~dp)NGAI!W>7U$#1R4hs!4?#d&@6+QBS{(*eMGr}Uj zyxvNS`oIgq0ffofYLld|R%xOFaP9yz`-DTgc>VR)?TX8` z?L~c_%Mt*@FtLYOx*zF44?F4Mb%oAuvEP+{ptE1;_PTnH;YXDq!G9f8#ngBr{7`%G zuR&J=fSYJ^*1KO{8?#mv0H~wYxPuF}v%-fdL4qF*yw#-o?yvGu+YK-b`kO!H>`SXi(|t<%6j~t72uX4Ah95>}AQ{s@euS`iRr4 zs&bnB`q)Ek(~Z{?>2A_MxWTf0u)u&^Bvt9=q#U)9rt(W^Z{kq6VhUgR&%S(S zBMa51Bal&D$rPbb99vZnnlwN!DJk;-GXrF1WT|ruoSCI|Vj=Rxl5+-O42Y?!S;`M` zo~;B*gvwTBrLxE`EVtVFCcEIGw ze`r+U_63@n-WBg3ngD<_$3ZA6Hdh9u=*OAEXdd-252P#Tqaw&}{6Q-S08p)}`z#}F z@l^oqji&s9upovX>=Fe9qdL*-SHc~4+#l_dORlm_HrdGTyZ2@%RLri&nPR)7{z%fonGqq+NErQ`*8|Fra@CVOY1OEVp3~pu2WFfL zK)Mmok+0mipd#>ohPD&)6*E>|RadbpNk7n#azRrnFPN1Ev~|u8Ab!LRL0`x-%7i>> zwvyr!7rOY?9z~TpmFNu zwUzD6zn!VN-K2c0^}dxphAkVcAfc|YVuDXY*w;@RV>vcunXPgYA|g90NT~}^g#fy<`^3|lxtjB z=G@VnL4yBfz#l?;p|yySsDFoNINHTgWbOh0u?r5+{P4q%?STg#_5;<2 z4<2A!ZMvQf=-pFpurKxHPr;Y)oe2Q4+7#ieT&ohHV}>X{A0o&8RR$y)2$z)lV6(9f zBFCM|8gOgi#mAk&L7oPXekBz%k|HDQ-3)_SW{Tt_H9%|82QZKa4b<9ME*h@iVx}2l zmz%G_XIr*4RznOjd=SH6oS9Ar*Et$|FtBcE)4&MffJT2DQpkX$a^V7Biu{}7{%Py1 zy{hfD+g3Jg$Y86N{dPsx2bhWlbE5aZxwf`EDTU3&7i{{U@lCnY#_-aIQv#qe8$YJDv{`bC~$H|2!`0bWUQu^n^F z@9fgcuC~oK-PrEB<3{^*%Ewkw-YtYDMc4?(IK-1Z-jH3qfp8QS7O8Glxqr+wqsMjw zh&=5C(ig~Lu9Ih063kyP&#x{d-Q)rOL*&Q{$SX6lE>IFl^wkIWTM(A&GmFj4bf|9# z1QDb`Lh&c~LBD~Jjedd^4!Dmbv_OsNo%i0g6HYkQ#;-Nn52PD1WQdb8{E5Vd{N$_< z`T)XZSw3x?S$2dCv**q7l^ggS%C=**1|T13_rwuD(WkF~_;u@sunzLb)t(ui2KvW1 z`|SCx0ThBtRvXa2aj+oy;lxzt2xGVwkMk}_7i5-uWm!%Rc_)t`okWMcB<>-f+Poa7 zLtK|h9|&O&+e_4cD$iKW0AYl@lFtyyc(o~8e26D$!cXEK^0&?XLeH;Lq<-sL!7M)r zf`CA>10X!;XDWU5K7;LXQ65oW8tNOo%%@JBYL{GcjY#%FJNl?YY@P9ITdnFA^_#fG z@*-c^N`rfZxd>qh%KI$U2M(;IuIBkFCbcgF*ZTSq2l9frfl&5gX1_DYzjT$3*e2sM z-5kA`?ylUX|K>dk38F$!5EW(078I`Aq#Q^$in79-HiaF}2Zc%4F;4srWfcSr@pm+* z&Qb>`Z@#mrC`5>>l(2&y<%K!*jVJo_Um)FI^vKg#PLwx#ofY~q9?=eNct?Tsw4~=_ z)F;e{=q4iFembImU}@&j4o~cK_B$foFOVL;m>-?}iuEl$>}W6Ai7G*Y?;g}o+7V9_ zREAY>>QD7cU8~LbA_@R9tWUpwHg?T1HfZQT_4Q%jv%UKn?x$>>K0jXNudTCmHrWgK;-5YT7k$LgRa`zu>6$40E0P*2b}`nxcWMgV3x!B zKsnp;3q@qJShC8}ZqtB;rR0$MObs+NU{*RH0*&<=B#W^zGtEi>_WHBLo$Uqq%>XlB z16pzo;!LLbm2g5?S*Z^$@4E9&yYYsHZKDk)*pWx<=L6`Ps<6itL4w~wtwC~@3MEg( zq-y3&Yu6x&C9x2b;^Gq7)u2%W?JuTHGxo5TmTN#R_tgs*DkSB#?B#2Ki7Z6zxB z5~Z!u+OpPLDE8cC^y+?oL5yFgWt8e6l?jj$YGAN`9G8l!R zbn8~`b%4QW7{F+J6sQZ-WhO?vyFk zvu8Jz1FIsKQ53;t1pv?h-wQoHf1m;Y@`n6~gSgmSd1sJL9>w3w0`5>9gJFLNswea? zq{CZ(sB_%U-lF#8%hc6Q=o4gu0|#zON=m&A{OVUHI?396vyJTjdvCNEv!;1{XP-4> zA0Zk9yR@`i;kH^yajBD(8WCK|7ch{ed_#I$odEXk(c7kdG0n>yAsQ#y6MqN_q=MB1 z#Uj6$FRTjJ%!TA35C~*}c7vb%=1HH!>^Ww{jqs^^@>+AnAb|VTYyZ)LVW-lJSptkp|+AK5jz% znmtaK;WzfNi~k4_^uymt6MaA=3Bb2QsgEN*=#ytb$Pwxg>4Jz+enkbP`rYog0`QwK zxnhz$E-x#0|K`n~=f6A3sLi)3RFqYC8Q~x93YgVbO=)PXcmJ^)^Os2-X4ESx5Z=_g zzxat;h-YD8vB#4%kp~EWe4CfjL0RBG{*f=l13lu48~Oyk4fv0KMRA2y)>PVwzdO-y z$=H3@-ED{McCZCi^E_PgntUanW1drI!y$jP6>PD6i|hWF8E5uiBvs!Ygah$#O!6}z z7+GXrQ6|m^pCuWir?fB zf&x}7aQ+DIlp6{m0zw6Z3z+dvyQh!GoHC%?NFROy!sQ)3!b}J0M$kl^M=*n+fZwE# z>rMHM8G=AoZp0^c0!TkG&I#vMdIJNpIF%LjBW zQ_Qdv6~C9K?6F7uC?CS@9Ji>SAi;kR)boz91n3X|(B9bsFxM`;=mzUJ17NHT8ZyY5 zTN~A{YD}Xs0<)idM-n9XF~D1k`f6%DtCW5A-`hYG06_jVo>f~4TL8iefCnFZC|m*f zB>{j`80s$*->Co~D_?_iX3|6^nElTX@h<7v!|E5z_Wiv%Ir5{OSvmIQLfVn`GkDg( zTOT%-!9qgv^F;)e5e%voF@1Cu&vs@yG;n4nUW7k8m&}8>AP`W-$(-4mrUnM!T(=bt z16;VEQvPIGVX?xNy?ThJKC~SC2RUTM51~M<1}(lsSp&a%4PrQ*v_ylBqM|~p7x^zO zEt7t=<%k?G>(wax3_vLumbYh%$TN7QGvp)9$Q3#a9Dx zs(D6HH>;dMu=!S0qB6^^vPP}}Ea+ub3#t@X%7lSqn+D8TR%vQ3j8RCI3#EFXvoRj?d&B0oM2*gzb8Z@cWR`eWTGpBr^yvlKc zk>lZ3T452}MVQ4#0HDE@lU*s*JC6(*&Qsz4Pz317S7QOgc)k`5`S2&gn)u~^bmXyCVp$E?!>oJ^^-h=w8Z$~ z2l)YUihcq7C++-(fYDyK`<^m~VBPxYN|u~_3dBs z1BIXDJ9Qz}SKp@Mbuthp^275^_DL5CdtUDpUqGEB4cM<-Sm}phE?Bt0+X;0Ofo@pt z9|Q*2i)F^virShw`ANJ&U+u&{w@_(fUp@V);-%#CS1aEn4OV<&cmRaguR4cgo(aev8)Ls zBIVbz@SO?(8lCV-PXygWB%2#+-7Z%iu>aF(6pTsa7(qZhlue&WecU0AX*qmD3Tc&BGXySRFT|D6lq2xH7$| zsZO1ZGMT05$^st+T@ zNG-GPkS1ok$gAR_GEXyUfMj#^9oGt0&acrRq}c009Q5+WV7?uxg)d#_x5|Xm%G>f> zXhO;5D14T|Gi%?b{9)g2oANO$vrsuHii$)vuT`C^2!+bZ&qHV}wzg*F2SSr9$XbKQ zjLM^}NCRu7UHX=zylhi>i2$lJRZ-M=H*0{L(_~q>W!6$xPKp#;4tJbmMP&#+a-^7< zlMAJdGVy`B;*phGtbAh-DIzYjCiZ%%5(j||>0p2x_R_ZJD!gV900x~(59vnGK~+T% z;rXC?g?$c5gFINfh`#EZY%0zSO53cYyv*vV7bwljJB5j4jr=7q!$*mXroK_{$V0jR z0d4_^1547+fEO?bJuPePyjRDWAl!A=16PtyaqeuPpES#AM}p_KW$5cY}%g` zL=r(07cRFQ_04KzeG=`<- z_}j5&p;kKELqP}o5fB{r?+WuBOH{b`q|X1b`$cCwn|tX zbtw!|&YpOdc-D_aqm^+)(YJ}U3kOq5*JWGU52 zx_&R0&}cj_cn|eSwFS!pdb|b|^gGN_j#D5F=%GkgEPqsIw;7pYA5zkLV`a zi->gwMElVWal)K*lE3_p=IQ=)b_demaYxxwCs33nzj>ysXddmv@Oj5Ri1`Mn#|VcI zK1JaHf(Cx$2DikEl?vF6;Y7cwk0{cHitUkio`i$@bg%*;3M8Z803iYj;awCUAh5ze z-mxEr5iyLVp>ucuy;w$o-!W~(G3H5no+n7~Z6nr9wF>=Zyb{JN0qQ&5ME#kJXM8co zE_49^X8`mGTL6X(OidIvGuo6J*;aq+U`#^atMMCzir)_DLAaJAUV8ciy)^soLe40Z?*u0RRBQ# zz&OM~HDVGk&P@pb9?>|3GXM|(tZM^O0s!1BPnZ8C0RRn`!96q185s+#5&^(-|7V3c zwN_ZPs`VbQt`(FF)u0gpfCiwZkEudz)Bv(YADe8o@Vpk8sQtGnVMzQqJ)T+YwpM1~ znB~@Bjlnb-piFb3D&_=v@PsOS;=v?~pF*!pLhjM3LBEC*jJ#xr0TG8}u?Mw59gB#h z;(;RWZO8%wlhzNpYSnw2KIp84SLQZ0)XIY5p+P?T{`u%ZX=eCdCy&9z3h540C6Xl@T+CRuryr}ArDB)?jmByepb_wP5hFvDM< z(0eQF0)=?kP6kJ$83Lp2|3u`r~Tgis6wv}acpCG$Ef&f5oiv<8M0N)QR9pdecj?&@p zw*&GZq9rxhWspgpF<>P>0Qnj7G!7&^|D-%`r7$MHmDB*e2PYw4$R7wR^$L6Bo6p8d z&-d4h{IlP?l}hU?Pa4#g5zY`dmaMDYxByXkD|f#4TZ$kdTtToG;t&J`sWzvMEyR!b zdW7UxAd8e10wCYhuP~_N2nfQUHVk-4BWWhAm{#;K!ybcdezVsdg!l!aLbMM;+`^#Q z56{z+ee(24;lM$4zG|!Fdvq7`Ji^l}?>u_`JLDm?5&=}mTeUODdJDug$J2@M5fT6? z4TtFAZ}2+=fdEKmlsA1R)mgfspCjUGCo&^W#628-NP9#`z#*8b7wS_uYXJcOf)pIf8C^Lj4 z5JAopVKs=KL!x-Oa94T2iZ9NiLC6E~XTQJq73xcgYXsd0aU=;|o?hO{N6Ox_l=OuB zj7Vj#Kd~3<4R$-DE4_5Yup-j!r@wa&C*56FX6bIp*Yw{J=*2b{-B1^z-E@B=qFK6~ z2=qc-SURv1?GYA;;h>^9irE}JJltB+g9bz>>)Qje*=x;i(k6H8&!C>^4 zx<%as5RKbG)U|dQ7z@$(R0MHlXPizbEJ^cxm)N_)> zoBG|wL~RK>ptBxN&{^->v%l~7BWWPfuQCI?Q{PkLu*KjVJ3ff)h-mM-LJ@JS>r zON3Ws%&&)1#%JZ|Lnymk`NbeK3|ys@@>UfNS8>UrQmag%z(|1Xu@9Mjpk$U0LPaDw zu&Pz0J{%UM!KDHWvy6Oj8E}R{YuG0*($=EEb0gU(Lr9JMasncMIsKmxFCS=@{Id5{ zmi)uXN1T~EmfsU+2IW4;)IgkYRi)%V14w=NrI(eH>pYYC$Do_Igqt2ovF^ z7@-|G*(w8L=`oc}?pihQZxx}!npG*>7LjKJ0L;h}dD+cYcr6VYaLZ3s5gHFG4Vqf( z+;6rKw8@XmERnH1W^5W1cTOm0kOpxIIs%9aN|>0fCkZ4eMh zKZ7yK8REst3-TfkkRTEa-YFN#m$IQ;81QpKcc9+NFZmVg4dj)a@Pbi_LnG@@G%zS~Ag`#m3P85n%Q~u z!?JJMejvI*co_VZwzp;cKtM-vkX9FHx&4mS6PS@L_<fe+Z*kuD@_$rHB?=CPM9{Er!())U6;yq%XmQ zl^nEbX8h@+vN>E;?cDnjsUWBhekl5`+*2NUhB}UZC~v|5sh^$DrRHMbHo8woho7Mh z#IQO8d+BEB{&nRpnn(R*`5TdLhw_TTxOcy?24?W&du^&j+i*~#X zrsY*k3+NnHSHLWqFUvl9IU^7K$bk( zU&^JR?SH~A##i|1^+tM>AL$_;#2JM>_X&G$Ck4#)@bab(D(}O@t>R0C)GHiqBzZvtu zEtwo){6~KlRx>j}67#It+Y93x*&#pmL;w(481+Z?)Rq)O%g)X5YXBd3;1Tm%00s@V zEu#Pc+j5dN{9G!!5CGJY>oQTsMFGI`r&(bx*RzebzWvwNz-olZA^Ub!;8t(VS#4HF zW%Dt1i{-Msos718RW4~N6TJFE>g6gVCp?2$Xskg(qZf~ol8L!LQ)P z-&5|;0q9{j%+!KZqu~$Q;j!4h1C4Z~45PgzpP`TlgLu)Hh(oXuY=yMxjVDG*6L0P+ zW#;-Rboh@Qy}4WT2qpNz5|RMQE8Vrwu7=3~*7IB>YO(uZrYh<085trTJbj?c04t<| zRTub>a*;y(O=PLWQUkbdJyx(0t88sq-8PUfy{X;q zp4?NDmSZ()suSszXQ5_k&?QsU|DPadLXHKbzXN`^T2o8CcXE7W{Nt_8FAzJGl0FPH zWpad0-9eoXnkgtJ`I!>TggO(#id{fD=&E9O6+a3=h?wrDhnRZ%53sl%;kVuwx3zBw zw()p6qryMpnf?S_=|!aJdHYMH-5Yl*kH2@QOjBjFB#3uMdcuc23@Xv*A8?nROxh`{ zKM+F1S^DUQ+OF(`Y8Bqy2lo%1OeF=iw-MLAaQuBc`qM_aGhVzn5hXzarAjaTC+l*$wDQFFhO(e}i^M)a>MGZ6LpwquWSLyx*jUEw{t_f?y+%k5M-B3#T@wfmOAAk>uw z*<}=(VNHtq)ERT^k}IyWocuiN*1fxp9XrZ~4IS*0JzPOdc?0}Uy@a8GKrh}I(Oxtm zPX4YZlWIz->qo@2b;jcG1otClFFqMpEa8)W#BW{nk-Vp!(PpT-o_9(=LVw67XOiU= zauqoO$YsZivL@f1j0%|J9||+-2<;hy>60ylCHp?HCSn=4^bsHOls*J=cjx3ZkWo^V zE258}lDI;Y@fU(m-;lw?rTk>l1GjNIE_DMU%481brg3$;lWOeJrc~yslK2vEAD=P5 zc;Y9B{e;KK;~dgXrc)QFZ_#J+h3~n76E6({7GDJ@`<$nyjJJj+<-5M|=uuA@CvYZE zRaLd;FX_aLbkoPtzv8d^t$4(;iDlqV;^GqwZB|oP>#MQolcSK7wn8jf$%=r1wBVLJ z!n^9~TBVzFoDev${Y>pe@1&2}fA|+?!3C&{73Z)DAhiPEqmS(V2OqIKg~bYhEjL8~ z(8F1o`_XmQFM%%$0NNll3KZ9w2ml_kcc1@@739`iVZmtY*Ka*5DozOil;c?$b=H#E zW_8N+MunV_(c}UE_Aa!yvqv@z#sC5F7N6+K>3A_S4P2mi?3ffaSiKtqZNS=?$AUsM0EWu3*DgnP}M+8|VYpN0dKY z;Yh9a%>eC4_0ZBEkuYA>t*Y?`8~?i?t>K)GxUU_>IRSL!fp{^C8{V<+9jXQg{&W>O zQl6|Ppd+PY43IwmQg#7dRUDA1b6Ttq(z`J}1m6l=2!LlP70VfY2zLxzomEtnUl)gm z5~Pt5kXDf{0m&hy1O!Pb5do3zW@wN`T2krmp*y9!yJP5@Ainp1`(4eNn_07Fy=Trj zzrFYKgkhhShw8C$WgMgQ=(gns?`UKmJeEK9SP6HzigxZR-@Lj$K z?QNj%lQc2?X%?qZG~7<9mOOtqOgtR&=Y>qV?t2+-%csudTVz{O=_36=;jEKE1Q#!a zfM(YdKLjzt82)1L9|55l)i=|=FVFeO9-bL@<@me@`n-m}X7>0(JTiN@kw2NDc^`(* zEhEN8PvJB(ItV#9Z_L-bcHE5a1N_OrtO?cOv>iptum{sDi%8Q*mT+Veoo^Ej4k^;8 zJ)t0vNy2-f^53jV6}RzI5F`Fa;eGvaHlYz9*0dO|il}Iq#SO=8m52l;LI_@rkJZDg zKc`eq`L|!KGe}59(!5M>aCx$e1L`W|V8~}>BfiXL&t2O3XYmRdB05k7{?uM%S}R4F z@^d(^V!KoPdhzlz9q%O_Nw-6=T~Pc5k(~b5Ue#g9fY`%$$UN7;Hr~b;>|Uu(7lLb5 zrOT@{X!M#~u$-?s3IFZzqR^}pj%U6Ldj*b3)nAPbbg-4eDMBeU-Z!|vxGRM&=983v z#q00iztKQ(+~|aAf;qKHw{i4a10m;BQr_dt?O`lF+Ar^Ls63>56q!p(eat*roNv-< z=8HP~9F+Ml*l|Y}=nbe&!yOOvXF^HIw z4Dl1v6X@v&DV!hWiSXerA&zLIEoqwwRsHBQLtL>Wk?_l>PQndG%vFt%defqm`7w<9CDhJbVB914zJDUndb>>@l#CGFxj=Vwhba`E?zXId(M%086 zsw0_x{Sn1=b&qQI7`F^DyJoAnswiNdcc{cHs5uwv{rZfC`9sr0guk4#SqRrfuOfy{sUc}mj80|FW4BnbD#c_T% zpTlG(8x7@?0i}knvAS<`Pb!C7f-Yal!uf@#Ifvmj3F>u<6u>I&Rtl5_#jZDFTxWVx zkYLBZAzs32_mIy^D_};>EZ~c4dg`|Df0X0piSoUqJC^r4r@HUOce^?u#(T1J7ZP+v zr}L60%zQmYuVn;HoXmBiU+qb!dNv6p=WF^`gTEdXMy=@|dlR3k4|LdJVxRx~`Z0>? z#=Q^iU5DLWPp8Jc*J+68lai)p56t5*!Aq&-$;xa5eUU-(-LGs&f7p|Id zYvf)=T$b^@D^b1|xcWM~EbRJ_H>a0_13*MDth<8hYSdyrNSl_OZOV_!SMaNUuon6 zMjZT$L`$;_QMf818V~K=YrQ6CABpLrS5tlZ>F=J@zPfv_(5G#><2UC59T`m%oqOtA zf1$Bs5iwIti-d~BeFvJd_}VKwx{FCBUWKv^4wk8#1!wuK^M=0MJ4_o8{BgB8D}NYR zpzPYvwVb>-gf5-cFuaO&RRrrd9%EUE!R=vj!FLM6{?xw2H_yo!DOw)5J99jeRt!rLpe6#66|tqtIsr zOJp+5%xd;qONrN`1Wp9F@%sDoTtm423~RCaSl9PYLBADBGZQS#6FJjS39XmQmf9&g zHdw(WdXEoBy6We|R+d^D14c;#pOv*sX3W^P$g2N-Z?qXn+Cm4JsW$U52<$7zu7~0j zi_!*M`nh6)?3QX-D*zVzkCHQf(Cg3U^#n6q$j{0l)WyGFx4gswY0!P_-Jw(MQfoo3 zJ)x!YDpKHFCzWM+fr+LN+_M>9=~jy;N=(Vb$IGH@;9{zQrUtL06Rn9;$wLbuTQ(b0SiT<}h5ZcFiK z+{vMpxGf>na!B`+dDROasKhm$cHEno7Ncx`E?4#GHON`$nu8!mEWQr)oh%yY z=6>rK5gmT6MDY3mJ87J9@>lh9%RXR-qva?^p`RYKOBJq3$;o;Z7G~KJZk~=lpbh^; z!9|%4Q6PcqXb(+4iL_3a7cWc;@oc3=$KD7=KJY` zo-EJ$Q+)%iv+UmWaoM8z@`l9(V6AT1*&SJ0?$Cmd+*r{kypDUTM%r7+4EbnZFU1UFy0r7lqO z7qtVVuKJfF>Ed%-4KPpRBysn%FZvc4=YsAZAuO^y?^(o)-1ETVZOY~m%!VM4z5lQB z7)totFVx2kVAe+_IBj=$SbL7Rf`PYM{gLgbQ=|HXM?~ZByD4oE^T(nJ0~>=<&+R?A zea(J$(x+!hao8;c(;PHAoAmqXJt8i{kI z5K~Vkd&;aghgKhGHUJxHXuHtckVMIJnZ6OL<;tWJ!FwvHmNN{u!tbh{Um-h7PxB5n z*LYZbt46-W)Fk2JU6z%XOFi(u$LlcibZ-e!#)LVe(KV+Dea9+eg+$YAj`x*$ zlihx&{n(*|b`#y(YSl@*o|En7vELT*NGP$disRvSbjZNVa@VUwkLL0v+ zzwaLQQ8)Pnn~whyg{Jje>3(OxPTgOvZt%|5^Tdm=1WX>cEN$kYN|_}aXgU$iLfjAq<; zT`&ZVK^EsJgJzrcyKB*Bco%Q;(avb@70UmD7;#B(FmCq?@JPqI@x3ODCA|lRQbG?9 z!S~Ky>Un$OKucx^esJq3@U?pEMINIaq+;CZ0JFL4f>|=c(Gh23e1qBMDn-D0KU+%B ze41L&ccf~zLXDn#>hA9|AM)x*{a^DN_X}4GuB&p%qLwctyc?qES^-?v!piS$9d!qj z`S-CQ#8~%=y*~>I7-zDk;&W(M)wgxv$D?<~?nvbVH`uzd{bbx6t3KW9F`j%y#wJBe zIicZ%Ic=>4xxFllD5h<|&QMNu+G zQ_IVHCFp~E>jhAY4DD~?v+jDz8(`1U_}wyX>aJ&jdDA0LVe%cyc|f*lBcu7ASdFmb z@@=6+mEj*fQ@#!YsbS6L>;NhVCBs_;oo5hD1RLc-0H6t)58Ker5mb6%@P>hJ812+g z)4qdY&3Jty_X5W`H=YGKh;dN$JBE{h;}(p{daR}hZeFr&UH~ww`|M=PbfX$4XMFIH zcMR|$JHns7M0yyglW4s#fOK~l+pmGS>NY<#@K+@ zn~Y7u7FBoZ>2hN9{Z_XaI>D_7?q!lWRsNx@R~C;Vw_+uqfc}nd!ZzuxL>;5L4R-u` z^^yvc;6YPN8WlGE&3>rt;q)yF=;L3lo3^W8`XGu?kKxzgM@SobcBQ@9kCpw0@k0pih`wd zJV{u^AG_QHQBTfx4&kX9#~KG-d#1z>(RAkXiU+2dw!75ZKF)9%ki#GR?ivhU5_HRF zZ)$WShc$8`AuVE-Qb0N7SK5_Y7zE~HPm+l*kq)~=8;J~!JWw>tR_DT+Q0~Hg2=(l7 zdYT)2y#Fnoq4OfZlkUh<2Sa(hkyAFe`8aYsGeFNmG^6|H>A}t4wb~5l%kKp>^dNqu z)A&Mqr$GDEJ;s4=!05@O;tz`&=lZyofWlD2RYs*)UrappFyde=YaL0V;4h49VWeuy zlFuedw)`X>WTmid|9)ZYOLLcs-2&oZ2UlKP5W^!5ntO~i)@l_c$yCA#wyOgrq~J*2 zMCOW!eC=r(oJ1`)v*J88vx1ji3Q2k!6pDzGr?UhE>5Y4w=(mv{v}J3<-%>38HhsU8 zPh+#58+A#iO)uUz$mXdVqVPHt4?!*QB|FP&&^6Bkyx8 z8i}t#v`$y*bPoW<)3zWTX(76)BR`+s=ycq>mswN4>M?h-V8spgj@#Lb^?W7b{i;S& zP2+*Ik%?sQjP8QL*p+fP%`OIflj3vnj|I?Vhw3`$DW=%R39AvV%ix@L;pXvr=g746 zwe;FHg&+L&J2SqDknB z!xFF6l)I#zVxOLF%G3qEmIabb-HK8R9F83JfZC7d+}vDR=*DHCRsOxEX-Fa`clv7a=S4|; z{1Js5A(|wAV5O^z7$>#gzpTg)FSXgG>8BY4qyk=%XctxfmK%dAS(QA_=le)3RG@JH zITnGwjZ+QX(SW(o%(a++@{Ha6VE#caM4xYlwQ%L*68{~A-_CdcM|x&w+CMgzP41$8 znMLJ%d6Mq8kky|BB94zMwklB@)IzH=dxPQr34R^d0@<4RQ$<*A+fD;_5R>@nw=Z`hF<6U?l`XfTor5N0KI$jfM;W=;2C(~S$xw$izfFQzR zqft|g6k-_707>0CYVvi_`L6DSY;U~ zTfT~R8{rd?U;jmgjXw0SV4RPJ`EJ$&TU0cNJA=(kAkBRv@ofuYWcn5#<3 z>6kFvuet}oUOdUzqF%^jHOoOseHP8*cZ}<>gx)@3p(ij@o`c#4OUBgxr3}VBz?HmX z`X{dd`tzRXA|RX{|D9|UJEMoikhFmzu?|I#bKe<4 z0(oWh-d(kZT-8wt$y09cd>+dbw}z!uLAO*z7h*}+KUer-l(xvLm6R6MmDsg(6Ga@Y z<}{Zz?&{J=SclcIb1ybbid>J((Vu#Hu-x=4B!(8R*}h85D(e4Q(|cgXK}-;s`KZz= zx-Fl+a%uohc^b3zteg}7L_=cp^^S{DcZF0YuT4`~`>N+`{?&@}QW^9igvKM|yd)^E z|GJiw6Q1@18_s%r;_|sgj9@a9!*QMtq2?o{5KLv3Su)&)I`M)bkIHK_5>Z)dq9aeP zj!aEwpW9@4-&JMY?SU86`{`H$L>F8a9au^t`1Ly71_eS^o;B#Qqg9%i z<*$s=JK_EHKytU8jKi@M^&CTx{U~B@(H6YYP1o{>CaUF1C;_ua{Zn)O)JPGO_Vn$I z-%a4DIw<@7@W0*I+ekzk`g+FR*o6!TFXFu`4(PYmxXt0)#juY_GbQ6`sV;Fww#wyV z+M&sLN^yCrW7reGXbX=&h(Vc6XXb55-QZ^$i5knSHh=*mpgmy~L}2LisU~ylTU9zU z*9?c8#Pkcxa_8}Kh6mp~CJk2tRSx4r2!g`TjPV*xEv{pnD9??bcWRQv+ywCk$q*Ze zDUdB0?1b^0Y%s}F;E5_n^QJR=+y|@O8_TbaaYN=cdF`iDzHE98VQg{MRYRg0XOzYS z{s{a|ZNo$!>nuKo?txpGn`vbD@#s{{^yAr=XhrR4D?9pjd7K(9@&vI>l>&6gL#UX0QC~kXjn$1rV z8Rj6JM|$MkBPMA=XF-jioqFnSrx5HeG4Xv9go8uOkcNYayg5GFoi}awjl86PIKu|m zclygGgrqY*XhjZ?JDFEHPoF5KaIeVzk*HIF7bJdR?ViXiiu= zWGYsT(dZnwZi+HXI1__DWFZ^NgnvY)tvRA>py%dkdWJq2bVzG%c6zu(V~1$)sDrfn zDakOy$FGXQ>?>Wk39s2X*59JMD}-3m?OR6Dz+*Q{cHkuoz)wlt$7>Z`ucoD=dOuWj zbCeSU=sZ0aUfVV%j!go_978A|OZ05L5Gm$iwSuC*{dY={7k~HVpq=v1X22N}x9A+5 z=Q`RFB+ExEle-mJT-Mb0LpwBE`I^Ep3Op^==g_zejTgb;Ee7T-#BwD_=`7{evx&>x zPBXQ2=Jp@_0q@{URY>m+S=I!Y?1A~a6i!IfLzC5Um@(b%^{p0(6XBCr-2CJPz|4~x zIGkT{e$w$cQD<>h-`1pl*`Z|QcTL9@X}3ZQ#1oz#)$y*jHg|f~z%)T6L!@`~4wcFU zDl95-`!oC5s>0^d+}C6;-7ESS(&2wIyL37){3z0Y(ss$!eA9GfeFv}G)=9#9z36i% zbJwz0KoAm5(WGdbru60%PxCnu^F)CSe=MDUog zJL=8GCYp@k4}ZSos87XRwN()&nEmxiV;f^1I54M#4I!Ln$P7Rq9~)IrSK=k5rFG$% ztZ0%I>OVO1eDOLq$wA(P-^EoK^bRI-vlLDkxqi?;0x8sW=wU;^A$6^nhy^TGeS2{d zi7xh({$~8udDXEl8pvZyva>JWGnfVw-M7sz4aFiK9uqF|!DaMh1%l61?ymxC4@|7cyD5 zgRqmS71!V^o=r*0^?Y_W-n*-JvcICkJ(V$bCq^e>c_^uOL)A3?Y30P-7zYnM7EM%P zH&e&?1&LxmZJ9)t)P!O@V>$i2uKs3F#D(ocG|%0A#UNSwbzMkpd5hAw@1j608a?AV{av7S)go6A_hP4~#r=Wp$qHL{>Z&8W*S#C8TI%BKo?!hQ?7t%{+h6e0g1 zaX)(POr>nQh?|5;TzIu(mt7830!5XVJIx zT5t0@W@&y1La$P^YqRZ^k92l}-QS{auQ56DSd3YpXp4SyGhIPH@Yqw{H{&fu;+g#6 zkwG-5nViWo_ywe!zE|H6Y+|e^oGJx19Pg&VlCkN3?2wZST3+ZU{eiomQG2cD=ax<% zIn-Y~LjfSmr5PP#D}6iu3ES2!ZR6JLN86Z&oUcAV9poFN#K$J#77tx=(4s-ar5d;n ze2*Br8R{m|dEr!=?-^Gn;A?2d4nYhR0mMD8qt;a;&x2P>dj;USmD}YhLgd1jbuYP& z#wvSE!jm%~9;UYc`Id;W!$AM-9u;c6@sa~vuo$is^7&LMr?jxJo!T<9ukQ`PI9X%J z3$q02;U6RQ%ezb-36?4g*IXc7Z*utnOt9p5?Yki+{cUlUoLOo%a2ec#}2#kJri)OM})6`Cvif6_e*GIDxLl zaUSUjYTbXg68}Zs(92y%2x}trDrZk0)8N3+_>BkzX0q!xd68x`KB2WO($DBeq=bDI zL-ZM5h~|vG5Ot1M-aYJaM}BY4Lz20VfQF`I_TIqv|Ljq$_@*qJj2}tX(i@3-p6u&* z2aI}dP&IkAhE{|ho%7<+uYK8dNYD$jQxY{xdN6<`_iLRvbZdFnV%uTx%?SDXlh9i| zD=_x_2FDM<`;prXhI~Bo zo#`CqWH(7B7L1wz>LbU9kHvk3bkmx$Q$)t-10=)V9_6xitrC|>S1GpPO5Q$taNnf+ z8+8Te9624eZN6at#Sn%Yv{OP>^DpCgv#n-rziN@8{Nws2fv4Q@Ft<~&FRFv!eQ}^#;K7#Ow zObiz{Ko8PYMr_%G8jq(hL8WCh1vUvUHu z-m6HOHx+5#+SC_r{j~K<{A%Jhmx)<^REO7s^Bt~BE7pkQ?cK3C`cu4jKj=l?Jv6R5BkXdU(Egrf7!vi$=bkVAUQ&o45BcFiZohvQjv8quo9m=R>l#p)xXymB*K@XNZSzF8jmaqg#w z?@PAz@fBq7nYi}qviilvA-9cyVCbm?YW~jS5|#jdR6PD7T4ML(=0N6b?HTA>MpsC* z^V=bEu5+oN{3_QF&U9o5wQI=^rE~q?$;_lQ9gdpm>^O?wd40c^zECYhaS@mZySz6q zp~iLdW6R;!&y}roAIyqgJ1Azasj!0RnXlE|o2B~90cGGDmt$q0EED;f@~gI-N+-Uw zYkx~^L#_Lf^7`En4{d#Y%P0cQB%S$@rfVA8q_vTX>OXquVff9t^Eoj7oPE>Wo7jzQ z?4KTo%$KH81HVdgl^!afr) zvyQ;QKfYSni^hMhUTw|>^u>}K-Bb6wD?67|g2?d}A0%KK^Z>Svm7|2u4Qh?|%=r=@GM^OQ*p5tH;IgJQD4 zs-c>#$1^MhX;vrw{ioloG4Ly@yHf9=5iZR(r~0y0^+wO+@YBY|jns_Zr}I(>uh(7( zR_3JHzhO>cZaQo|f8vdXdEJQN;ZL zr?(J1jN$DKQ8y`NL~1j;v8+#O~&%0 z2(bjWYG!6B;rfT{&A;f)C&eYl<)Wvx9!zRlGg_`$t5!!x*6}KWHw~)3R@H{C2YIdl z_!HS_3tYeB#)ehX_OTO|wVDX7mht?7Q5X=pO@z`_D^3P3 ztE7p{>~b0~jK;GBtc~GDbZN!W{{tZOV|DU$zVojm;6BI$7C|l7y)d59O!0mr%?F;7 zdCP(fYpgsHX>omXi!7I<6}Q`!ObEU2nSa04;a=9#mE{x+kK`s%mYP-6%C3$z%jZYI z<8_6goH+qg=$OQ1WEWx@Su{LL;_wKVgpPl+S7=HQR&zp^yF!XfQ_w7KGA_~H{~U;> z6Zm`ppXX}5;;W$HP|V`|D=O!~Yd_AActk9E|M>7D%lD$_KWgn~wHZ9<(@MEqPxZR{ zb2paoLdf?to2DY1+YimxvrFlB%=V0}S*#MKeUZ?oq_cHuSH80g7OZQhRXT|h%RUba zd$xASVJfcJFLm-H(u6a3gInB?hZ>)93l+n%*0Z}y;IAl47qW9HvNcz|mT{(!f^Wsx zOpOTEXz3XC?iMf8Y5N+NSHFU+rHU;`sMCE&^nyyq#!QPtp_Pd{$Mvh#*eA_nxYLBh zVQ^i!NADXWGhNM&*>rrs%E%AHAn_cPkQ~2G-QplYwem*f2-)e2!;Ayj2*6UhwZLT_A{5z|?9EGy($XJtCx)#n`JtRIYJ6^tB%*NH?X3?5W z7he0!Pf;86RVpnzF1ysdh?!8C4u@m-I`(Qqg{QQ5hkne zn)15yD^0glKeRuZ*ia2W$h-h5kCv!)$YP_ zwat`MH8O|add*R<0t0utC*=n29sFJjX3&E*sJw^6#D99GbIF`wvqO)_9jn$)JKmmSPz^?09&W zX4iJGrjX>z46>i(LdCiyb?qt8GXZCh62RYW3*)anvT5)yYaCrn(lPjPFMH*A1v?1E zqM)D%Q?A`#>I@3+>fsK?`}wpc)x=9F4km8Db}u11Dl6%rSY%V%`2_m#d ze%pno&CZA8zht&&Xx*ErePwmYQ1J-w2bbmp#^JKYBziI&DYt47gpJo;tDDVEqIUHv z(}qE(kW(LivtG|L>VXBc5_Tithe?fx1icelagQH37*b+JG_`3tmwfcr7kK#Rzy$X0 zu|Jw>uCIVGWYYV<{VzDCpqcL`1XpEusva=e)!zYH#@3@#w~hzE1F9B0$2FO5L7>zP zEN)BAkrC(!bg5yzpxW^dsyp1@&~;^DRx309w)a)9>l()GlAcATC7`N-PMG%3zo)UW z&XM(u2v>%2#$6MwdX0tPQ_ta$WOrqshAfZ?7A}mC!H^`OQbK#0(v_ zaf{iB=C9|Bj?jx%AQzqxHUT>)xX3BJ^!q69H`_XOVzSFuC>>JV7VHL+`C3 zqn~bV;h>Sn!7IuJd^(XHtal?E$t38A#}h1&@hbZG0KKKz(JQMqtx@03RWIaP(v09* zI6G2L-9v3?GMli-C@D-WT2tRVM_^k^53lCF%p++|GoQsv`?Eo>J25e~tOGl!Tb+$M z?3C6VjrQgMKjEzRMifQv8@NtMOF}i1XskHDzC`4u=lh2e=2t=LI_K-tY(n~(^q07= z{V&Lfbcvp>O_a;RY-|6ZpyTweIXSzo)%&6%uf!vRUe#|;&_GtMo4DuGx!@M|KITqG zCW`MONdvMRh1>h(lY@=jCZX8Y1opWc>boRWbn8SYO2kh(6pl}X{}nIZ%Gae$861xo zg;TyQE2Q;@P_M_t>KxC!HXh9+!dv5zuc$=v`eC{BK;kb4u7N_zNXj)2SHjS&gA$VG z&Ik@MWM{|`%1%gr{~4@-hVo4%Z%7EJlc>C@YttJqCU1+K6Ho^MEBzGxT=e}TA)0&@ z!MaX6GBIq+rSFHx<0_-<*l6X&=GUW{vSrWkNNwk%U3PrI6=!~u>8LXKthQMWi1~1; zMY6F^#G2?Bnl%tSLOTPWz^@@5!Y1@S%?iIDRvMDy<4mnaE9@|xcClqZQldn|=bUo< zSd+D|5lU~nkPgna+W;83-vK%^de;4la|EY%(Oo$E4_Lk(oPSKrlyU%O7FQ17Pd}Nr zyJ`&CJdtM;C+<}dTpErBKez*~rCj42x1kZCCE>@r0!S#pvK7|%xSoM!dYx85jNSjJ z{C@jSN9_*q-=f0NZ#|k+cQKj&Z54f4HAq=w z4g|3QAx|C!hdfmxS42c=3HWjTm#WqEb1MF`qMac@H1Q!P` z5mT;3KVv1# zF9H(FowN2mWA{!#nC*KU`P%zS;OrVwH3y6Km}L zfVJchN?Y34w(7cMO0*^v6C1d5k%+gqG%xU8Pe!@K5Xdl~Ko7y9(*^4B!LfKQ^cb*5 z%o^MI7{_%EKE0XFLKcAaN)E@5-Bxy_0cc@Em#@bFBi9!Xr;BgK!O|}8K^=8d){uiD zv7u!8(8mj&W@I?K&EHLzr3|-uCK6;zx;4ssP_ucndg!iW=ppdQf*#~Cjn-wF7a+%f zShBfYv3bNGswL?T`3&^At2}Rqsw6*9S!9}o(jk?>@VHAH;&lJMz9(BZ{%<~*3iLB# z(|(Hp4yHQt_ltx{X~9}`wznuz3_qFY4jD5H^t*aHu;k-b3+|ev5N?iwhAuuwJa3#M zH;KW|<-WD%Gy0}Rd3E1}-kp!xanz?%5ZY}9DLxrheiFyfN%XXgi6`pt<&k&ar|Gu5 ziA5SMizTH}x6>KxVD+@rM1p!~B-6Q1^uv%A^QZpB*VUxLv{3{TG+lDe)Vh<96rum=C8=vU^UV203l3v{n4m-SHfamhS`?LGHfBgl2NDX+^{2^&1RL1r$ zIdb{M?MaN)(NFt7dShmIAp0Q`;i2~-W5xV&v;rc}?#sE{tGCUOfMvq5} z4)U$0_Ja)JNr)Fw`9O?ulQQqPO%WJs|E+4wHNLKTo);lc{+Q%n1(B*&HlMbM#?tUc z!Aix3xVb84boAt8znLz5tx@qAtCi3|20;P0U<@afkw^lL6 zR<#5q{zWA=XPiCuA+99tXHi7^z%1)3(rFaDc6;O0z{ro(G4c(*zo&mZo52E@aaBM| z$xwT1`q#0@;|Qj3uL$dCO|dZvl(jwtNDO|Llvgv$N_br#TkQ>j%@g%D3I9N@CghJT zz^K%rg)GktR(-2GchS?kOIS=nI&AL5VSR~k$#$=VsbMI?<|)xCq&>ran3wKR-?n)K zy5@@wu+3;>&j{-rd(Rz7rpV>Xw`IwG^$81S`H1wot~$sc&E|yOpXbH{4jMN{|Bf4Y znV9)&UvUzniw+`5TN@}RH2ph&fm$8J$iCdB@mO$h*Pb71XudfySrlPTFTu`du9{^F zC`bK|R&pHmtw!qJ=z3XAra=+rX&wlPhv|4h$C<=3ZL{G8YyqZxt7tl#x)}l2#)~iv z7!d!f0-jah!+;=4WABNvXOhp)*1L%i!kF8amP{!9Fok4?SsAAidaj@ATSD!Ks1b50 ziK9|T7>s@w(KxfK&$C~N$K5&&UH-vNDJwawXIVL$QspbY(a080>pDMb(e%&hE{)Ho zI7_P21Czexv90y;Migp)Vo<^Ew&D~M3JJbIoOKgANlmBOeVA+z>%NRR|KjRezNuqP z?}Kb4pn3~fYfj!Z9|8-ugj4V~jmCWR_tusObhHI|Sn^*})&h`OeHCwVt6$(ZpNERV zz5q(4unIDhHL(7t_Z4j+Dj9q;s-pMKqWhHXXV9*VaL(eP<*ywI;hu77QVhLPflF%X z-|bq?Lx6v&s^U)t^LKKOhG-qh@_mjA(*_nJ9LIK67fOk7I>1Dhoc7vp(?k~=jbrVp z6ad4T|DnX@ZIK`=ITXw*RN{0GNb5q&`EvQn{s{LUrd?cBeN9sqav5LIdK@Y(;_d%^ zs9#pZDPsUuCYVUm{mu=Nj(`6nDQD$XSeS==eqIR|8ZUWg0JY=K4MIZVH z{dK`d!;{_KW`Pit3~K+|GW|R4u*`AQ!0R!i-X@K+zP3(wye}q^x;`K0EClfO_9HG1 zV%8oz*eE$_XUz#YtcjF1DvGYY{bZ2#Ocmb)wL(Jub#o!gQLb7@P!pi`r& zevQWTn^BUcfS2t`cbAglr*hpJ)r|+w%ol8K9cb9_4KJ%GTB|L&p1HKjOd#THJ9$hP zlc@1Exy#JEbDaDUk>);}2Q8cpoE_lEC=PMk7e1ihGL!TDDIlj?ZUbBGjS zU06ikXm>8+x8&JNf~H(^@nyPDT|56BuTMuAfw)|U(3-ooqCus3|zw^|R~%o900>nBL6%(`JK@qSaq z+}pjT!OhCBaD9m`!nl%TH#SjYN<1ZSmKHOv(;3Wg5NE^|kg-#R(1I7I1jhC`d+YVr zK&VRizIrs3yvoS;3pVS0!vEsER|{!orn1wl*}JEJLGx@2OEx2Q+GR%Ju>Z$_uulO8ypCbT8cr zmJt8Ay&`;GTvl`e=M(hH<`X=t2!O45F4+Kn?%5McWoUCmVcXeegf@p8aWfOi@tl#* z40Q3U@}qd*SBVyek&Mb|)Nejo3UxnNnE`903G}T%e5n9_E znh=i5Bt`JcNs_#M!dMR!Kr-n zsB5$mOhD~i@_evC*&!6VitMhuZlK+oIN&#Mw;{fBJB*1A?jXt{%8W*RAu04}N( z;x};8n|L7pD|@CUai1Gy;6dK*;CIPTOu=<^>tjr0wh1<#`7| zo5i=HTao;*?5xM(9|_t}lXW7qVbPt4Gk<&GLWfNXeK=zRU|EQ~f5?r$=RiAawLx3& z!$(vsD(02er{6R(A^3+EdERIzbXmuoUSGW$Z{z}fA4;{bsm@x^{*tP)qE(XUpr;a! zrIK09Nz5o60gS)L=!vx9q1N(^4|M7N|0U5FnDB~HzVqWpTU^rb+0ZgxavVOKAzoCz zYES-QA1&Y@uJS~AYEctaGcBn3sK2AQjNZ{ml?wZV=KNwf^MRXLyr!M;tMEG!N=@0h zhtN#+2ED(O$^_H9nrekV69us>V;5 zmbD_Ms=mEQ!bMzaN%#|X_D{l0=`4N(tem+iE_pk?`%+mW(Jtx}o%E}R@UcCzFsA!E z(ZwSCWd&@kig@(Nz{k}#uuh1YwXK}H$ppOiq7*wG-# zv0Xt{%aL^crBR7TTy{?G%Wl~Fn9nmIjsy%rb$JsO0oP2BfG>1*DH*Diph|-@c1*kG zOV>28-Jkg4la;~a<;&3;aK?qj!jUcH9panMs(wb8=i6xnf9=rV`&e}gecQ%70(yz% z|CG?8AAF@NvpjC7SS~okxmmfOit($JKlSalEYQTSyDkMimv!5D*K5J|3rb4i$Gc0X zXPh|OPiuy*nS#c^sM2HRYHQqE*C71xJ(oFSyHGms$|Y1c{lk|Pwx(d1q8W+M88P<> zV(&|K~WFX&su&gsiyB+wjHf{8FcvbUPg~8Q9b!^CRu}>PaM4i*G>*7*3SJL#GI>t19(*D3K zxhZ=+E|mU4EM43xDT4#t$BKVQgy<~8Z$54+nNx=vT9=5m1BcHQiF)Ifhut);cT#>c z^V2ZWd16OxsJ&|!Z@a``dE153l625rlBjJB79M4z@qFj$k(Mux!^L%TQ}N(aiGWy> zVj#?WGdxzqoAZ8Ynu`B8vOVKZ%lsM`;+FI zlALJhS|;2Juz=p$x7TxmxPt#m52itH#9ozu=*b6$&Au$qW#hh;C3h*LzWb=vz{p3F zOCez3U-oT*ssuh&{ayi5IBnl(dgC0NUHxgytZ1hyF#HB6^_UgW>(8%ESJ3~MKQJFM zwX4b?DIO}G(!;p=qi#5M!abvd^tsyplIZR7ZQ(FQcRJ{=S)QleXJXE1eSW_A=9M?W z;}PZ$?SzxhXM}o^MT(rkQ!~k(q5SS0l8h>URrPnTe*89Quit$Li~fiLmml@Fd=vg@R#{O2YOWv2byIJ7CeuO|An^*?=2W+6w| z*0RTCrI}S}Rmg=st-eEVqBjZ)`?cp?!t>2YP++*ivZHL$g40;F*G1M2+{2?W;&y8b z?BaJ9GW;oeKW;6Z^L&|qY#u1wo2@jt-7aA^NL*IQ(_L#(X$j0I$q&dJz73-N8Uw+? zLeNp(g&+5gjeh#<&cexAZLIlwv8zff@?QV_z{cBc%COr)g6)BqQw4H)COaA{T1t7y zvM#4y!)T7n(0iVxpBZ!-* zgHQX%=AUH}F5Ezr85Uho2fn?x`{5Mv8u+i1Bx{?$Wz*I5ny+b+P>iYWTN5~&aQ^o! z`@(S6o?ee5-$@!V6`gmRPD!9|pg6?K3(a0^zv!YJBvNQwotc0-Wokt9ebQqxZQK~t zRqb(;3V=y}M1Xo;p@^G$yRaDe6--HUwQU=G%bB3+1gh zB3@Tj{jiCC`uZcghKW)5(i%*t{XT=9OsKtj@}A*M7=2BJ3a3rdALkvJ0Y}F&bK_yiV&ZGCf8W>2A`E{S6|%RGr3H zr4pq*_lBwDU9_Q<3i}(b>i z&64TfCGh|!%~CuO_4~QP(Vlo#_xEpvReXD|i zd3b@X2tB5odz+!MdWZX?issddH{WKua$>~(-qPH^yno#b35*iF(sK%*h6^V&V$_wVI*viHun#-4M{HOCwyto!Eaxnj3xm!1zXO&rhspU6C64B zIAt$D9jcpT32w`a>_%*86zkQ!E%*?zk9 z-(Plggc)2E;(eZARAZFNwnlZ;ZC&AFQ>mb0GS?~1JDRslLZbJfLCYaV(N*+DnEb-y z8>`C3_FwJ(q0DAgI1!3W(q&aoCR3shkKp~N|5t9*pB8T3Fe_mIkakjj9 zvjLG0-7~MkXO5;c4c-nJF?NE2O-_ydEbGrmT2Bqwdq-!YW+g?=V8s?FOm*C#Xu56;_mQXegQ+e}#7$^Q>YA{|g8vChGKf1-M&Ncn5BX#DL9q~kJq)DQc zViNDW#NeYSk4D1Ec#|PtQK^~z`<(NTnjz#VaI{Rq8YmL%14$7qu4vj-RvkV!mD7W# zrYIm$jU(LK{j%ACgzE#K97Z?^!>(S1jAJ{~~hjMGdTm0j~~u))k3RzDjue|A*V&RiS8 ztUT=A1T+@XvZG4AtEcw9KK&tkU}a{t?Ett%`k+*fE6qL9W)}rrPcI|N=XyukI@YL@ z_H+0=Lob&PsUmu`IpfCCrdwJyT_IPQX zvpz#AHSLI*nbr@gxVH2h=hSD)Xa9j8{wP z`Ry?lt3BcI#h2k@xlu2?%ELgR93bac*GQVDZ%X(X+m(S5fLlWhhFnhg;bQBR%f3q? zE{5}9yY=gAOvqGK&1!`9&WYh9>@%0O1L)foIONSatn<9v^*DJImOXGsgfd}j!7BLF z6loJS05@`A+7ehJ_^Wa=eK-l4He#Akcnp3w>CWxmSTXC_Hy~#-dbh+pN41$VJNfkV zV8>}DZqm!8^|QcV9J39Ce($Pg78uXb__U~Z>auX{5WH^q(j{*3M?%WEC0{GGw_i=0 zw#{yzwg?wD)MT9v`M3%bCM@&P#u#}Nx{oGZJWdBHx=fpvrX*g_WL#O+?ue?{p8mGA zFIEOfX;;-U{h^AZx_tLG+`rbnX8CAlY6nRQoN@g*Q2Z!o4q0pzEGX@AT+V4?Y+e&% zS2{9_o3?EVI0m>l>|W8;&3n%PtK8FOnTXL1m%3K9p>QHOyrTD$Z-iDeO8Mk5x3Vo2 zykKxKv>$o=D0|a)fvjc?TT)US=*x-lENY=#W|?3`?93PeXT4<#W7i(p z_;81vUo-S}%TF=c*JSaXw9%Q`xXy5i#)WaVNym3a)5aoXG(pZDFID7L_^7#>@cntn ztISN|LRaO!Ouls2NA1{pLH^omte$eaC+$HDtKeoWM&*l%saIag(~a#z0ZjR@+;otS z(%EK}YqTZ881{)kAAPI}uotJ+hx70vS%lsOSe4ThPtwytA$~I2`?2) zNU(E}L}Ad>tKIhx4fZw|Af$$^y@wdGh%Me;)fu-T6}RwB%=xs-(NM_w=*BuEn#a~| z++vjef-sybV)t#cI_%Zf44p!HQq@J;9EuzDx4h0br)mcAdo}B#MJEIrl3UOkxaAkn z{%)H7jkufBXKU=ECF*$a22`LRLg}&F8`KL>2SDM3FlY_5A62hR81dx4j^Njfn z4ITLo$S0~!WMe%!$g>lFu&j?&3yC7U0e_Dk#;HUsrsZtEKA-cNY`t{suJx* zPc?qRBQuj4g;|D`p<{DOQPIym#T{jqTHWn7VUu=c!H4f|Ll@A-v^?Z6Q?1!2d| zlj;mWd zYuqKO$tMZxieQs695Jervf?Nm4&AcPHG_JxGi>~3bv*-%rB`bt?Qe=`VLpDGcG`uE z;JKne{pnTW+?5GUw1ZdF(m~RK5;h)~7X_XWAGCTYgHQ>UZsC1qAE{vFs_=)%#l><< zbsKz7z)4mbCqVUj6E@tgSGUAH`fP!M#P9QoKCYe4Cpfin{HN{srXpfwCuGO|v?b@V zJ#;qM7uv@^cr_Un8OMj`BQkm|v_MHEczO9hPo2+4b}L8PqiDW6i8Jh9h_b4{i9fK? za3u48*397C+gBVGi08O!uGP)ieRBnSWkt}r9qR6u!Xi9|J6+`_!AC+`elsS`zW(@S88-b!Z&qi%5n^0gx)GSCq6 zX_n?%bI`xMzq;rJ4As1gqy}S#hPpE3ev*`T6t`>#dQ?qFRvY0$%qGz4{*f2Id~zs| zh^JVLuB+$DyB#UYhS=0Fnes(toJx+Yyl;!s(s1;rk#;50eXs9k>2`T(z7)aLc%h9! z#KWEWJ8Jnz8B&kd!!1a9h2N+mseq@A8tv1hRCwv*s;#4UrK3Y%$Q>nmRIU{$R0Hk7 z9z(1!GpKTXu~#)#!IrxIij~1%9Gr7{@+-t!lj_-M)ld~E?Y%uAOR!nnRb<_w{I;Ei z%aaWpQopEe*kf~nPj(ScN7u>ZzZf1f#?F?|#;AfrL$MiKY_yN}y?wqLmJAIC27UJx ze~7c@gd{S!(rP+i8N_ewrDSx$+-ai&I+EwH{_4vDWros&3Epu6gE*dh#+F;|ATL2C zJiMej2}yigV2|B5;mKWykhzi#2*Wk*sA9Z5+nL6Xi^%CBcF$*YDM9}lC-HL&RYL*| z2E|%!uM73nNBF(aX1YT3!L&C|4CByMG#xtJyx;m;s0yQ+9^RYkM(kk>F%s{130;9ku<; zSwjOHN`ri%E!^m}-5i+OKJy@eOII>AI@x3jRkhe?=izmpzuz{RN{&$3!fFD%ZxW#4 zhag=3$ry;gJN2*t{bb0AuI-U-{i-`5A%~y#CRix4h<9q`zVX8bh332rr)#7W9WdA4qlr}f!0 zPPK0VVw_}j%huG`c-avwxA5KY2;$PH6XLf-9h{BUY!hd7PV5_S8p`VJx?EHB76;V@^k3Q1s&#S8G|%DPi?K58A^p4D^4KKen_^marSwI~a|J@0Y76sT z2Tv6+GS|St!C@7$WWux*&SfsKa@}hYdMKk>p;;{v#ah{<+|DG{4RTg1NyAlp!|gBHeZJ53atI zoO)NZnBR3mJnO<9=c3GGOeNaFag7~X%us>*ku8hV$E)9j&viy(f^mDiIq5nf{L_(P zN<=!Lvf(WV<${#b+H%izeLgOD`+PW2 z89E>8bLq2h89FD$%F2H~ZH9AwBmADIBE`Q#k`hX$v@6r^4tARU2!%hD6!X){O< zqLsH73qHC?&aEfc!q+X7hiaG+bdDZdWO27uKr3z9CaT&?bkaoS^f&8NMk{SDT~yiZ znhHYN@hPF*aO@;nT!-JHum)8q->SMFq%w~tFpnGKr^8Bp?)Apn%`K~oT^=80*)2i{ zhhJL?4_+GZn3Mj&b*9si;d1DqgM)|jjD?B&^6YCeLVrpni}c@fK?h!#jJL;L@wbFGBKs<{GK?F<<&pXZXq|&f#-Z zXxe`Qu8I5wHCLpOdgD7@ducZ177twxgkJ%>LAHo~n301c-u1@L-RlF$994!k7$Sjp z2c|eRE>Qc$U5e$TWGhzR+@-gSS$3{IZT`J^{%%=HU2m`>B6X(gdH|N^>@laTBSN!L zM%fA%fy$ZeVs_t)_S06$VM;YW*iFVjESCOQ>e;!otg|bKrE5y3X^gIpJo|wJ+4izz zW5XKTB@b*Z?EIwfepi=bSQBE3Yz+(K!Rh#aDhv{Mi(00z^?&yccGFhTb_J8KVHN4k z&$Gl961`9B-?@WNyu2SSe1fEo>{k#ke^WSo7?Fvtl^((w8rta!BW%;HE>`yK{9(}V zi~PxWC_X>CpV<6^$^D_b=@r(#tFl$!UPqEHvXQC%UDo~AZoB!B)(aN0czf0+U2v{H zaaJJwc?&3t%bh==(Qeeu?oq67w@CDNFIBZ0U01Q-k##Kdh=}mz6ME#;d}Us-hXIC@3!EcdZ3$kjum5_-H`*E)9qV84NVnlYS5|+=3&rJ3=kRKc zkdT#*sS^$^{ecuiUTb>i$p_%T7Al<94$_>nMpa@-=}r=0wNS|E_b(yb&q4oq;eb?& zmu#nEAUOz;hyH7ULL6#wa%MklD)ivCjM~HGHM9Ko1z=~opcDFAP64h!r2P%3e|O)= zep`}XeRDxI0nq={L%+7S@@;8@(&ojj`j6hfetPp5XQ;vOXb2dB`KH-mrgu+YZ9rfZ zix~ToDl_fCx4iwJpb}?eH}(5|VLDXz&Fe;SM}Y?#4R@wrPx?S_9-sQ~sUEk>>!TXJ z9uCf~rC#q-^llAa?bEkuCeNxf3McV44-}K&lAUTxGY785`p#b(rlTI*{hZG|9etsu z4azu{I6YQ5?WH4@>-D8H6cSuy!=wNC>yJT2=iLR#y-&nTJ1No}M z8+kTnOET}`yk$2=i{3kYAS^FCMHS#VeqWPIp{lyq--AN0gGQUv?Evm+ii6`1Q%qQd zYyV`0955H-;>IzMRCQEy3r?TK--@ELNw@<%z^7GCSrVXGh=m?vpVfXyH4&5OuP}rX zy0Ku1&ZMRYkLyTi2 zKDE7gz%Av8E|Go`&vfa=aAoCyx3^4j{RizMQ!)UFD4NaXA$O;w5c61K^iwIDE1(S< zjkxaq$F;cE;(??l7E4e|JShf3;TCsyqLwT;u-77WY`iknj`iPe-!j1t+I<}bTEOWS z7uJo5em*W&kBBy{-JUJZq8OH$Ik@9a{tMy-g?=WlKrJY$gLY{O0*X8|K3=Y`XRrna z@2`-D=M)!AxQa3Ht%!k6j<*)c$=u1iP1x`JwpUJtnC*}QGIW3vWQqhxtyK=-;@JUm z37u<=m_mGg<)`-N$=SYyn&+K!` ztix1?5SZh_OgTnecGq$mp2~%n*!pi3S?Xr}(>@srczZK%*g6fF8em-o0y~j%!D=G`!NH;0+zXl5uSwgd@q4rZ-GE-chq^)qDl|F! zP+C$2wBJ8{T)$NGH88IGPO5H*yL&SO#VbXc0oFAJ34g;7U?91#^8bFa#IyViz$_|9 z7=IHObfiA_Ic;>P);#_8iYp_p8_HSh`Sj-yGzry6f#>&)e4NApBlQmh5kiSl5<8zM)U23 zB3=D(N>UN6Kov68>_4EMr@57v`|H&6V%(yrR0E%3TAb` zf7^!$bNsB!q+O%|LSO#3AO799qcpAY`#tmN?n1+UgYEw-f&J%=ehYrT5*rHif27@< b=qVCKl5+cb$JJ6C2>9q}8)%hkScm@y20uHO literal 0 HcmV?d00001 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/__init__.py" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/__init__.py" new file mode 100644 index 0000000..143c3e9 --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/__init__.py" @@ -0,0 +1,23 @@ +"""Contingent: a build system that responds to changes with minimal rebuilding. + +Most build systems allow only absolute rules, like "If ``aux.c`` has +been modified, then *always* rebuild ``aux.o``." But when documents are +built from a collection of files that contain cross references, absolute +rules are overly limiting. + +Contingent allows a programmer to instead describe a build process as a +network of Python function calls, that each describe one task. The +return values alone determine whether a given downstream task needs to +be rebuilt. Contingent will: + +* Automatically learn the dependencies between tasks. + +* Re-run every downstream task when an upstream output changes. + +* Prevent a routine from re-running if none of its inputs has changed. + +* Re-learn the inputs to a step that is re-run, in case dependencies + between resources are added or deleted in the course of a project's + history. + +""" diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/graphlib.py" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/graphlib.py" new file mode 100644 index 0000000..45e5909 --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/graphlib.py" @@ -0,0 +1,106 @@ +"""A directed graph of tasks that use one another as inputs.""" + +from collections import defaultdict + +class Graph: + """A directed graph of the relationships among build tasks. + + A task can be identified by any hashable value that is eligible to + act as a Python dictionary key. If the user has a preferred order + for tasks when the graph is otherwise agnostic about output order, + they may set the ``sort_key`` attribute of their ``Graph`` instance + to a ``sorted()`` key function. + + """ + sort_key = None + + def __init__(self): + self._inputs_of = defaultdict(set) + self._consequences_of = defaultdict(set) + + def sorted(self, nodes, reverse=False): + """Try sorting `nodes`, else return them in iteration order. + + Graph methods that return a list of tasks but do not care about + their order can use this method to impose a user-selected order + instead. In particular, doctests benefit from the imposition of + a gratuitous stable order on sequences that otherwise lack any + stable order from one run to the next. This method tries to use + this Graph's ``sort_key`` function to order the given `nodes`. + If sorting does not succeed, then the nodes are returned in + their natural iteration order instead. + + """ + nodes = list(nodes) # grab nodes in one pass, in case it's a generator + try: + nodes.sort(key=self.sort_key, reverse=reverse) + except TypeError: + pass + return nodes + + def add_edge(self, input_task, consequence_task): + """Add an edge: `consequence_task` uses the output of `input_task`.""" + self._consequences_of[input_task].add(consequence_task) + self._inputs_of[consequence_task].add(input_task) + + def remove_edge(self, input_task, consequence_task): + """Remove an edge.""" + self._consequences_of[input_task].remove(consequence_task) + self._inputs_of[consequence_task].remove(input_task) + + def inputs_of(self, task): + """Return the tasks that are inputs to `task`.""" + return self.sorted(self._inputs_of[task]) + + def clear_inputs_of(self, task): + """Remove all edges leading to `task` from its previous inputs.""" + input_tasks = self._inputs_of.pop(task, ()) + for input_task in input_tasks: + self._consequences_of[input_task].remove(task) + + def tasks(self): + """Return all task identifiers.""" + return self.sorted(set(self._inputs_of).union(self._consequences_of)) + + def edges(self): + """Return all edges as ``(input_task, consequence_task)`` tuples.""" + return [(a, b) for a in self.sorted(self._consequences_of) + for b in self.sorted(self._consequences_of[a])] + + def immediate_consequences_of(self, task): + """Return the tasks that use `task` as an input.""" + return self.sorted(self._consequences_of[task]) + + def recursive_consequences_of(self, tasks, include=False): + """Return the topologically-sorted consequences of the given `tasks`. + + Returns an ordered list of every task that can be reached by + following consequence edges from the given `tasks` down to the + tasks that use them as inputs. The order of the returned list + is chosen so that all of the inputs to a consequence precede it + in the list. This means that if you run through the list + executing tasks in the given order, that tasks should find that + the inputs they need (or at least that they needed last time) + are already computed and available. + + If the flag `include` is true, then the `tasks` themselves will + be correctly sorted into the resulting sequence. Otherwise they + will be omitted. + + """ + def visit(task): + visited.add(task) + consequences = self._consequences_of[task] + for consequence in self.sorted(consequences, reverse=True): + if consequence not in visited: + yield from visit(consequence) + yield consequence + + def generate_consequences_backwards(): + for task in self.sorted(tasks, reverse=True): + yield from visit(task) + if include: + yield task + + visited = set() + return list(generate_consequences_backwards())[::-1] diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/io.py" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/io.py" new file mode 100644 index 0000000..30eff9a --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/io.py" @@ -0,0 +1,58 @@ +import ctypes +import os +import struct +import time + +# Experimental inotify support for the sake of illustration. + +IN_MODIFY = 0x02 +_libc = None + +def _setup_libc(): + global _libc + if _libc is not None: + return + ctypes.cdll.LoadLibrary('libc.so.6') + _libc = ctypes.CDLL('libc.so.6', use_errno=True) + _libc.inotify_add_watch.argtypes = [ + ctypes.c_int, ctypes.c_char_p, ctypes.c_uint32] + _libc.inotify_add_watch.restype = ctypes.c_int + +def wait_on(paths): + # TODO: auto-detect when the OS does not offer libc or libc does not + # offer inotify_wait, and fall back to looping_wait_on(). + _setup_libc() + return inotify_wait_on(paths) + +def looping_wait_on(paths): + start = time.time() + changed_paths = [] + while not changed_paths: + time.sleep(0.5) + changed_paths = [path for path in paths + if os.stat(path).st_mtime > start] + return changed_paths + +def inotify_wait_on(paths): + paths = [path.encode('ascii') for path in paths] + fd = _libc.inotify_init() + descriptors = {} + if fd == -1: + raise OSError('inotify_init() error: {}'.format( + os.strerror(ctypes.get_errno()))) + try: + for path in paths: + rv = _libc.inotify_add_watch(fd, path, 0x2) + if rv == -1: + raise OSError('inotify_add_watch() error: {}'.format( + os.strerror(ctypes.get_errno()))) + descriptors[rv] = path + buf = os.read(fd, 1024) + # TODO: continue with some more reads with 0.1 second timeouts + # to empty the list of roughly-simultaneous events before + # closing our file descriptor and returning? + finally: + pass #os.close(fd) + time.sleep(0.1) # until above TODO is done + wd, mask, cookie, name_length = struct.unpack('iIII', buf) + return [descriptors[wd].decode('ascii')] diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/projectlib.py" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/projectlib.py" new file mode 100644 index 0000000..5557494 --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/projectlib.py" @@ -0,0 +1,212 @@ +"""Provide a Project of related tasks that can be rebuilt when inputs change. + +""" +from contextlib import contextmanager +from collections import namedtuple +from functools import wraps +from .graphlib import Graph + +_unavailable = object() + +class Project: + """A collection of tasks that are related as inputs and consequences.""" + + def __init__(self): + self._graph = Graph() + self._graph.sort_key = task_key + self._cache = {} + self._cache_on = True + self._task_stack = [] + self._todo = set() + self._trace = None + + def start_tracing(self): + """Start recording every task that is invoked by this project.""" + self._trace = [] + + def stop_tracing(self, verbose=False): + """Stop recording task invocations, and return the trace as text. + + By default, the trace only shows those tasks that were invoked, + because no up-to-date return value was available for them in the + cache. But if the optional argument `verbose` is true then the + trace will also include tasks which experienced a cache hit, not + of a miss, and therefore did not need to be re-invoked. + + """ + text = '\n'.join( + '{}{} {}'.format( + '. ' * depth, + 'calling' if not_available else 'returning cached', + task) + for (depth, not_available, task) in self._trace + if verbose or not_available) + + self._trace = None + return text + + def _add_task_to_trace(self, task, return_value): + """Add a task to the currently running task trace.""" + tup = (len(self._task_stack), return_value is _unavailable, task) + self._trace.append(tup) + + def task(self, task_function): + """Decorate a function that defines one of the tasks for this project. + + The `task_function` should be a function that the programmer + wants to add to this project. This decorator will return a + wrapped version of the function. Each time the wrapper is + called with a particular argument list, it checks our internal + cache of previous calls to find out if we already know what this + function returns for those particular arguments. If we already + know, then the wrapper skips the function call itself and simply + returns the cached value. + + If the cache does not have an up-to-date return value, then the + wrapper invokes `task_function` and saves its return value to + the cache for future use before returning it to the caller. + + If it must invoke the `task_function`, then the wrapper places + the task atop the current stack of executing tasks. This makes + sure that if `task_function` invokes any further tasks, we can + remember that it used their return values and that it will need + to be re-invoked again in the future if any of those other tasks + changes its return value. + + """ + @wraps(task_function) + def wrapper(*args): + task = Task(wrapper, args) + + if self._task_stack: + self._graph.add_edge(task, self._task_stack[-1]) + + return_value = self._get_from_cache(task) + if self._trace is not None: + self._add_task_to_trace(task, return_value) + + if return_value is _unavailable: + self._graph.clear_inputs_of(task) + self._task_stack.append(task) + try: + return_value = task_function(*args) + finally: + self._task_stack.pop() + self.set(task, return_value) + + return return_value + + return wrapper + + def _get_from_cache(self, task): + """Return the output of the given `task`. + + If we do not have a current, valid cached value for `task`, + returns the singleton `_unavailable` instead. + + """ + if not self._cache_on: + return _unavailable + if task in self._todo: + return _unavailable + return self._cache.get(task, _unavailable) + + @contextmanager + def cache_off(self): + """Context manager that forces tasks to really be invoked. + + Even if the project has already cached the output of a + particular task, re-running the task inside of this context + manager will make the project re-invoke the task:: + + with project.cache_off(): + my_task() + + """ + original_value = self._cache_on + self._cache_on = False + try: + yield + finally: + self._cache_on = original_value + + def set(self, task, return_value): + """Add the `return_value` of `task` to our cache of return values. + + This gives us the opportunity to compare the new value against + the old one that had previously been returned by the task, to + determine whether the tasks that themselves use `task` as input + must be added to the to-do list for re-computation. + + """ + self._todo.discard(task) + if (task not in self._cache) or (self._cache[task] != return_value): + self._cache[task] = return_value + self._todo.update(self._graph.immediate_consequences_of(task)) + + def invalidate(self, task): + """Mark `task` as requiring recomputation on the next `rebuild()`. + + There are two ways that code preparing for a call to `rebuild()` + can signal that the value we have cached for a given task is no + longer valid. The first is to run the task manually and then + use `set()` to unilaterally install the new value in our cache. + The other is to call this method to simply invalidate the `task` + and let `rebuild()` itself call it when it next runs. + + """ + self._todo.add(task) + + def rebuild(self): + """Repeatedly rebuild every out-of-date task until all are current. + + If nothing has changed recently, our to-do list will be empty, + and this call will return immediately. Otherwise we take the + tasks in the current to-do list, along with every consequence + anywhere downstream of them, and call `get()` on every single + one to force re-computation of the tasks that are either already + invalid or that become invalid as the first few in the list are + recomputed. + + Unless there are cycles in the task graph, this will eventually + return. + + """ + while self._todo: + tasks = self._graph.recursive_consequences_of(self._todo, True) + for function, args in tasks: + function(*args) + +# Helper functions. + +def task_key(task): + """Return a sort key for a given task.""" + function, args = task + return function.__name__, args + +class Task(namedtuple('Task', ('task_function', 'args'))): + """Turn a call to a function into a task 2-tuple. + + Given a task function and an argument list, returns a task 2-tuple + that encapsulates the call as a single object. `Project` uses these + task objects for consequence tracking and caching. + + Raises `ValueError` if `args` is not hashable. + + """ + __slots__ = () + + def __new__(cls, task_function, args): + try: + hash(args) + except TypeError as e: + raise ValueError('arguments to project tasks must be immutable' + ' and hashable, not the {}'.format(e)) + + return super().__new__(cls, task_function, args) + + def __repr__(self): + "Produce a “syntactic,” source-like representation of the task." + + return '{}({})'.format(self.task_function.__name__, + ', '.join(repr(arg) for arg in self.args)) diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/rendering.py" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/rendering.py" new file mode 100644 index 0000000..75e6c33 --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/contingent/rendering.py" @@ -0,0 +1,44 @@ +"""Output routines related to the graph type.""" + +def as_graphviz(graph): + """Render this ``contingent.Graph`` object as graphviz code. + + To turn the output of this routine into an image, you might save the + text in a file named "output.dot" and then run: + + $ dot -Tpng output.dot > output.png + + """ + edges = graph.edges() + inputs = set(input for input, consequence in edges) + consequences = set(consequence for input, consequence in edges) + lines = ['digraph {', 'graph [rankdir=LR];'] + append = lines.append + + def node(task): + return '"{}"'.format(task) + + append('node [fontname=Arial shape=rect penwidth=2 color="#DAB21D"') + append(' style=filled fillcolor="#F4E5AD"]') + + append('{rank=same') + for task in graph.sorted(inputs - consequences): + append(node(task)) + append('}') + + append('node [shape=rect penwidth=2 color="#708BA6"') + append(' style=filled fillcolor="#DCE9ED"]') + + append('{rank=same') + for task in graph.sorted(consequences - inputs): + append(node(task)) + append('}') + + append('node [shape=oval penwidth=0 style=filled fillcolor="#E8EED2"') + append(' margin="0.05,0"]') + + for task, consequence in edges: + append('{} -> {}'.format(node(task), node(consequence))) + + append('}') + return '\n'.join(lines) diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" new file mode 100644 index 0000000..09d7119 --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" @@ -0,0 +1,1386 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 练习6:动态构建系统\n", + "-------\n", + ">本节练习节选自书籍《500 lines or less》——Contingent: A Fully Dynamic Build System\n", + "\n", + "## 介绍\n", + "\n", + "构建系统(build system)用于将源代码生成用户可用的目标(如库、可执行文件、脚本等),常见的有 GNU Make、CMake、Apache Ant 等。Python 中的 PyInstaller 也是构建系统的一种。本练习中,我们将实现一个构建系统,且试图对“动态交叉引用”问题提出一个解决方案。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "长期以来,构建系统一直是计算机编程中的标准工具。\n", + "\n", + "标准make构建系统的作者赢得了ACM软件系统奖,该标准构建系统于1976年首次开发。它不仅可以让您声明输出文件取决于一个(或多个)输入,还可以递归地进行操作。例如,程序可能取决于目标文件,而目标文件本身取决于相应的源代码:\n", + "```shell\n", + " prog: main.o\n", + " cc -o prog main.o\n", + "\n", + " main.o: main.c\n", + " cc -C -o main.o main.c\n", + "``` \n", + "如果make在下次调用时发现main.c源代码文件的修改时间比main.o的更新时间更长,那么它不仅会重建main.o对象文件,而且还会重建它。 也将自己重建prog。\n", + "\n", + "构建系统是分配给本科计算机科学专业学生的一个普通的学期项目,这不仅是因为构建系统几乎用在所有软件项目中,而且因为构建系统涉及基本数据结构和涉及有向图的算法(本章将在后面详细讨论) )。\n", + "\n", + "在构建系统背后经过数十年的使用和实践之后,人们可能会希望它们已完全成为通用的系统,甚至可以满足最奢侈的需求。\n", + "\n", + "但是,实际上,构建构件之间的一种常见交互作用(动态交叉引用问题)在大多数构建系统中都处理得很差,以至于在本章中,我们受到启发,不仅要练习经典的解决方案和用于解决问题的数据结构,的make问题,而是要显着延长该解决方案,以一个更为苛刻的领域。\n", + "\n", + "问题又是交叉引用。交叉引用会在哪里出现?在文本文档,文档和印刷书籍中!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1 问题:构建文档系统\n", + "\n", + "从源重建格式化文档的系统似乎总是做太多或做很少的工作。\n", + "\n", + "当他们响应较小的编辑时,使您等待不相关的章节被重新解析和重新设置格式时,它们会执行过多的工作。但是它们也可能重建得很少,从而给您带来不一致的最终产品。\n", + "\n", + "考虑一下Sphinx,它是用于正式Python语言文档和Python社区中许多其他项目的文档构建器。Sphinx项目的`index.rst`内容通常包括一个目录:\n", + "\n", + "```\n", + " Table of Contents\n", + " =================\n", + "\n", + " .. toctree::\n", + "\n", + " install.rst\n", + " tutorial.rst\n", + " api.rst\n", + "```\n", + "\n", + "该章节文件名列表告诉Sphinx在构建`index.html`输出文件时,包括指向三个命名章节中每个章节的链接。它还将包含指向每一章中任何部分的链接。除去其标记,上述标题和`toctree`命令产生的文本可能是:\n", + "\n", + "```\n", + " Table of Contents\n", + "\n", + " • Installation\n", + "\n", + " • Newcomers Tutorial\n", + " • Hello, World\n", + " • Adding Logging\n", + "\n", + " • API Reference\n", + " • Handy Functions\n", + " • Obscure Classes\n", + " `\n", + "```\n", + "如您所见,此目录是来自四个不同文件的信息的汇总。它的基本顺序和结构来自`index.rst`,而每章和节的实际标题均从这三章源文件本身中提取。\n", + "\n", + "如果您以后重新考虑本教程的章节标题,那么您将编辑第一行`tutorial.rst` 并写点更好的东西:\n", + "```\n", + " -Newcomers Tutorial\n", + " +Beginners Tutorial\n", + " ==================\n", + "\n", + " Welcome to the tutorial!\n", + " This text will take you through the basics of...\n", + "```\n", + "\n", + "当您准备重建时,Sphinx会做正确的事!它将重新构建教程章节本身和索引。(将输出管道输入到`cat`中使Sphinx成为在单独的行中宣布每个重建的文件,而不是使用空回车,用这些进度更新重复覆盖一行。)\n", + "\n", + "```\n", + " $ make html | cat\n", + " writing output... [ 50%] index\n", + " writing output... [100%] tutorial\n", + "``` \n", + "\n", + "因为Sphinx选择重建两个文档,所以`tutorial.html`现在不仅将其新标题放在顶部,而且输出`index.html`还将在目录中显示更新的章节标题。 Sphinx重建了所有内容,以使输出保持一致。\n", + "\n", + "如果对`tutorial.rst`的编辑较小,该怎么办?\n", + "\n", + "```\n", + " Beginners Tutorial\n", + " ==================\n", + "\n", + " -Welcome to the tutorial!\n", + " +Welcome to our project tutorial!\n", + " This text will take you through the basics of...\n", + "```\n", + "在这种情况下,无需重建`index.html`,因为对段落内部进行的较小编辑不会更改目录中的任何信息。\n", + "\n", + "但是事实证明,Sphinx并不像刚出现时那样聪明!\n", + "\n", + "即使结果完全一样,它将继续执行重建`index.html`的多余工作。\n", + "\n", + "```\n", + " writing output... [ 50%] index\n", + " writing output... [100%] tutorial\n", + "```\n", + "\n", + "您可以在`index.html`的“之前”和“之后”版本上运行“ diff”,以确认您的小修改对首页没有影响-但是Sphinx还是让您等待它的重建。\n", + "\n", + "您甚至可能没有注意到对于易于编译的小型文档的额外重建工作。但是,当您频繁调整和编辑冗长,复杂的文档或涉及诸如绘图或动画之类的多媒体生成的文档时,对工作流程的延迟会变得非常重要。\n", + "\n", + "尽管Sphinx至少会在不做任何更改的情况下努力不重建每一章-例如,它并没有响应`“ tutorial.rst”`编辑而重建`install.html`或`api.html`, 它所做的超出了必要。\n", + "\n", + "但是事实证明,Sphinx的作用甚至更糟:有时它做得太少,使您看到的输出不一致,用户可能会注意到。\n", + "\n", + "要查看其最简单的故障之一,请首先在您的API文档的顶部添加一个交叉引用:\n", + "\n", + "```\n", + " API Reference\n", + " =============\n", + "\n", + " +Before reading this, try reading our :doc:`tutorial`!\n", + " +\n", + " The sections below list every function\n", + " and every single class and method offered...\n", + "```\n", + "\n", + "对于目录,Sphinx通常会谨慎行事,将尽职地重建此API参考文档以及项目的`index.html`主页:\n", + "\n", + "\n", + "```\n", + " writing output... [ 50%] api\n", + " writing output... [100%] index\n", + "```\n", + "\n", + "在`api.html`输出文件中,您可以确认Sphinx是否已将标题包含在交叉引用的定位标记中:\n", + "\n", + "```html\n", + "

Before reading this, try reading our\n", + " \n", + " Beginners Tutorial\n", + " !

\n", + "```\n", + "\n", + "如果您现在再次对“ tutorial.rst”文件顶部的标题进行编辑怎么办?\n", + "\n", + "您将使*三个*输出文件无效:\n", + "\n", + "1.现在`tutorial.html`顶部的标题已过期,因此需要重建文件。\n", + "\n", + "2. `index.html`中的目录仍然具有旧标题,因此需要重建文档。\n", + "\n", + "3.`api.html`第一段中的嵌入式交叉引用仍然具有旧的章节标题,因此也需要重新构建。\n", + "\n", + "Sphinx会做什么呢?\n", + "```\n", + " writing output... [ 50%] index\n", + " writing output... [100%] tutorial\n", + "```\n", + "哎呀\n", + "\n", + "仅重建了两个文件,而不是三个。\n", + "\n", + "Sphinx无法正确重建您的文档。\n", + "\n", + "如果您现在将`HTML`推送到网络上,则用户将在`api.html`顶部的交叉引用中看到旧标题,但是一旦链接将其带到`tutorial.html`,用户将看到另一个标题(新标题)。 `本身。\n", + "\n", + "Sphinx支持的多种交叉引用可能会发生这种情况:章标题,节标题,段落,类,方法和函数。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2 构建系统和一致性\n", + "\n", + "上面概述的问题并非特定于Sphinx。它不仅困扰着其他文档系统(例如LaTeX),而且甚至会困扰那些只是试图用古老的make工具指导编译步骤的项目,如果它们的资产碰巧以交叉方式进行了交叉引用。\n", + "\n", + "由于该问题是古老且普遍存在的,因此其解决方案具有同样长的沿袭:\n", + "\n", + "```bash\n", + " $ rm -r _build /\n", + " $ make html\n", + "```\n", + "如果删除所有输出,则可以保证完全重建!有些项目甚至将别名`rm -r`命名为一个目标,`clean`因此只需快速`make clean`擦拭即可。\n", + "\n", + "通过消除每一个中间或输出资产的每个副本,一个庞大的`rm -r`团队能够迫使该构建重新开始,而不会缓存任何内容,而不会存储可能会导致产品过时的早期状态。\n", + "\n", + "但是我们可以开发出更好的方法吗?\n", + "\n", + "如果您的构建系统是一个持续的过程,当它从一个文档的源代码传递到另一个文档的文本时,注意到每个章节标题,每个章节标题和每个交叉引用的短语,该怎么办?它关于更改单个源文件后是否重建其他文档的决定可以是精确的,而不是仅仅猜测,而是可以纠正的,而不是使输出保持不一致状态。\n", + "\n", + "结果将是一个像旧的静态`make`工具一样的系统,但是该系统在构建文件时就了解了文件之间的依赖关系-在添加,更新和删除交叉引用时动态地添加和删除了依赖关系。\n", + "\n", + "在以下各节中,我们将**使用Python构造一个名为Contingent的工具**。\n", + "\n", + "Contingent在存在动态依赖项的情况下保证正确性,同时执行最少的重建步骤。尽管它可以应用于任何问题领域,但我们将针对上面概述的一小部分问题运行它。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3 链接任务以制作图形\n", + "任何构建系统都需要一种链接输入和输出的方法。例如,在我们上面的讨论中,三个标记文本分别产生一个相应的HTML输出文件。表达这些关系的最自然的方法是将它们组合成一个盒子和箭头(或者用数学术语来说是节点和边缘)来形成图形。\n", + "\n", + "![](figure1.png) \n", + "\n", + "通过解析三个输入文本生成的三个文件。\n", + "\n", + "程序员用来解决构建系统问题的每种语言都将提供各种数据结构,用这些数据结构可以表示节点和边的图形。\n", + "\n", + "我们如何用Python表示这样的图?\n", + "\n", + "Python语言通过直接支持四种通用数据结构的语言语法来赋予它们优先级。您可以通过简单地在源代码中键入它们的文字表示形式来创建这些四大数据结构的新实例,并且它们的四个类型对象可以作为内置符号使用,而无需导入即可使用。\n", + "\n", + "该元组是用于保存异构数据只读序列-在元组中的每个时隙典型地是指不同的东西。在这里,元组将主机名和端口号放在一起,如果重新排序元素,它将失去其含义:\n", + "\n", + "```python\n", + "('dropbox.com', 443)\n", + "```\n", + "\n", + "**list**是用于保存同质数据的可变序列-每个项目通常具有与对等项目相同的结构和含义。\n", + "\n", + "列表既可以用于保留数据的原始输入顺序,也可以重新排列或排序以建立新的更有用的顺序。\n", + "\n", + "```python\n", + "['C', 'Awk', 'TCL', 'Python', 'JavaScript']\n", + "```\n", + "\n", + "**set**不保留顺序。 集合仅记住是否已添加给定值,而不记住多少次,因此记住用于从数据流中删除重复项的数据结构。 例如,以下两个集合将各自包含三个元素:\n", + "\n", + "```python\n", + "{3, 4, 5}\n", + "{3, 4, 5, 4, 4, 3, 5, 4, 5, 3, 4, 5}\n", + "```\n", + "\n", + "**dict**是用于存储键可访问值的关联数据结构。Dicts允许程序员选择索引每个值的键,而不是像tuple和list那样使用自动整数索引。查找由一个散列表支持,这意味着无论dict有12个键还是有100万个键,查找dict键的速度都是相同的。\n", + "\n", + "\n", + "```python\n", + "{'ssh': 22, 'telnet': 23, 'domain': 53, 'http': 80}\n", + "```\n", + "\n", + "Python灵活性的关键在于这四个数据结构是可组合的。 程序员可以将它们彼此任意嵌套以产生更复杂的数据存储,其规则和语法仍然是基本元组,列表,集合和字典中的简单规则。\n", + "\n", + "假设我们的每个图形边缘都需要至少知道其原始节点和目标节点,那么最简单的表示可能就是元组。\n", + "\n", + "顶部可能看起来像:\n", + "\n", + "```python\n", + " ('tutorial.rst', 'tutorial.html')\n", + "```\n", + "\n", + "我们如何存储多个边缘? 虽然我们最初的冲动可能只是简单地将所有边缘元组放入列表中,但这会带来不利条件。 列表会谨慎地保持顺序,但是谈论图形中边的绝对顺序没有意义。 即使我们只希望能够在`tutorial.rst`和` tutorial.html`之间绘制单个箭头,列表也会非常乐意保存完全相同的边缘的多个副本。 因此,正确的选择是集合,这将使我们表示为:\n", + "\n", + "```python\n", + " {('tutorial.rst', 'tutorial.html'),\n", + " ('index.rst', 'index.html'),\n", + " ('api.rst', 'api.html')}\n", + "```\n", + "\n", + "这将允许我们所有边缘的快速迭代,单个边缘的快速插入和删除操作,以及一种检查特定边缘是否存在的快速方法。\n", + "\n", + "不幸的是,这些并不是我们唯一需要的操作。\n", + "\n", + "像Contingent这样的构建系统需要了解给定节点与连接到该节点的所有节点之间的关系。 例如,当`api.rst`更改时,Contingent需要知道哪些资产(如果有)受该更改影响,以最大程度地减少执行的工作并确保完整的构建。 要回答这个问题-`api.rst`下游有哪些节点?” —我们需要检查`api.rst`中的“出局”边缘。\n", + "\n", + "但是构建依赖关系图需要Contingent也要考虑节点的`inputs`。 例如,当构建系统组装输出文档`tutorial.html`时,使用了哪些输入? 通过观察每个节点的输入,Contingent可以知道`api.html`依赖于`api.rst`,而`tutorial.html`则不依赖。\n", + "\n", + "当源发生更改并进行重建时,Contingent会重建每个更改的节点的传入边缘,以删除潜在的陈旧边缘,并重新学习任务这次使用的资源。\n", + "\n", + "我们的元组组很难回答这些问题中的任何一个。 如果我们需要了解`api.html`与图的其余部分之间的关系,则需要遍历整个集合以查找以`api.html`节点开头或结尾的边。\n", + "\n", + "像Python的`dict`这样的关联数据结构将允许直接从特定节点中查找所有边缘,从而使这些琐事变得更加容易:\n", + "```python\n", + " {'tutorial.rst': {('tutorial.rst', 'tutorial.html')},\n", + " 'tutorial.html': {('tutorial.rst', 'tutorial.html')},\n", + " 'index.rst': {('index.rst', 'index.html')},\n", + " 'index.html': {('index.rst', 'index.html')},\n", + " 'api.rst': {('api.rst', 'api.html')},\n", + " 'api.html': {('api.rst', 'api.html')}}\n", + "```\n", + "查找特定节点的边缘现在将非常快,其代价是必须将每个边缘存储两次:一次存储在一组传入边缘中,一次存储在一组向外边缘中。\n", + "\n", + "但是必须手动检查每组中的边缘,以查看哪些入站和哪些出站。 在节点的边缘集中不断重复命名节点也是有点多余的。\n", + "\n", + "这两个反对意见的解决方案是将传入和传出的边放置在它们自己单独的数据结构中,这也将使我们不必为涉及的每个边都一遍又一遍地提及该节点。\n", + "\n", + "```python\n", + " incoming = {\n", + " 'tutorial.html': {'tutorial.rst'},\n", + " 'index.html': {'index.rst'},\n", + " 'api.html': {'api.rst'},\n", + " }\n", + "\n", + " outgoing = {\n", + " 'tutorial.rst': {'tutorial.html'},\n", + " 'index.rst': {'index.html'},\n", + " 'api.rst': {'api.html'},\n", + " }\n", + "```\n", + "注意,“ outgoing”直接用Python语法表示了我们之前所写的内容:构建系统会将左侧的源文档转换为右侧的输出文档。\n", + "\n", + "对于这个简单的示例,每个源仅指向一个输出-所有输出集都只有一个元素-但是不久之后我们将看到示例,其中单个输入节点具有多个下游后果。\n", + "\n", + "该集合字典数据结构中的每个边都得到两次表示,一次是从一个节点的出站边缘(` tutorial.rst`→` tutorial.html`),另一次是到另一节点的传入边缘(`tutorial.html`←`tutorial.rst`)。\n", + "\n", + "只是从边缘任一端的两个节点的相反角度来看,这两种表示形式捕获了完全相同的关系。\n", + "\n", + "但是作为这种冗余的回报,数据结构支持Contingent需要的快速查找。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4 Class的使用\n", + "\n", + "您可能对以上关于Python数据结构的讨论中缺少类感到惊讶。毕竟,类是构建应用程序的一种常见机制,并且在其拥护者和批评者之间进行激烈辩论的频率并不高。曾经有人认为班级很重要,可以围绕它们设计整个教育课程,并且大多数流行的编程语言都包含用于定义和使用它们的专用语法。\n", + "\n", + "但是事实证明,类通常与数据结构设计问题正交。类没有为我们提供完全替代的数据建模范例,而是仅重复了我们已经看到的数据结构:\n", + "\n", + "- 类实例被*实现*为字典。\n", + "- 类实例的*使用*就像可变的元组。\n", + "该类通过更漂亮的语法提供键查找,您可以在其中用`graph.incoming`代替`graph[\"incoming\"]`。但是,实际上,类实例几乎从未用作通用键值存储。相反,它们用于按属性名称组织相关但异构的数据,实现细节封装在一致且令人难忘的接口后面。\n", + "\n", + "因此,您不必创建一个主机名和一个端口号在元组中,而是必须记住哪个名在前,哪个名在后,而创建一个`Address`类,其实例分别具有`host`和`port`属性。然后,您可以将`Address`对象传递到否则会有匿名元组的位置。代码变得更易于阅读和编写。但是,使用类实例并不能真正改变我们在进行数据设计时遇到的任何问题。它只是提供了一个更漂亮,更匿名的容器。\n", + "\n", + "因此,类的真正价值不是在于它们改变了数据设计的科学。类的价值在于它们使您可以从程序的其余部分隐藏数据设计!\n", + "\n", + "成功的应用程序设计取决于我们利用Python提供的强大的内置数据结构的能力,同时最大程度地减少了随时需要记住的细节量。类提供了解决这一明显难题的机制:有效使用类,可以围绕系统整体设计的一些小子集提供外观。在一个子集(`Graph`例如`a`)中工作时,只要记住其他子集的接口,我们就可以忘记其他实现的细节。这样,程序员通常会发现自己在编写系统的过程中处于多个抽象层次之间,现在正在使用特定子系统的特定数据模型和实现细节,现在通过其接口连接了较高层次的概念。\n", + "\n", + "例如,从外部,代码可以简单地请求一个新`Graph`实例:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from contingent import graphlib\n", + "g = graphlib.Graph()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "无需了解Graph工作原理的详细信息。仅使用图形的代码在处理图形时(例如添加边或执行其他一些操作时)仅看到接口动词(即方法调用):" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "g.add_edge('index.rst', 'index.html')\n", + "g.add_edge('tutorial.rst', 'tutorial.html')\n", + "g.add_edge('api.rst', 'api.html')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "在没有显式创建“ node”和“ edge”对象的情况下,我们在图形中添加了边,并且在这些早期示例中,节点本身只是字符串。\n", + "\n", + "Python语言和社区明确并有目的地强调使用简单的通用数据结构来解决问题,而不是为要解决的问题的每一个细节创建自定义类。这是`Pythonic`解决方案概念的一个方面:Pythonic解决方案试图最大程度地减少语法开销,并利用Python强大的内置工具和广泛的标准库。\n", + "\n", + "考虑到这些考虑因素,让我们回到`Graph`类,检查其设计和实现,以查看数据结构和类接口之间的相互作用。\n", + "\n", + "Graph构造新实例时,已经使用上一节中概述的逻辑构建了一对字典来存储边:\n", + "\n", + "```python\n", + "class Graph:\n", + " \"\"\"A directed graph of the relationships among build tasks.\"\"\"\n", + "\n", + " def __init__(self):\n", + " self._inputs_of = defaultdict(set)\n", + " self._consequences_of = defaultdict(set)\n", + "```\n", + "\n", + "在属性名称前面的前导下划线`_inputs_of`和`_consequences_of `是在Python社区信号共同约定的属性是私有的。这种约定是社区建议程序员通过空间和时间彼此传递消息和警告的一种方式。认识到需要指出公共对象属性和内部对象属性之间的差异,社区采用了单个前导下划线作为对其他程序员(包括我们将来的自己)的简洁一致的指示,即该属性最好被视为内部无形内部机制的一部分。班级。\n", + "\n", + "为什么我们使用`defaultdict`标准指令而不是标准指令?将字典与其他数据结构组成时的常见问题是处理缺少的键。在正常情况下,检索不存在的键将引发`KeyError`:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'index.rst'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mconsequences_of\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mconsequences_of\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'index.rst'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'index.html'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m: 'index.rst'" + ] + } + ], + "source": [ + "consequences_of = {}\n", + "consequences_of['index.rst'].add('index.html')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这种需求非常普遍,以至于Python包含一个特殊的实用工具,`defaultdict`您可以通过它提供一个返回缺少键值的函数。当我们询问`Graph`尚未看到的边缘时,我们将得到一个空的`set`而不是一个异常:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "set()" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from collections import defaultdict\n", + "consequences_of = defaultdict(set)\n", + "consequences_of['api.rst']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "通过这种方式来构造我们的实现,意味着每个键的首次使用看上去都与使用特定键的第二次及以后相同:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "consequences_of['index.rst'].add('index.html')\n", + "'index.html' in consequences_of['index.rst']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "有了这些技术,我们就可以检查的实现`add_edge`,我们之前曾使用它来构建图形。\n", + "\n", + "```python\n", + " def add_edge(self, input_task, consequence_task):\n", + " \"\"\"Add an edge: `consequence_task` uses the output of `input_task`.\"\"\"\n", + " self._consequences_of[input_task].add(consequence_task)\n", + " self._inputs_of[consequence_task].add(input_task)\n", + "```\n", + "这种方法掩盖了以下事实:每个新边都需要两个(而不是一个)存储步骤,以便我们在两个方向上都知道。并注意如何`add_edge()`不知道或不在乎之前是否曾见过任何一个节点。由于输入和后果数据结构均为`a defaultdict(set)`,因此该`add_edge()`方法对于节点的新颖性仍然一无所知- `defaultdict`通过动态创建新`set`对象来解决差异。正如我们在上面看到的,如果不使用`defaultdict`,`add_edge()`时间将增加三倍。更重要的是,对结果代码的理解和推理将更加困难。此实现演示了`Pythonic`解决问题的方法:简单,直接和简洁。\n", + "\n", + "还应该为调用者提供一种访问每个边缘的简单方法,而不必学习如何遍历我们的数据结构:\n", + "```python\n", + " def edges(self):\n", + " \"\"\"Return all edges as ``(input_task, consequence_task)`` tuples.\"\"\"\n", + " return [(a, b) for a in self.sorted(self._consequences_of)\n", + " for b in self.sorted(self._consequences_of[a])]\n", + "```\n", + "\n", + "该`Graph.sorted()`方法尝试按照可以为用户提供稳定输出顺序的自然排序顺序(例如字母顺序)对节点进行排序。\n", + "\n", + "通过使用这种遍历方法,我们可以看到,在前面的三个` add`方法调用之后, `g`现在表示如下:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('api.rst', 'api.html'),\n", + " ('index.rst', 'index.html'),\n", + " ('tutorial.rst', 'tutorial.html')]\n" + ] + } + ], + "source": [ + "from pprint import pprint\n", + "pprint(g.edges())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "由于我们现在有了一个真实的实时Python对象,而不仅仅是一个图形,因此我们可以向它提出有趣的问题!例如,当Contingent从源文件构建博客时,它将需要知道诸如“什么取决于`api.rst`?”之类的内容。当`api.rst`内容更改时:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['api.html']" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.immediate_consequences_of('api.rst')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`g`告诉Contingent,当`api.rst`更改时,`api.html`就会过时,必须重新构建。\n", + "\n", + "`index.html`呢?" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "g.immediate_consequences_of('index.html')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "返回了一个空列表,表示`index.html`在图的右边缘,因此如果更改,则无需再构建任何东西。由于已经进行了布局数据的工作,因此可以非常简单地表示此查询:\n", + "```python\n", + " def immediate_consequences_of(self, task):\n", + " \"\"\"Return the tasks that use `task` as an input.\"\"\"\n", + " return self.sorted(self._consequences_of[task])\n", + "```\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from contingent.rendering import as_graphviz\n", + "open('figure1.dot', 'w').write(as_graphviz(g)) and None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "我们将为每个需要通过解析输入文件生成然后传递给我们的其他例程之一的标题字符串创建一个节点:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "g.add_edge('api.rst', 'api-title')\n", + "g.add_edge('api-title', 'index.html')\n", + "g.add_edge('tutorial.rst', 'tutorial-title')\n", + "g.add_edge('tutorial-title', 'index.html')" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('api-title', 'index.html'),\n", + " ('api.rst', 'api-title'),\n", + " ('api.rst', 'api.html'),\n", + " ('index.rst', 'index.html'),\n", + " ('tutorial-title', 'index.html'),\n", + " ('tutorial.rst', 'tutorial-title'),\n", + " ('tutorial.rst', 'tutorial.html')]\n" + ] + } + ], + "source": [ + "pprint(g.edges())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](figure2.png)\n", + "\n", + "只要提及的标题发生变化,`index.html`随时准备重建。\n", + "本手册演练说明了Contingent最终将为我们做些什么:该图`g`捕获了项目文档中各种工件的输入和后果。\n", + "\n", + "## 5 学习联系\n", + "现在,我们有了一种方法,让Contingent可以跟踪任务及其之间的关系。但是,如果我们更仔细地查看上图,我们会发现它实际上有点波折和模糊:`api.rst`是怎么产生`api.html`的?我们如何知道`index.html`需要教程中的标题?以及如何解决这种依赖性?\n", + "\n", + "当我们手动构建后果图时,我们对这些想法的直觉概念就起作用了,但是不幸的是,计算机并不是非常直观的,因此我们需要更精确地了解我们想要的东西。\n", + "\n", + "从源产生输出需要采取什么步骤?如何定义和执行这些步骤?Contingent如何知道它们之间的联系?\n", + "\n", + "在Contingent中,构建任务被定义为“函数加参数”。\n", + "\n", + "- 这些函数定义特定项目理解如何执行的动作。\n", + "- 这些参数提供了具体信息:应阅读哪个源文档,需要哪个博客标题。\n", + "\n", + "当它们运行时,这些函数可以依次调用其他任务函数,并传递它们需要答案的任何参数。\n", + "\n", + "为了了解它是如何工作的,我们现在实际上将实现开头描述的文档构建器。为了避免陷入困境,在本例中,我们将使用简化的输入和输出文档格式。我们的输入文档将在第一行包含一个标题,其余文本构成正文。交叉引用将只是反引号中包含的源文件名,在输出中将其替换为输出中相应文档的标题。\n", + "\n", + "以下是示例`index.txt`,`api.txt`和`tutorial.txt`的内容,包括格式的标题,文档正文和交叉引用:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "index = \"\"\"\n", + " Table of Contents\n", + " -----------------\n", + " * `tutorial.txt`\n", + " * `api.txt`\n", + " \"\"\"\n", + "\n", + "tutorial = \"\"\"\n", + " Beginners Tutorial\n", + " ------------------\n", + " Welcome to the tutorial!\n", + " We hope you enjoy it.\n", + " \"\"\"\n", + "\n", + "api = \"\"\"\n", + " API Reference\n", + " -------------\n", + " You might want to read\n", + " the `tutorial.txt` first.\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在我们有了一些可以使用的原始资料,基于Contingent的博客构建者需要哪些功能?\n", + "\n", + "在上面的简单示例中,HTML输出文件直接从源代码开始,但是在实际的系统中,将源代码转换为标记涉及几个步骤:\n", + "- 从磁盘读取原始文本\n", + "- 将文本解析为方便的内部表示形式\n", + "- 处理所有指令。\n", + "\n", + "作者可能已经指定,解决了交叉引用或其他外部依赖项(例如include文件),并应用了一个或多个视图转换将内部表示形式转换为其输出形式。\n", + "\n", + "Contingent通过将任务分组到一个“Project”来管理任务,这是一种构建系统的多管闲事者,它将自己注入到构建过程的中间,注意到每次一个任务与另一个任务对话,以构建所有任务之间的关系图。\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "from contingent.projectlib import Project, Task\n", + "project = Project()\n", + "task = project.task" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "本练习开头给出的示例的构建系统可能涉及一些任务。\n", + "\n", + "我们的`read()`任务将假装从磁盘读取文件。 由于我们确实在变量中定义了源文本,因此只需将文件名转换为相应的文本即可。" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "filesystem = {'index.txt': index,\n", + " 'tutorial.txt': tutorial,\n", + " 'api.txt': api}\n", + "@task\n", + "def read(filename):\n", + " return filesystem[filename]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "`parse()`任务根据我们文档格式的规范解释文件内容的原始文本。\n", + "\n", + "我们的格式非常简单:文档标题显示在第一行,其余内容被视为文档正文。" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "@task\n", + "def parse(filename):\n", + " lines = read(filename).strip().splitlines()\n", + " title = lines[0]\n", + " body = '\\n'.join(lines[2:])\n", + " return title, body" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "请注意`parse()`和`read()`之间的解析的第一个任务是将给定的文件名传递给`read()`,文件名将查找并返回该文件的内容。\n", + "\n", + "`title_of()`给定源文件名称的任务将返回文档的标题:" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "@task\n", + "def title_of(filename):\n", + " title, body = parse(filename)\n", + " return title" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "最后的任务, `render()`将文档的内存表示形式转换为输出形式。实际上,它是`parse()`的倒数。而`parse()`采用符合规范的输入文档并将其转换为内存中表示, `render()`采用内存中表示并生成符合某些规范的输出文档。" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "import re\n", + "LINK = '{}'\n", + "PAGE = '

{}

\\n

\\n{}\\n

'\n", + "\n", + "def make_link(match):\n", + " filename = match.group(1)\n", + " return LINK.format(filename, title_of(filename))\n", + "\n", + "@task\n", + "def render(filename):\n", + " title, body = parse(filename)\n", + " body = re.sub(r'`([^`]+)`', make_link, body)\n", + " return PAGE.format(title, body)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "

Beginners Tutorial

\n", + "

\n", + " Welcome to the tutorial!\n", + " We hope you enjoy it.\n", + "

\n" + ] + } + ], + "source": [ + "print(render('tutorial.txt'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](figure3.png)\n", + "说明任务图,该任务图可过渡地连接生成输出所需的所有任务,从读取输入文件到解析和转换文档并呈现文档。\n", + "\n", + "每次调用新任务时,Contingent都可以假定当前位于堆栈顶部的任务已调用该任务,并且将使用其输出。维护堆栈将需要几个额外的步骤来围绕任务$T$的调用:\n", + "\n", + "- 将$T$推入堆栈。\n", + "- 执行$T$,让它调用它需要的任何其他任务。\n", + "- 将$T$弹出堆栈。\n", + "- 返回其结果。\n", + "\n", + "为了拦截任务调用,Project利用了Python的一项关键功能:`function decorators`。装饰器可以在定义函数时对其进行处理或转换。该`Project.task`装饰用这个机会来包装的另一个功能,里面每个任务的包装,这使得包装之间的责任完全分离-这有可能会担心图形和堆栈管理代表项目-而我们的任务功能专注于文档处理。\n", + "\n", + "这是`task`装饰器样板的外观:\n", + "\n", + "```python\n", + " from functools import wraps\n", + "\n", + " def task(function):\n", + " @wraps(function)\n", + " def wrapper(*args):\n", + " # wrapper body, that will call function()\n", + " return wrapper\n", + "```\n", + "这是一个典型的Python装饰器声明。然后,可以通过`@`在`def`创建函数的字符顶部命名该函数,将其应用于函数:\n", + "\n", + "```python\n", + " @task\n", + " def title_of(filename):\n", + " title, body = parse(filename)\n", + " return title\n", + "```\n", + "完成此定义后,`title_of`将引用该函数的包装版本。包装器可以通过名称访问函数的原始版本`function`,并在适当的时间对其进行调用。Contingent包装器的主体运行如下内容:\n", + "\n", + "```python\n", + " def task(function):\n", + " @wraps(function)\n", + " def wrapper(*args):\n", + " #----------------\n", + " task = Task(wrapper, args)\n", + " if self.task_stack:\n", + " self._graph.add_edge(task, self.task_stack[-1])\n", + " self._graph.clear_inputs_of(task)\n", + " self._task_stack.append(task)\n", + " try:\n", + " value = function(*args)\n", + " finally:\n", + " self._task_stack.pop()\n", + "\n", + " return value\n", + " #---------------\n", + " return wrapper\n", + "```\n", + "\n", + "该包装器执行几个关键的维护步骤:\n", + "\n", + "1. 为方便起见,将任务(一个函数及其参数)打包到一个小对象中。wrapper在此命名为函数的包装版本。\n", + "\n", + "2. 如果此任务已由正在执行的当前任务调用,则添加一条边,以捕获该任务是已在运行的任务的输入这一事实。\n", + "\n", + "3. 忘记我们上一次可能在该任务上学到的知识,因为这一次可能会做出新的决定-例如,如果API指南的源文本不再提及该Tutorial,那么`render()`它将不再请求该`Tutorial`文档`title_of()`。\n", + "\n", + "4. 将该任务推入任务堆栈的顶部,以防其决定在执行工作时调用其他任务。\n", + "\n", + "5. 在`try...finally`块内调用任务,以确保我们正确完成了从堆栈中删除的任务,即使该任务因引发异常而死亡。\n", + "\n", + "6. 返回任务的返回值,以便此包装的调用者将无法得知他们没有简单地调用普通任务函数本身。\n", + "\n", + "步骤4和5维护任务堆栈本身,然后由步骤2用于执行结果跟踪,这是我们首先构建任务堆栈的全部原因。\n", + "\n", + "由于每个任务都被其自身的包装函数副本所包围,因此,正常任务堆栈的单纯调用和执行将产生关系图,这是看不见的副作用。因此,我们谨慎地在定义的每个处理步骤周围使用包装器:\n", + "```python\n", + " @task\n", + " def read(filename):\n", + " # body of read\n", + "\n", + " @task\n", + " def parse(filename):\n", + " # body of parse\n", + "\n", + " @task\n", + " def title_of(filename):\n", + " # body of title_of\n", + "\n", + " @task\n", + " def render(filename):\n", + " # body of render\n", + "```\n", + "\n", + "当我们调用`parse('tutorial.txt') `装饰器时,我们了解了`parse`和`read`之间的联系。我们可以通过建立另一个`Task`元组来询问这种关系,并询问如果其输出值更改会带来什么后果:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "read('tutorial.txt')\n" + ] + } + ], + "source": [ + "task = Task(read, ('tutorial.txt',))\n", + "print(task)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[parse('tutorial.txt')]" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "project._graph.immediate_consequences_of(task)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "重新读取`tutorial.txt`文件并发现其内容已更改的结果时,我们需要重新执行该文档的`parse()`例程。\n", + "\n", + "如果我们渲染整个文档集会怎样?Contingent是否能够学习整个构建过程?" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "

Table of Contents

\n", + "

\n", + " * Beginners Tutorial\n", + " * API Reference\n", + "

\n", + "==============================\n", + "

Beginners Tutorial

\n", + "

\n", + " Welcome to the tutorial!\n", + " We hope you enjoy it.\n", + "

\n", + "==============================\n", + "

API Reference

\n", + "

\n", + " You might want to read\n", + " the Beginners Tutorial first.\n", + "

\n", + "==============================\n" + ] + } + ], + "source": [ + "for filename in 'index.txt','tutorial.txt','api.txt':\n", + " print(render(filename))\n", + " print('=' * 30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It works!\n", + "\n", + "从输出中,我们可以看到转换将源文档中的指令标题替换为文档标题,表明Contingent能够发现构建文档所需的各种任务之间的联系。\n", + "\n", + "![](figure4.png)\n", + "\n", + "通过观察一个任务,通过task包装机调用另一个任务, Project就自动了解了输入和后果图。由于它具有完整的结果图可供使用,如果任何任务的输入发生变化,Contingent都知道要重建的所有事物。" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6 追踪后果\n", + "\n", + "初始构建运行完成后,Contingent需要监视输入文件的更改。当用户完成一个新的编辑并运行“保存”时,该`read()`方法及其*后果*都需要被调用。\n", + "\n", + "这将要求我们以与创建图形相反的顺序移动图形。您会回想起,它是通过为API参考调用`render()`和`parse()`,并最终调用该`read()`任务而构建的。现在我们朝另一个方向前进:我们知道`read()`现在将返回新的内容,并且我们需要弄清楚其将产生什么后果。\n", + "\n", + "编译结果的过程是一个递归过程,因为每个结果本身可以有其他依赖于此的任务。我们可以通过重复调用图形来手动执行此递归。(请注意,我们在这里利用了Python提示符保存名称下显示的最后一个值_供后续表达式使用的事实。)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[parse('api.txt')]" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "task = Task(read, ('api.txt',))\n", + "project._graph.immediate_consequences_of(task)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[render('api.txt'), title_of('api.txt')]" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t1, = _\n", + "project._graph.immediate_consequences_of(t1)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t2, t3 = _\n", + "project._graph.immediate_consequences_of(t2)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[render('index.txt')]" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "project._graph.immediate_consequences_of(t3)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "t4, = _\n", + "project._graph.immediate_consequences_of(t4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "这种递归任务不断地寻找直接的结果,只有当我们到达没有进一步结果的任务时才停止,这是一种足够基本的图形操作,`Graph`类中的一个方法直接支持它:" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[parse('api.txt'),\n", + " render('api.txt'),\n", + " title_of('api.txt'),\n", + " render('index.txt')]\n" + ] + } + ], + "source": [ + "# Secretly adjust pprint to a narrower-than-usual width:\n", + "_pprint = pprint\n", + "pprint = lambda x: _pprint(x, width=40)\n", + "pprint(project._graph.recursive_consequences_of([task]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "实际上,`recursive_consequences_of()尝`试变得聪明一点。如果某个特定任务由于其他多个任务的下游结果而重复出现,则应注意在输出列表中仅提及一次,并将其移至末尾,以便仅在作为其输入的任务之后出现。这种智能由拓扑排序的经典深度优先实现实现,该算法通过隐藏的递归辅助函数在Python中编写起来相当容易。查看[graphlib.py](contingent/graphlib.py)源代码以获取详细信息。\n", + "\n", + "如果在检测到更改后,我们谨慎地重新运行递归结果中的每个任务,那么Contingent将能够避免重建得太少。但是,我们的第二个挑战是避免重建过多。再次参考下图。\n", + "![](figure4.png)\n", + "\n", + "我们希望避免每次`tutorial.txt`更改时都重建所有三个文档,因为大多数编辑可能不会影响其标题,而只会影响其正文。如何做到这一点?\n", + "\n", + "解决方案是使图形重新计算依赖于缓存。当逐步解决更改的递归结果时,我们将仅调用输入与上次不同的任务。\n", + "\n", + "此优化将涉及最终的数据结构。我们将提供`Project`一个`_todo`集合,用于记住每个至少更改了一个输入值并因此需要重新执行的任务。因为只有`_todo`已过期的任务,所以构建过程可以跳过运行任何任务,除非它们出现在其中。\n", + "\n", + "同样,Python方便且统一的设计使这些功能非常易于编码。由于任务对象是可散列的,因此 `_todo`可以简单地设置为一组集合,该集合可以通过标识记住任务项--保证任务永远不会出现两次--并且`_cache`先前运行的返回值可以是将任务作为键的命令。\n", + "\n", + "更准确地说,只要`_todo`非空,重建步骤就必须保持循环。在每个循环中,它应该:\n", + "\n", + "- 调用`recursive_consequences_of()`并传递中列出的每个任务`_todo`。返回值将不仅是`_todo`任务本身的列表,还包括任务下游的每个任务的列表-换句话说,如果这次输出不同,则可能需要重新执行每个任务。\n", + "\n", + "- 对于列表中的每个任务,检查它是否在中列出`_todo`。如果没有,那么我们可以跳过运行它,因为在上游重新调用的所有任务都没有产生需要任务重新计算的新返回值。\n", + "\n", + "- 但是,对于在`_todo`我们到达时确实列出的任何任务,我们需要要求它重新运行并重新计算其返回值。如果任务包装函数检测到此返回值与旧的缓存值不匹配,则`_todo`在我们将其下游任务返回到递归结果列表之前,它将自动添加到其下游任务。\n", + "\n", + "当我们到达列表的末尾时,实际上可能需要重新运行的每个任务实际上应该已经重新运行。但以防万一,`_todo `如果尚未清空,我们将检查并重试。即使对于变化非常快的依赖树,这也应该很快解决。\n", + "\n", + "只有一个循环(例如,任务A需要任务B的输出而任务 本身又需要任务A的输出)才可以使构建器处于无限循环中,并且前提是其返回值永远不会稳定。幸运的是,实际的构建任务通常没有周期。\n", + "\n", + "让我们通过一个示例来跟踪该系统的行为。\n", + "```\n", + "tutorial = \"\"\"\n", + " Beginners Tutorial\n", + " ------------------\n", + " Welcome to the tutorial!\n", + " We hope you enjoy it.\n", + " \"\"\"\n", + "``` \n", + "假设您编辑`tutorial.txt`,更改标题和正文内容。我们可以通过修改`filesystem dict`中的值来模拟这一点:" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "filesystem['tutorial.txt'] = \"\"\"\n", + " The Coder Tutorial\n", + " ------------------\n", + " This is a new and improved\n", + " introductory paragraph.\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在内容已更改,我们可以通过使用`cache_off()`上下文管理器要求项目重新运行该`read()`任务,该上下文管理器暂时禁用其对于给定任务和参数返回其旧缓存结果的意愿:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "with project.cache_off():\n", + "... text = read('tutorial.txt')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "现在,新的教程文本已读入缓存。有多少下游任务需要重新执行?\n", + "\n", + "为了帮助我们回答这个问题,Project该类支持一个简单的跟踪工具,该工具将告诉我们在重建过程中执行了哪些任务。由于上述更改`tutorial.txt` 影响到它的主体和标题,因此下游的所有内容都需要重新计算:" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling parse('tutorial.txt')\n", + "calling render('tutorial.txt')\n", + "calling title_of('tutorial.txt')\n", + "calling render('api.txt')\n", + "calling render('index.txt')\n" + ] + } + ], + "source": [ + "project.start_tracing()\n", + "project.rebuild()\n", + "print(project.stop_tracing())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![](figure4.png)\n", + "回顾上图,您会发现,正如预期的那样,这是`read('tutorial.txt')`的直接或下游结果中包含的所有任务。\n", + "\n", + "但是,如果我们再次编辑它,但是这次标题保持不变怎么办?" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "filesystem['tutorial.txt'] = \"\"\"\n", + "... The Coder Tutorial\n", + "... ------------------\n", + "... Welcome to the coder tutorial!\n", + "... It should be read top to bottom.\n", + "... \"\"\"\n", + "\n", + "with project.cache_off():\n", + "... text = read('tutorial.txt')" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "calling parse('tutorial.txt')\n", + "calling render('tutorial.txt')\n", + "calling title_of('tutorial.txt')\n" + ] + } + ], + "source": [ + "project.start_tracing()\n", + "project.rebuild()\n", + "print(project.stop_tracing())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "成功!\n", + "\n", + "仅重建了一个文档。在`title_of()`给定新输入文档的情况下,尽管返回了相同的值,但这意味着所有其他下游任务均不受更改的影响,因此不会被重新调用。\n", + "\n", + "## 结论\n", + "\n", + "在Python中对Contingent进行编程时,我们跳过了诸如`TaskArgumentand`、`CachedResult`和`ConsequenceList`的十几种可能的类的创建。相反,我们借鉴了Python解决通用数据结构通用问题的悠久传统,导致代码重复使用了核心数据结构元组,列表,集合和字典中的一小部分想法。\n", + "\n", + "归功于严格的封装原则(仅允许`Graph`代码触摸图形的集合,并允许代码触摸Project项目的集合),如果`set`操作在项目的后续阶段返回错误,将永远不会产生歧义。错误发生时最内部执行方法的名称必然会将我们定向到错误所涉及的类和集合。`set`只要我们将常规下划线放在数据结构属性的前面,然后注意不要从类外部的代码中碰到它们,就不必为数据类型的每种可能的应用创建的子类。" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "cgsource", + "language": "python", + "name": "cgsource" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.dot" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.dot" new file mode 100644 index 0000000..1965abb --- /dev/null +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.dot" @@ -0,0 +1,22 @@ +digraph { +graph [rankdir=LR]; +node [fontname=Arial shape=rect penwidth=2 color="#DAB21D" + style=filled fillcolor="#F4E5AD"] +{rank=same +"api.rst" +"index.rst" +"tutorial.rst" +} +node [shape=rect penwidth=2 color="#708BA6" + style=filled fillcolor="#DCE9ED"] +{rank=same +"api.html" +"index.html" +"tutorial.html" +} +node [shape=oval penwidth=0 style=filled fillcolor="#E8EED2" + margin="0.05,0"] +"api.rst" -> "api.html" +"index.rst" -> "index.html" +"tutorial.rst" -> "tutorial.html" +} \ No newline at end of file diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.png" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure1.png" new file mode 100644 index 0000000000000000000000000000000000000000..f3e5e84b248d9087d728089c77242bac08562d7b GIT binary patch literal 9824 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 literal 0 HcmV?d00001 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure2.png" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure2.png" new file mode 100644 index 0000000000000000000000000000000000000000..b1bedf519794ddbffda5ef0ae64d9b2c4a02ac9f GIT binary patch literal 18476 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 literal 0 HcmV?d00001 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure3.png" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure3.png" new file mode 100644 index 0000000000000000000000000000000000000000..5982e8f95694065e3d6d2f35062aafc78eb68ec2 GIT binary patch literal 9980 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 b`hrykd()wgs%;6UvmwYzDoNCe8HfHqhUeK4 literal 0 HcmV?d00001 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure4.png" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/figure4.png" new file mode 100644 index 0000000000000000000000000000000000000000..dc5f415ba22a714b589e3b2df28cc769b17e3cb6 GIT binary patch literal 44574 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�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 J6)0N1`9Gl}H=h6i literal 0 HcmV?d00001 From 008c0973a0234a29052fe48180e3bb5c23670c3b Mon Sep 17 00:00:00 2001 From: JoyceCoder Date: Thu, 12 Mar 2020 16:43:21 +0800 Subject: [PATCH 2/4] push from JoyceCoder --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4e2c9db..2fbbeef 100644 --- a/README.md +++ b/README.md @@ -17,18 +17,19 @@ |[A Web Crawler With asyncio Coroutines](http://aosabook.org/en/500L/pages/a-web-crawler-with-asyncio-coroutines.html)|A. Jesse Jiryu Davis and Guido van Rossum|[高效爬虫与协程](https://linux.cn/article-8265-1.html)| |[Dagoba: an in-memory graph database](http://aosabook.org/en/500L/pages/dagoba-an-in-memory-graph-database.html)|Dann Toliver|Dagoba:内存中的图形数据库| |[DBDB: Dog Bed Database](http://aosabook.org/en/500L/pages/dbdb-dog-bed-database.html)|Taavi Burns|[DBDB:非关系型数据库](https://github.com/HT524/500LineorLess_CN/blob/master/DBDB_Dog%20Bed%20Database/DBDB_%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93.md)| -|[A Flow Shop Scheduler](http://aosabook.org/en/500L/pages/a-flow-shop-scheduler.html)|Dr. Christian Muise|Flow Shop 调度问题| +|[A Flow Shop Scheduler](http://aosabook.org/en/500L/pages/a-flow-shop-scheduler.html)|Dr. Christian Muise|[Flow Shop 调度问题](https://github.com/JoyceCoder/500LineorLess_CN/tree/master/Flow Shop调度问题 A Flow Shop Scheduler)| |[An Archaeology-Inspired Database](http://aosabook.org/en/500L/pages/an-archaeology-inspired-database.html)|Yoav Rubin|Python 实现数据库| -|[ A Python Interpreter Written in Python](http://aosabook.org/en/500L/pages/a-python-interpreter-written-in-python.html)|Allison Kaptur|[Python 解析器](https://linux.cn/article-7753-1.html)| +|[A Python Interpreter Written in Python](http://aosabook.org/en/500L/pages/a-python-interpreter-written-in-python.html)|Allison Kaptur|[Python 解析器](https://linux.cn/article-7753-1.html)| |[A 3D Modeller](http://aosabook.org/en/500L/pages/a-3d-modeller.html)|Erick Dransch|3D建模| -|[ A Simple Object Model](http://aosabook.org/en/500L/pages/a-simple-object-model.html)|Carl Friedrich Bolz|[简易对象模型](http://manjusaka.itscoder.com/2016/12/15/A-Simple-Object-Model/)| +|[A Simple Object Model](http://aosabook.org/en/500L/pages/a-simple-object-model.html)|Carl Friedrich Bolz|[简易对象模型](http://manjusaka.itscoder.com/2016/12/15/A-Simple-Object-Model/)| |[Optical Character Recognition (OCR)](http://aosabook.org/en/500L/pages/optical-character-recognition-ocr.html)|Marina Samuel|[光学文字识别](https://github.com/HT524/500LineorLess_CN/blob/master/%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB%20Optical%20Character%20Recognition%20(OCR)%2F%E5%85%89%E5%AD%A6%E6%96%87%E5%AD%97%E8%AF%86%E5%88%AB.md)| |[A Pedometer in the Real World](http://aosabook.org/en/500L/pages/a-pedometer-in-the-real-world.html)|Dessy Daskalov|现实计步器| -|[ A Rejection Sampler](http://aosabook.org/en/500L/pages/a-rejection-sampler.html)|Jessica B. Hamrick|[决策取样器](https://github.com/HT524/500LineorLess_CN/blob/master/%E5%86%B3%E7%AD%96%E9%87%87%E6%A0%B7%E5%99%A8_A_Rejection_Sampler/%E5%86%B3%E7%AD%96%E9%87%87%E6%A0%B7%E5%99%A8_A_Rejection_Sampler.md)| -|[ Web Spreadsheet](http://aosabook.org/en/500L/pages/web-spreadsheet.html)|Audrey Tang|Web 电子表格[(繁体中文版)](https://github.com/aosabook/500lines/blob/master/spreadsheet/spreadsheet.zh-tw.markdown)| +|[A Rejection Sampler](http://aosabook.org/en/500L/pages/a-rejection-sampler.html)|Jessica B. Hamrick|[决策取样器](https://github.com/HT524/500LineorLess_CN/blob/master/%E5%86%B3%E7%AD%96%E9%87%87%E6%A0%B7%E5%99%A8_A_Rejection_Sampler/%E5%86%B3%E7%AD%96%E9%87%87%E6%A0%B7%E5%99%A8_A_Rejection_Sampler.md)| +|[Web Spreadsheet](http://aosabook.org/en/500L/pages/web-spreadsheet.html)|Audrey Tang|Web 电子表格[(繁体中文版)](https://github.com/aosabook/500lines/blob/master/spreadsheet/spreadsheet.zh-tw.markdown)| |[Static Analysis](http://aosabook.org/en/500L/pages/static-analysis.html)|Leah Hanson|静态检查| |[A Template Engine](http://aosabook.org/en/500L/pages/a-template-engine.html)|Ned Batchelder|[模板引擎](http://www.jianshu.com/p/b5d4aa45e771)| -|[ A Simple Web Server](http://aosabook.org/en/500L/pages/a-simple-web-server.html)|Greg Wilson|[简易Web服务器](https://github.com/HT524/500LineorLess_CN/blob/master/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8%20A%20simple%20web%20server/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8.md)| +|[A Simple Web Server](http://aosabook.org/en/500L/pages/a-simple-web-server.html)|Greg Wilson|[简易Web服务器](https://github.com/HT524/500LineorLess_CN/blob/master/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8%20A%20simple%20web%20server/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8.md)| +|[Contingent: A Fully Dynamic System](http://aosabook.org/en/500L/contingent-a-fully-dynamic-build-system.html)|Brandon Rhodes and Daniel Rocco|[动态构建系统](https://github.com/JoyceCoder/500LineorLess_CN/tree/master/动态构建系统Contingent A Fully Dynamic Build System)| ## 术语库 @@ -50,7 +51,7 @@ |A Web Crawler With asyncio Coroutines|[harold](https://github.com/haroldrandom) , [skhe](https://github.com/skhe)|翻译中| |Dagoba: an in-memory graph database|[yanwang10](https://github.com/yanwang10)|翻译中| |DBDB: Dog Bed Database|[JinXJinX](https://github.com/JinXJinX)|已完成| -|A Flow Shop Scheduler|待认领|| +|A Flow Shop Scheduler|[JoyceCoder](https://github.com/JoyceCoder)|已完成| |An Archaeology-Inspired Database|待认领|| |A Python Interpreter Written in Python|[qingyunha](https://github.com/qingyunha)|已完成| |A 3D Modeller|[Kalung Tsang](https://github.com/TsangKalung)|翻译中| @@ -62,3 +63,5 @@ |Static Analysis|待认领|| |A Template Engine|[treelake](http://www.jianshu.com/users/66f24f2c0f36/latest_articles)|已完成| |A Simple Web Server|[skhe](https://github.com/skhe)|已完成| +|Contingent:A Fully Dynamic System|[JoyceCoder](https://github.com/JoyceCoder)|已完成| + From 4ef0a1129dce72bbf9df94ee763cbb3a343b0656 Mon Sep 17 00:00:00 2001 From: JoyceCoder Date: Thu, 12 Mar 2020 16:46:49 +0800 Subject: [PATCH 3/4] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2fbbeef..8d9f034 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ |[A Web Crawler With asyncio Coroutines](http://aosabook.org/en/500L/pages/a-web-crawler-with-asyncio-coroutines.html)|A. Jesse Jiryu Davis and Guido van Rossum|[高效爬虫与协程](https://linux.cn/article-8265-1.html)| |[Dagoba: an in-memory graph database](http://aosabook.org/en/500L/pages/dagoba-an-in-memory-graph-database.html)|Dann Toliver|Dagoba:内存中的图形数据库| |[DBDB: Dog Bed Database](http://aosabook.org/en/500L/pages/dbdb-dog-bed-database.html)|Taavi Burns|[DBDB:非关系型数据库](https://github.com/HT524/500LineorLess_CN/blob/master/DBDB_Dog%20Bed%20Database/DBDB_%E9%9D%9E%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93.md)| -|[A Flow Shop Scheduler](http://aosabook.org/en/500L/pages/a-flow-shop-scheduler.html)|Dr. Christian Muise|[Flow Shop 调度问题](https://github.com/JoyceCoder/500LineorLess_CN/tree/master/Flow Shop调度问题 A Flow Shop Scheduler)| +|[A Flow Shop Scheduler](http://aosabook.org/en/500L/pages/a-flow-shop-scheduler.html)|Dr. Christian Muise|[Flow Shop 调度问题](https://github.com/JoyceCoder/500LineorLess_CN/blob/master/Flow%20Shop%E8%B0%83%E5%BA%A6%E9%97%AE%E9%A2%98%20A%20Flow%20Shop%20Scheduler)| |[An Archaeology-Inspired Database](http://aosabook.org/en/500L/pages/an-archaeology-inspired-database.html)|Yoav Rubin|Python 实现数据库| |[A Python Interpreter Written in Python](http://aosabook.org/en/500L/pages/a-python-interpreter-written-in-python.html)|Allison Kaptur|[Python 解析器](https://linux.cn/article-7753-1.html)| |[A 3D Modeller](http://aosabook.org/en/500L/pages/a-3d-modeller.html)|Erick Dransch|3D建模| @@ -29,7 +29,7 @@ |[Static Analysis](http://aosabook.org/en/500L/pages/static-analysis.html)|Leah Hanson|静态检查| |[A Template Engine](http://aosabook.org/en/500L/pages/a-template-engine.html)|Ned Batchelder|[模板引擎](http://www.jianshu.com/p/b5d4aa45e771)| |[A Simple Web Server](http://aosabook.org/en/500L/pages/a-simple-web-server.html)|Greg Wilson|[简易Web服务器](https://github.com/HT524/500LineorLess_CN/blob/master/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8%20A%20simple%20web%20server/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8.md)| -|[Contingent: A Fully Dynamic System](http://aosabook.org/en/500L/contingent-a-fully-dynamic-build-system.html)|Brandon Rhodes and Daniel Rocco|[动态构建系统](https://github.com/JoyceCoder/500LineorLess_CN/tree/master/动态构建系统Contingent A Fully Dynamic Build System)| +|[Contingent: A Fully Dynamic System](http://aosabook.org/en/500L/contingent-a-fully-dynamic-build-system.html)|Brandon Rhodes and Daniel Rocco|[动态构建系统](https://github.com/JoyceCoder/500LineorLess_CN/blob/master/%E5%8A%A8%E6%80%81%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9FContingent%20A%20Fully%20Dynamic%20Build%20System/ex6-contigent.ipynb)| ## 术语库 From 4e66065e22e65496edff0bf99be9696805a696bc Mon Sep 17 00:00:00 2001 From: JoyceCoder Date: Thu, 12 Mar 2020 16:52:31 +0800 Subject: [PATCH 4/4] fix something --- .../ex3-shopSche.ipynb" | 2 +- README.md | 2 +- .../ex6-contigent.ipynb" | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/ex3-shopSche.ipynb" "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/ex3-shopSche.ipynb" index 4b17549..7f425f8 100644 --- "a/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/ex3-shopSche.ipynb" +++ "b/Flow Shop\350\260\203\345\272\246\351\227\256\351\242\230 A Flow Shop Scheduler/ex3-shopSche.ipynb" @@ -1082,4 +1082,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file diff --git a/README.md b/README.md index 8d9f034..99d5467 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ |[Static Analysis](http://aosabook.org/en/500L/pages/static-analysis.html)|Leah Hanson|静态检查| |[A Template Engine](http://aosabook.org/en/500L/pages/a-template-engine.html)|Ned Batchelder|[模板引擎](http://www.jianshu.com/p/b5d4aa45e771)| |[A Simple Web Server](http://aosabook.org/en/500L/pages/a-simple-web-server.html)|Greg Wilson|[简易Web服务器](https://github.com/HT524/500LineorLess_CN/blob/master/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8%20A%20simple%20web%20server/%E7%AE%80%E6%98%93web%E6%9C%8D%E5%8A%A1%E5%99%A8.md)| -|[Contingent: A Fully Dynamic System](http://aosabook.org/en/500L/contingent-a-fully-dynamic-build-system.html)|Brandon Rhodes and Daniel Rocco|[动态构建系统](https://github.com/JoyceCoder/500LineorLess_CN/blob/master/%E5%8A%A8%E6%80%81%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9FContingent%20A%20Fully%20Dynamic%20Build%20System/ex6-contigent.ipynb)| +|[Contingent: A Fully Dynamic System](http://aosabook.org/en/500L/contingent-a-fully-dynamic-build-system.html)|Brandon Rhodes and Daniel Rocco|[动态构建系统](https://github.com/JoyceCoder/500LineorLess_CN/blob/master/%E5%8A%A8%E6%80%81%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9FContingent%20A%20Fully%20Dynamic%20Build%20System)| ## 术语库 diff --git "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" index 09d7119..24e34b4 100644 --- "a/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" +++ "b/\345\212\250\346\200\201\346\236\204\345\273\272\347\263\273\347\273\237Contingent A Fully Dynamic Build System/ex6-contigent.ipynb" @@ -1383,4 +1383,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} +} \ No newline at end of file