├── LICENSE
├── README.md
├── data
├── PorscheTaycan.xlsx
└── WineryFreights.xlsx
├── examples
├── JupyterLab
│ ├── Tutorial Capacity
│ │ ├── Compound Capacity
│ │ │ ├── comp_capacity1.ipynb
│ │ │ ├── comp_capacity2a.ipynb
│ │ │ └── comp_capacity2b.ipynb
│ │ └── Single Capacity
│ │ │ ├── capacity 1.ipynb
│ │ │ ├── capacity 2a.ipynb
│ │ │ ├── capacity 2b.ipynb
│ │ │ ├── capacity 2c.ipynb
│ │ │ ├── capacity 3a.ipynb
│ │ │ └── capacity 3b.ipynb
│ ├── Tutorial LoadFreights
│ │ └── exa_load_freights.ipynb
│ ├── Tutorial Logistics
│ │ ├── Exa_Chapter_2.ipynb
│ │ ├── Exa_Chapter_4.ipynb
│ │ └── Exa_Chapter_5.ipynb
│ ├── Tutorial Manufacturing
│ │ ├── 1 Simple Recipes
│ │ │ ├── recipe1.ipynb
│ │ │ ├── recipe2a.ipynb
│ │ │ ├── recipe2b.ipynb
│ │ │ └── recipe2c.ipynb
│ │ └── 2 Recipes with Substitution
│ │ │ ├── porsche_Taycan.ipynb
│ │ │ ├── product_subst3rd_1a.ipynb
│ │ │ ├── product_subst3rd_1b.ipynb
│ │ │ ├── product_subst3rd_2a.ipynb
│ │ │ ├── product_subst3rd_2b.ipynb
│ │ │ └── product_subst3rd_2c.ipynb
│ └── Tutorial Paths
│ │ ├── exa_dyn_path1.ipynb
│ │ ├── exa_dyn_path2.ipynb
│ │ ├── exa_get_paths.ipynb
│ │ └── exa_new_path.ipynb
└── JupyterNotebook
│ ├── Exa_Algorithm_Backstage_Chapter6.ipynb
│ ├── Exa_Distribution_Network_Chapter1.ipynb
│ ├── Exa_Distribution_Network_Chapter2.ipynb
│ ├── Exa_Distribution_Network_Chapter3.ipynb
│ ├── Exa_Distribution_Network_Chapter4.ipynb
│ ├── Exa_Distribution_Network_Chapter5.ipynb
│ ├── Exa_LoadFreights_Chapter7.ipynb
│ └── Exa_Setting_Paths_Chapter8.ipynb
├── lib
├── Install.txt
├── aitpath.py
└── sunflow.py
└── tutorial
├── SunFlow Tutorial Part I .pdf
└── SunFlow Tutorial Part II.pdf
/LICENSE:
--------------------------------------------------------------------------------
1 | SunFlow's BSD 3-Clause License Agreement
2 |
3 | Copyright (c) 2019-2020, AI-Technologies - Rainer Wallwitz
4 | All rights reserved.
5 |
6 |
7 | 1. This LICENSE AGREEMENT is between the ' AI Technologies ("AIT") and the Individual or Organization ("Licensee") accessing and otherwise using SunFlow software ("SUNFLOW") in source or binary form and its associated documentation.
8 |
9 | 2. Subject to the terms and conditions of this License Agreement, AIT hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use SUNFLOW alone or in any derivative version, provided, however, that AIT's License Agreement and AIT's notice of copyright, i.e., "Copyright (c) 2019-2020 AI-Technologies; All Rights Reserved" are retained in SUNFLOW alone or in any derivative version prepared by Licensee.
10 |
11 | 3. In the event Licensee prepares a derivative work that is based on or incorporates SUNFLOW or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to SUNFLOW.
12 |
13 | 4. By copying, installing or otherwise using SUNFLOW, Licensee agrees to be bound by the terms and conditions of this License Agreement.
14 |
15 | THE SOFTWARE SUNFLOW IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USEOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
17 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | # Design & Optimize your Supply Chain
4 |
5 | SunFlow is a tool to design and optimize your Supply Chains. In SunFlow a supply model is made of materials, components, parts, products, substitutes, suppliers, manufacturers, distributors and customers - just to mention the major ones - together with fix and variable costs, capacities and other constraints. With SunFlow you model all kinds of industrial supply chains from simple transportation networks up to complex multi-level manufacturing setups.
6 |
7 | Tutorials
8 | ---------
9 |
10 | Illustrative tutorials explain SunFlow's capabilities and their usage by Python examples step-by-step. Their source code is inside the examples folder.
11 |
12 | Powerful Graphics
13 | -----------------
14 |
15 | SunFlow got powerful graphics. Your network can be displayed at any time. Have a look on the artificial and schematic assembly of a Porsche Taycan electric as an example. First you graph the network with all potential connections and definitions for cost, freight, capacities, products, components, suppliers, plants, distribution centers and customers or markets.
16 |
17 |
18 |
19 | Once you got the network, execute its potential flows to identify the cost-optimal paths, i.e. optimize it. The optimized network is shown below.
20 |
21 |
22 |
23 | The optimized model above shows active (blue) and inactive flows (gray) as well as active participants (gray boxes) and inactive participants (white boxes). In complex models this could be confusing. This is why SunFlow offers an option to display only those vertices and edges, which have an active flow in its optimized model (see below).
24 |
25 |
26 |
27 | Network Compiler
28 | ----------------
29 |
30 | SunFlow's supply networks are build up in a way Supply Chain Architects think: in terms of components, materials, products, suppliers, plants, assembly lines, reactors, warehouses, distribution centers, customers, markets,... The above shown charts are made by the Python code example below.
31 |
32 |
33 |
34 | Library
35 | -------
36 |
37 | SunFlow's library 'sunflow.py' is in the folder 'lib' together with an installation guide.
38 |
39 | Dependencies
40 | ------------
41 |
42 | SunFlow supports Python 3.6+
43 |
44 | The installation requires [numpy](http://www.numpy.org/), [scipy](http://www.scipy.org/), [pandas](http://pandas.pydata.org/) and [graphviz](https://www.graphviz.org).
45 |
46 |
47 | Data
48 | ----
49 |
50 | Some of the examples use data which are inside the folder 'data'.
51 |
52 | Installation
53 | ------------
54 |
55 | To install SunFlow on your computer, press 'Clone or download' on SunFlow's Repository site and choose the 'Download ZIP' option. Then SunFlow will be copied into a folder 'SunFlow' or zip inside your download directory, containing the complete SunFlow repository. To proceed further, read the installation guide of folder 'lib'.
56 |
57 |
--------------------------------------------------------------------------------
/data/PorscheTaycan.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aitechtools/SunFlow/f980adaba88aa3877651e1504afe8b259543c50b/data/PorscheTaycan.xlsx
--------------------------------------------------------------------------------
/data/WineryFreights.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aitechtools/SunFlow/f980adaba88aa3877651e1504afe8b259543c50b/data/WineryFreights.xlsx
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Compound Capacity/comp_capacity1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 3,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "sun = InitSunflow()\n",
14 | "\n",
15 | "prod_loc = Location('prod city')\n",
16 | "log1_loc = Location('log city 1')\n",
17 | "log2_loc = Location('log city 2')\n",
18 | "cust_loc = Location('cust city')\n",
19 | "\n",
20 | "\n",
21 | "producer = Producer('Prod') .at(prod_loc)\n",
22 | "log1 = Logistics('Log1').at(log1_loc)\n",
23 | "log2 = Logistics('Log2').at(log2_loc)\n",
24 | "customer = Customer('Cust') .at(cust_loc)\n",
25 | "\n",
26 | "Freight(prod_loc, log1_loc, 70) \n",
27 | "Freight(prod_loc, log2_loc, 70)\n",
28 | "Freight(prod_loc, cust_loc, 90) \n",
29 | "Freight(log1_loc, cust_loc, 10)\n",
30 | "Freight(log2_loc, cust_loc, 10)\n",
31 | "\n",
32 | "n = SupplyNet('CompoundCapcacity 1')\n",
33 | "\n",
34 | "prod = n.source() .at(producer).capacity(200)\n",
35 | "dist1 = n.distribution(prod).at(log1) .capacity(150) \n",
36 | "dist2 = n.distribution(prod).at(log2) .capacity(150) \n",
37 | "\n",
38 | "cust = n.delivery(dist1,dist2,prod) .at(customer) .demand(100)\n",
39 | "\n",
40 | "n.compile()\n",
41 | "\n",
42 | "n.showGraph().view()\n",
43 | "n.execute().showGraph().view()\n",
44 | "\n"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": null,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": []
53 | }
54 | ],
55 | "metadata": {
56 | "kernelspec": {
57 | "display_name": "Python 3",
58 | "language": "python",
59 | "name": "python3"
60 | },
61 | "language_info": {
62 | "codemirror_mode": {
63 | "name": "ipython",
64 | "version": 3
65 | },
66 | "file_extension": ".py",
67 | "mimetype": "text/x-python",
68 | "name": "python",
69 | "nbconvert_exporter": "python",
70 | "pygments_lexer": "ipython3",
71 | "version": "3.7.6"
72 | }
73 | },
74 | "nbformat": 4,
75 | "nbformat_minor": 4
76 | }
77 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Compound Capacity/comp_capacity2a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "sun = InitSunflow()\n",
14 | "\n",
15 | "prod_loc = Location('prod city')\n",
16 | "log1_loc = Location('log city 1')\n",
17 | "log2_loc = Location('log city 2')\n",
18 | "cust_loc = Location('cust city')\n",
19 | "\n",
20 | "capa_distrib = Capacity('Distribution',80)\n",
21 | "\n",
22 | "producer = Producer('Prod').at(prod_loc)\n",
23 | "log1 = Logistics('Log1').at(log1_loc).compoundCapacity(capa_distrib)\n",
24 | "log2 = Logistics('Log2').at(log2_loc).compoundCapacity(capa_distrib)\n",
25 | "customer = Customer('Cust').at(cust_loc)\n",
26 | "\n",
27 | "Freight(prod_loc, log1_loc, 70) \n",
28 | "Freight(prod_loc, log2_loc, 70)\n",
29 | "Freight(prod_loc, cust_loc, 90) \n",
30 | "Freight(log1_loc, cust_loc, 10)\n",
31 | "Freight(log2_loc, cust_loc, 10)\n",
32 | "\n",
33 | "\n",
34 | "\n",
35 | "n = SupplyNet('CompoundCapcacity 2a')\n",
36 | "\n",
37 | "prod = n.source() .at(producer).capacity(200)\n",
38 | "dist1 = n.distribution(prod).at(log1) .capacity(150) \n",
39 | "dist2 = n.distribution(prod).at(log2) .capacity(150) \n",
40 | "\n",
41 | "cust = n.delivery(dist1,dist2,prod) .at(customer) .demand(100)\n",
42 | "\n",
43 | "n.compile()\n",
44 | "\n",
45 | "n.showGraph().view()\n",
46 | "n.execute().showGraph().view()\n",
47 | "\n"
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": null,
53 | "metadata": {},
54 | "outputs": [],
55 | "source": []
56 | }
57 | ],
58 | "metadata": {
59 | "kernelspec": {
60 | "display_name": "Python 3",
61 | "language": "python",
62 | "name": "python3"
63 | },
64 | "language_info": {
65 | "codemirror_mode": {
66 | "name": "ipython",
67 | "version": 3
68 | },
69 | "file_extension": ".py",
70 | "mimetype": "text/x-python",
71 | "name": "python",
72 | "nbconvert_exporter": "python",
73 | "pygments_lexer": "ipython3",
74 | "version": "3.7.6"
75 | }
76 | },
77 | "nbformat": 4,
78 | "nbformat_minor": 4
79 | }
80 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Compound Capacity/comp_capacity2b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "#sun = InitSunflow()\n",
14 | "\n",
15 | "prod_loc = Location('prod city')\n",
16 | "log1_loc = Location('log city 1')\n",
17 | "log2_loc = Location('log city 2')\n",
18 | "cust_loc = Location('cust city')\n",
19 | "\n",
20 | "capa_distrib = Capacity('Distribution',80)\n",
21 | "\n",
22 | "producer = Producer('Prod').at(prod_loc)\n",
23 | "log1 = Logistics('Log1').at(log1_loc).compoundCapacity(capa_distrib)\n",
24 | "log2 = Logistics('Log2').at(log2_loc).compoundCapacity(capa_distrib)\n",
25 | "customer = Customer('Cust').at(cust_loc)\n",
26 | "\n",
27 | "Freight(prod_loc, log1_loc, 40) # was 70 in 2a\n",
28 | "Freight(prod_loc, log2_loc, 70)\n",
29 | "Freight(prod_loc, cust_loc, 90) \n",
30 | "Freight(log1_loc, cust_loc, 10)\n",
31 | "Freight(log2_loc, cust_loc, 10)\n",
32 | "\n",
33 | "\n",
34 | "\n",
35 | "n = SupplyNet('CompoundCapcacity 2b')\n",
36 | "\n",
37 | "prod = n.source() .at(producer).capacity(200)\n",
38 | "dist1 = n.distribution(prod).at(log1) .capacity(150) \n",
39 | "dist2 = n.distribution(prod).at(log2) .capacity(150) \n",
40 | "\n",
41 | "cust = n.delivery(dist1,dist2,prod) .at(customer) .demand(100)\n",
42 | "\n",
43 | "n.compile()\n",
44 | "\n",
45 | "n.showGraph().view()\n",
46 | "n.execute().showGraph().view()\n",
47 | "\n"
48 | ]
49 | },
50 | {
51 | "cell_type": "code",
52 | "execution_count": null,
53 | "metadata": {},
54 | "outputs": [],
55 | "source": []
56 | }
57 | ],
58 | "metadata": {
59 | "kernelspec": {
60 | "display_name": "Python 3",
61 | "language": "python",
62 | "name": "python3"
63 | },
64 | "language_info": {
65 | "codemirror_mode": {
66 | "name": "ipython",
67 | "version": 3
68 | },
69 | "file_extension": ".py",
70 | "mimetype": "text/x-python",
71 | "name": "python",
72 | "nbconvert_exporter": "python",
73 | "pygments_lexer": "ipython3",
74 | "version": "3.7.6"
75 | }
76 | },
77 | "nbformat": 4,
78 | "nbformat_minor": 4
79 | }
80 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 3,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "#sun = InitSunflow()\n",
13 | "\n",
14 | "producer = Producer('Prod')\n",
15 | "log = Logistics('Log')\n",
16 | "customer = Customer('Cust')\n",
17 | "\n",
18 | "n = SupplyNet('Capcacity 1')\n",
19 | "\n",
20 | "prod = n.source() .at(producer)\n",
21 | "log = n.distribution(prod).at(log)\n",
22 | "cust = n.delivery(log) .at(customer).demand(100)\n",
23 | "\n",
24 | "n.compile()\n",
25 | "\n",
26 | "n.showGraph().view()\n",
27 | "n.execute().showGraph().view()\n",
28 | "\n",
29 | "\n"
30 | ]
31 | },
32 | {
33 | "cell_type": "code",
34 | "execution_count": null,
35 | "metadata": {},
36 | "outputs": [],
37 | "source": []
38 | }
39 | ],
40 | "metadata": {
41 | "kernelspec": {
42 | "display_name": "Python 3",
43 | "language": "python",
44 | "name": "python3"
45 | },
46 | "language_info": {
47 | "codemirror_mode": {
48 | "name": "ipython",
49 | "version": 3
50 | },
51 | "file_extension": ".py",
52 | "mimetype": "text/x-python",
53 | "name": "python",
54 | "nbconvert_exporter": "python",
55 | "pygments_lexer": "ipython3",
56 | "version": "3.7.6"
57 | }
58 | },
59 | "nbformat": 4,
60 | "nbformat_minor": 4
61 | }
62 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 2a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "producer = Producer('Prod')\n",
14 | "log = Logistics('Log')\n",
15 | "customer = Customer('Cust')\n",
16 | "\n",
17 | "n = SupplyNet('Capcacity 2a')\n",
18 | "\n",
19 | "prod = n.source() .at(producer).capacity(200)\n",
20 | "log = n.distribution(prod).at(log) .capacity(300) \n",
21 | "\n",
22 | "cust = n.delivery(log) .at(customer).demand(100)\n",
23 | "\n",
24 | "n.compile()\n",
25 | "\n",
26 | "n.showGraph().view()\n",
27 | "n.execute().showGraph().view()\n",
28 | "\n",
29 | "\n"
30 | ]
31 | },
32 | {
33 | "cell_type": "code",
34 | "execution_count": null,
35 | "metadata": {},
36 | "outputs": [],
37 | "source": []
38 | }
39 | ],
40 | "metadata": {
41 | "kernelspec": {
42 | "display_name": "Python 3",
43 | "language": "python",
44 | "name": "python3"
45 | },
46 | "language_info": {
47 | "codemirror_mode": {
48 | "name": "ipython",
49 | "version": 3
50 | },
51 | "file_extension": ".py",
52 | "mimetype": "text/x-python",
53 | "name": "python",
54 | "nbconvert_exporter": "python",
55 | "pygments_lexer": "ipython3",
56 | "version": "3.7.6"
57 | }
58 | },
59 | "nbformat": 4,
60 | "nbformat_minor": 4
61 | }
62 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 2b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "\n",
14 | "sun = InitSunflow()\n",
15 | "\n",
16 | "producer = Producer('Prod')\n",
17 | "log = Logistics('Log')\n",
18 | "customer = Customer('Cust')\n",
19 | "\n",
20 | "capa_prod = Capacity(200)\n",
21 | "capa_log = Capacity(300)\n",
22 | "\n",
23 | "n = SupplyNet('Capcacity 2b')\n",
24 | "\n",
25 | "prod = n.source() .at(producer).capacity(capa_prod)\n",
26 | "log = n.distribution(prod).at(log) .capacity(capa_log)\n",
27 | "\n",
28 | "cust = n.delivery(log) .at(customer).demand(100)\n",
29 | "\n",
30 | "n.compile()\n",
31 | "\n",
32 | "n.showGraph().view()\n",
33 | "n.execute().showGraph().view()\n",
34 | "\n",
35 | "\n"
36 | ]
37 | },
38 | {
39 | "cell_type": "code",
40 | "execution_count": null,
41 | "metadata": {},
42 | "outputs": [],
43 | "source": []
44 | }
45 | ],
46 | "metadata": {
47 | "kernelspec": {
48 | "display_name": "Python 3",
49 | "language": "python",
50 | "name": "python3"
51 | },
52 | "language_info": {
53 | "codemirror_mode": {
54 | "name": "ipython",
55 | "version": 3
56 | },
57 | "file_extension": ".py",
58 | "mimetype": "text/x-python",
59 | "name": "python",
60 | "nbconvert_exporter": "python",
61 | "pygments_lexer": "ipython3",
62 | "version": "3.7.6"
63 | }
64 | },
65 | "nbformat": 4,
66 | "nbformat_minor": 4
67 | }
68 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 2c.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "sun = InitSunflow()\n",
14 | "\n",
15 | "producer = Producer('Prod')\n",
16 | "log = Logistics('Log')\n",
17 | "customer = Customer('Cust')\n",
18 | "\n",
19 | "capa_prod = Capacity(80)\n",
20 | "capa_log = Capacity(300)\n",
21 | "\n",
22 | "n = SupplyNet('Capcacity 2c')\n",
23 | "\n",
24 | "prod = n.source() .at(producer).capacity(capa_prod)\n",
25 | "log = n.distribution(prod).at(log) .capacity(capa_log)\n",
26 | "\n",
27 | "cust = n.delivery(log) .at(customer).demand(100)\n",
28 | "\n",
29 | "n.compile()\n",
30 | "\n",
31 | "n.showGraph().view()\n",
32 | "n.execute().showGraph().view()\n",
33 | "\n",
34 | "\n"
35 | ]
36 | },
37 | {
38 | "cell_type": "code",
39 | "execution_count": null,
40 | "metadata": {},
41 | "outputs": [],
42 | "source": []
43 | }
44 | ],
45 | "metadata": {
46 | "kernelspec": {
47 | "display_name": "Python 3",
48 | "language": "python",
49 | "name": "python3"
50 | },
51 | "language_info": {
52 | "codemirror_mode": {
53 | "name": "ipython",
54 | "version": 3
55 | },
56 | "file_extension": ".py",
57 | "mimetype": "text/x-python",
58 | "name": "python",
59 | "nbconvert_exporter": "python",
60 | "pygments_lexer": "ipython3",
61 | "version": "3.7.6"
62 | }
63 | },
64 | "nbformat": 4,
65 | "nbformat_minor": 4
66 | }
67 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 3a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "\n",
14 | "sun = InitSunflow()\n",
15 | "\n",
16 | "producer = Producer('Prod')\n",
17 | "log = Logistics('Log')\n",
18 | "customer = Customer('Cust')\n",
19 | "\n",
20 | "capa_prod = Capacity(200)\n",
21 | "capa_log = Capacity(80)\n",
22 | "\n",
23 | "n = SupplyNet('Capcacity 3a')\n",
24 | "\n",
25 | "prod = n.source() .at(producer).capacity(capa_prod)\n",
26 | "log = n.distribution(prod).at(log) .capacity(capa_log)\n",
27 | "\n",
28 | "cust = n.delivery(log,prod) .at(customer).demand(100)\n",
29 | "\n",
30 | "n.compile()\n",
31 | "\n",
32 | "n.showGraph().view()\n",
33 | "n.execute().showGraph().view()\n",
34 | "\n",
35 | "\n"
36 | ]
37 | },
38 | {
39 | "cell_type": "code",
40 | "execution_count": null,
41 | "metadata": {},
42 | "outputs": [],
43 | "source": []
44 | }
45 | ],
46 | "metadata": {
47 | "kernelspec": {
48 | "display_name": "Python 3",
49 | "language": "python",
50 | "name": "python3"
51 | },
52 | "language_info": {
53 | "codemirror_mode": {
54 | "name": "ipython",
55 | "version": 3
56 | },
57 | "file_extension": ".py",
58 | "mimetype": "text/x-python",
59 | "name": "python",
60 | "nbconvert_exporter": "python",
61 | "pygments_lexer": "ipython3",
62 | "version": "3.7.6"
63 | }
64 | },
65 | "nbformat": 4,
66 | "nbformat_minor": 4
67 | }
68 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Capacity/Single Capacity/capacity 3b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "prod_loc = Location('prod city')\n",
14 | "log_loc = Location('log city')\n",
15 | "cust_loc = Location('cust city')\n",
16 | "\n",
17 | "producer = Producer('Prod').at(prod_loc)\n",
18 | "log = Logistics('Log').at(log_loc)\n",
19 | "customer = Customer('Cust').at(cust_loc)\n",
20 | "\n",
21 | "Freight(prod_loc, log_loc, 70)\n",
22 | "Freight(prod_loc, cust_loc, 90) # 90\n",
23 | "Freight(log_loc, cust_loc, 10)\n",
24 | "\n",
25 | "capa_prod = Capacity(200)\n",
26 | "capa_log = Capacity(80)\n",
27 | "\n",
28 | "n = SupplyNet('Capcacity 3b')\n",
29 | "\n",
30 | "prod = n.source() .at(producer).capacity(capa_prod)\n",
31 | "log = n.distribution(prod).at(log) .capacity(capa_log)\n",
32 | "\n",
33 | "cust = n.delivery(log,prod) .at(customer).demand(100)\n",
34 | "\n",
35 | "n.compile()\n",
36 | "\n",
37 | "n.showGraph().view()\n",
38 | "n.execute().showGraph().view()\n",
39 | "\n",
40 | "\n"
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": null,
46 | "metadata": {},
47 | "outputs": [],
48 | "source": []
49 | }
50 | ],
51 | "metadata": {
52 | "kernelspec": {
53 | "display_name": "Python 3",
54 | "language": "python",
55 | "name": "python3"
56 | },
57 | "language_info": {
58 | "codemirror_mode": {
59 | "name": "ipython",
60 | "version": 3
61 | },
62 | "file_extension": ".py",
63 | "mimetype": "text/x-python",
64 | "name": "python",
65 | "nbconvert_exporter": "python",
66 | "pygments_lexer": "ipython3",
67 | "version": "3.7.6"
68 | }
69 | },
70 | "nbformat": 4,
71 | "nbformat_minor": 4
72 | }
73 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial LoadFreights/exa_load_freights.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 4,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | "Pre-defined default paths:\n",
13 | " userDir = /users/rainer/\n",
14 | " chartDir = py/pydata/tempdata/sunflowtemp/\n",
15 | " frameDir = py/pydata/tempdata/sunflowtemp/\n",
16 | " dataDir = py/pydata/datasets/\n",
17 | "\n",
18 | " buildPath(): default path = /users/rainer/py/pydata/tempdata/sunflowtemp/\n",
19 | " buildPath(chart): file path = /users/rainer/py/pydata/tempdata/sunflowtemp/peter.xlsx\n",
20 | " buildPath(frame): file path = /users/rainer/py/pydata/tempdata/sunflowtemp/mary.xlsx\n",
21 | " buildPath(data): file path = /users/rainer/py/pydata/datasets/freight.xlsx\n",
22 | "SunFlow\n",
23 | "Entities\n",
24 | " [ 0] Location Europe\n",
25 | " [ 1] Location NewYork\n",
26 | " [ 2] Location NewOrleans\n",
27 | " [ 3] Location StLouis\n",
28 | " [ 4] Freight Europe => NewYork\n",
29 | " [ 5] Freight Europe => NewOrleans\n",
30 | " [ 6] Freight NewYork => StLouis\n",
31 | " [ 7] Freight NewOrleans => StLouis\n",
32 | "\n"
33 | ]
34 | }
35 | ],
36 | "source": [
37 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
38 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand,SunFlow\n",
39 | "\n",
40 | "sun = SunFlow()\n",
41 | "\n",
42 | "print('Pre-defined default paths:')\n",
43 | "print(' userDir = ',sun.userDir())\n",
44 | "print(' chartDir = ',sun.chartDir())\n",
45 | "print(' frameDir = ',sun.frameDir())\n",
46 | "print(' dataDir = ',sun.dataDir())\n",
47 | "\n",
48 | "print()\n",
49 | "fpath = sun.buildPath(); print(' buildPath(): default path =',fpath)\n",
50 | "fpath = sun.buildPath('peter.xlsx', path='', kind='chart'); print(' buildPath(chart): file path =',fpath)\n",
51 | "fpath = sun.buildPath('mary.xlsx', path='', kind='frame'); print(' buildPath(frame): file path =',fpath)\n",
52 | "fpath = sun.buildPath('freight.xlsx', path='', kind='data'); print(' buildPath(data): file path =',fpath)\n",
53 | "\n",
54 | "sun.dataDir('py/pydata/datasets/')\n",
55 | "sun.loadFreights('WineryFreights.xlsx')\n",
56 | "\n",
57 | "sun.show()\n",
58 | "print()"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": null,
64 | "metadata": {},
65 | "outputs": [],
66 | "source": []
67 | },
68 | {
69 | "cell_type": "code",
70 | "execution_count": null,
71 | "metadata": {},
72 | "outputs": [],
73 | "source": []
74 | }
75 | ],
76 | "metadata": {
77 | "kernelspec": {
78 | "display_name": "Python 3",
79 | "language": "python",
80 | "name": "python3"
81 | },
82 | "language_info": {
83 | "codemirror_mode": {
84 | "name": "ipython",
85 | "version": 3
86 | },
87 | "file_extension": ".py",
88 | "mimetype": "text/x-python",
89 | "name": "python",
90 | "nbconvert_exporter": "python",
91 | "pygments_lexer": "ipython3",
92 | "version": "3.7.6"
93 | }
94 | },
95 | "nbformat": 4,
96 | "nbformat_minor": 4
97 | }
98 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Logistics/Exa_Chapter_2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 5,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import SupplyNet,Logistics,Customer,Location,Freight,Producer\n",
11 | "\n",
12 | "Europe = Location('Europe') \n",
13 | "New_York = Location('New York') \n",
14 | "New_Orleans = Location('New Orleans')\n",
15 | "StLouis = Location('StLouis') \n",
16 | "\n",
17 | "Freight(Europe, New_York, 2500/20 )\n",
18 | "Freight(Europe, New_Orleans, 2900/20 )\n",
19 | "Freight(New_York, StLouis, 1200/20 )\n",
20 | "Freight(New_Orleans, StLouis, 820/20 )\n",
21 | "\n",
22 | "Winery = Producer('Winery') .at(Europe)\n",
23 | "New_York_WH = Logistics('New York WH') .at(New_York)\n",
24 | "New_Orleans_WH = Logistics('New_Orleans WH') .at(New_Orleans)\n",
25 | "Walmart = Customer('Walmart') .at(StLouis)\n",
26 | "\n",
27 | "net = SupplyNet('Chapter 2 Distribution USA').display(0)\n",
28 | "\n",
29 | "winery = net.source() .by(Winery) \n",
30 | "\n",
31 | "new_york = net.distribution(winery).n('test').by(New_York_WH).varcost(4)\n",
32 | "new_orleans = net.distribution(winery).by(New_Orleans_WH).varcost(2)\n",
33 | "\n",
34 | "walmart = net.delivery(new_york, new_orleans) .at(Walmart) .demand(20)\n",
35 | "\n",
36 | "net.compile()\n",
37 | "\n",
38 | "net.showGraph().view()\n",
39 | "\n",
40 | "net.execute().showGraph(orient='BT').view()\n",
41 | "#\n",
42 | "# ... show only those nodes which have flow\n",
43 | "#\n",
44 | "net.execute().showGraph(flowOnly=True, orient='BT').view()"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": null,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": []
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": null,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": []
60 | }
61 | ],
62 | "metadata": {
63 | "kernelspec": {
64 | "display_name": "Python 3",
65 | "language": "python",
66 | "name": "python3"
67 | },
68 | "language_info": {
69 | "codemirror_mode": {
70 | "name": "ipython",
71 | "version": 3
72 | },
73 | "file_extension": ".py",
74 | "mimetype": "text/x-python",
75 | "name": "python",
76 | "nbconvert_exporter": "python",
77 | "pygments_lexer": "ipython3",
78 | "version": "3.7.6"
79 | }
80 | },
81 | "nbformat": 4,
82 | "nbformat_minor": 4
83 | }
84 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Logistics/Exa_Chapter_4.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import SupplyNet,Logistics,Customer,Location,Freight,Producer\n",
11 | "\n",
12 | "Europe = Location('Europe') \n",
13 | "New_York = Location('New York') \n",
14 | "New_Orleans = Location('New Orleans')\n",
15 | "StLouis = Location('StLouis') \n",
16 | "\n",
17 | "Freight(Europe, New_York, 2500/20 )\n",
18 | "Freight(Europe, New_Orleans, 2900/20 )\n",
19 | "Freight(New_York, StLouis, 1200/20 )\n",
20 | "Freight(New_Orleans, StLouis, 820/20 )\n",
21 | "\n",
22 | "Winery = Producer('Winery') .at(Europe)\n",
23 | "New_York_WH = Logistics('New York WH') .at(New_York)\n",
24 | "New_Orleans_WH = Logistics('New_Orleans WH') .at(New_Orleans)\n",
25 | "Walmart = Customer('Walmart') .at(StLouis)\n",
26 | "\n",
27 | "net = SupplyNet('Chapter 2 Distribution USA').display(0)\n",
28 | "\n",
29 | "winery = net.source().n(' ') .by(Winery) \n",
30 | "\n",
31 | "new_york = net.distribution(winery).n(' ').by(New_York_WH).varcost(4)\n",
32 | "new_orleans = net.distribution(winery).n(' ').by(New_Orleans_WH).varcost(2).capacity(8)\n",
33 | "\n",
34 | "walmart = net.delivery(new_york, new_orleans).n(' ') .at(Walmart) .demand(20)\n",
35 | "\n",
36 | "net.compile()\n",
37 | "\n",
38 | "net.showGraph().view()\n",
39 | "\n",
40 | "net.execute().showGraph(orient='BT').view()\n",
41 | "#\n",
42 | "# ... show only those nodes which have flow\n",
43 | "#\n",
44 | "net.execute().showGraph(flowOnly=True, orient='BT').view()"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": null,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": []
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": null,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": []
60 | }
61 | ],
62 | "metadata": {
63 | "kernelspec": {
64 | "display_name": "Python 3",
65 | "language": "python",
66 | "name": "python3"
67 | },
68 | "language_info": {
69 | "codemirror_mode": {
70 | "name": "ipython",
71 | "version": 3
72 | },
73 | "file_extension": ".py",
74 | "mimetype": "text/x-python",
75 | "name": "python",
76 | "nbconvert_exporter": "python",
77 | "pygments_lexer": "ipython3",
78 | "version": "3.7.6"
79 | }
80 | },
81 | "nbformat": 4,
82 | "nbformat_minor": 4
83 | }
84 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Logistics/Exa_Chapter_5.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import SupplyNet,Logistics,Customer,Location,Freight,Producer,Capacity\n",
11 | "\n",
12 | "Europe = Location('Europe') \n",
13 | "New_York = Location('New York') \n",
14 | "New_Orleans = Location('New Orleans')\n",
15 | "StLouis = Location('StLouis') \n",
16 | "Baltimore = Location('Baltimore') # !!!\n",
17 | "\n",
18 | "Freight(Europe, New_York, 2500/20 )\n",
19 | "Freight(Europe, Baltimore, 2500/20 )\n",
20 | "Freight(Europe, New_Orleans, 2900/20 )\n",
21 | "Freight(New_York, StLouis, 1200/20 )\n",
22 | "Freight(Baltimore, StLouis, 1500/20 )\n",
23 | "Freight(New_Orleans, StLouis, 820/20 ) # !!!\n",
24 | "\n",
25 | "capa_WH = Capacity('Distribution',12) # !!!\n",
26 | "\n",
27 | "Winery = Producer('Winery') .at(Europe)\n",
28 | "New_York_WH = Logistics('New York WH') .at(New_York).compoundCapacity(capa_WH).capacity(30) # !!!\n",
29 | "Baltimore_WH = Logistics('Baltimore WH') .at(Baltimore)\n",
30 | "New_Orleans_WH = Logistics('New_Orleans WH') .at(New_Orleans).compoundCapacity(capa_WH).capacity(9) # !!!\n",
31 | "Walmart = Customer('Walmart') .at(StLouis) \n",
32 | "\n",
33 | "net = SupplyNet('Chapter 5 Distribution USA').display(0)\n",
34 | "\n",
35 | "winery = net.source().n(' ') .by(Winery) \n",
36 | "\n",
37 | "new_york = net.distribution(winery).n(' ').by(New_York_WH).varcost(4)\n",
38 | "baltimore = net.distribution(winery).n(' ').at(Baltimore_WH).varcost(4)\n",
39 | "new_orleans = net.distribution(winery).n(' ').by(New_Orleans_WH).varcost(2)\n",
40 | "\n",
41 | "walmart = net.delivery(new_york, baltimore, new_orleans).n(' ') .at(Walmart) .demand(20)\n",
42 | "\n",
43 | "net.compile()\n",
44 | "\n",
45 | "net.showGraph().view()\n",
46 | "\n",
47 | "net.execute().showGraph(orient='BT').view()\n",
48 | "#\n",
49 | "# ... show only those nodes which have flow\n",
50 | "#\n",
51 | "net.execute().showGraph(flowOnly=True, orient='BT').view()"
52 | ]
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": null,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": []
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": null,
64 | "metadata": {},
65 | "outputs": [],
66 | "source": []
67 | }
68 | ],
69 | "metadata": {
70 | "kernelspec": {
71 | "display_name": "Python 3",
72 | "language": "python",
73 | "name": "python3"
74 | },
75 | "language_info": {
76 | "codemirror_mode": {
77 | "name": "ipython",
78 | "version": 3
79 | },
80 | "file_extension": ".py",
81 | "mimetype": "text/x-python",
82 | "name": "python",
83 | "nbconvert_exporter": "python",
84 | "pygments_lexer": "ipython3",
85 | "version": "3.7.6"
86 | }
87 | },
88 | "nbformat": 4,
89 | "nbformat_minor": 4
90 | }
91 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/1 Simple Recipes/recipe1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 3,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('mA')\n",
14 | "mB = Material('mB')\n",
15 | "\n",
16 | "product = Product('product').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "\n",
18 | "reactor = Producer('reactor').capacity(2000) \n",
19 | "\n",
20 | "n = SupplyNet('Recipe 1')\n",
21 | "\n",
22 | "m_a = mA.raw(mA.name())\n",
23 | "m_b = mB.raw(mB.name())\n",
24 | "\n",
25 | "p_reactor = product.production( m_a, m_b).at(reactor)\n",
26 | "\n",
27 | "n.delivery(p_reactor).demand(1000)\n",
28 | "\n",
29 | "n.compile()\n",
30 | "n.showGraph().view()\n",
31 | "n.execute().showGraph().view()\n",
32 | "\n",
33 | "\n",
34 | "\n",
35 | "\n",
36 | "\n",
37 | "a=0"
38 | ]
39 | },
40 | {
41 | "cell_type": "code",
42 | "execution_count": null,
43 | "metadata": {},
44 | "outputs": [],
45 | "source": []
46 | }
47 | ],
48 | "metadata": {
49 | "kernelspec": {
50 | "display_name": "Python 3",
51 | "language": "python",
52 | "name": "python3"
53 | },
54 | "language_info": {
55 | "codemirror_mode": {
56 | "name": "ipython",
57 | "version": 3
58 | },
59 | "file_extension": ".py",
60 | "mimetype": "text/x-python",
61 | "name": "python",
62 | "nbconvert_exporter": "python",
63 | "pygments_lexer": "ipython3",
64 | "version": "3.7.6"
65 | }
66 | },
67 | "nbformat": 4,
68 | "nbformat_minor": 4
69 | }
70 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/1 Simple Recipes/recipe2a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('mA')\n",
14 | "mB = Material('mB')\n",
15 | "\n",
16 | "product = Product('product').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "\n",
18 | "sA = Supplier('sA') .capacity(500)\n",
19 | "sB = Supplier('sB') .capacity(800)\n",
20 | "reactor = Producer('reactor') .capacity(2000) \n",
21 | "\n",
22 | "n = SupplyNet('Recipe 2a')\n",
23 | "\n",
24 | "m_a = mA.raw(mA.name()).by(sA).price(77)\n",
25 | "m_b = mB.raw(mB.name()).by(sB).price(88)\n",
26 | "\n",
27 | "p_reactor = product.production( m_a, m_b).at(reactor)\n",
28 | "\n",
29 | "n.delivery(p_reactor).demand(1000).title('Market')\n",
30 | "\n",
31 | "n.compile()\n",
32 | "n.showGraph().view()\n",
33 | "n.execute().showGraph().view()\n",
34 | "\n",
35 | "\n",
36 | "\n",
37 | "\n",
38 | "\n",
39 | "a=0"
40 | ]
41 | },
42 | {
43 | "cell_type": "code",
44 | "execution_count": null,
45 | "metadata": {},
46 | "outputs": [],
47 | "source": []
48 | }
49 | ],
50 | "metadata": {
51 | "kernelspec": {
52 | "display_name": "Python 3",
53 | "language": "python",
54 | "name": "python3"
55 | },
56 | "language_info": {
57 | "codemirror_mode": {
58 | "name": "ipython",
59 | "version": 3
60 | },
61 | "file_extension": ".py",
62 | "mimetype": "text/x-python",
63 | "name": "python",
64 | "nbconvert_exporter": "python",
65 | "pygments_lexer": "ipython3",
66 | "version": "3.7.6"
67 | }
68 | },
69 | "nbformat": 4,
70 | "nbformat_minor": 4
71 | }
72 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/1 Simple Recipes/recipe2b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('mA')\n",
14 | "mB = Material('mB')\n",
15 | "\n",
16 | "product = Product('product').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "\n",
18 | "sA = Supplier('sA') .capacity(500)\n",
19 | "sA2 = Supplier('sA2').capacity(500)\n",
20 | "sB = Supplier('sB') .capacity(800)\n",
21 | "\n",
22 | "reactor = Producer('reactor').capacity(2000) \n",
23 | "market = Customer('Market')\n",
24 | "\n",
25 | "n = SupplyNet('Recipe 2b')\n",
26 | "\n",
27 | "m_a = mA.raw(mA.name()).by(sA) .price(77)\n",
28 | "m_a2 = mA.raw(mA.name()).by(sA2).price(55)\n",
29 | "m_b = mB.raw(mB.name()).by(sB) .price(88)\n",
30 | "\n",
31 | "p_reactor = product.production( m_a, m_a2, m_b).at(reactor)\n",
32 | "\n",
33 | "n.delivery(p_reactor).demand(1000).title('Market')\n",
34 | "\n",
35 | "n.compile()\n",
36 | "n.showGraph().view()\n",
37 | "n.execute().showGraph().view()\n",
38 | "\n",
39 | "\n",
40 | "\n",
41 | "\n",
42 | "\n",
43 | "a=0"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": null,
49 | "metadata": {},
50 | "outputs": [],
51 | "source": []
52 | }
53 | ],
54 | "metadata": {
55 | "kernelspec": {
56 | "display_name": "Python 3",
57 | "language": "python",
58 | "name": "python3"
59 | },
60 | "language_info": {
61 | "codemirror_mode": {
62 | "name": "ipython",
63 | "version": 3
64 | },
65 | "file_extension": ".py",
66 | "mimetype": "text/x-python",
67 | "name": "python",
68 | "nbconvert_exporter": "python",
69 | "pygments_lexer": "ipython3",
70 | "version": "3.7.6"
71 | }
72 | },
73 | "nbformat": 4,
74 | "nbformat_minor": 4
75 | }
76 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/1 Simple Recipes/recipe2c.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('mA')\n",
14 | "mB = Material('mB')\n",
15 | "\n",
16 | "product = Product('product').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "\n",
18 | "sA = Supplier('sA') .capacity(500)\n",
19 | "sA2 = Supplier('sA2').capacity(220) # instead of 300\n",
20 | "sB = Supplier('sB') .capacity(800)\n",
21 | "\n",
22 | "reactor = Producer('reactor').capacity(2000) \n",
23 | "market = Customer('Market')\n",
24 | "\n",
25 | "n = SupplyNet('Recipe 2c')\n",
26 | "\n",
27 | "m_a = mA.raw(mA.name()).by(sA) .price(77)\n",
28 | "m_a2 = mA.raw(mA.name()).by(sA2).price(55)\n",
29 | "m_b = mB.raw(mB.name()).by(sB) .price(88)\n",
30 | "\n",
31 | "p_reactor = product.production( m_a, m_a2, m_b).at(reactor)\n",
32 | "\n",
33 | "n.delivery(p_reactor).demand(1000).title('Market')\n",
34 | "\n",
35 | "n.compile()\n",
36 | "n.showGraph().view()\n",
37 | "n.execute().showGraph().view()\n",
38 | "\n",
39 | "\n",
40 | "\n",
41 | "\n",
42 | "\n",
43 | "a=0"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": null,
49 | "metadata": {},
50 | "outputs": [],
51 | "source": []
52 | }
53 | ],
54 | "metadata": {
55 | "kernelspec": {
56 | "display_name": "Python 3",
57 | "language": "python",
58 | "name": "python3"
59 | },
60 | "language_info": {
61 | "codemirror_mode": {
62 | "name": "ipython",
63 | "version": 3
64 | },
65 | "file_extension": ".py",
66 | "mimetype": "text/x-python",
67 | "name": "python",
68 | "nbconvert_exporter": "python",
69 | "pygments_lexer": "ipython3",
70 | "version": "3.7.6"
71 | }
72 | },
73 | "nbformat": 4,
74 | "nbformat_minor": 4
75 | }
76 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/porsche_Taycan.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | "\n",
13 | "***Error: Product Porsche Taycan electric has unbalanced ingredient quantities sum = 0.9999999999999999 => should be 1.0 !\n",
14 | " Porsche Taycan electric\n",
15 | " Engine 0.2\n",
16 | " Car Body Parts 0.7\n",
17 | " Accumulator 0.1\n"
18 | ]
19 | }
20 | ],
21 | "source": [
22 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
23 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand,SunFlow,Component\n",
24 | "\n",
25 | "sun = SunFlow()\n",
26 | "\n",
27 | "mEngine = Component('Engine')\n",
28 | "mCarBody = Component('Car Body Parts')\n",
29 | "mAccu = Component('Accumulator')\n",
30 | "\n",
31 | "p1 = Product('Porsche Taycan electric').component(mEngine,0.2).component(mCarBody,0.7).component(mAccu,0.1)\n",
32 | "p2 = Product('Porsche Taycan electric').component(mEngine,0.1).component(mCarBody,0.8).component(mAccu,0.1).substituting(p1)\n",
33 | "#\n",
34 | "# !!! adapt to your data directory settings\n",
35 | "#\n",
36 | "sun.dataDir('py/pydata/datasets/').loadFreights('PorscheTaycan.xlsx')\n",
37 | "\n",
38 | "Frankfurt = sun.location('Frankfurt')\n",
39 | "Chicago = sun.location('Chicago')\n",
40 | "Toronto = sun.location('Toronto')\n",
41 | "Zuffenhausen = sun.location('Zuffenhausen')\n",
42 | "Shanghai = sun.location('Shanghai')\n",
43 | "Tokyo = sun.location('Tokyo')\n",
44 | "Seoul = sun.location('Seoul')\n",
45 | "Detroit = sun.location('Detroit')\n",
46 | "Stuttgart = sun.location('Stuttgart')\n",
47 | "Nanjing = sun.location('Nanjing')\n",
48 | "Chongqing = sun.location('Chongqing')\n",
49 | "Rotterdam = sun.location('Rotterdam')\n",
50 | "NewJersey = sun.location('NewJersey')\n",
51 | "Paris = sun.location('Paris')\n",
52 | "\n",
53 | "sElektromotoren = Supplier('Elektromotoren GmbH') .at(Stuttgart)\n",
54 | "sMingHuang = Supplier('Ming Huang Car Bodies Ltd').at(Nanjing)\n",
55 | "sBatteriesCN = Supplier('Batteries China Ltd') .at(Chongqing)\n",
56 | "sElectricEngines = Supplier('Electrical Engines Corp') .at(Detroit)\n",
57 | "\n",
58 | "plant_zuff = Producer('Plant Zuffenhausen').at(Zuffenhausen).capacity(2500) .varcost(20000)\n",
59 | "plant_shang = Producer('Plant Shanghai') .at(Shanghai) .capacity(800) .varcost(10000)\n",
60 | "\n",
61 | "wh_rotterdam = Logistics('Distribution Center Rotterdam') .at(Rotterdam)\n",
62 | "wh_newjersey = Logistics('Distribution Center NewJersey') .at(NewJersey)\n",
63 | "wh_shanghai = Logistics('Distribution Center Shanghai') .at(Shanghai)\n",
64 | "\n",
65 | "frankfurt_market = Customer('Germany') .at(Frankfurt) .demand(300)\n",
66 | "paris_market = Customer('France') .at(Paris) .demand(200)\n",
67 | "chicago_market = Customer('USA') .at(Chicago) .demand(600)\n",
68 | "toronto_market = Customer('Canada') .at(Toronto) .demand(200)\n",
69 | "china_market = Customer('China') .at(Shanghai) .demand(1000)\n",
70 | "japan_market = Customer('Japan') .at(Tokyo) .demand(500)\n",
71 | "korea_market = Customer('Korea') .at(Seoul) .demand(400)\n",
72 | "\n",
73 | "\n",
74 | "n = SupplyNet('Porsche Taycan electric').quantityUnit('pc').currencyUnit('$')\n",
75 | "\n",
76 | "m_engine1 = mEngine .component(mEngine.name()) .by(sElektromotoren) .varcost(15000)\n",
77 | "m_engine2 = mEngine .component(mEngine.name()) .by(sElectricEngines) .varcost(20000)\n",
78 | "m_carbody = mCarBody.component(mCarBody.name()).by(sMingHuang) .varcost(25000)\n",
79 | "m_accu = mAccu .component(mAccu.name()) .by(sBatteriesCN) .varcost(10000)\n",
80 | "\n",
81 | "\n",
82 | "p_eu = p1.assembly( m_engine1, m_carbody, m_accu, m_engine2) .at(plant_zuff) .fixcost(30000)\n",
83 | "p_apac = p2.assembly( m_engine1, m_carbody, m_accu, m_engine2) .at(plant_shang).fixcost(25000)\n",
84 | "\n",
85 | "\n",
86 | "p_market_eu = n.distribution(p_eu,p_apac).by(wh_rotterdam)\n",
87 | "p_market_apac = n.distribution(p_eu,p_apac).by(wh_shanghai)\n",
88 | "p_market_na = n.distribution(p_eu,p_apac).by(wh_newjersey)\n",
89 | "\n",
90 | "\n",
91 | "n.distribution(p_market_apac, p_market_eu, p_market_na).to(frankfurt_market) .title('Europe')\n",
92 | "n.distribution(p_market_apac, p_market_eu, p_market_na).to(paris_market) .title('Europe')\n",
93 | "n.distribution(p_market_apac, p_market_eu, p_market_na).to(chicago_market) .title('North America')\n",
94 | "n.distribution(p_market_apac, p_market_eu, p_market_na).to(toronto_market) .title('North America')\n",
95 | "n.distribution(p_market_apac, p_market_eu) .to(china_market) .title('Asia Pacific')\n",
96 | "n.distribution(p_market_apac, p_market_eu) .to(japan_market) .title('Asia Pacific')\n",
97 | "n.distribution(p_market_apac, p_market_eu) .to(korea_market) .title('Asia Pacific')\n",
98 | "\n",
99 | "n.compile()\n",
100 | "\n",
101 | "n.showGraph().view()\n",
102 | "opt = n.execute()\n",
103 | "opt.showGraph().view()\n",
104 | "opt.showGraph(flowOnly=True, orient='BT').view()\n",
105 | "\n",
106 | "\n",
107 | "a=0"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": null,
113 | "metadata": {},
114 | "outputs": [],
115 | "source": []
116 | },
117 | {
118 | "cell_type": "code",
119 | "execution_count": null,
120 | "metadata": {},
121 | "outputs": [],
122 | "source": []
123 | }
124 | ],
125 | "metadata": {
126 | "kernelspec": {
127 | "display_name": "Python 3",
128 | "language": "python",
129 | "name": "python3"
130 | },
131 | "language_info": {
132 | "codemirror_mode": {
133 | "name": "ipython",
134 | "version": 3
135 | },
136 | "file_extension": ".py",
137 | "mimetype": "text/x-python",
138 | "name": "python",
139 | "nbconvert_exporter": "python",
140 | "pygments_lexer": "ipython3",
141 | "version": "3.7.6"
142 | }
143 | },
144 | "nbformat": 4,
145 | "nbformat_minor": 4
146 | }
147 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/product_subst3rd_1a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('A')\n",
14 | "mB = Material('B')\n",
15 | "\n",
16 | "p1 = Product('p1').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "mP1x = Material('p1x').substituting(p1)\n",
18 | "\n",
19 | "sA = Supplier('sA')\n",
20 | "sB = Supplier('sB')\n",
21 | "sX = Supplier('sX').capacity(400)\n",
22 | "\n",
23 | "blender = Producer('Blender').capacity(800) \n",
24 | "wh = Logistics('warehouse') \n",
25 | "\n",
26 | "n = SupplyNet('ProdSubst 1a')\n",
27 | "\n",
28 | "m_a = mA.raw(mA.name()) .by(sA)\n",
29 | "m_b = mB.raw(mB.name()) .by(sB)\n",
30 | "m_p1x = mP1x.raw(mP1x.name()).by(sX).price(350)\n",
31 | "\n",
32 | "p_blend = p1.production( m_a, m_b) .at(blender).varcost(300)\n",
33 | "p_wh = n.distribution(p_blend) .at(wh)\n",
34 | "\n",
35 | "n.distribution(p_wh,m_p1x).title('Market').demand(1000)\n",
36 | "\n",
37 | "n.compile()\n",
38 | "n.showGraph().view()\n",
39 | "n.execute().showGraph().view()\n",
40 | "\n",
41 | "\n",
42 | "\n",
43 | "a=0"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": null,
49 | "metadata": {},
50 | "outputs": [],
51 | "source": []
52 | },
53 | {
54 | "cell_type": "code",
55 | "execution_count": null,
56 | "metadata": {},
57 | "outputs": [],
58 | "source": []
59 | }
60 | ],
61 | "metadata": {
62 | "kernelspec": {
63 | "display_name": "Python 3",
64 | "language": "python",
65 | "name": "python3"
66 | },
67 | "language_info": {
68 | "codemirror_mode": {
69 | "name": "ipython",
70 | "version": 3
71 | },
72 | "file_extension": ".py",
73 | "mimetype": "text/x-python",
74 | "name": "python",
75 | "nbconvert_exporter": "python",
76 | "pygments_lexer": "ipython3",
77 | "version": "3.7.6"
78 | }
79 | },
80 | "nbformat": 4,
81 | "nbformat_minor": 4
82 | }
83 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/product_subst3rd_1b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('A')\n",
14 | "mB = Material('B')\n",
15 | "\n",
16 | "p1 = Product('p1').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "mP1x = Material('p1x').substituting(p1)\n",
18 | "\n",
19 | "\n",
20 | "sA = Supplier('sA')\n",
21 | "sB = Supplier('sB')\n",
22 | "sX = Supplier('sX').capacity(400)\n",
23 | "\n",
24 | "blender = Producer('Blender').capacity(800) \n",
25 | "wh = Logistics('warehouse') \n",
26 | "\n",
27 | "n = SupplyNet('ProdSubst 1b')\n",
28 | "\n",
29 | "m_a = mA.raw(mA.name()) .by(sA)\n",
30 | "m_b = mB.raw(mB.name()) .by(sB)\n",
31 | "m_p1x = mP1x.raw(mP1x.name()) .by(sX) .price(350)\n",
32 | "\n",
33 | "p_blend = p1.production( m_a, m_b).at(blender).varcost(300)\n",
34 | "p_wh = n.distribution(p_blend, m_p1x).at(wh)\n",
35 | "\n",
36 | "n.distribution(p_wh).title('Market').demand(1000)\n",
37 | "\n",
38 | "\n",
39 | "n.compile()\n",
40 | "n.showGraph().view()\n",
41 | "n.execute().showGraph().view()\n",
42 | "\n",
43 | "\n",
44 | "\n",
45 | "a=0"
46 | ]
47 | },
48 | {
49 | "cell_type": "code",
50 | "execution_count": null,
51 | "metadata": {},
52 | "outputs": [],
53 | "source": []
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": null,
58 | "metadata": {},
59 | "outputs": [],
60 | "source": []
61 | }
62 | ],
63 | "metadata": {
64 | "kernelspec": {
65 | "display_name": "Python 3",
66 | "language": "python",
67 | "name": "python3"
68 | },
69 | "language_info": {
70 | "codemirror_mode": {
71 | "name": "ipython",
72 | "version": 3
73 | },
74 | "file_extension": ".py",
75 | "mimetype": "text/x-python",
76 | "name": "python",
77 | "nbconvert_exporter": "python",
78 | "pygments_lexer": "ipython3",
79 | "version": "3.7.6"
80 | }
81 | },
82 | "nbformat": 4,
83 | "nbformat_minor": 4
84 | }
85 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/product_subst3rd_2a.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('A')\n",
14 | "mB = Material('B')\n",
15 | "\n",
16 | "p1 = Product('p1').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "mP1x = Material('p1x').substituting(p1)\n",
18 | "\n",
19 | "sA = Supplier('sA')\n",
20 | "sB = Supplier('sB')\n",
21 | "sX = Supplier('sX') .capacity(400)\n",
22 | "blender = Producer('Blender') .capacity(800) \n",
23 | "wh = Logistics('warehouse') \n",
24 | "\n",
25 | "n = SupplyNet('ProdSubst 2a')\n",
26 | "\n",
27 | "m_a = mA.raw(mA.name()) .by(sA)\n",
28 | "m_b = mB.raw(mB.name()) .by(sB)\n",
29 | "m_p1x = mP1x.raw(mP1x.name()) .by(sX) .price(350)\n",
30 | "\n",
31 | "p_blend = p1.production( m_a, m_b) .at(blender).varcost(300) \n",
32 | "p_wh = n.warehouse(p_blend, m_p1x) .at(wh) # joint model\n",
33 | "\n",
34 | "n.delivery(p_wh,m_p1x).title('p1').demand(1000) # joint model\n",
35 | "\n",
36 | "\n",
37 | "n.compile()\n",
38 | "n.showGraph().view()\n",
39 | "n.execute().showGraph().view()\n",
40 | "\n",
41 | "\n",
42 | "\n",
43 | "a=0"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": null,
49 | "metadata": {},
50 | "outputs": [],
51 | "source": []
52 | },
53 | {
54 | "cell_type": "code",
55 | "execution_count": null,
56 | "metadata": {},
57 | "outputs": [],
58 | "source": []
59 | }
60 | ],
61 | "metadata": {
62 | "kernelspec": {
63 | "display_name": "Python 3",
64 | "language": "python",
65 | "name": "python3"
66 | },
67 | "language_info": {
68 | "codemirror_mode": {
69 | "name": "ipython",
70 | "version": 3
71 | },
72 | "file_extension": ".py",
73 | "mimetype": "text/x-python",
74 | "name": "python",
75 | "nbconvert_exporter": "python",
76 | "pygments_lexer": "ipython3",
77 | "version": "3.7.6"
78 | }
79 | },
80 | "nbformat": 4,
81 | "nbformat_minor": 4
82 | }
83 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/product_subst3rd_2b.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('A')\n",
14 | "mB = Material('B')\n",
15 | "\n",
16 | "p1 = Product('p1').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "mP1x = Material('p1x').substituting(p1)\n",
18 | "\n",
19 | "sX_loc = Location('P1x supplier')\n",
20 | "wh_loc = Location('Warehouse')\n",
21 | "market_loc = Location('Market')\n",
22 | "\n",
23 | "Freight(sX_loc, wh_loc, 80)\n",
24 | "Freight(sX_loc, market_loc, 120)\n",
25 | "Freight(wh_loc, market_loc, 30)\n",
26 | "\n",
27 | "sA = Supplier('sA')\n",
28 | "sB = Supplier('sB')\n",
29 | "sX = Supplier('sX') .at(sX_loc) .capacity(400)\n",
30 | "blender = Producer('Blender') .capacity(800) \n",
31 | "wh = Logistics('warehouse').at(wh_loc) \n",
32 | "market = Customer('Market') .at(market_loc)\n",
33 | "\n",
34 | "n = SupplyNet('ProdSubst 2b')\n",
35 | "\n",
36 | "m_a = mA.raw(mA.name()) .by(sA)\n",
37 | "m_b = mB.raw(mB.name()) .by(sB)\n",
38 | "m_p1x = mP1x.raw(mP1x.name()).by(sX).price(350)\n",
39 | "\n",
40 | "p_blend = p1.production( m_a, m_b) .at(blender).varcost(300) \n",
41 | "p_wh = n.warehouse(p_blend, m_p1x) .at(wh) \n",
42 | "\n",
43 | "n.delivery(p_wh,m_p1x).title('p1').demand(1000).at(market) # joint model\n",
44 | "\n",
45 | "\n",
46 | "n.compile()\n",
47 | "n.showGraph().view()\n",
48 | "n.execute().showGraph().view()\n",
49 | "\n",
50 | "\n",
51 | "\n",
52 | "a=0"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": null,
58 | "metadata": {},
59 | "outputs": [],
60 | "source": []
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": null,
65 | "metadata": {},
66 | "outputs": [],
67 | "source": []
68 | }
69 | ],
70 | "metadata": {
71 | "kernelspec": {
72 | "display_name": "Python 3",
73 | "language": "python",
74 | "name": "python3"
75 | },
76 | "language_info": {
77 | "codemirror_mode": {
78 | "name": "ipython",
79 | "version": 3
80 | },
81 | "file_extension": ".py",
82 | "mimetype": "text/x-python",
83 | "name": "python",
84 | "nbconvert_exporter": "python",
85 | "pygments_lexer": "ipython3",
86 | "version": "3.7.6"
87 | }
88 | },
89 | "nbformat": 4,
90 | "nbformat_minor": 4
91 | }
92 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Manufacturing/2 Recipes with Substitution/product_subst3rd_2c.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [],
8 | "source": [
9 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
10 | "from sunflow import Location, Material, Product, Supplier, Producer,Customer, SupplyNet, Freight, InitSunflow, Capacity, Logistics, Demand\n",
11 | "\n",
12 | "\n",
13 | "mA = Material('A')\n",
14 | "mB = Material('B')\n",
15 | "\n",
16 | "p1 = Product('p1').ingredient(mA,0.3).ingredient(mB,0.7)\n",
17 | "mP1x = Material('p1x').substituting(p1)\n",
18 | "\n",
19 | "sX_loc = Location('P1x supplier')\n",
20 | "wh_loc = Location('Warehouse')\n",
21 | "market_loc = Location('Market')\n",
22 | "\n",
23 | "Freight(sX_loc, wh_loc, 80)\n",
24 | "Freight(sX_loc, market_loc, 120)\n",
25 | "Freight(wh_loc, market_loc, 30)\n",
26 | "\n",
27 | "sA = Supplier('sA')\n",
28 | "sB = Supplier('sB')\n",
29 | "sX = Supplier('sX') .at(sX_loc) .capacity(400)\n",
30 | "blender = Producer('Blender') .capacity(800) \n",
31 | "wh = Logistics('warehouse').at(wh_loc) \n",
32 | "market = Customer('Market') .at(market_loc)\n",
33 | "\n",
34 | "n = SupplyNet('ProdSubst 2c')\n",
35 | "\n",
36 | "m_a = mA.raw(mA.name()) .by(sA)\n",
37 | "m_b = mB.raw(mB.name()) .by(sB)\n",
38 | "m_p1x = mP1x.raw(mP1x.name()).by(sX).price(350)\n",
39 | "\n",
40 | "p_blend = p1.production( m_a, m_b) .at(blender) .varcost(300) \n",
41 | "p_wh = n.warehouse(p_blend, m_p1x) .at(wh) .varcost(20) \n",
42 | "\n",
43 | "n.delivery(p_wh,m_p1x).title('p1').demand(1000).at(market)\n",
44 | "\n",
45 | "\n",
46 | "n.compile()\n",
47 | "n.showGraph().view()\n",
48 | "n.execute().showGraph().view()\n",
49 | "\n",
50 | "\n",
51 | "\n",
52 | "a=0"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": null,
58 | "metadata": {},
59 | "outputs": [],
60 | "source": []
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": null,
65 | "metadata": {},
66 | "outputs": [],
67 | "source": []
68 | }
69 | ],
70 | "metadata": {
71 | "kernelspec": {
72 | "display_name": "Python 3",
73 | "language": "python",
74 | "name": "python3"
75 | },
76 | "language_info": {
77 | "codemirror_mode": {
78 | "name": "ipython",
79 | "version": 3
80 | },
81 | "file_extension": ".py",
82 | "mimetype": "text/x-python",
83 | "name": "python",
84 | "nbconvert_exporter": "python",
85 | "pygments_lexer": "ipython3",
86 | "version": "3.7.6"
87 | }
88 | },
89 | "nbformat": 4,
90 | "nbformat_minor": 4
91 | }
92 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Paths/exa_dyn_path1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | " userDir = /users/rainer/\n",
13 | " chartDir = py/sunflow/charts/\n",
14 | " frameDir = py/sunflow/data/\n",
15 | " dataDir = py/sunflow/data/\n"
16 | ]
17 | }
18 | ],
19 | "source": [
20 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
21 | "from sunflow import SunFlow\n",
22 | "\n",
23 | "sun = SunFlow()\n",
24 | "#\n",
25 | "# set new paths\n",
26 | "#\n",
27 | "sun.chartDir('py/sunflow/charts/')\n",
28 | "sun.frameDir('py/sunflow/data/')\n",
29 | "sun.dataDir('py/sunflow/data/')\n",
30 | "\n",
31 | "#\n",
32 | "# print redefined paths\n",
33 | "#\n",
34 | "print(' userDir = ',sun.userDir())\n",
35 | "print(' chartDir = ',sun.chartDir())\n",
36 | "print(' frameDir = ',sun.frameDir())\n",
37 | "print(' dataDir = ',sun.dataDir())\n",
38 | "\n"
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": null,
44 | "metadata": {},
45 | "outputs": [],
46 | "source": []
47 | },
48 | {
49 | "cell_type": "code",
50 | "execution_count": null,
51 | "metadata": {},
52 | "outputs": [],
53 | "source": []
54 | }
55 | ],
56 | "metadata": {
57 | "kernelspec": {
58 | "display_name": "Python 3",
59 | "language": "python",
60 | "name": "python3"
61 | },
62 | "language_info": {
63 | "codemirror_mode": {
64 | "name": "ipython",
65 | "version": 3
66 | },
67 | "file_extension": ".py",
68 | "mimetype": "text/x-python",
69 | "name": "python",
70 | "nbconvert_exporter": "python",
71 | "pygments_lexer": "ipython3",
72 | "version": "3.7.6"
73 | }
74 | },
75 | "nbformat": 4,
76 | "nbformat_minor": 4
77 | }
78 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Paths/exa_dyn_path2.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | " userDir = /users/rainer/\n",
13 | " chartDir = py/sunflow/charts/\n",
14 | " frameDir = py/sunflow/data/\n",
15 | " dataDir = py/sunflow/data/\n"
16 | ]
17 | }
18 | ],
19 | "source": [
20 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
21 | "from sunflow import SunFlow\n",
22 | "\n",
23 | "#\n",
24 | "# set new paths\n",
25 | "#\n",
26 | "sun = SunFlow( charts='py/sunflow/charts/', data='py/sunflow/data/', frame='py/sunflow/data/')\n",
27 | "#\n",
28 | "# print redefined paths\n",
29 | "#\n",
30 | "print(' userDir = ',sun.userDir())\n",
31 | "print(' chartDir = ',sun.chartDir())\n",
32 | "print(' frameDir = ',sun.frameDir())\n",
33 | "print(' dataDir = ',sun.dataDir())\n",
34 | "\n"
35 | ]
36 | },
37 | {
38 | "cell_type": "code",
39 | "execution_count": null,
40 | "metadata": {},
41 | "outputs": [],
42 | "source": []
43 | },
44 | {
45 | "cell_type": "code",
46 | "execution_count": null,
47 | "metadata": {},
48 | "outputs": [],
49 | "source": []
50 | }
51 | ],
52 | "metadata": {
53 | "kernelspec": {
54 | "display_name": "Python 3",
55 | "language": "python",
56 | "name": "python3"
57 | },
58 | "language_info": {
59 | "codemirror_mode": {
60 | "name": "ipython",
61 | "version": 3
62 | },
63 | "file_extension": ".py",
64 | "mimetype": "text/x-python",
65 | "name": "python",
66 | "nbconvert_exporter": "python",
67 | "pygments_lexer": "ipython3",
68 | "version": "3.7.6"
69 | }
70 | },
71 | "nbformat": 4,
72 | "nbformat_minor": 4
73 | }
74 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Paths/exa_get_paths.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 4,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | "Pre-defined default paths:\n",
13 | "\n",
14 | " userDir = /users/rainer/\n",
15 | " chartDir = py/pydata/tempdata/sunflowtemp/\n",
16 | " frameDir = py/pydata/tempdata/sunflowtemp/\n",
17 | " dataDir = py/pydata/datasets/\n",
18 | "\n",
19 | "Build new paths:\n",
20 | "\n",
21 | " buildPath(): default path = /users/rainer/py/pydata/tempdata/sunflowtemp/\n",
22 | " buildPath(chart): file path = /users/rainer/py/pydata/tempdata/sunflowtemp/peter.xlsx\n",
23 | " buildPath(frame): file path = /users/rainer/py/pydata/tempdata/sunflowtemp/mary.xlsx\n",
24 | " buildPath(data): file path = /users/rainer/py/pydata/datasets/freight.xlsx\n"
25 | ]
26 | }
27 | ],
28 | "source": [
29 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
30 | "from sunflow import SunFlow\n",
31 | "\n",
32 | "sun = SunFlow()\n",
33 | "\n",
34 | "print('Pre-defined default paths:\\n')\n",
35 | "print(' userDir = ',sun.userDir())\n",
36 | "print(' chartDir = ',sun.chartDir())\n",
37 | "print(' frameDir = ',sun.frameDir())\n",
38 | "print(' dataDir = ',sun.dataDir())\n",
39 | "\n",
40 | "print('\\nBuild new paths:\\n')\n",
41 | "fpath = sun.buildPath(); print(' buildPath(): default path =',fpath)\n",
42 | "fpath = sun.buildPath('peter.xlsx', path='', kind='chart'); print(' buildPath(chart): file path =',fpath)\n",
43 | "fpath = sun.buildPath('mary.xlsx', path='', kind='frame'); print(' buildPath(frame): file path =',fpath)\n",
44 | "fpath = sun.buildPath('freight.xlsx', path='', kind='data'); print(' buildPath(data): file path =',fpath)\n"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": null,
50 | "metadata": {},
51 | "outputs": [],
52 | "source": []
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": null,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": []
60 | }
61 | ],
62 | "metadata": {
63 | "kernelspec": {
64 | "display_name": "Python 3",
65 | "language": "python",
66 | "name": "python3"
67 | },
68 | "language_info": {
69 | "codemirror_mode": {
70 | "name": "ipython",
71 | "version": 3
72 | },
73 | "file_extension": ".py",
74 | "mimetype": "text/x-python",
75 | "name": "python",
76 | "nbconvert_exporter": "python",
77 | "pygments_lexer": "ipython3",
78 | "version": "3.7.6"
79 | }
80 | },
81 | "nbformat": 4,
82 | "nbformat_minor": 4
83 | }
84 |
--------------------------------------------------------------------------------
/examples/JupyterLab/Tutorial Paths/exa_new_path.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "metadata": {},
7 | "outputs": [
8 | {
9 | "name": "stdout",
10 | "output_type": "stream",
11 | "text": [
12 | "\n",
13 | "\n",
14 | "Now build user-defined paths:\n",
15 | "\n",
16 | " userDir = /users/rainer/\n",
17 | " chartDir = py/sunflow/charts/\n",
18 | " frameDir = py/sunflow/data/\n",
19 | " dataDir = py/sunflow/data/\n",
20 | "\n",
21 | " buildPath(): default path = /users/rainer/py/sunflow/charts/\n",
22 | " buildPath(chart): file path = /users/rainer/py/sunflow/charts/peter.xlsx\n",
23 | " buildPath(frame): file path = /users/rainer/py/sunflow/data/mary.xlsx\n",
24 | " buildPath(data): file path = /users/rainer/py/sunflow/data/freight.xlsx\n"
25 | ]
26 | }
27 | ],
28 | "source": [
29 | "globals().clear(); import aitpath; import importlib,sunflow; importlib.reload(sunflow)\n",
30 | "from sunflow import SunFlow\n",
31 | "\n",
32 | "sun = SunFlow()\n",
33 | "\n",
34 | "print('\\n\\nNow build user-defined paths:\\n')\n",
35 | "\n",
36 | "sun.chartDir('py/sunflow/charts/')\n",
37 | "sun.frameDir('py/sunflow/data/')\n",
38 | "sun.dataDir('py/sunflow/data/')\n",
39 | "print(' userDir = ',sun.userDir())\n",
40 | "print(' chartDir = ',sun.chartDir())\n",
41 | "print(' frameDir = ',sun.frameDir())\n",
42 | "print(' dataDir = ',sun.dataDir())\n",
43 | "\n",
44 | "print()\n",
45 | "fpath = sun.buildPath(); print(' buildPath(): default path =',fpath)\n",
46 | "fpath = sun.buildPath('peter.xlsx', path='', kind='chart'); print(' buildPath(chart): file path =',fpath)\n",
47 | "fpath = sun.buildPath('mary.xlsx', path='', kind='frame'); print(' buildPath(frame): file path =',fpath)\n",
48 | "fpath = sun.buildPath('freight.xlsx', path='', kind='data'); print(' buildPath(data): file path =',fpath)\n"
49 | ]
50 | },
51 | {
52 | "cell_type": "code",
53 | "execution_count": null,
54 | "metadata": {},
55 | "outputs": [],
56 | "source": []
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": null,
61 | "metadata": {},
62 | "outputs": [],
63 | "source": []
64 | }
65 | ],
66 | "metadata": {
67 | "kernelspec": {
68 | "display_name": "Python 3",
69 | "language": "python",
70 | "name": "python3"
71 | },
72 | "language_info": {
73 | "codemirror_mode": {
74 | "name": "ipython",
75 | "version": 3
76 | },
77 | "file_extension": ".py",
78 | "mimetype": "text/x-python",
79 | "name": "python",
80 | "nbconvert_exporter": "python",
81 | "pygments_lexer": "ipython3",
82 | "version": "3.7.6"
83 | }
84 | },
85 | "nbformat": 4,
86 | "nbformat_minor": 4
87 | }
88 |
--------------------------------------------------------------------------------
/examples/JupyterNotebook/Exa_Distribution_Network_Chapter1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Chapter 1: A Distribution Network\n",
8 | "\n",
9 | "Building supply networks with SunFlow is quite easy. To see the steps look at the example below.\n",
10 | "\n",
11 | "Let's assume we want to supply 20 pallets of wine (our product) from a european winery (our supplier) to Walmart (our customer) either through a warehouse in New York or New Orleans. Which option is the cheaper one? To answer this question we first build a model of the potential product flows and optimize it afterwards.\n",
12 | "\n",
13 | "\n",
14 | "# Create a new Net\n",
15 | "\n",
16 | "A supply net is created by SupplyNet('name'). The given name identifies the net and becomes the name of its graphical chart file. "
17 | ]
18 | },
19 | {
20 | "cell_type": "code",
21 | "execution_count": 1,
22 | "metadata": {},
23 | "outputs": [],
24 | "source": [
25 | "globals().clear(); import aitpath; from sunflow import SupplyNet\n",
26 | "\n",
27 | "net = SupplyNet('Chapter 1 Distribution USA')"
28 | ]
29 | },
30 | {
31 | "cell_type": "markdown",
32 | "metadata": {},
33 | "source": [
34 | "# Build the Net\n",
35 | "\n",
36 | "A supply net is a directed graph made by nodes and vertices. Once a new net is created, we start to build up its nodes step-by-step.\n",
37 | "\n",
38 | "The first node is the initial source, the supplier."
39 | ]
40 | },
41 | {
42 | "cell_type": "code",
43 | "execution_count": 2,
44 | "metadata": {},
45 | "outputs": [],
46 | "source": [
47 | "supplier = net.source() "
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "Now we add the two warehouses to the net. The link between the supplier's node and the warehouse nodes are made by the ditstibution() method's parameter which is set to 'supplier' which links the new node with their predecessor - here the supplier node."
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": 3,
60 | "metadata": {},
61 | "outputs": [],
62 | "source": [
63 | "new_york = net.distribution(supplier)\n",
64 | "new_orleans = net.distribution(supplier)"
65 | ]
66 | },
67 | {
68 | "cell_type": "markdown",
69 | "metadata": {},
70 | "source": [
71 | "Finally add the customer node and connect it in the same way with its predecessors, the two warehouses. The customer's demand of 20 pallets is attached to this node by demand(20)."
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 4,
77 | "metadata": {},
78 | "outputs": [],
79 | "source": [
80 | "customer = net.delivery(new_york, new_orleans) .demand(20)"
81 | ]
82 | },
83 | {
84 | "cell_type": "markdown",
85 | "metadata": {},
86 | "source": [
87 | "# Compile the Net \n",
88 | "\n",
89 | "Compiling the net by the compile() method tells SunFlow to build and construct the internal model representation and prepare it for its further use. "
90 | ]
91 | },
92 | {
93 | "cell_type": "code",
94 | "execution_count": 5,
95 | "metadata": {},
96 | "outputs": [],
97 | "source": [
98 | "net.compile()"
99 | ]
100 | },
101 | {
102 | "cell_type": "markdown",
103 | "metadata": {},
104 | "source": [
105 | "# Show the Net's Graph\n",
106 | "\n",
107 | "Finally we let SunFlow create a graphical representation of the net by createGraph(). To display this graph use te method view()."
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 6,
113 | "metadata": {},
114 | "outputs": [],
115 | "source": [
116 | "net.showGraph().view()"
117 | ]
118 | },
119 | {
120 | "attachments": {
121 | "image.png": {
122 | "image/png": "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JEwkQAIkQAIkQAIkQAIkQAIkQAIkkGMCpShAc0yYxZMACZAACZAACZAACZAACZAACWgCFKC8EEiABEiABEiABEiABEiABEiABAIhQAEaCGZWQgIkQAIkQAIkQAIkQAIkQAIkQAHKa4AESIAESIAESIAESIAESIAESCAQAhSggWBmJSRAAiRAAiRAAiRAAiRAAiRAAhSgvAZIgARIgARIgARIgARIgARIgAQCIUABGghmVkICJEACJEACJEACJEACJEACJEABymuABEiABEiABEiABEiABEiABEggEAIUoEkwqzVS5auvvpIGDRokyZX9oW3btknlypWzLyhBCT/++KOULl1aqlSpkiBHdHf/9NNPUqlSpcAauGHDBqlZs6aUKlUqsDrTrWjLli2y5557pnVaUNdyWo1iZhIgARIgARIgARIggaIjEJgAvfrqq2XBggWeAT/33HNSpkwZz/n9zPjWW2/J1KlT5T//+Y/UqFEjrXan2463335bjjnmGOnTp4889thj6Z6eMP8PP/wgkyZNkhdffFHee+89+fe//y0nnXRSwvxROrBu3TqZPHmybvsee+wh7777bs6bd/fdd8u9994rmzZtkp07d8rIkSNl2LBhOa/XawWLFi2SadOm2dfka6+95unUIK9lTw1iJhIgARIgARIgARIggaImEJgA7dKli8ybN0/OPvtsOeigg7TFr1+/fhr+0KFDZf/995f169fLv/71L4EA2bp1a06tgslG/ZNPPpEpU6bIhAkTpHXr1jkVoC+//LL06NFDevXqJTNmzEjWrLSOQUjNnj1bLr/8clmzZo1A0OeLAP3iiy/krrvukjvvvFM6d+6s+5FW59PMjIcA3bp1E4i8cuXKSYcOHbTV+9NPP02zpNxl//zzzwUiGVxwveDhiJcU5LXspT3MQwIkQAIkQAIkQAIkUNwEAhOgHTt2lP79+8uFF15oE99tt93kjz/+kFdffVVbAXFg5cqVcsABB8jXX3+trY925oA30A6I4lwLUHQLArFevXpStmxZ33vZt29fLabzSYACwurVq6Vx48aBCFBYn2EphGhHwoMQCFFYv6OU5s6dK506dZITTjhBXnjhBc9NC/Ja9twoZiQBEiABEiABEiABEihKAoEJ0Pbt2wssTc65jvEEKEYB1qjHH39catWqFdqgwArbsGHDQARoLjsJKzPc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0MmZJavtKI9VVh3jySRAAiRAAiRAAiRAAiRAAp4I5L0A9dRLZiIBEiABEiABEiABEiABEiABEgidAAVo6EPABpAACZAACZAACZAACZAACZBAcRCgAC2OcWYvSYAESIAESIAESIAESIAESCB0AhSgoQ8BG0ACJEACJEACJEACJEACJEACxUEgbwQo1qjEUia77757cYxMQL3ctm2bIDpvLhMiAf/8889SqVKlEtX89NNPcfeXyJjFjmT1Z1EsTyUBEiABEiABEiABEiABEkiTgG8C9Pbbb9fLdaxZs8aToPj666/loYce0lFXFy1aJBCYjRs3loMOOkjat28v48aNk/fee0/eeOMNef755/W6mdOmTZNu3bql2cX8yj579mwZM2aMgCei0CZLWDZl8eLFJbJAUNaqVUv22Wcf6dmzpzRt2rREHuzAmqRYXqVPnz7y2GOPxc3jx87u3bvrsUQU3BYtWsjSpUvliSeekJdeekmvP4o1UXOZ3PXnsi5T9pw5c+T666/Xy/CYfXg/6qij5LLLLrN3YcmgXbt22Z+xPM/UqVP155UrV8oVV1whH3zwgezYsUN/L3D9g9fo0aPliCOOsM+Lt4Gxv/TSS9OKCI01Yffbbz8ZNGiQXss2XrncRwIkQAIkQAIkQAIkQAIZE1DWIV/SxRdfbKlGWOvXr09ZnhKSVrVq1Sy11qQ1dOhQS91QW/PmzbOUILXUEiq6HJSl1o20nnvuOatRo0Z63+uvv56ybL8zqKVJ/C4ybnlqKRlLiUG775988kncfO6dkydPts/5v//7P+upp56ybr31Vqt///6WEqL6WNu2bS0l5t2nWkoA6uO9evUqcSzVjnS4dOrUySpVqpSlBKgudv78+ZZaD1XXfeyxx6aqKq3j8drlrj+tArPIrNZUtQ499FDdzz322MP69NNPS5T2zTffWBdddJHOc+WVV1q//PKLzvPtt99a1atXt/baay/rkUcesdSasvq7svfee+u8U6ZMKVGWc8eSJUt0vr/+9a/O3Sm30WZ893D9MJEACZAACZAACZAACZCA3wRgofEl3XLLLVpQKktm0vImTpyob3Ahjl577bUSebdu3Wopi5XO8/nnn+vjRqwELUCVldY6/vjjS7QxFzsgHJcvX241aNBA992rAP3hhx90foiG6dOnxzRt8+bN1oABA/Tx0qVLW5MmTYo5jg+rV6+2du7cWWJ/sh3pcoGoWrduXUyRyqqn2+WnAE3Urnj1xzQmhx+UlVr3U1mzE9aiLMI6z6pVq+w8//jHP/S+4cOH2/uw8dlnn2lRiu9bsjRw4EB9PoQ/yk8nVahQwVIW1nROYV4SIAESIAESIAESIAES8ETANwH673//W4unZLXCommsctddd13CrCtWrNBiFpYypPPOO0/fTAcpQCHK/vKXv1iwngWZDj74YN1XrwIUbYP4jCdATbtPPPFEfbxs2bJWOuWa853vfnGZO3eubpNfAtSvdjn76sf2tddeq/vZrl27hMVt2LBB5/nxxx/tPCeccILeF88SqVy0LeVaa+d1b6Ac5cprKTdsXQYsrOkkiOV4DyvSKYN5SYAESIAESIAESIAESCAeAd8EKAQF3A2TpfPPP1/fEFetWtWCpTNZUnPQbJdFpwD96quvrLvuusuChUjNlyxRxDvvvGOpeXNW3759LYjcZcuWxeTZuHGjdffdd2uXXwjd8ePHW3//+9+1q6/JqALmWMcdd5xuK9x/77//fuvZZ581hy3c4MNiefXVV1uw6KJNzqQC6+gbeFj5YMVFW+Hu6iXlQoDCrRIuzxCp/fr1i2kGXJ/vuOOOmH0YG7h9wnp62223WcbdMxmXZH1GeRA05oECKnMKUDUHUrthDxs2zHr44Yet7du36/aoucG6frThmWee0fvAE5/NC21K1i6cFK9+7Ee9//nPf6yxY8da//znPy0119hScy1xyE64XjD+7777rgWLMtqHdsa79uyTHBteBOimTZv02Di/E8Ytt1y5ctZ9993nKNHS19ujjz4as8/5AWw6dOhg4aEQxhwWze+++86ZJem2mjtqvfrqq0nz8CAJkAAJkAAJkAAJkAAJZELANwGKm3PMQUyWVAAafUOsArEky1bimBGgp512mraM1qhRQ5dTpkwZa9asWXZ+zCHFDTdu2F955RVLBTPSwksFc9F5Tj31VH0+8hx55JEWzq9SpYo+B/swjxUJogwCFvvq1q1rXX755dY999yjj0EU7b///nreHoQuLLpOd2KcB+sTzoWIxtw/bNeuXVufn+pPLgQo6sRcQGc7VBAgSwV80vvwbtKWLVv03EOIawjGs846y4IIQkrEJVGfYYHDNWEYYO6vSUaANmvWzHY7RvvwgrUQggltAXvs69y5sz4V4h/iy+TFHMpE7YKgS1T/2rVrrUMOOcSCtU8FfNKiEtcDPpu5mhCamKeMus4880xtUYSYw2fkhShNlTIVoLjOYLE2/Tz99NMtzAtNlTAHFtcnhDIEdr169XQZN9xwQ6pT7eN4IANXXyYSIAESIAESIAESIAES8JuAbwIUDcN8xEQJLpLmhhqW0HSSEaAQB1988YWllmPRggE357DSmYSALZjzZuahmgA9sGAh4ebcBPpBYB64BGMfxKW50TeBchYsWKD3HX744aZ4PVeySZMmFlwgTTJ11KlTR1vP4E4JYYPy0B4EF4J1DZZSLylXAhRiGW0CH1j5wBBWPOxzClDMLcQ+4w4KlhAxJsXjkqzPEEGGeTwBirpg0ca1o6LyambYd8kll+gq4TKMz0aAmnaYubIQoEjx2oX98erHmKM8tSxMjPXazE9WUYN1MCDkO+ecc3T9DRs2tCAKwc2IYi+urZkKULRdRYDWDwPQf7zgOYDrLVmCpR3WbmNFxrWHczGG+A56SRD+6CcTCZAACZAACZAACZAACfhNwFcBmqxxxs0QN8OIfJtOMgLU6QYL6xPK6tq1q10UhKFTkMJ1FHmGDBli5zHBWdw38maeJCx/SEbQdOnSxT4XViWUB8umWmJDv0z0X+yHQEGCeMJnp1C1C0mxkSsBivaiTQhGBJdVJEQsxj6nAEUEXew76aST7AcK4GgESTwuKCtZnzGPEWXGE6DO8UM5EKPIC7GFZKK5ugWoWipE53MLUOd46QLUH3f9cLtFHWoJFJNFvyNYkVpnVh8zcyANt2uuucbOa669o48+2t6XaCMbAYoy0T9Y/tFe8wJr85DFXS9cx53fL1hNYcHGubB6M5EACZAACZAACZAACZBAmAQCE6DopJmH6L7xTwUgngDF3E7cVEOwOROEEoQOxAEsWcjjDORiBKh7Dh3mhSIvXC2R4gktcy7mTD7wwAMlXrCoIo0cOVKXBZfgdFOuBGjv3r11m+AGbRKixqLPTgEKUQrLIPZjGRD01YhPnBePC/Yn6/OFF16oy4snQN3XAkQ86sYLDy38EKDu+o1VUK3HiabHJAhd1G3cseMJULX2qs6DIFWpkhcBinmmqNM5B9RdLkSzcadFXpTrToiijGO43m+++Wb7Vb9+fb2/Y8eO7lP4mQRIgARIgARIgARIgAQCJRCoAIV1CjfIEIbpJK8CdM2aNVpMIXItbsaxvqi5ITf1GRHpFqBTp07VeY1bpRFaTpGBJVlQHo4lS8nEWLLzcCxXAtRYDJ3uz/EEKNoAdpiHib7ihTm7v/76Kw7ZAtTJBfuT9dktAJHfzAF1C1CIXSOA4QacrgB1twt1ues3LrROaznyIWEtTvT5jDPO0J+zFaDmwQZEYKIEt3LMNYXLLxLmU5t5qM5zIFT32Wcf3b543yFYRvEwAdew84V5sGYs460H66yD2yRAAiRAAiRAAiRAAiSQSwKBClBYDc2NsIlq6qVzXgQorEeYI4pgP8bFNB0BisihaBsC0iAZAep0EYXrLfJAlLgTguY8/fTTencyMeY+z/05FwIUrpdoN+bgOgVIPAGKwEOYI4oX3HFNACFEikWKxwX7k/XZLQCRP5EARcReuAljjieSEaCHHXaY/mz+GEHtdsF1jpfJ667fzPmNJ1bdrsTZClDTT/BPNEcaEWcR7MokzHtt3LixHgOzz7zfdNNN9ncIc29NwrxNBNR64YUXzC77HcLWeAP87W9/s/dzgwRIgARIgARIgARIgASCJhCoAMWNsAnQgxtsCKB4CcFS4AJpBJ0RoE7RiuU4cFOP5SaQcOONzxChJhnB67T6JbKAwsqHCKdG0MAChfKc6zc+/vjjet+ee+4ZEyUUYg1RdWfOnKmrTibGTNsSvacrQGExRDvxmj59eolisXaqCf5kIvmaTGYO6IEHHmh26bmcThFjRPzJJ5+s88TjggPJ+mzmYGLpGpOMMHNbQDHG6MuoUaN0VuNqve+++5pTdYAgBH1CPli9kRK1C8fc9S9dulRHsUVAJnM+8iHBeo79c+bM0Z/jCVDjJhxPwOqTHH9wLZt5pU4XZJMF3wlYKJ3L4+BhCvqGBwDuZAIlIcKwsZgiD/Li4UuiuaFwpUaZsLSuXr3aXSw/kwAJkAAJkAAJkAAJkEAgBAIVoOgRlkTB8ii4GcZN9HPPPWdhDUlzDKIRc9WwtIeJ2tmrVy+d30SzRV4TwRXzSpGMKEC5w4cP11ZKI1IgsGDZxI29EaAQwhCOSAhIhPOMlQ/7jAiAeECbYBmDyDnggAN0Xiy1AjdHWEVhrTOuuzgX80hRHpazSCchYisi5+JcpwhMVgbWMkV+vG688UZt/cUSIxCeYIj2Q4Ca4ErOsow1E8vaGDGDfsJVGgF5kAxXuCgjxeOCJTuS9RkBjdA+BBgyyQhQWObgcooEKx4snXiIYKK4wvXXCLgTTjhBRyzG9VG+fHldJtxoMfc2UbtQbrz6cY2gTViexoi2VatWaVbnnnsuTtPJrF0LK6pJZn1NWGG9JGO1xAMOPFTZtm2b5g3XW4hjPIxxi8KaNWtqSzDG1LQPYtlcfxMmTLCrhiUUYwg+iRK+d+Y6wQMdJhIgARIgARIgARIgARIIg0DgAhSdhLCEIDLrecLl0mxjXUgTgRR5IWzMWowQm7DkPP/88zFrR3bv3l0HyoEYhFjBHEKsm4ibeiybAgGGm24IPCNAIXIQZAf1waKJG313grsibtpxvnHN/eqrr7SVzNzMw1oGEQQRDaEAsWyijsJ9FaIAgiNVwlxBWNRMuZjrB6tYIrdNlIcgOs51TM256A9EGtbwRMAdiFR3Qn9gVTTnHHroodbChQu10Ib4gWiHEMMyNFdddZUtUFGOkwuEUKI+r1u3zurRo4fmh3owfiNGjNBNwTWApWHQT7QXDyUQZOeCCy6wH0iYNmO+LlxUUQbGCy7FsFjjHIwbLLlIznahf8nqh+UYwhBj1apVKy0EMU8TTM2DD1g/zZquuKYQ+Me4yxpubguuabP7HWvTNmrUSPcB1zvKgyBFP0z7nedAiB977LFanKINuF5xrSE6sHNJHwh5rEOL9mBt0j59+jiL0dtYzsU5pxd53VGFS5zEHSRAAiRAAiRAAiRAAiSQAwKlUKa6IQ0tKeuNqKiiun611qIoq5KoG+2M26MEmyjrmCjxp8tQlj1R4lCUUNOflUiVe++9V5SoESWORAV2ESVqRIncuHUqcSDqpl+UCIg5jnbjXCXiRImJmGP5/EFZhUWJeFFzMTU3JRDjdicRl7iZU+xU0W4F9SoBmnDslWAUJSg1bxSH9ilBW6LkdNulLL2irLyiRKe0adNGlJgrUaafO3B9KrdifT0mu+6Um7Ao67C+LtFXZWUW9cBE9t9/f1EPRPxsEssiARIgARIgARIgARIggcAIhC5AA+vp/ypyCtCzzz476OpZHwmQAAmQAAmQAAmQAAmQAAkULYGiE6DnnHOO/Otf/xLlyisq0FHRDjw7TgIkQAIkQAIkQAIkQAIkQAJBEygaAQpPYxUlVgYPHixw01TRTmX06NHSrVs3ujQGfdWxPhIgARIgARIgARIgARIggaIkUDQCFHNBMfcTcwmdSQXaseeHOvdzmwRIgARIgARIgARIgARIgARIwF8CRSNA/cXG0kiABEiABEiABEiABEiABEiABNIlQAGaLjHmJwESIAESIAESIAESIAESIAESyIgABWhG2HgSCZAACZAACZAACZAACZAACZBAugQoQNMlxvwkQAIkQAIkQAIkQAIkQAIkQAIZEaAAzQgbTyIBEiABEiABEiABEiABEiABEkiXAAVousSYnwRIgARIgARIgARIgARIgARIICMCFKAZYeNJJEACJEACQRLYsmWL/PTTT0FWybpIIGMC5cuXl2rVqmV8Pk8kARIggUImQAFayKPLvpEACZBAARD47rvvZMmSJWJZVgH0hl0oBgI1atSQgw46qBi6yj6SAAmQQNoEKEDTRsYTSIAESIAEgiJA8RkUadbjJwEKUD9psiwSIIFCI0ABWmgjyv6QAAmQQIEQSCQ+S5cuXSA9ZDcKgQAs827r/N577y3NmzcvhO6xDyRAAiTgOwEKUN+RskASIAESIIFsCcQTnw0bNpRGjRplWzTPJwFfCEB0fv7557Jx48YS5dECWgIJd5AACZCATYAC1EbBDRIgARIggSgQoPiMwiiwDckIxBOfpUqVsi2hFKDJ6PEYCZBAsROgAC32K4D9JwESIIEIEaD4jNBgsClxCcQTn2XKlJEKFSrI1q1b9TkUoHHRcScJkAAJaAIUoLwQSIAESIAEIkGA4jMSw8BGJCGQSHy2atVKVq9eLT/88IM+mwI0CUQeIgESKHoCFKBFfwkQAAmQAAmET4DiM/wxYAuSE0gmPitXriyLFi2iAE2OkEdJgARIQBOgAOWFQAIkQAIkECoBis9Q8bNyDwRSiU8UQQHqASSzkAAJkIAiQAHKy4AESIAESCA0AhSfoaFnxR4JeBGfKIoC1CNQZiMBEih6AhSgRX8JEAAJkAAJhEOA4jMc7qzVOwGv4hMlUoB658qcJEACxU2AArS4x5+9JwESIIFQCFB8hoKdlaZBIB3xiWIpQNOAy6wkQAJFTYACtKiHn50nARIggeAJUHwGz5w1pkcgXfGJ0ilA02PM3CRAAsVLgAK0eMeePScBEiCBwAnEE59ly5YVrKPIRAJRIfDLL7/ENAXXJ5ZaQbTbRIkCNBEZ7icBEiCBWAIUoLE8+IkESIAESCCHBN5//33ZtWtXDmtg0STgL4HddttNWrdunVR8okYKUH+5szQSIIHCJUABWrhjy56RAAmQQOQIUIBGbkjYoBQEWrRoIdWrV0+RiwI0JSBmIAESIIH/EaAA5aVAAiRAAiQQGAGnAK1atWpKq1JgDWNFJPA/AnAT3759u83j0EMPlXLlytmfE23QApqIDPeTAAmQQCwBCtBYHvxEAiRAAiSQQwJOAdq4cWNp0KBBDmtj0SSQPgEI0MWLF9snUoDaKLhBAiRAAr4QoAD1BSMLIQESIAES8EKAAtQLJeYJkwAFaJj0WTcJkEAxEKAALYZRZh9JgARIICIEKEAjMhBsRkICFKAJ0fAACZAACfhCgALUF4wshARIgARIwAsBClAvlJgnTAIUoGHSZ90kQALFQIACtBhGmX0kARIggYgQoACNyECwGQkJUIAmRMMDJEACJOALAQpQXzCyEBIgARIgAS8EKEC9UGKeMAlQgIZJn3WTAAkUAwEK0GIYZfaRBEiABCJCgAI0IgPBZiQkQAGaEA0PkAAJkIAvBChAfcHIQkiABEiABLwQoAD1Qol5wiRAARomfdZNAiRQDAQoQIthlNlHEiABEogIAQrQiAwEm5GQAAVoQjQ8QAIkQAK+EKAA9QUjCyEBEiABEvBCgALUCyXmCZMABWiY9Fk3CZBAMRCgAC2GUWYfSYAESCAiBChAIzIQbEZCAhSgCdHwAAmQAAn4QoAC1BeMLIQESIAESMALAQpQL5SYJ0wCFKBh0mfdJEACxUCAArQYRpl9JAESIIGIEKAAjchAsBkJCVCAJkTDAyRAAiTgCwEKUF8wshASIAESIAEvBChAvVBinjAJUICGSZ91kwAJFAMBCtBiGGX2kQRIgAQiQoACNCIDwWYkJEABmhAND5AACZCALwQoQH3ByEJIgARIgAS8EKAA9UKJecIkQAEaJn3WTQIkUAwEKECLYZTZRxIgARKICAEK0IgMBJuRkAAFaEI0PEACJEACvhCgAPUFIwshARIgARLwQoAC1Asl5gmTAAVomPRZNwmQQDEQoAAthlFmH0mABEggIgQoQCMyEGxGQgIUoAnR8AAJkAAJ+EKAAtQXjCyEBEiABEjACwEKUC+UmCdMAhSgYdJn3SRAAsVAgAK0GEaZfSQBEiCBiBCgAI3IQLAZCQlQgCZEwwMkQAIk4AsBClBfMLIQEiABEiABLwQoQL1QYp4wCVCAhkmfdZMACRQDAQrQYhhl9pEESIAEIkKAAjQiA8FmJCRAAZoQDQ+QAAmQgC8EKEB9wchCSIAESIAEvBCgAPVCiXnCJEABGiZ91k0CJFAMBChAi2GU2UcSIAESiAgBCtCIDIRqxtatW+WOO+6Qr7/+Wu69997oNCzkllCAhjwArJ4ESKDgCVCAFvwQs4MkQAIkEB0CFKDhj8XPP/8sEydOlHHjxsn3338vJ554ojz//PPhNywiLaAAjchAsBkkQAIFS4ACtGCHlh0jARIggegRoAANf0yWLFkimzdvlrlz58oVV1xBAeoaEgpQFxB+JAESIAGfCVCA+gyUxZEACZAACSQmQAGamE3QR1555RU57rjjKEBd4ClAXUD4kQRIgAR8JkAB6jNQFkcCJEACJJCYAAVoYjZej6xbt06efvppufzyy2Xx4sXyxhtvSJUqVeT000+X8uXLy86dO/U+WDg7deqkRWa8silA41ERoQCNz4V7SYAESMAvAhSgfpFkOSRAAiRAAikJUICmRJQww6pVq+T888+XWbNm6TyjRo3SQYQqVaqkAwnVr19fJk+eLGeeeaZUqFBB74MYveuuu2Tw4MElyqUALYFE76AAjc+Fe0mABEjALwIUoH6RZDkkQAIkQAIpCVCApkSUMMOuXbtk48aN0rhxY23lHDBggNx+++1Srlw56datm7z11ltSt25dmTFjhrRr104L1SOOOEJatmwpixYtKlEuBWgJJHoHBWh8LtxLAiRAAn4RoAD1iyTLIQESIAESSEmAAjQlopQZ9t9/f1m5cqVs2bJFu97iBCyncumll8qYMWPkmmuu0WX88ccf2hJasWJF7VbqLpgC1E3kv58pQONz4V4SIAES8IsABahfJFkOCZAACZBASgIUoCkRpczQpEkTWbFiRYwAfeSRR+S8886LEaAoqHbt2rJt2zbB0ivuRAHqJvLfzxSg8blwLwmQAAn4RYAC1C+SLIcESIAESCAlAQrQlIhSZognQKdMmSJ9+/YtIUDr1KkjW7dupQBNSfXPDBSgf7LgFgmQAAnkggAFaC6oskwSIAESIIG4BChA42JJaycFaFq40s5MAZo2Mp5AAiRAAmkRoABNCxczkwAJkAAJZEOAAjQbev89N54AffTRR+Xcc8+V0aNHy7XXXmtXQguojcLzBgWoZ1TMSAIkQAIZEaAAzQgbTyIBEiABEsiEAAVoJtT+PGf79u1So0YNwfvy5csFYhTp5ptvlhEjRsgZZ5whjz/+uN6HPFWrVpXff/9dNm3aJNWqVdP7zZ/x48fLsGHDpG3btjJ//nyzu+jfKUCL/hIgABIggRwToADNMWAWTwIkQAIk8CcBCtA/WaS79cUXX8jAgQPlzTff1Kd26NBBC89XX31V7r77bj3Ps2zZstK7d28ZOXKk9OvXT+bMmaPzduzYUefB+9q1a7WldPr06fL999/r4z169JCzzjpLTj/99HSbVXD5KUALbkjZIRIggYgRoACN2ICwOSRAAiRQyAQoQAt5dAujbxSghTGO7AUJkEB0CVCARnds2DISIAESKDgCFKAFN6QF1yEK0IIbUnaIBEggYgQoQCM2IGwOCZAACRQyAQrQQh7dwugbBWhhjCN7QQIkEF0CFKDRHRu2jARIgAQKjgAFaMENacF1iAK04IaUHSIBEogYAQrQiA0Im0MCJEAChUyAArSQR7cw+kYBWhjjyF6QAAlElwAFaHTHhi0jARIggYIjQAFacENacB2iAC24IWWHSIAEIkaAAjRiA8LmkAAJkEAhE6AALeTRLYy+UYAWxjiyFyRAAtElQAEa3bFhy0iABEig4AhQgBbckBZchyhAC25I2SESIIGIEaAAjdiAsDkkQAIkUMgEKEALeXQLo28UoIUxjuwFCZBAdAlQgEZ3bNgyEiABEig4AhSg0RnS77//XipWrCi77757dBoVgZZQgEZgENgEEiCBgiZAAVrQw8vOkQAJkEC0CFCAhjsezz77rDz00EOyYcMGadmypdxwww1St27dcBsVsdopQCM2IGwOCZBAwRGgAC24IWWHSIAESCC6BChAwxmb5cuXy5AhQ+Sdd96RG2+8US6++GIpXbp0OI2JeK0UoBEfIDaPBEgg7wlQgOb9ELIDJEACJJA/BChAgx+rdevWSdu2bWXr1q0yc+ZMOfzww4NvRB7VSAGaR4PFppIACeQlAQrQvBw2NpoESIAE8pMABWiw47Zr1y7p0qWLzJkzR26++Wa58sorg21AHtZGAZqHg8YmkwAJ5BUBCtC8Gi42lgRIgATymwAFqP/j98knn8jUqVOlVKlS0qpVK2nWrJm0b99eVwTBOW7cOKlXr56sXbtWdtttN/8bUGAlUoAW2ICyOyRAApEjQAEauSFhg0iABEigcAlQgPo7ttdff7089thjcv/99wui2p5//vlyxRVXyFVXXaUrql+/vqxfv16aNm0qDRo0kAULFkjVqlWlR48egnMrV67sb4MKoDQK0AIYRHaBBEgg0gQoQCM9PGwcCZAACRQWAQpQ/8Zzx44dOoLt2WefLbfddpsu+L777tMRbq+99lotPCFAkU455RQtTiFGb731VkFQooMPPlgwHgxGpBHZfyhAbRTcIAESIIGcEKAAzQlWFkoCJEACJBCPAAVoPCqZ7cP8zlq1askff/whjz76qJx44onaCvrBBx9Iz5495bnnntPCs3r16rJp0ybtoouaPvvsM+nQoYP88ssvMm3aNOndu3dmDSjQsyhAC3Rg2S0SIIHIEKAAjcxQsCEkQAIkUPgEKED9HeOhQ4fKhAkTdKFwq8U25oAiPfLII3LeeefJYYcdJu+9957eZ/4ce+yx8tprr8mIESP0sixmP99FKEB5FZAACZBAbglQgOaWL0snARIgARJwEKAAdcDwYdOyLB1kaNSoUQKL6B577KGtmscff7zMnj1bR8Bt2LChrFmzJqa2YcOGyfjx4+XCCy/U80djDhb5BwrQIr8A2H0SIIGcE6AAzTliVkACJEACJGAIUIAaEtm///bbb7Jw4UId8fbTTz+VQYMGadFZqVIl7XL7008/Se3ateX333+Xb775Rm+bWo0Avemmm2T48OFmN98VAQpQXgYkQAIkkFsCFKC55cvSSYAESIAEHAQoQB0wstz88ccf5aijjpL58+frkmABPfroo+Xdd9/VwhRLsgwYMEBbOJ955hk9H9RU2bVrVy1WsYQL8jH9SYAC9E8W3CIBEiCBXBCgAM0FVZZJAiRAAiQQlwAFaFwsGe2EAN1rr73kxRdf1EGHUAii3SLCLSyjWPNz48aNOuBQhQoVZO7cuXrZlWXLlkmbNm0E0XOxfAtTLAEK0Fge/EQCJEACfhOgAPWbKMsjARIgARJISIACNCGatA9AgO67777axRZBhbAsC+aEYj4ollgxCSK0b9++AmsnhOfixYvlzDPPFLjfQqQyxRKgAI3lwU8kQAIk4DcBClC/ibI8EiABEiCBhAQoQBOiyegARCdEJIIM1ahRQ/bcc8+E5WzZskXWrVsnBxxwgJQtWzZhvmI/QAFa7FcA+08CJJBrAhSguSbM8kmABEiABGwCFKA2Cm5ElAAFaEQHhs0iARIoGAIUoAUzlOwICZAACZQkMHHiRFm0aJHUqlVLR0HFu/NVtWrVkiflcA8FaA7hsmhfCFCA+oKRhZAACZBAQgIUoAnR8AAJkAAJ5D+Be+65RwYPHpywI7vvvrvUrFlTi1Ms2eEUp+5tiNVSpUolLMvLAQpQL5SYJ0wCFKBh0mfdJEACxUCAArQYRpl9JAESKFoCn332mTRv3jxl/yEsEcAmWSpXrlxCSyrEqlPAJhKrFKDJCPNYFAhQgEZhFNgGEiCBQiZAAVrIo8u+kQAJFD0BiEoIw02bNqUUmF5heRWrxrJqLKloB27u8Y7lQzp37qyXCPFaL/ORQBAEKECDoMw6SIAEipkABWgxjz77TgIkUBQE+vTpI9OmTQulr4nEKpYNGTdunLRs2TKUdrFSEkhEgAI0ERnuJwESIAF/CFCA+sORpZAACZBAZAnce++9MmjQoMi0b+zYsXL44YdL48aNpUGDBpFpFxtCAiBAAcrrgARIgARyS4ACNLd8WToJkAAJhE5g6dKlctBBB4XWDhO46Pzzz5fevXsLAh8hUYCGNiSsOAkBCtAkcHiIBEiABHwgQAHqA0QWQQIkQAJRJoB5oHXq1JGNGzf6Ng80nf7us88+8tBDD0n37t2FQYjSIce8YRCgAA2DOuskARIoJgIUoMU02uwrCZBA0RI47bTT5Kmnngqs/8bqOXDgQLnpppukcuXKum4K0MCGgBVlSCAbAYpz+/fvL23atJGzzjpLP3SpWLFihi3haSRAAiRQmAQoQAtzXNkrEiABEoghcN999wnEYK6TCToE99pJkybJEUccEVMlBWgMDn6IIIFsBOiyZcvksssuk/Xr1+ue7bHHHnLkkUfK8ccfLz179hR4AzCRAAmQQLEToAAtwisA7ni//fab/P7773FfiY4595cuXVp22203KVOmjGAb7/jsfMXb5zynCNGzyyQQGoHPP/9cDjzwwJzWD/GJ15AhQ+T666+XeJYfCtCcDgEL94FANgL0hx9+0C346aefBGvwvvjii9rtHL+f+G60bt1aevXqpQVphw4d9O+nD01mEXlAYMOGDbJu3bo8aCmbWKwEoA/wfwoJXksHHHBAzlBQgOYMbfgF//HHH/LLL7/I9u3b5eeff9avbdu2yY4dO0JvHIRopUqV9AVeoUIFMa+yZcuG3jY2gAQKkUAu54HiBwvlN23aVB5++GG9vmcihhSgichwf1QI+CFAa9SoYQf++v777+Xll1+WGTNmyKuvvio//vij7irWw4VVFIIU86PjPbCJChO2IzsC3377rcA6zkQC+UJgzz331FMJctVeCtBckQ24XIhKPHGF0DTvEJ+4KcynVK5cOS1M8UMMgYp3iFPzRCaf+sK2kkDYBPD9X7x4sbz99tv6tWbNGpk/f76vzcJ3E6+hQ4fKmDFjpHz58knLpwBNiocHI0DAbwHq7NKuXbvk3Xff1ZZRCNIVK1bow3TVdVIqrG2Kz8Iaz2LpDQVosYx0Gv2E6+zWrVsF1ky844UftWwTXGmNa615h6XSbDvfcWOLdsDKalx5zbb73Y92QYxWqVJFv+AWgB9rJhIggVgC+F4uWbLEFpyzZs2SzZs360z4/h522GEye/bs2JMy/GSsnljeZfLkydKpUydPJVGAesLETCESyKUAdXcLrvEQonTVdZMpjM/xxKe5lymMHrIX+U4A9/CbNm3SU/OcfcF12rZtW+cuX7dpAfUVZ24Kw00lRCbmluAF4Yl96STMx4QlEevvwcqId/c2blD9TmgnxDEstHjt3LkzZhtW2l9//TXtaiFA99prL/uF/jGRQLERwPcL88ze/p+FE4ITPyRIEIgtWrSQI1QQILy6du2qxagfczpQNh5ODR8+XK6++mp7XU8v/ClAvVBinjAJBClAnf2kq66TRv5vxxOf+++/v9SrVy//O8ceFAQB3JcvXLhQT9dzd4gWUDeRIvkMKyLEJm4m8WOIAAZeEm4K4bZqXhCd2IbojGrC0xfnPFWzjS+Gl4SbYXxRMOdm7733jnRfvfSHeUggEQEIzqVLl8YITqztiYTvQfPmzWMEJ74P7oT1QBEMI92HWKYOnNeqVStt9WzXrp27+JSfKUBTImKGkAmEJUCd3aarrpNG/m1TfObfmBVbi+OJT8RhMR6VFKBFdEXgxg5PQCE64TYHYZYsOQP5wC0Vr1Tzr5KVF7Vj+BLA2osX5rXCCgwLaqqEL03NmjUpRlOB4vHIE8D/BASugIVz5syZAgsnxCMSBCfcX2HdxAsWTjyESZXOOOMMefLJJ1Nli3scP06jRo2Sq666SjINGEYBGhctd0aIQBQEqBsHXXXdRKL7meIzumPDlv2XQDzxCZdbeBeah9oUoEVwtWzZskXfVMbzwXZ2Hy6yuCCqVq2qXxCcuAktpgR3XUQQhHUY78kEKdjATdeIUQh2JhKIOgEjOCE68cLNDBKuZyyjArGJFwQnru100wMPPCAXXXSR59NQL4Rw+/bttdWzZcuWns+Nl5ECNB4V7osSgSgKUCcfuuo6aURrm+IzWuPB1pQkkEh8wrPpiy++sB9yU4CWZFcQezD3EZYMvJLNgYSVAW50eEF45mKeZj4DhWUU1mK8EAE4UYL4BEOEvQdHJhKICoHly5droWkE5zfffKObBuHXrFkzvYi9EZy1atXKutmoD+V6TZgrPnr0aBk2bJhe79freYnyUYAmIsP9USEQdQHq5ERXXSeNcLcpPsPlz9pTE0gmPnGfDE8L42VFAZqaZ97kwLxOCCXcYJp1wOI13ohOuNNBLOFGlCk1AcwdhRUZr2RiFC4GmAcHMRrlubGpe8wc+UgATxiN2MT7119/bXcDwhBi07xwjeYi1a1bV1tWYdmMl4zV85BDDtHresLy6leiAPWLJMvJFYF8EqBuBnTVdRMJ5jPFZzCcWUvmBFKJT5RMAZo530ieCQsnRCdeZnKvu6HGQgeXOriNUnS6CaX3GWIUfux4wdocL4ExrKK4GadVNB4h7vODANb5cwrO9evX28U2bdrUFpsQnXgwEkQ688wz5YknnkhYFR7SjB07Vi699FId7TZhxgwOUIBmAI2nBEognwWoExRddZ00crdN8Zk7tizZHwJexCdqogD1h3fopSBozldffaWtnvEsDRBAED6wckAI0b02N0PmZY4tIgXXr19fz6njOORmHIql1JUrV8YITvwPMKlJkyYxghMPP8JIDz74oFx44YUxVRurZ5cuXWTSpEmCtuYiUYDmgirL9JNAoQhQJxO66jpp+LdN8ekfS5aUGwJexSdqpwDNzRgEVip+vNatW6ejtsarFNYFiE68ML+KKRgCcIGGey5+MBK5QMMlF0IUwoBBi4IZl3yvZdWqVTGC88svv7S7hDXfYNk0r6is/wY3YFhfnQkPYW688UYZPHhwTh+GUYA6qXM7igQKUYC6OReKqy4e8OE3O4xE8RkGddaZDoF0xCfKpQBNh26E8uJHa82aNXrJkHjNqlatmhY21atXj3eY+wIkABddzL3DZOt4a6yWKVNGGjRooBeMphANcGDyoKrVq1fHCE48bDJpv/32s8UmRGdYN0amPcneEWAAXhpIRx11lDz00EOy7777JjvFl2MUoL5gZCE5JFAMAtSJL59ddXv27ClY7xzRvTF9KagUT3ziwTW82ZhIIAoEID4RVd+ZsNQKot0muq+lAHXSyoNtuHjCCmJu5pxNxiAjciVuRAtpjU52tl5aAAAWTElEQVRnH/N5G2ut4ocE8/LizRVFQKiGDRvqBwecl5vPI51529euXRsjOPGQyaTGjRvHCE48tMiXhHmg06dPl1tvvVW74wZ1fVOA5ssVUrztLDYB6hzpfHLVRbDBSpUq6ebvs88+el57586dnd3JyTY8qT777LOclM1CSSBXBFKJT9RLAZor+j6Xi+BCEJ74Z+ROEC5wt8ML1jSmaBPAHF1EKIY1C0u7uBOesMK6BSs2U2ETwDXw9tv/XYMT77B4mgQLISyb5oWbnnxNs2fPFrQ/6D5QgObrFVM87S5mAeoe5Si76r7wwgty0kkn6SbjARriN1xzzTUycuTIhBYed/8y+YwpDM7o5ZmUwXNIIEgCmO7XsWPHlN8LCtAgRyWDuiBWYDGDJQQWNGei66aTRn5uJ3OlxtI4mNfH5Vvyc2zjtRpzNp2CEw+VTIL124jNI488UlvDzTG+Z0aAAjQzbjwrOAIUoPFZR81Vt3///nrqgGmtCaTWtWtXmTJlSs6mQFCAGuJ8zxcCbdq0EUy7SZUoQFMRCvE43DQxQG53Wzx5g7UT1gRaPEMcIB+rxhIusH7B0u1MsG4jQijEKFP+EUDQCqfgRNRak/D9NYIT70HMiTR1F8s7BWixjHT+9jNTAbpgwQLBlBwk/D4cdNBB+QshRcvDdtVFUEHccyGOQ7xVBrDCwOTJk20LaYrupHXYKUARvK1FixZpnc/MJJBrAtu2bYtxE2/fvr3trp6sbgrQZHRCPAZBsnz58hJWT0w6h3smotsyFRYB/MjBQga3TGw7EwIOYNy5bIuTSvS24a3gFJxYl9MkzNl0Ck7M6WTKLQEK0NzyZenZE8hEgGLqxrx58+zKC12A2h393wZuXGfMmCEvvvii4DuO4H6wSLZu3Vp69eolxx9/vHTo0MG338u5c+dKp06d3M2wP+N3Gb/ZAwcOlPHjx/sag8MpQCtXrizt2rWz6+UGCUSBAATo/Pnz7aZQgNoo8msDbrb4h4Mnbc4EN0xYwhj1zEmlMLdh+cbDB/fyLZgbeuCBB3p6slSYZKLXK8zNcQpOfHdNQjAwp+DEAwSmYAlQgAbLm7WlTyBdAQrxuWjRIoFV0CT8rynW/y9BuOpirud1111ncCd9b968uTz11FOCdz8SBagfFFlGLglQgOaSbkBl44cF0c7cEVIhOrGOHtwxmYqHANw3MUfQ6fKDJ6240YBFlCl4At98802M4MSDApPgouUUnJi/yxQuAQrQcPmz9tQE0hGg8cQnrJ94MBlUZOnUPQovhxdXXVhI040g3rZtW1m4cGHMb3GiXmIcEITltttukwEDBiTK5nk/BahnVMwYEgEK0JDA+1Utbmzhrud0vcSyKnDTo9jwi3L+lYMbjqVLlwrWEnWmmjVr6ocSidZXcublduYEsGyO08LpXOcK30un4ISHAlO0CFCARms82JqSBLwKUIrPkuxS7fHDVRfTYhAgzvkgOFW9xiX3lFNOkQcffDCriPYUoKlo83jYBChAwx6BDOuH4ITwhAB1Jqw3haeacLtkKm4CuEYQvMYdih0BCeDmwzVf/bs+4Po+a9YsW3TiBsbceNSpUydGcMIrgSnaBChAoz0+bJ2IFwFK8Zn9lZKpq+69994rgwYNyrgBcI9+4oknpEuXLhmVQQGaETaeFCABCtAAYftV1c6dO2XJkiUlotwy4IxfhAurHKwBC5dPBFwwCVGQEf1wr732Mrv4ngYBBPtyCk5Ym43grF27dozgbNasWRolM2sUCFCARmEU2IZkBFIJUIrPZPQyO5aOq27Pnj3l5Zdftn8X0q0RLrl4XX311fqVrtcSBWi6xJk/aAIUoEETz7K+n3/+WT799FPZsWOHXRL+McGqAvdKJhKIRwDzg/HQAtePSfhxw3xDumobIonfIeKdghNzro3grFWrlmBNN7jVYh1OCE6wZcpfAhSg+Tt2xdLyZAKU4jOYqyCRq27Lli11XA7nQ99MWoTfEfzOwAqKNUOxBJfXRAHqlRTzhUWAAjQs8hnU+8MPP2gRgYi3JsGNEu6UcKtkIoFkBHDdYC4ixJQzIbACl/ZwEhHZvHlzjOCEeDeCEw96jOCE6GQgj1h2hfCJArQQRrGw+5BIgFJ8hjPuTlddLPPifNjrR4uwZuhDDz0kp556qqfiKEA9YWKmEAlQgIYIP52qIRqcbn44F/+Q4EbJKLfpkGRerBe6evXqGBCw4hWz5Q43c04L5+LFi23BiWiRTsGJ7xwtnDGXT8F9oAAtuCEtuA7FE6CYnuNeaoXRboMf+n79+snkyZN9rdgEKLroootkwoQJKeN8UID6ip+F5YAABWgOoPpdJAINOZdtQPmYZwa3W94I+027OMrDAw24DzmjJ1evXl0/0MAPXaEnPK12C07DAssXOQUnPAz4PSv0KyK2fxSgsTz4KXoE3AK0VatW+iG1c51Pis/gxw2/I5jWgjgBxmvG71bgIejUqVMFrr6JEgVoIjLcHxUCFKBRGYkE7UAEU/wjcSaE9m7UqJFzF7dJIG0CW7ZsEVj6nPNUqlWrpl26C02EQnC+++67OkrtzJkz9TxqIzghvJ2Cs0WLFhScaV9NhXUCBWhhjWch9sYtQOEJRfEZ/kh/9NFHcvDBB+e0IXggWq5cOW0JHThwYNzfKwrQnA4BC/eBAAWoDxBzVUQ8yyeCxmDheiYS8IMA5gshqBVct0yCIMt3qx/mSxvBifU4sRi4EZwQ2W7BWWiC24wl3zMjQAGaGTeeFRwBtwB11kzLp5NGsNuIWjt27NicV2pcck888USZNGmS4HfbmShAnTS4HUUCFKBRHBXVJrhIItKmM8HlFmsKMpGAnwS2b9+uBZpThOIGBm4++ZJ+/PHHGMG5YMGCGMGJKIImSi3clig482Vkw2mnU4BWqVIlreiT4bSYtRYbAdy8rV27tkS3KT5LIAl0R5s2bfQ83Fy538brDFx+sWYoHqyaRAFqSIT/vnXrVrnjjjv0muxYH5bpvwQoQCN4JeBmGlYpY7FBEyk+IzhQBdSkeCIUlnZY3KOY4D7stHBCcJro0Fjb1AhOiM7WrVtTcEZxECPcJqcAjXAz2TQSiCFA8RmDI/APX375pWCKVJDiE52ESy5eI0eOlGuuuUawzjcFaODDX6JCREKeOHGijBs3TjANCNbq559/vkS+Yt1BARqxkcd6jfPnz4+Zl7fffvtJ/fr1I9ZSNqfQCOCfJYScc05okyZNIrFOKJ4gOgXnJ598YgtORIN2Ck48gaaFs9CuzmD7QwEaLG/Wlj0BBE9jhO7sOWZTAqxbgwYNyqaIjM+FAIXw7dy5szz++ON6Wg1iiCBVrlxZ2rVrl3HZPDEzAli+DUu6zZ07V6644goKUBdGClAXkDA/woID8QlrlElco9GQ4HsQBGBZRBh/Y33HjxqiK0LkBZnwj2n27Nk6aBDmcDofyuy5554lBOduu+0WZPNYV4EToAAt8AEusO7R8hmNAe3Ro4e88sorgVtA3b3HtIHrrrtOe//gGAWom1Cwn3FNHHfccRSgLuwUoC4gYX7EnE/M/TQJTzQRDIaJBIIkgPDxWHPWJETba9++vY66Z/b5/Y5/RO+9954tOOfNm2dbYvFj6rRwtm3bVig4/R4BlocHgHCTws28M5ooyZBA1AnA5RIPC5nCIwAPIgQC2rFjR3iNcNXcs2dPGTJkiP6fRguoC46Hj/AGg3iEgO/UqZO89NJLOjbLSSedZC+BgzXVX3jhBUEUauyPFySUAjQ+bArQ+FwC3/vtt9/KsmXL7HorVqwovNG2cXAjYAL4p7pu3Tq7VsyrhCXUr4Tou07B+fHHH9uCE//sDz/8cB00CHM48cOJGyymwiWAxdWNu5jpJdyoH3300Zxa3/GwBRErP/zwQ32TcdZZZ8l5551nmsB3EiABEvBEAHP7Tj75ZE95k2VyPkjIdi4pRFGzZs3k5ptvFlhnmbwTuPXWWwWvDRs2SJ8+fXRcFjxkwO8UHlBiXice1E+bNk3wkBz7MV0O3lr47EwUoE4af25TgP7JIrStX3/9VXADboKowLoDi1P58uVDaxMrLm4C+OGDKy4CYpmUzXxQ/ON2C05jZYLgxLwViE28cO1TcBrqxfGO6+3GG2/UQTTQ4379+ukffzz4yEXC/1rM18KSCZg3B6Eb1YBbueg/yyQBEvCXwAUXXKCXQ8mk1N13311gdKhUqZL9Mp8zfccyfsajji646Y8KLNkjRoyQ22+/XTDtByLykEMOkXfeeceONox5nWPGjBGMX/fu3eWtt96SZ555Rk455ZSYCilAY3DYHyhAbRThbSDiLVy/TMITq9q1a5uPfCeBUAjgH7DTMokHIx07dtT/bFM1CPOYMY/ubTV/c+bMmXoSvhGc+JF1Cs4OHTpQcKYCWgTHMQXBTDl444035Oijj85Zry+55BK58847BS5q06dPZ9CqnJFmwSRQHASGDh0q8OzB71sy0RjvWC4euDIKbvbX3ZQpU6Rv375y2WWXyYQJE+wC8WAU8TJMrAwcuOGGG/QDVPyuwO3ZmShAnTT+3KYA/ZNFKFvu9T4xh6BFixahtIWVkoCbgHs+KObHxVsfFILzgw8+sOdwfvTRRzoKH8rDD65bcMI1iIkEnATwxB7r2SHNmTNHz7lxHvdrG+vlnXnmmTqyOKI+uxdw96selkMCJEACYRGgAM2ePKIJY1qGW4A2atRIT1FyCtD77rtPBg4cKLfccouOeOusnQLUSePPbQrQP1kEvoWLFzfqZtJ6OhamwBvLCouWgNtCj7mge+yxRwnBaa7jChUqyGGHHabdaY888khtNaXgLNrLx3PH/RKg+FF79tln9bxOeJPgoQkEJxLqgKstHpjghgFzT5lIgARIoNAIUIBmP6KJBCh+Q1atWhVjAb3//vtlwIABFKBpYKcATQOW31nXrl0ra9assYvlep82Cm5EiADWpoUrLh6YwI12+PDhgvWtnILz0EMP1YITczgRLQ6Rc5lIIB0CfghQrBfbuHFjvRYfAoLAbQpBIsy1OmnSJMFcLSQ82Ua0ZdQLrxMs4I55PEwkQAIkkO8EKECzH0EK0OwZJiuBAjQZnRwew4083MxM4CFYjTAXzhkBLYfVs2gSSIsAHpTggQkSnvJhiaBjjjlGi04ITkzCZyKBbAj4IUARmfDKK6/UwbMQOAL/Xxs2bChfffWVblrv3r3l6aef1lEKEeGwfv36MmPGDB2QCP97sY15oUwkQAIkkM8EKECzH71EAnTffffV90NOF1xaQNPnTQGaPjNfzli5cqV9U4QCW7ZsKdWqVfOlbBaSmAAsJHfccYcOmY0omEzeCOBG3szrRMRSRGiG8OQDE2/8mCs1AT8E6Pjx42XYsGF6PbbJkyfrJVxwE3H66afrQEMQnOvXr9f/Ay6++GK7Ueeee66OhIv5zbDuM5EACZBAPhOgAM1+9EaPHq2j3J5xxhmC3xEkrA2KIEQIOLV8+XLB6gBII0eO1IGILr30Urntttv0PvPH/C5haUUs08L0XwIUoCFcCTt37tTWT/P0pGrVqtK6desQWlI8VWIZkIkTJ+q1mxBx+MQTTxSs28XknQDWucKPmklNmzaVOnXqmI98J4GsCPghQHGNYt4nbg4QXAhutX//+9/tKLcIHgFL/muvvRbjbosAWpi3jAcq+F/BJbCyGkqeTAIkEDIBCtDsBgDBhPD67rvvdCBFxBEYPHiwnHPOOYLgdUiYNgfL56xZs3RUdUTGxZI3/fv3F4hO/NZAxCLSulnpAuuxYvoHHooWe6IADeEKWL16tY6gZapu06aNXmfIfOa7/wRg1di8ebNeDgRrN1GAps8Ylk9YQbFuLZKxgqZfEs8ggZIE/BCgKBU3Xqeddpr9pPmoo46Sl156SbuJd+vWTd58802BdRRWT5PwQwiXXVzjELF8sGLI8J0ESCAfCVCA5uOoFVebKUADHm9YPfG0HWZ8JNz0QIAyBUOA4bCz4+y2giJ4C5exyI4pz/4vAa8C9KqrrtICM57XyCeffGKvJQqPh1GjRukHJmPHjtUuUnCPggs+ot8iCq5JsHpi/T7MxcePYunSpc0hvpMACZBA3hGgAM27ISu6BlOABjzk3377rSxbtsyulTfwNoqkGxDsEI9wb8DcQ1g0sHD9SSedpOfP4mRYll944QXBkh/YX69evRJlUoCWQJLWDjxA+fDDD3U0XJyIuRBYloWJBLIlgEBBDRo00MUkWgd05syZOkgQ3KKMmyz+n9aqVUvP94TAhMXzhBNO0OWY7zsi4mJpFgTTOuCAAwTu44sWLbKbjHJx3qmnnqqDFNkHuEECJEACeUiAAjQPB63ImkwBGvCA4wk9AuEgYS3Fgw8+OOAW5F91iFaJ14YNG6RPnz6CdSlhsYA1DtGEEfly6dKlermFKlWq6P3wzcdkb3x2JnNDShdcJ5X0trH+1ZdffmmfhGsY1zITCWRDYPbs2dKlSxddxAMPPCAI/IDgV5jPCesoXGfHjBmj8+B7jPT666/raMwILgRxOXToUP29xxxPXJP4X4EHJFOnTtX/O3DOTTfdJLCiYu7OhRdeiF3Sr18//f8Dc3uwxhsTCZAACeQzAQrQfB694mg7BWiA44z1FDGHziSEct5nn33MR74nIIA1/EaMGCG33367dlnGzechhxwi77zzjnTt2lWfhXmduDnFciBYy++tt96SZ555Rk455ZSYUilAY3Bk9MF9HSOwC5a6YCKBTAn07dtXWyi3b9+esghEGISlEwmiFPM68X8UHhCXX365PPnkk9otHA9GVqxYoQXr9ddfHxOxGXNAsZ6t+f+LB1oQqfHcelM2iBlIgARIIGIEKEAjNiBsTgkCFKAlkORuByJi4Sm9SRBRXD/R0Ej+PmXKFMFN6mWXXaYXlze54QKKyGMmojD233DDDXq+15133ilDhgwxWfU7BWgMjow/wFIE7kgVK1bUa9hmXBhPJIEsCOB/KuYhwz0fD6vwPxURB2E5NQIzXvEIOAT3XUQhr127drws3EcCJEACeUmAAjQvh62oGk0BGuBwz5s3T98UoUoGH0oPfKIFgWF9W7duXYwARXCRgQMH6hDasIw6EwWok0bm2+5gRJiXa+bkZV4qzyQBEiABEiABEsiWAAVotgR5fq4JUIDmmvD/ysfan4h+axLmKGLeEpM3AokEKOZrYU6i0wKKuV0DBgygAPWGNqNcvJ4zwsaTSIAESIAESCDnBChAc46YFWRJgAI0S4BeT0cAnc8//9zOTouRjcLTBgWoJ0yBZnJa9OECiYjOTCRAAiRAAiRAAuESoAANlz9rT02AAjQ1I19yLF++XEdyRGGYo4T5n0zeCSQSoAjkhLm1tIB6Z+lXzpUrVwqWzkAqU6aMdO7c2a+iWQ4JkAAJkAAJkECGBChAMwTH0wIjQAEaEOqPP/5YLx2C6mrWrCkHHnhgQDUXRjWjR4/WUW6xNAPEKBLWBkUQIgQbgcBv0qSJ3j9y5EgdiAiRMhEx05nGjx8vw4YNk7Zt2+rlGpzHuJ0egc2bN8uSJUvskzp27CgVKlSwP3ODBEiABEiABEggeAIUoMEwx/JhWIEBqzQ0b948ZaXTp0+XwYMH6yl5xT4NLx8E6P8DAAD///0LWJUAAEAASURBVO2dC7xVY/7/v6RUQqGkf6XkNmVKVJJyqVApySUKYeo34zLjl0mMYZL5/fq5pAsZlWIkl9wv41oMQy7pLpckKqEiqRAZnP/+PGbt1t7n7HP23mevvddZ+/28Xvus+3N5f9fZe33W8zzf73YlsWRVOP388882e/Zs85rRokULa9y4cRVuUX6rfsMNN5g+X375pe2000525pln2kUXXWTnnHOOLVq0yFVGTCdPnmz/+te/7Oabb7ZNmzbZzjvvbP/1X/9lY8aMsVWrVtnIkSPtiSeesA0bNrhrevXqZWeddZYNGDAgvw2KSGlbt261N954I96aX/3qV9agQYP4NisQgAAEIAABCOSfwAcffGCfffaZK1jPQoccckj+KxHhEufMmWMjRoywmTNnulYuXLjQDj744HJbvGbNGmvdurWtX7/e3n//fdt///3LPT/qB7/++mtbsGBBvJmHHnqo1alTJ76damXp0qW2bt06d3jXXXetkHuqfNLZv11VF6DffvutzZs3L95W3YD16tWLb7MCgapK4LXXXrN///vfrvp77723NWvWrKo2hXpDAAIQgAAEIkEAARqsGR944AFr27atdevWzVavXm0VCVB1QPXo0SMuWBGgZgjQYO9Rl7vedrzzzjvxkjp27Gg77rhjfJsVCFRVAvrS3bx5s6u+ej/VC0qCAAQgAAEIQKBwBBCg+WGv53n1hlYkQMePH2+PPvqo1a1b143EQ4AiQPNyh3766ae2fPlyV9Z2221nRx55ZF7KpRAIBE3gvffes88//9wVE/RQiKDbQv4QgAAEIACBKBBAgFbOihKUM2bMMD2za9TiAQccYBoimpzSEaBvvfWWHXfccU6oDh061B577DGG4MZA0gOafDcFsL1y5Uo3B1FZq+dTNywJAlEg8OGHH9onn3zimlKrVi3r0KFDFJpFGyAAAQhAAAJVlgACNHvTjRo1yqZPn+78ishnyODBg2348OF2xRVXlMq0IgH6/fffW7t27ezPf/6zDRw40Pr164cA/Q9FBGip2yn3O9T7qV5QJTnR0c1IgkAUCHz88ce2YsUK15Tq1atbp06dotAs2gABCEAAAhCosgQQoNmZTs4VGzVqZIMGDbJx48a5TCZNmuSc3lx99dWlMq1IgF588cXOgeY999zjrkWAbkOIAN3GIrC1ZcuWmbxfKe2yyy5u4nJghZExBPJIQL2f6gVVqlatmnXu3DmPpVMUBCAAAQhAAALJBBCgyUTS25ZTxT333NMUvWLatGnWt29fFznh9ddftxNOOKFUJuUJ0GeeecYuvPBCF61BU5SUEKDbECJAt7EIbE2TjdeuXevyZ55cYJjJuAAE/PObt99+e+vSpUsBakGREIAABCAAAQh4BBCgHonMl8OGDbOxY8e6CxWuT+uaA1pWSiVA5RtDXnI1j9T/XIQA3UYRAbqNRWBrCNDA0JJxgQkgQAtsAIqHAAQgAAEIJBFAgCYByWBTIVNGjx5tV111lQszV7NmTVPYlT59+pTKJZUAvf32223IkCEuHr3/IokuJU3H00v7WbNm2WGHHeY/pWjWEaB5MLV/CC4BgfMAnCLyRoAhuHlDTUEQgAAEIACBtAggQNPCVOqkH3/80RYvXuw83i5ZssQNoZ09e7bVqVPHvvjiC5MY9adUAlTX3Hnnnf5T3fo///lP5zfj1FNPNY2IlGOjFi1alDqvGHYgQPNgZb8Totq1a1v79u3zUCpFQCB4AqtWrTJ5eVaqUaOGHX744W6dPxCAAAQgAAEIFIYAAjQ77hs3brSuXbvaggULXAaaE9qtWzd75ZVXnDBVSBZ/SiVA/ef41/v3728PPvggYVhiUBCg/jsjoHV/GBYe0gOCnJTta6+9ZnKlrS8RDXXQGPxrr73WGjZsmHQmm5UhwMuVytDjWghAAAIQgEDuCSBAs2MqAVqvXj178skn406HTj75ZNNIRvWMytmil9Rb2qBBA/vqq6/s8ccftxNPPNE7lHKJAN2GBgG6jUVga5999pnpy0BJQW0lhrQkBUPgueeec18c+hL56aef3JeDSmrcuLG9/fbbbthDMCUXX67vvvuuG5ailtetW9fatGlTfBBoMQQgAAEIQCBEBBCg2RlDArR58+bu2fH44483hWXRnFDNB/XP1bz11lvt/vvvt5dfftkV1LRpU+vevbuNGTPGPQulKh0Buo0MAnQbi8DWFMhWY8m91KFDB6tVq5a3yTKHBPRGSkJTQX8Vf0lfHpo8ft5557kvlJEjR1pZsZxyWIWiyko9zPoSUZLr8gMPPLCo2k9jIQABCEAAAmEjgADN3iJ6blRPp0Yv1q9fn06L7FGWeyUCtFw8uTn43Xff2ZtvvhnP7Ne//rXttttu8W1WckdAvZ9Tpkyxhx56KCFTvcmaOXOm6e2T3lqRckNAE+3Vy6zUrFkz23vvvXOTMblAAAIQgAAEIJAVAQRoVti4KI8EEKB5gK3uez2oK7Ctkrr31V1Pyp7AwoULXXwlDWXWpHDFaDr00EPdnE+Je4khf5Io/e1vf2tnn3223XXXXf5DrGdJIPnFSqtWrWyPPfbIMjcugwAEIAABCEAgFwQQoLmgSB5BEkCABknXl7d/qKIe0vWwTsqOgJwLTZ8+3SZPnmwa3jx48GAbPny4c2edKscbb7zRnXPLLbfYRRddlOo09mdAQIGW33vvvfgVmh+R7KI8fpAVCEAAAhCAAATyQgABmhfMFFIJAgjQSsDL5FK/t9Dq1atbp06dMrmcc/9DQGPzGzVqZIMGDbJx48a5vZMmTbJ169aVO7fzmGOOMdlAnsyYf5ub28n/A4d359wwJRcIQAACEIBAZQn4f5+JP19ZmlwfBAEEaBBUy8hTAWzlMdRLGi6qwLakzAgoJpOc3Wg487Rp06xv376uF/T111+Pu8xOzlHutPv162fPPPOM81KWfJzt7AhoXrOG4Sppon7Lli2zy4irIAABCEAAAhDIGQEEaM5QklFABBCgAYFNzlbeWRWbUvNBlTRHEYctyZTS2x42bJiNHTvWndyrVy+3rjmgZSWFwJHX4REjRrg5oGWdw77MCSTP/9x///1tr732yjwjroAABCAAAQhAIKcEEKA5xUlmARBAgAYANVWWixYtsk2bNrnD6v1ULygpcwIS8aNHj3ZxmdQjqnmHCrXSp0+fhMwkko466ig79thjTfNGSbkj8PHHH9uKFSviGXbs2NF23HHH+DYrEIAABCAAAQgUhgACtDDcKTV9AgjQ9FlV+sxPPvnEPvzww3g+7du3t9q1a8e3WamYgHqSFy9e7MS7YqteeOGFzsOwBL2GOXtOcBQa5PTTT3e9chMmTEjIePPmzbbLLrsk7GMjMwLz5s2zb7/91l0klm3bts0sA86GAAQgAAEIQCAQAgjQQLCSaQ4JIEBzCLOirH744Qd744034sNwmzRpYvvss09Fl3HcR2Djxo3WtWtXF25Fu9UD2q1bN3vllVecMFVIFqUhQ4a4+JR33HGHKVSLl3Te1KlT3fxRbx/LzAh88803Nn/+/PhF++67r/2///f/4tusQAACEIAABCBQOAII0MKxp+T0CCBA0+OUs7PUa6fQIUryhquhi9tvv33O8o96RhKg9erVMzkWOuGEE1xzTz75ZOfdVj2j1apVc+FWFHZFQ5y17aUvv/zSDRudOXOmE63efpaZEZAn4TVr1riLJO4PP/xwdy9nlgtnQwACEIAABCAQBAEEaO6oarSXnikfeugh9+wjnyMK5zdw4MBShejlvMIEPv/88y4ueu/evd25RF8ohcoQoKWZBLpn/fr19s4778TLOPDAA51X1/gOVsolIAHavHlz17t5/PHHm8KyaE7oVVddZYpDKc+45557bso8WrRoYfpi9veKpjyZA6UIaAi0evE1xFkJ77elELEDAhCAAAQgUFACCNDc4Nczj/yIaPRc06ZNE3xfSJTKKaaX1MGkEItyjnnTTTfZ0qVLbcCAAda5c2fnp4TnTo/UL0sEaCKPwLcklubMmeOEkwrbaaedrF27doGXG6UCJDrVs7ly5UongHbdddcoNS/UbVm1apXj7lXy4IMPNvh7NFhCAAIQgAAECk8AAZobG8iHiKZyPf74406ASlQOHTrUnnvuOedzRJ0icsC4ZcsWO+igg0y+XvSc5EUFkANMdZDIceall14ar9Rf/vIXJ1Z79uwZ31dsKwjQAlg82RlRq1atXFd9AapCkRBIm4B6PfXyRPNulQhunTY6ToQABCAAAQjkjQACNDeojzjiCJs4caJ5/kWUq+LOq6dTaeHChaYX8Q8++KD179/fTjvtNNfb6Q7G/mjUY4MGDVzoRTkhVS+oYtJraK6mkiFAF3io3LQ5ORStKOklwLp169xp6gAR/6DSdrFew1+CZwZVQp7z1YO8hjGqa1+JXtA8G4DisiKQ3PvJi5OsMHIRBCAAAQhAIFACCNDc4H3kkUdMfkaSkxwvKs68RKWciWqo7YwZM+y6666zyy+/POH0vffe2xS6Ti/wJUhPPfVUU5jAP/zhD67XtEePHq53NeGiItigB7RARk6Oo6hJzQ0bNixQbSgWAuUTUK+nvjz18kRDTho3bkwc2/KRcRQCEIAABCBQEAII0OCwq09MPW9yLLR27VrXq6mwigpPd99999kZZ5yRULjmgL766qt299132+rVq10kBgnXU045xSRO5dCoGCNiIEATbpP8behB/s033zSFZlGqUaOGdejQIcFra/5qQ0kQKJ+A3/OtPL/9/PPPLhzO0Ucfbfrst99+5WfAUQhAAAIQgAAE8kIAARoc5pdeesmOOeYY0/zQ3//+964ghVXU9LonnnjC+vTpk1D4cccdZ7NmzbLrr7/eLrvsMuvXr5899thjzlOuwggWa0KAFtDyCmWhB3svERfUI8EyTAT8XxLqCZ00aZLJ25v/3tVwFE+MaqnYoCQIQAACEIAABPJPAAEaDHP1firignpANZdzhx12cAVpBKPmJWqfhtT6k+Z5Pvvss3FHRJ4AfeGFF9yLfP+5xbTuf7ZUuxU6kTmgeboDdCMvWLDAvvnmG1eiJifLAJoTSoJAGAiUd49q/oPeBHof/eB5SUN0JUT1llDLYhxe4rFgCQEIQAACEMgnAQRoMLSvueYau//++50jIn8EAG8I7qOPPmonnXRSQuFdunSx2bNn21NPPeVCtCBAf8GDAE24TfK/sWnTJlu0aFG84F122cV5dCJeUBwJKwUkoPkKH330UbwG6ulM1bv56aefxsWoROny5cvj1yl+loSo91EsVxIEIAABCEAAArkngADNPdOHHnrILrnkEhcTtFmzZgkFaD6nHBZNnTrVBg8enHBMXloXL17sYojqOk+A/vOf/3Qv6RNOLqINBGgIjP3++++7icxeVXSDamIyCQKFJPDtt9+6HnrN91TSPGW95fOGnFRUN82HkBDV58UXX0wQsrq/PTGqZfKXeUV5cxwCEIAABCAQFgIKvyGHNBpCqBBlWmo0W/KyrH3+c+TYJhcJAZoLitvyUOgVebrVUNoDDzwwfkDebKtXr24333yzDRs2zMX6VMxPL8nfi9dTKsGlziVPgOq5SM8/xZoQoCGwvMKxzJ07N+6QSDdomzZt4jdtCKpIFYqMgL40NTxcwZW9pCDLu+++u7eZ8VKenz1BquWKFSvieUiA6ovY+/ACJo6GFQhAAAIQCDmBoUOH2k033VTpWlarVs1q167txKuEbEWCNdXxL7/80vSAL0Gr+YkdO3asdN2KNYO33nrL+vbt63o427ZtG8egl/NyODR27Fjba6+9TH5cJDbl4VaiVEkjHHXNkCFDbMqUKW6fwrA8/PDDZToscicUyR8EaEgMvWHDBufYxauOeps0H1RLEgTyTeC9996zzz//PF6sfsAUKiiXSXFFJUS9z8qVK+PZa4iuJ0a11BBeEgQgAAEIQCCMBJ5//nk79thjc141/3Qs+WTINCm6wqhRo6x79+6ZXsr5MQKaSqQ5nJs3b3YxOz0o6jjSsdatW7shudo/fvx4N0R33LhxphcSShKur732mgvR4r1YV0+pRGvXrl3t4osvdiFabrjhBnd+Mf1BgIbI2pprpzl3XtJ8UPWEbr/99t4ulhAInEByjFq9jT3kkEMCDxEkAeqJUS0lUL3UokWLBEEqJ0ckCISNwNatW+37778PW7WoDwTKJKBeGn2/kypPQCH19thjD9frWPnccpPDBRdcYP379zc9S+o3nJQZAQl++bzw+8FIzuGuu+6ys88+O7574sSJ9te//tXq1avnwtXp/0vzQv38FS9Uola/FZofKudEjRo1iudRLCsI0BBZWje7uvo3btwYr1X9+vWtZcuW8W1WIBAkAfV6qvfTSxoOpC/OQjykaIiuX5BKGHtJPwrqGfU+co5EgkAhCcibub6/FaqIBIGqQIDni9xaSWLvwQcfzG2mWeSm30f1qO22227uag3l9QugLLLkkgwJaBiu5vbuueeeZV4pHxt61i/mZxcEaJm3RuF26uFFc+/8b9H1ZmS//fYrXKUouSgIaBj422+/bd4wHw39adWqVaXmfeYSnL7Q/YJUTo68pP8PT4xqWYxvEz0WLPNPAPGZf+aUWHkCCNDKM/TnMH36dBs0aJB/V97WNVJOcxLPOeccu+WWW0xx5hUqTQkBmjczUFAGBBCgGcDK16ly/LJw4ULTGHMvacihhiGSIBAEAb2JW7JkifsB8/LXW9Qwv53T/Au/IFUYGC/tv//+CYJUDgJIEAiCAOIzCKrkmQ8CGjKql4yk3BBYv369c/gjJ375ThKZkyZNsoEDB7qi8YKbbwtQXqYEEKCZEsvT+ZrwrOFc/i8yRGie4BdZMRKf6vn032ty+lPVYnXqB9cvSL23vzKnHCipZ/SYY46xo446yj0kFJmZaW4ABMoSn3Xr1nUjVvzOQwIomiwhkDYBfRf6R4x4F9ID6pHI3VJz+1599dX4SKLc5Vw6J33HaMSSwqPdd999CZ0UCNDSvNgTLgII0HDZI6E2X331lRMGXhxGHWQ4bgIiNipJQMNu33nnnYSeT/V6qvezqqdly5YlCFINSVLSj7bieEmQ6iNBmmqeRlVnQP2DI1CW+NQD/a9+9St3jwVXMjlDIH0CyU7l/FciQP00crN+/fXX25/+9KfcZFZOLvod02f48OH2P//zP/GwH94lCFCPBMuwEkCAhtUy/6lXWQJBPxp6gMY7bsiNF/LqrVu3zt5///2EN7VRfsGhtvp7SBU0XEk/4hINfkHaoEGDkFuP6hWSAOKzkPQpO10CyeJT33VyKCcHKEoI0HRJpn/eu+++m5dhzXppevfdd6cMr4IATd9mnFkYAgjQwnDPqFT1hKqXyj9EUsFuDzroINthhx0yyouTISACCnHij7upfcU0xFvDlpYuXRoXpP/6179MglxJD2nyPO0XpHpQI0FABBCf3AdVgUBZ4lMv2jQSRM8USgjQYCwpfx3y4u459MtVKfptUp69evWyO++809kvVd4I0FRk2B8WAgjQsFiignpoTqjm6fld/NeqVcuJ0EKEyKiguhwOKQEN59bQVE9sedVs1qyZeUGSvX3FtNSPusLPeD2kEqQKSaOkH3056vALUjnvIBUfAcRn8dm8KrY4lfiU4JRvCQRosFYdPHiw3XHHHTktRL9DituqIb7//d//7X6XyisAAVoeHY6FgQACNAxWSLMO8o4rT6X+EC3qAdVw3N133z3NXDitWAls3brV9aTrn95L+lFTCBO8xHpEfllKkGoolV+QfvHFF+6gmGn0gV+Q8v+XyC+KW4jPKFo1em0qT3yqtQjQ3NtcL3bnzp1rTz75pP3jH/9wjHPd+ynP7jNmzLC2bdum1QAEaFqYOKmABBCgBYSfTdE//PCDExHqEfUn9V41i/VikSBQFgF5ulUPn+4fL+nlhYaa1qtXz9vFMgUBPUxoGLxfkMrlvpLmYnuCVF52jzzyyHgA8BTZsbuKEUB8VjGDFWl1KxKfwoIAzc3NoXm0s2bNcoLz6aefNs+ngLxgH3fccU6MqtOgMsmL7XneeefZhAkTbKeddko7OwRo2qg4sUAEEKAFAl+ZYvW2TQ5VvCGCXl4SEuoNrVGjhreLJQTcfE/N+fS/kWX4duVuDLHUkHi/IP3yyy9dpnpoaN26dbyHVIIUkV853oW8GvFZSPqUnS6BdMSn8kKApku09HlirF5OfV588cX4aDSNIurdu7f16dPHOnfu7IbKnn766fbAAw+UziSDPbvssotNnjzZzjjjjAyu+uVUBGjGyLggzwQQoHkGnsviFNfro48+ShAWEp+KebjbbrvlsijyqoIENORWjnbU++lPujfkjAIHVn4qlVvXS6FkQSoP1koSpG3atIkLUsWJQ5BWjne+rkZ85os05VSGQLriU2UgQNMnnWporX47O3Xq5ASnhKde/Cen6dOn26BBg5J3V7itKR56wdmxY0e79957s47HjQCtEDUnFJgAArTABqhs8WUNrVSeiuW4zz77EKqlsoCr6PUaHipnQ36nVWqKhmkXs7OhfJlTDy560PN6SF9++eW44w8J0oMPPjhBkGrYFilcBBCf4bIHtSmbQCbiUzkgQMvm6O0tb2htjx49XE9nz549K3zJrxExCpXij17glZFqKfGpz+WXX27XXHNNqdieqa4raz8CtCwq7AsTAQRomKyRZV00r089XZ5nOy+bOnXquDdzmcwb8K5lWTUJ6Mfuww8/dK72/S1Qz7je0tLz5qeSv3UJ0sWLF8cF6SuvvBL/f61WrVopQaowS6TCEZD4lL1+/PHHeCV23HFH23nnnePbrECg0AS8eehePSReNLqlvLBRCFCP1rZlJkNrt11V8ZpGu7z66qsJo9TKu6phw4Z2zz33WNeuXcs7La1jCNC0MHFSAQkgQAsIP9dF60tUsR39c/3U26IeryZNmlTotjvX9SG//BJQb7h6Pb/77ruEgjXkVsOymRucgKWgGxKkixYtShCk3lBpCVJ5Ojz66KPdRw8xmgtEyh+BOXPmxOd35a9USoJA9gTSEZ/KHQFqVpmhtZlY6IYbbnC9meVdI7vpmU1Def/+979brkJ8IUDLo86xMBBAgIbBCjmsgwyq8BH+UC3KXr2g++67rzHUL4ewQ5KVesDV65nslEo/bBqG3bhx45DUlGqkIqCe62RBumnTJne65hv5BamcXCBIU5HMzf7XXnut1PD13ORMLhAIhoB+3zX1pqJUrAI0V0NrK+LrPy7P8/I0nyrpN1ovhiVU//CHP+S0kwABmoo6+8NCAAEaFkvksB4aNrZ8+XJbt25dqVz1dq158+ZWu3btUsfYUbUISLSsXr3a5IwqeZ6JXjhoyK2GYZOqHgHZc+HChQk9pF7oJQnSQw45JN5DKkHK0NDc2tgvQOUxWh8SBMJEwHNy5tXp8MMPT2uUSzEJ0KCG1nrM01m2aNHCVqxYkTAyzbtOv9GK7SkndblOCNBcEyW/XBNAgOaaaIjy0w+UvoSSe0P11q1BgwZuaC4PViEyWJpVkTj57LPPnPhMdjIk2zZt2tR9NPyaFA0CsvmCBQvignT27NnmF6SHHnqoE6SKQ3rEEUfw4qGSZvcLUI0i0BQGEgTCREBObuR520sI0PwNrfWYp7O85JJLbPz48fFT9busIcBDhgxx+4Py0YEAjSNnJaQEshWg8+fPN/lpUJK/DDl1DCptFxsfXxJU5lHPVw+u6iXTR196/iSxImcFeriip8xPJpzr6tn+9NNP3SdZeKrGmuupt630bofTfrmsle6FZEGqL3Ol6tWrW7t27eI9pBKkQT3k5LJNZeX16KOPOk+SCnmQz4QAzSdtysqGAAL0F2qFGFqbib1eeOEF6969e/wSTZ+YMmWK9e/fP74viBUEaBBUyTOXBLIRoHoG1ghPLyFAPRIhXiompBwUaVhuWXpe3lE1f2T33XcPcSuKs2pbtmxxolO20wuF5KSXB+qlwcNtMpni2ZYg1VvBl156yX3UQ+q9IZQgbd++fVyQSsxVFUHar18/e+yxx2zo0KE2atSovL1cQYAWz/9OVW1pMQvQMAytTfe+0ctizwGgvnvl5bZZLBxa0AkBGjRh8q8sgUwFaLL4VPlysCnv0UElekBzSFZiZtWqVaUc1nhFaEjuXnvt5QyqB1dSYQjoJYEeMDTUNjm8jlcjiQj9kOXKa56XL8uqT0APPfPmzYsLUoUCUE+Bkh6GkgVpGHvNNWJD9dLLMyW9ZLnjjjvsqKOOcttB/kGABkmXvHNBoJgEaL681ubCLmXlMXDgQDc66eqrrzbN4c9HQoDmgzJlVIZAJgK0EOJTbUOAVsbCKa6VEJXzmrVr15bZI6p5ChI2erNAz1oKiAHsVggV2US9nd6Dd3IxGsKjeZ70VieTYTsVAQnSuXPnxgWpBJZfkHbo0CHeQ6q5ZGEQpPIKLO+/XtKUAaULLrjArr/++kCnDSBAPeosw0og6gI07ENrM7kv9Lueb38bCNBMLMS5hSCQrgAtlPgUEwRogHeGQnjIuGvWrEkZdqBmzZpuHtaee+6Z9y/RAJsemqw1rPaLL75wwtMLvZFcOT1864WAQqoQgiOZDtuZEtD/fbIg1UsppR133NGSBWm+H55UDznukAOPspJiG0+dOjVhblVZ52W7DwGaLTmuyxeBKArQqjS0Nl92zrYcBGi25LguXwTSEaCFFJ/igADNw92gIS4SQTK2bopUSeEe5EFXH29eQ6pz2Z+agHjLS7Fid+pBQttlJTHWkGh9JAxIEAiCgATpm2++Ge8hff31180vSA877LCEHlK9lAo6efM/yyrH6w0dPHiw3Xjjjc4TXlnnZbsPAZotOa7LF4EoCNCqPrQ2X7bOphwEaDbUuCafBCoSoIUWn2KBAM3nHRErS85L1CMqcSTnJqmSvE/Ji64+iNFUlLbt14+t5nN6orMsh0Le2fJoq+HP6vX0Hra9YywhEDQBDf9OFqQaRqYk8ekXpB07dnT7clkn/a/o3k81/9lflpyn3XbbbdarVy//7kqtI0ArhY+L80CgqgrQKA2tzYOZsy4CAZo1Oi7ME4HyBGgYxKcwIEDzdDMkF6OHwPXr17v5iHoQLMt7rneNxKgeGDUvsRDD9bx6hG0pAa+eTnHUsjzRqXl3GuasD72dYbNkcddHgnTOnDkJPaRefGEJUs0bPfroo91H4rSy92/y/M/y6OsFjb6bzjnnHBs3blxO5qwjQMsjzrEwEKhKApShtfm/YxCg+WdOiZkRSCVAwyI+1RoEaGY2DeRsDdFTz50+5Q3RVeF6IJUgrVu3rvvkY7heII3OIlMJzs2bN9vGjRvdR73J5Ql39RyrB1miU8ObSRCoCgQkPv2C9I033jBPkOoFlF+Qaj5ppoK0vPmf5fHR/9HkyZOtb9++5Z1W4TEEaIWIOKHABMIsQBlaW+CbI1Y8ArTwNqAG5RMoS4DKD4o/zqdyCDrUSnm1RICWR6cAxzQUT/NFJUY9T5rlVUMiS7EqJbD00XqmD6Tl5V+oY+rNlMDUP5G39ObNlVcnhbdRb7GEp0Q6Q2zLo8WxqkBA4lMi9MUXX3S9pBKnnhdnCVLFv/N6SCVIKxqyf9JJJ9njjz+ecdO93tABAwbYzTff7P7PMs4kdgECNBtqXJNPAmEToAytzaf1Ky4LAVoxI84oLIFkAdqkSRNbvXp1QqUKKT5VEQRogjnCtSHBpeGl+lTUM+qvuUSYhpwqlqV/WdGDqT+PfK1LaKqd+uhH1lt6PT7p1EPtkujUB9GZDjHOqcoE9JJKjoxeeukl99F8Uk+Q6v/dL0gVk9T/f6/eEw3l1yiCyiT9r91666122mmnZZwNAjRjZFyQZwJhEKAMrc2z0TMoDgGaASxOLQiBZAGaXIlCi0/VBwGabJWQbmuYrh4aNV9UH++BM5PqKkizHkYlUP1Lb93br+1q1aplknXCuXrIVWxE1bmipc7JNKluGoasGKoSnOr1JUGgWAlIkErUveQTpN7/lV5C+QWp/sfVS1rZpFjG+j8/5ZRT7G9/+5sb5p5ungjQdElxXqEIFEKAMrS2UNbOvFwEaObMuCK/BMoToGEQn6KBAM3vPZGz0iRANR9SN5n3Kc8JT6YFa7idHjIl9rRMXtfcS/1gqkz/Uuv65CqpHurVUXxOb5ixHqoZWpsrwuQTNQIaReAXpIpJ6gnS1q1b21tvvZXTJutF0IQJE+zMM89MK18EaFqYOKmABPIlQBlaW0AjV6JovwBVNvKsT4JAmAh4PlOS6xQW8al6IUCTrVOFt9UTovmS+lHzPtpXVZJ6Z9SbKYHp/0j8kiAAgewI6LvAE6TPPfecLViwoFznXZmWov9PvXTq06ePTZo0yRo1alRuFgjQcvFwMAQEghSgDK0NgYErWYVkAVrJ7LgcAnkhECbxqQYjQPNi9sIVogdDb46lxKjWtdSnvDikQdVYPZdynKKPeja9pdYlQEkQgEAwBDRaQfM/5QkvqKSh8QrXct5556UsAgGaEg0HQkIglwJUv8EahfDkk0/aP/7xDzcCQSOINCVGw+P14qZ379524IEHhqT1VKMiAgjQighxPGwEwiY+xQcBGra7JI/10Q+jPnowreiTfJ43JNcboqtlRR/vmjw2kaIgAIH/EFDP56GHHhooD683tEePHi5kS9OmTUuVhwAthYQdISNQWQEqJ3rLli0zxdx9+umnbe3ata6F8lmg/w0Jzp49ezJ0M2R2T7c6a9ascb440j2f8yBQSAJ68awwamFLCNCwWYT6QAACEAiAwNixY23YsGEB5Fx2lpqzPXr0aPvtb3+bMGcbAVo2L/aGh0BlBOjSpUvt7LPPjs+73m+//ZzgVE9n586dGekTHjNTEwhAoIAEMhagcv//f//3f6WqfMIJJ9j5559fan9ld+hhZdSoUW7ekuYFdunSxa699lpr2LBhZbPmeghAAAJFQ+DEE090wwA1/C8fyesN7datm02ZMsWaN2/uikWA5oM+ZVSGQGUEqLzUX3PNNW60weDBgxlaW44h8v086VVl9uzZzkbjx4+3Vq1aebvLXGqqknqt27RpY2PGjCnzHHZCAAKZE8hYgKqIzz//3Nq2bWufffaZe5unIOnazrVnUjnMkLCVl0UNEdUXu1Ljxo3t7bffdqE43A7+QAACEIBASgL5mP+ZsvDYAb08vO666+zCCy80/V4oPJPSPvvsYwqQTYJAmAhUVoCqLfXr17eWLVuGqVmhrEu+nifV+Dlz5tiIESNs5syZjsXChQvt4IMPLpfLVVdd5TpBBgwYYPfee2+553IQAhBIn0BWAlTZ9+/f3x588EE3pOSVV15Jv8Q0z9RbJwnNP//5z3bxxRe7uJcPPPCAc26hh6mRI0fa1VdfnWZunAYBCECgeAnMnz/f2rVrVzAAejmpnleNYLnoooviI1gQoAUzCQWXQwABWg6cAA4F/TzpVVnPkOos0aiM1atXW0UCVM+2Rx55pLscAepRZAmB3BDIWoD+7ne/s9tuu81NpNck+1wn9X5q2NZDDz2UkPXxxx/v3l7pC+v+++9POMYGBCAAAQiUJqChY5deemnpAwXao3mhZ5xxhu277770gBbIBhSbmgACNDWbII4E/TyZXOeOHTu63tDyBKi8hat3VKM2LrvsMkOAJlNkGwKVI1BwAaovgBkzZrjhuwqSLlfB8tQoj40K7tusWbOEFkqU6uFFk/zvuuuuhGNsQAACEIBAaQJygPLUU0/lNP5n6VIS93hTMlLNOdXcqwkTJtgxxxyTeCFbECgwAQRofg2QKwGa6nkyuTXpCNCBAwc6z6HnnnuuE6II0GSKbEOgcgQKKkDlXGj69OnOXf+GDRtME/aHDx9uV1xxRcpW3Xjjje6cW265xQ3lSnkiByAAAQhAwM2f18u8zZs3V5pGRaJSBSgck9y+y1GcXL/7P9q3fv16N39fc/s1HC75JWOlK0kGEKgkAQRoJQFmeHkuBGgmz5MVCdC7777bbrjhBhe/VV6N1ROKAM3QqJwOgQoIFEyAbt261Ro1amSDBg1ygctVz0mTJtm6devKndupt+XLly93MbZq1apVQfM4DAEIQKC4CcybN8/at2+fEkImonKvvfZKEJR+cal1Ccw99tjDidBUBeIFNxUZ9oeFAAI0v5aorADN9HmyPAG6YsUK0/Hnn3/efv3rX9vixYsRoPm9HSitSAgUTIDKC6IeWH7++WebNm2a9e3b19QLKrfc8nxbVnryySetX79+9swzz1j37t3LOoV9EIAABCDgI+CNGvHtcqvqqZRY9PdU+tf94rIiUZmcd3nbCNDy6OT3mHrFb7rpJufRfuLEifktPMSlIUDza5zKCtBMnydTCVA5uJTTodNOO82GDh3qICBA83svUFrxECiYABViBUVXcHSlXr16uXXNAS0rKeRLhw4dnAttzQElQQACEIBAxQTkrO2TTz5xL/z8AlOiUrE6850QoPkmXrq8b7/91s2/HT16tHvxqxfAjz32WOkTi3QPAjS/hq+sAFVtM3meTCVAFb9V30/PPvtsPKwgAjS/9wKlFQ+BggpQOafQD6DiLOkNVs2aNU1usuUww5++++47O+qoo+zYY4918Zj8x1iHAAQgAIGqQwABWnhbvfPOO24u7ty5c51PBQRook0QoIk8gt7KhQBN93lSbUklQBWTeM2aNVa7du14k3/44QcXBnCHHXYwTfvq2rUrL2vidFiBQPYEAhWgy5Yts1tvvdXGjx9fqoaK86k3S/J4u2TJEufqevbs2VanTh374osvnBjVRRoScfrpp5vmHsljoj9p+NAuu+zi38U6BCAAAQiEmAACNDzGUU9Pz5493RQYekC32QUBuo1FPtbSEaC5eJ702pJKgMoJ5ldffeWd5pYbN260hx9+2BSzWD5IWrZsaX/84x8TzmEDAhDInEDWAnTIkCF2++23p4wDKoHZo0cP69y5s40cOdLVTD2ZH3zwgSnciv6p9SZJ4VaU1AOq4MAK/CthqnOUVI5E6B133BEfEqH9Om/q1Klu/qi2SRCAAAQgEH4CCNDK2+jjjz92MbL1IPz22287hyl6GStPneqlUa+NnKioh1NTVyQyy0oI0LKomCFAy+YS1N58PU969U8lQL3j/uW7775rChmFF1w/FdYhkAMCsWELWaWYWCyJFV8S+8csWbt2bUlsTklJrOey5KOPPiqJvUkt8Y7HnArF8+/UqZO7ZvLkySWxt0xuPeZYKH485mDI5RcTr25fLHC6OyfWS1oS+xGNf1q0aFESm7tUEvuBjV/LCgQgAAEIhJ/Aq6++WvLSSy+5T0xIhb/CIarhhx9+WHL00UeXxDwXu89f/vKXkpjwLIl5lHe/lY0bNy6ZNWtWSYMGDUpi4W1KatSo4fbHwpaV2YqYQz93PDYEt8zjxbozFioofo/qXo15WU0LRezlefy62DDntK7hpJL482KQz5Me51hnR0ksBJS77x9//HFvd8ql7Khn3ZgATXkOByAAgcwJKDB5Rklfxvvvv7/7h9Q/ZXmfWOy5Ek9MqpAuXbq486dMmeIEaN26dUt23nnnklNPPbUkNu+zpHfv3iVvvPGGq8+dd95Zbt4SoTEPuhnVnZMhAAEIQKCwBBCg2fOP9WyWxBxKxYXl+eefX/L999+738LYiCL3mykxOn/+fFeIfq/1Gx0LJ1FmoQjQMrGUIEDL5pLrvfl6nvTq/be//a0k5uU2/mzZtGnTkt/85jfuedQ7J3mJAE0mwjYEckMg6yG4sR+1jJNiNa1atcpiAtZdq22FAli5cqXVr1/fBSfPOFMugAAEIACBKkOAIbiVN9W+++5rsd5Q27RpU9wPgsKpKHSEPHmOGDHCFaIwZ3KostNOO7lhpcklMwQ3mcgv2wzBLZtLmPbyPBkma1AXCGROIK8CNPPqcQUEIAABCESJAAK08tbcb7/9bPny5QkCNDZqyM4777wEAaqSFHrn66+/NoVeSU4I0GQiv2wjQMvmwl4IQAACuSKAAM0VSfKBAAQgAIEKCSBAK0RU4QllCdC7777bzj777FICVB7k5TEeAVoh1vgJCNA4ClYgAAEIBEIAARoIVjKFAAQgAIGyCCBAy6KS2T4EaGa8Mj0bAZopMc6HAAQgkBkBBGhmvDgbAhCAAAQqQQABWgl4/7m0LAE6bdo0O/fcc13Ys6uvvjpeCD2gcRRpryBA00bFiRCAAASyIoAAzQobF0EAAhCAQDYEEKDZUNt2zZYtW5zTPi2XLVtmEqNK119/vf3pT3+ygQMH2j333OP26ZyYt3kXSzsWJs1inundfu/PmDFjLBbuzNq2bRuPye0dK+YlArSYrU/bIQCBfBBAgOaDMmVAAAIQgIAjgADN/kb44IMP7IILLrAXXnjBZdKuXTsnPJ977jmLhZhw8zyrV69up512ml155ZUWCzFhc+bMcee2b9/enaOlvNGPHDnSnnjiCduwYYM73qtXLzvrrLMsFu8w+wpG5EoEaEQMSTMgAIHQEkCAhtY0VAwCEIBA9AggQKNn06i1CAEaNYvSHghAIGwEEKBhswj1gQAEIBBhAgjQCBs3Ik1DgEbEkDQDAhAILQEEaGhNQ8UgAAEIRI8AAjR6No1aixCgUbMo7YEABMJGAAEaNotQHwhAAAIRJoAAjbBxI9I0BGhEDEkzIACB0BJAgIbWNFQMAhCAQPQIIECjZ9OotQgBGjWL0h4IQCBsBBCgYbMI9YEABCAQYQII0AgbNyJNQ4BGxJA0AwIQCC0BBGhoTUPFIAABCESPAAI0ejaNWosQoFGzKO2BAATCRgABGjaLUB8IQAACESaAAI2wcSPSNARoRAxJMyAAgdASQICG1jRUDAIQgED0CCBAo2fTqLUIARo1i9IeCEAgbAQQoGGzCPWBAAQgEGECCND8GHf27Nl2zTXX2Pjx461Vq1alCp0/f75Nnz7dnn/+edtjjz2sd+/edtFFF1mtWrVKnVtsOxCgxWZx2gsBCOSbAAI038QpDwIQgEARE0CABmv8OXPm2IgRI2zmzJmuoIULF9rBBx+cUOiSJUusU6dO1qtXL7vpppts6dKlNmDAAOvcubM98MADtt122yWcX2wbCNBiszjthQAE8k0AAZpv4pQHAQhAoIgJIECDNb4EZNu2ba1bt262evVqSxagW7ZssYMOOsg++eQTW7Vqle21116uQqNGjbKrrrrKRo8ebZdeemmwlQx57gjQkBuI6kEAAlWeAAK0ypuQBkAAAhCoOgQQoPmxVceOHU29ockC9MEHH7T+/fvbaaed5no7vdqsX7/eGjRoYM2aNbMPP/ywqHtBEaDeXcESAhCAQDAEEKDBcCVXCEAAAhAogwACtAwoGeySoJwxY4YTiK1bt7YDDjjADj300FI5pBKgGmqr66+77jq7/PLLE67be++97eOPP3bCtUOHDgnHimkDAVpM1qatEIBAIQggQAtBnTIhAAEIFCkBBGj2htcwWTkOmjx5sm3YsMEGDx5sw4cPtyuuuKJUpqkEaPv27W3evHl233332RlnnJFwneaAvvrqq3b33XfbmWeemXCsmDYQoMVkbdoKAQgUggACtBDUKRMCEIBAkRJAgGZn+K1bt1qjRo1s0KBBNm7cOJfJpEmTbN26dXb11VeXyjSVAG3SpImb//nEE09Ynz59Eq477rjjbNasWXb99dfbZZddlnCsmDYQoMVkbdoKAQgUggACtBDUKRMCEIBAkRJAgGZn+H//+9+255572s8//2zTpk2zvn37ul7Q119/3U444YRSmaYSoA0bNnSi9ZlnnrEePXokXNezZ0979tlni94REQI04bZgAwIQgEDOCSBAc46UDCEAAQhAIBUBBGgqMhXvHzZsmI0dO9adqBAqWtcc0LJSKgHqDcF99NFH7aSTTkq4tEuXLqb4oU899ZQL0ZJwsIg2EKBFZGyaCgEIFIQAArQg2CkUAhCAQHESQIBmb/eSkhLXO6lwKeoRrVmzpvNkmzyUViWkEqCnnHKKPfLIIzZ16lQ3h9RfG8ULXbx4sa1YscJ5w/UfK6Z1BGgxWZu2QgAChSCAAC0EdcqEAAQgUKQEEKDZGf7HH3904lAeb5csWWIXXnih662sU6eOffHFF06M+nNOJUDVa6qeVMX6VMxPL/3000+26667us2vv/6aMCxvv+2hscMPP9xq1KgR30618tZbb9lXX33lDtevX99atmyZ6lT2QwACEChqAgjQojY/jYcABCCQXwII0Ox4b9y40bp27WoLFixwGagHtFu3bvbKK684YaqQLP6USoBu3rzZ5IhIYlPxPqtXr+4uW7RokbVt29aGDBliU6ZM8WdVdOv0gBadyWkwBCCQZwII0DwDpzgIQAACxUwAAZqd9SVA69WrZ08++WTc6dDJJ59sy5YtcwK0WrVq8YzVW9qgQQPXG/f444/biSeeGD+mlfHjx9sll1zivOkOHTrUHZNTI9lGIVoUD7SYEwK0mK1P2yEAgXwQQIDmgzJlQAACEICAI4AAze5GkABt3ry5aajs8ccfbwrLojmhmg962GGHxTO99dZb7f7777eXX37Z7WvatKl1797dxowZY3Xr1o2fN3HiRPvrX//qRK0869auXdvNCz3kkEPi5xTrCgK0WC1PuyEAgXwRQIDmizTlQAACEICA62XT8FGlffbZxw0H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6tWrl/OWffvttzZhwgQbPXq0bdiwwfr27WuPPfZYqXIkNh9++GG799577YgjjnB1kyB+6aWXrEOHDqXOZwcEIAABCEAAAsVHAAFafDanxRCAQEQIvPvuu9aqVSvXmueff966desWSMveeecdW79+vc2dO9eGDx9epgBVj+iFF15ov//9751YVUUkXBs3bmw1a9Z0PaIazkiCAAQgAAEIQKC4CSBAi9v+tB4CEKjCBNasWWOKpak0Z86cwHsZn332WevZs2eZAlRCWIJYYrVly5ZxqhdffLETpHfeeaedc8458f2sQAACEIAABCBQnAQQoMVpd1oNAQhEgECuBOjXX39tjzzyiL3xxht2wAEHWP369e3MM88sRSiVAH3//fftwAMPtFq1arlez+222y5+7d///nfT8GAJ16effjq+nxUIQAACEIAABIqTAAK0OO1OqyEAgQgQyIUAlWOhffbZxw2f7devn40dO9YeeOABk0Oh5JRKgD711FPWu3dvJ16XLl2acJmGBh977LG277772gcffJBwjA0IQAACEIAABIqPAAK0+GxOiyEAgYgQyIUAlWOhyy67zDZu3Gi77rqr/fTTT7b33nvbJ598UopSKgF6++2325AhQ+yQQw6x+fPnJ1ynuJ9ySKTe0S1btiQcYwMCEIAABCAAgeIjgAAtPpvTYghAICIEciFAx4wZY5deeqmddNJJpuGyCuFyzz332IABA0xhXfwplQCdNGmSXXDBBXbYYYe5Ybz+azQ3tWPHjlanTh3TUF8SBCAAAQhAAALFTQABWtzVyODwAAAFaklEQVT2p/UQgEAVJpALAapYopr3+c0339juu+9uI0aMcJ5sk8WnMKUSoN4Q3DZt2tiiRYsSiL7wwgvWvXt3a9++vb355psJx9iAAAQgAAEIQKD4CCBAi8/mtBgCEIgIgVwIUKHQ3MwzzjjDFixY4Mh07drVOQzacccdE0ilEqBLliyx1q1bu5Arq1evTrhG8UI1t1QecOUJlwQBCEAAAhCAQHETQIAWt/1pPQQgUIUJpCtAr7jiCicw1UOZnBYuXBiPJTphwgS76qqr7Pvvv7f//d//tSuvvDLh9FQCVA6LmjRp4mKFyqmRhtt66brrrjOVf8MNN7gYot5+lhCAAAQgAAEIFCcBBGhx2p1WQwACESAgR0ESfkqp4oC++OKLdsIJJ9iXX37pHAHpXIVN2XPPPd18z6FDh5p6PE888UQdig+zVa+lQrP4UyoBqnOuueYaGzlypE2cONHOP//8+GWaW6ohuuplbdasWXw/KxCAAAQgAAEIFCcBBGhx2p1WQwACESAwe/Zs69Kli2vJbbfdZgMHDnRebDWfU72jmn8pYahzJB6VZs2aZccdd5wbLrty5UobNmyYG3o7c+ZMq1mzpnnDaWfMmGGnn366u8b74zksatu2bXy4rndMAldOiORFV0N569WrZ3PnzrXDDz/c/vjHP7oeUO9clhCAAAQgAAEIFC8BBGjx2p6WQwACVZjA2Wef7Xoo0wltMm7cOFNPp5LnFKhp06a2YsUKJw7vu+8+54BIAnL58uVOsI4aNcq22247d82qVatc7+YTTzxhGzZscPt69eplZ511lvOW63bE/qxdu9bOPPNMmzdvnmm479tvv+16QzWctyynRt51LCEAAQhAAAIQKB4CCNDisTUthQAEIOAIqOdTHm933nln0/xNORuSsFTPqYRpZZPy+fTTT6158+ZWo0aNymbH9RCAAAQgAAEIRIgAAjRCxqQpEIAABCAAAQhAAAIQgAAEwkwAARpm61A3CEAAAhCAAAQgAAEIQAACESKAAI2QMWkKBCAAAQhAAAIQgAAEIACBMBNAgIbZOtQNAhCAAAQgAAEIQAACEIBAhAggQCNkTJoCAQhAAAIQgAAEIAABCEAgzAQQoGG2DnWDAAQgAAEIQAACEIAABCAQIQII0AgZk6ZAAAIQgAAEIAABCEAAAhAIMwEEaJitQ90gAAEIQAACEIAABCAAAQhEiAACNELGpCkQgAAEIAABCEAAAhCAAATCTAABGmbrUDcIQAACEIAABCAAAQhAAAIRIoAAjZAxaQoEIAABCEAAAhCAAAQgAIEwE0CAhtk61A0CEIAABCAAAQhAAAIQgECECCBAI2RMmgIBCEAAAhCAAAQgAAEIQCDMBBCgYbYOdYMABCAAAQhAAAIQgAAEIBAhAgjQCBmTpkAAAhCAAAQgAAEIQAACEAgzAQRomK1D3SAAAQhAAAIQgAAEIAABCESIAAI0QsakKRCAAAQgAAEIQAACEIAABMJMAAEaZutQNwhAAAIQgAAEIAABCEAAAhEigACNkDFpCgQgAAEIQAACEIAABCAAgTATQICG2TrUDQIQgAAEIAABCEAAAhCAQIQIIEAjZEyaAgEIQAACEIAABCAAAQhAIMwEEKBhtg51gwAEIAABCEAAAhCAAAQgECECCNAIGZOmQAACEIAABCAAAQhAAAIQCDMBBGiYrUPdIAABCEAAAhCAAAQgAAEIRIgAAjRCxqQpEIAABCAAAQhAAAIQgAAEwkwAARpm61A3CEAAAhCAAAQgAAEIQAACESKAAI2QMWkKBCAAAQhAAAIQgAAEIACBMBNAgIbZOtQNAhCAAAQgAAEIQAACEIBAhAj8f4b9HDEgUQUfAAAAAElFTkSuQmCC"
123 | }
124 | },
125 | "cell_type": "markdown",
126 | "metadata": {},
127 | "source": [
128 | "\n",
129 | "