diff --git a/ChangeLog.md b/ChangeLog.md index d1203102..4e437966 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -3,6 +3,8 @@ Starting with v1.31.6, this file will contain a record of major features and updates made in each release of graph-notebook. ## Upcoming +- New Gremlin Language Tutorial notebooks ([Link to PR](https://github.com/aws/graph-notebook/pull/533)) + - Path: 06-Language-Tutorials > 03-Gremlin - Added `--explain-type` option to `%%gremlin` ([Link to PR](https://github.com/aws/graph-notebook/pull/503)) - Added general documentation for `%%graph_notebook_config` options ([Link to PR](https://github.com/aws/graph-notebook/pull/504)) - Modified Dockerfile to support Python 3.10 ([Link to PR](https://github.com/aws/graph-notebook/pull/519)) diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/01-Basic-Read-Queries.ipynb b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/01-Basic-Read-Queries.ipynb new file mode 100644 index 00000000..9d789c85 --- /dev/null +++ b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/01-Basic-Read-Queries.ipynb @@ -0,0 +1,1088 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eab505f3", + "metadata": {}, + "source": [ + "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n", + "SPDX-License-Identifier: Apache-2.0\n", + "\n", + "# Learning Gremlin - Basic Read Queries\n", + "\n", + "This notebook is the first in a series of notebooks that walk through how to write queries using Gremlin. In this notebook, we will examine the basics of Gremlin read queries and how these queries fit into the \"Find\", \"Filter\", \"Format\" paradigm. Let's begin by loading some sample data into our Neptune cluster. \n", + "\n", + "\n", + "\n", + "\n", + "## Getting Started\n", + "\n", + "For these notebooks, we will be leveraging a dataset from the book [Graph Databases in Action](https://www.manning.com/books/graph-databases-in-action?a_aid=bechberger) from Manning Publications. \n", + "\n", + "\n", + "**Note** These notebooks do not cover data modeling or building a data loading pipeline. If you would like a more detailed description about how this dataset is constructed and the design of the data model came from then please read the book.\n", + "\n", + "To get started, the first step is to load data into the cluster. Assuming the cluster is empty, this can be accomplished by running the cell below which will load our Dining By Friends data." + ] + }, + { + "cell_type": "markdown", + "id": "b515ec7d", + "metadata": {}, + "source": [ + "### Before you begin\n", + "\n", + "Throughout all the **Learning Gremlin on Neptune** notebooks, you will notice that each code block starts with either a `%` or `%%` command. These are called *workbench magic* commands, and are essentially shortcuts to specific Neptune APIs. For example:\n", + "\n", + "* `%%gremlin` - issues a Gremlin query to the Neptune endpoint usng WebSockets\n", + "* `%seed` - provides a convenient way to add sample data to your Neptune endpoint\n", + "* `%load` - generates a form that you can use to submit a bulk load request to Neptune\n", + "\n", + "For more information on workbench magics, and to see all the supported commands, refer to the [Using Neptune workbench magics in your notebooks](https://docs.aws.amazon.com/neptune/latest/userguide/notebooks-magics.html) user guide." + ] + }, + { + "cell_type": "markdown", + "id": "8c569a38", + "metadata": {}, + "source": [ + "### Loading Data\n", + "\n", + "Run the following command to load the sample data set that we'll be using. We'll only need to run this once, and ensure your database is empty before doing so." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03dd0507", + "metadata": {}, + "outputs": [], + "source": [ + "%seed --model property_graph --language gremlin --dataset dining_by_friends --run" + ] + }, + { + "cell_type": "markdown", + "id": "dfa24286", + "metadata": {}, + "source": [ + "### Setting up the visualizations\n", + "\n", + "Run the next two cells to configure various display options for our notebook, which we will use later on to display our results in a pleasing visual way. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e655017", + "metadata": {}, + "outputs": [], + "source": [ + "%%graph_notebook_vis_options\n", + "{\n", + " \"groups\": { \n", + " \"person\": {\n", + " \"color\": \"#9ac7bf\"\n", + " },\n", + " \"review\": {\n", + " \"color\": \"#f8cecc\"\n", + " },\n", + " \"city\": {\n", + " \"color\": \"#d5e8d4\"\n", + " },\n", + " \"state\": {\n", + " \"color\": \"#dae8fc\"\n", + " },\n", + " \"review_rating\": {\n", + " \"color\": \"#e1d5e7\"\n", + " },\n", + " \"restaurant\": {\n", + " \"color\": \"#ffe6cc\"\n", + " },\n", + " \"cusine\": {\n", + " \"color\": \"#fff2cc\"\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "de66a832", + "metadata": {}, + "source": [ + "The following cell creates the `node_labels` object which we use to tell the Notebook which property we want to display when creating graphical visualisations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5c80800", + "metadata": {}, + "outputs": [], + "source": [ + "node_labels = '{\"person\":\"first_name\",\"city\":\"name\",\"state\":\"name\",\"restaurant\":\"name\",\"cuisine\":\"name\"}'" + ] + }, + { + "cell_type": "markdown", + "id": "3e51c509", + "metadata": {}, + "source": [ + "We'll be using the `node_labels` variable to provide a nicer visualisation when running the queries in this notebook. To use it, we need to pass it along with the query itself, as follows:\n", + "\n", + "`%%gremlin -d node_labels`\n", + "\n", + "The `-d` instructs the notebook as to which properties should be displayed for each specified node label." + ] + }, + { + "attachments": { + "dining-by-friends.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "48e9a85f", + "metadata": {}, + "source": [ + "### Looking at our graph data\n", + "\n", + "Now that we have loaded our data, let's take a moment to look at what our data model looks like:\n", + "\n", + "\n", + "![dining-by-friends.png](attachment:dining-by-friends.png)\n", + "\n", + "\n", + " \n", + " \n", + "\n", + " \n", + "
Element (Node/Edge) Counts
\n", + " \n", + "|Node Label|Count|\n", + "|:--|:--|\n", + "|review|109|\n", + "|restaurant|40|\n", + "|cuisine|24|\n", + "|person|8|\n", + "|state|2|\n", + "|city|2|\n", + " \n", + "\n", + "\n", + "|Edge Label|Count|\n", + "|:--|:--|\n", + "|wrote|218|\n", + "|about|218|\n", + "|within|84|\n", + "|serves|80|\n", + "|friends|20|\n", + "|lives|16|\n", + "\n", + "
\n", + "\n", + "This dataset represents a fictitious, but realistic, restaurant recommendation application that contains:\n", + "\n", + "* Users, represented by `person` nodes\n", + "* Users connected to Users via `friends` edges\n", + "* Restaurants and their associated information (`city`, `state`, `cuisine`)\n", + "* Reviews include the body and ratings\n", + "* Ratings of reviews (helpful/not helpful)\n", + "\n", + "This application contains three main aspects to the data it collects. First, it contains a social network consisting of `person` nodes connected to other `person` nodes via a `friends` edge. Second, it contains a restaurant review aspect consisting of `restaurant` nodes, information about those restaurants (`city`/`state`/`cuisine`), and `review` nodes for that restaurant. The third, and final aspect, consists of a personalization component where a `person` can rate a `review`, which allows for better recommendations based on a person's preferences.\n", + "\n", + "Throughout this set of notebooks, we will leverage the different aspects of this data to highlight different fundamental types of common property graph queries, namely neighborhood traversals, hierarchies, paths, and collaborative filtering.\n", + "\n", + "Now let's get started." + ] + }, + { + "cell_type": "markdown", + "id": "ab986dac", + "metadata": {}, + "source": [ + "\n", + "## Finding your Data\n", + "\n", + "When working with Gremlin, the most common usage of the language is to find data. Gremlin accomplishes this using the following constructs:\n", + "\n", + "* `V()` - used to access nodes in the graph\n", + "* `E()` - used to access edges in the graph\n", + "* `has()` - used to filter for objects with a property of a specific value\n", + "* `hasLabel()` - used to filter for objects with a specific label or labels.\n", + "\n", + "To access nodes and edges, you must first get access to the graph itself. In Neptune, this is prebound to a variable called `g`, which is used as the first step in any Gremlin query.\n", + "\n", + "Gremlin supports a number of steps that help us traverse the graph. Some of these steps are listed below:\n", + "\n", + "#### Gremlin Steps\n", + "\n", + "| Gremlin Steps|Description|\n", + "|:--|:--|\n", + "|`both()`|Follow edges in either direction|\n", + "|`outE()`|Include the outgoing edges in the query (to check a label or property for example)|\n", + "|`inE()`|Include the incoming edges in the query (to check a label or property for example)|\n", + "|`bothE()` |Include edges in either direction in the query|\n", + "|`outV()`|The node on the other end of an outgoing edge|\n", + "|`inV()`|The node on the other end of an incoming edge|\n", + "|`otherV()`|The node on the other end of either an outgoing or incoming edge|\n", + "\n", + "\n", + "Now that we have a basic understanding of Gremlin's traversal steps, let's take a look at how this is applied to answer some common graph query patterns.\n", + "\n", + "### Finding Nodes\n", + "\n", + "The simplest traversal you can do in Gremlin is to search for nodes. In Gremlin traversals, nodes are represented by `V()`. In our example, *review*, *restaurant*, *cuisine*, *person*, *state* and *city* as represented as nodes.\n", + "\n", + "Execute the query below to search for all nodes and return them, but limit the number returned to 10." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deabe58e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() //find me all reviews, restaurants, cuisines, persons, states and cities\n", + ".limit(10) //return only 10 results\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "4eee92c8", + "metadata": {}, + "source": [ + "### Finding Edges\n", + "\n", + "The example above works, however it does not leverage the connections within the data, represented by edges in our graph, that make graph databases powerful. \n", + "\n", + "To perform a search across multiple nodes and edges, we need to use our traversal to specify how the nodes and edges are related using the following syntax:\n", + "\n", + "\n", + "| Gremlin Step|Description|\n", + "|:--|:--|\n", + "|`outE()`|Include the outgoing edges in the query (to check a label or property for example)|\n", + "|`inE()`|Include the incoming edges in the query (to check a label or property for example)|\n", + "|`bothE()` |Include edges in either direction in the query|\n", + "\n", + "Execute the query below to search for node-edge->node patterns described by the `V().inE().outV()` steps, and return 10 results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "168bcc76", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() //find me all nodes\n", + ".inE() //traverse to the incoming edge\n", + ".outV() //find the outgoing node\n", + ".limit(10) //return only 10 results\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "6d36e1dd", + "metadata": {}, + "source": [ + "In the example above we specified using incoming edges, using the `inE()` step, but we could have also chosen to look for patterns using only outgoing edges, `outE()`, or ignoring edge direction, `bothE()`. \n", + "\n", + "To build more complex patterns, we can use these basic constructs to link together multiple levels of connections to find more complex patterns. In the example below, we have extended our previous query to return 10 nodes that have both incoming and outgoing edges, by specifying a `node-edge->node<-edge-node` pattern." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63d548a0", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() //find me all nodes\n", + ".outE() //traverse the outgoing edges\n", + ".inV() //find the node at the end of the edge\n", + ".inE() //traverse the incoming edge\n", + ".outV() //find the outgoing edge\n", + ".dedup() //remove any duplicates\n", + ".limit(10) //return only 10 results\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "a3093ad2", + "metadata": {}, + "source": [ + "We can also do the same using the combination of `bothE()` and `otherV()`, instead of explicitly stating whether to travese outgoing or incoming edges." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55f2aaf9", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() //find me all nodes\n", + ".bothE() //traverse both outgoing and incoming edges\n", + ".otherV() //find the node at the end of the edge\n", + ".dedup() //remove any duplicates\n", + ".limit(10) //return only 10 results\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "6f5ef9ca", + "metadata": {}, + "source": [ + "In the example above, we have returned matches based on a series of connected nodes and edges. When working with graphs, a series of connected nodes and edges may also be referred to as a 'path'. Often when we are looking for patterns within our graph we would like to return not just a node or edge within the pattern but the path containing how these items are connected.\n", + "\n", + "\n", + "### Finding Paths\n", + "\n", + "To find paths within our graph we can use the constructs we have already learned to specify that we want the path returned. In our previous queries, we started at every node and traversed to the adjacent node using the incoming edge using `inE()`, the outgoing edge using `outE()`, or disregarded the edge direction using `bothE()`. However, we only returned the adjacent node, and not the path.\n", + "\n", + "To return the path, we use the `path()` step. This will return traversal information for all paths that have been crossed." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1c3736ac", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() //find me all nodes\n", + ".bothE() //traverse both outgoing and incoming edges\n", + ".otherV() //find the node at the end of the edge\n", + ".dedup() //remove any duplicates\n", + ".path() // <-- now return the path\n", + ".by(elementMap())\n", + ".limit(10) //return only 10 results" + ] + }, + { + "cell_type": "markdown", + "id": "df52d879", + "metadata": {}, + "source": [ + "## Filtering your Data\n", + "\n", + "So far, we have learned how to find specific patterns within our graph based on how the nodes and edges connect. However, most of the time you will want to use attributes of the nodes and edges to filter the results to return a more specific subset of data. \n", + "\n", + "We accomplish this using the `has()` or `where()` steps. Using the `has()` step filters the traversal based on the existence of a property with a specific value. We can use the `where()` step to filter the traversal based on the existence of a matching traversal. \n", + "\n", + "This is an **important** differentiation between the two filtering steps. For example, if you wanted to filter based on the existence of a property, or if a property value matched an arbitrary value, you would use `has()`:\n", + "\n", + "`g.V().has('name','Dave')`\n", + "\n", + "Alternatively, if you wanted to filter based on a traversal, you would use `where()` instead. For example, if you wanted all nodes with more than 100 outgoing connections, you could use a query such as that below:\n", + "\n", + "`g.V().where(out().count().is(gt(100)))`\n", + "\n", + "Within both the `has()` and `where()` steps, there are a variety of predicates available to perform logical operations and comparisons of the data. Below is a listing of the some of the predicates supported by Gremlin.\n", + "\n", + "### Predicate Functions ###\n", + "\n", + "Predicates are functions used to compare values based on equality, ranges or certain patterns. Below is a list of some of the predicates supported by Gremlin. These are implemented in either the [TextP](https://tinkerpop.apache.org/javadocs/current/core/org/apache/tinkerpop/gremlin/process/traversal/TextP.html) or [P](https://tinkerpop.apache.org/javadocs/current/core/org/apache/tinkerpop/gremlin/process/traversal/P.html) traversal classes \n", + "\n", + "|Type|Predicate|\n", + "| ----------- | ----------- |\n", + "|General|`within()`, `without()`, `between()`|\n", + "|Math|`eq()`, `neq()`, `gt()`, `lt()`, `gte()`, `lte()`|\n", + "|String|`startingWith()`, `endingWith()`, `notStartingWith()`, `notEndingWith()`, `containing()`, `notContaining()`|\n", + "|Boolean|`and()`, `or()`, `not()`|\n", + "|Regex|`regex()`, `notRegex()`|\n", + "\n", + "### Filtering Steps ###\n", + "\n", + "In addition to the predicate functions listed above, Gremlin also supports steps which provide filtering functionality. Below is a list of some of the supported steps:\n", + "\n", + "|Gremlin Step|Description|Example|\n", + "| ----------- | ----------- | ----------- |\n", + "|`is()`|Filter scalar values|`g.V().values('age).is(32)`|\n", + "\n", + "### Reducing Barrier Steps ###\n", + "\n", + "Finally, Gremlin supports steps that are defined as `reducing barrier steps`. So what is a Reducing Barrier Step? A full definition can be read in the [official Tinkerpop Apache](https://tinkerpop.apache.org/docs/3.7.0/reference/#a-note-on-barrier-steps), but a shorter explanation is provided below as follows:\n", + "\n", + "_\"Gremlin is a lazy stream processing language. This means it will not evaluate data within a traversal until it reaches a step (called a `reducing barrier step`) that requires all the previous traverses to be processed, and a single 'reduced value' traverser to be emitted to the next step.\"_\n", + "\n", + "Some examples of `reducing barrier steps` are as follows:\n", + "\n", + "|Type|Step\n", + "| ----------- | ----------- |\n", + "|List|`fold()`|\n", + "|Math|`count()`, `sum()`, `max()`, `min()`|\n", + "|Aggregation|`group()`,`groupCount()`|\n", + "\n", + "\n", + "In the next sections, we will look at some common ways to apply filters using predicates and filtering steps, as well as using barrier steps to modify our return values." + ] + }, + { + "cell_type": "markdown", + "id": "20cf71b1", + "metadata": {}, + "source": [ + "### Filtering Nodes by Label\n", + "\n", + "One of the most common items you will want to filter on will be the label(s) associated with a node. This can be accomplished by using the `hasLabel()` step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "651a0f21", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person') // <-- find all person nodes\n", + ".limit(10)\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "61f35676", + "metadata": {}, + "source": [ + "#### Filtering by multiple labels using `hasLabel()`\n", + "\n", + "In Property Graph, nodes can have multiple labels associated with them, so you may need to filter across more than one label. You can do this using the example below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0460223d", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person','restaurant') // <-- filter on the node label, e.g. find all person and restaurant nodes\n", + ".limit(10)\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "51893308", + "metadata": {}, + "source": [ + "### Filtering Edge by Label\n", + "Another common item you to filter on is the type or label associated with an edge. As with nodes, you can use the `hasLabel()` step associated with an edge." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3b673615", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel('person') // <-- find all person nodes\n", + ".inE()\n", + " .hasLabel('friends') // <-- filter on the edge label\n", + ".outV()\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "52375922", + "metadata": {}, + "source": [ + "What about if we only wanted to include people who have 2 or more connected friends? We can use some of the predicates we mentioned earlier:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a76e67d6", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel('person')\n", + ".where(out().hasLabel('person').count().is(gte(2))) // <-- filter only people who have at 2 or more friend connections\n", + ".outE()\n", + " .hasLabel('friends')\n", + ".inV()\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "c5abc463", + "metadata": {}, + "source": [ + "What if we wanted to get a list of all the restaurants in order to find out which cuisine's they serve? After all, all this learning has made me hungry!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a6a9575", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel('restaurant') // <-- get all the restaurant nodes\n", + ".out()\n", + " .hasLabel('cuisine') // <-- traverse outwards to the cuisine nodes\n", + ".path() // <-- get the path\n", + ".by(values('name')) // <-- return the 'name' property for all nodes in the traversals" + ] + }, + { + "cell_type": "markdown", + "id": "ff908e2b", + "metadata": {}, + "source": [ + "You'll have noticed we used `by()` and `values()` in the above step. This was to be able to format the results to show the `name` property of each of the nodes in the traversal. We'll be explaining how these work in more detail in the **Formatting Results** section below." + ] + }, + { + "cell_type": "markdown", + "id": "2d59628b", + "metadata": {}, + "source": [ + "### Finding by Property\n", + "\n", + "The next common use case for filtering is to be able to filter on attribute values. \n", + "\n", + "This can be accomplished by using the `has()` step as described above, which applies to both nodes and edges.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e755b029", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() // <-- start with all nodes\n", + ".has('first_name','Dave') // <-- filter nodes which have a 'first_name' property value of 'Dave'\n", + ".limit(10)\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "8b998cd1", + "metadata": {}, + "source": [ + "Because there are no properties associated to any of our edges, running the following query won't return any records. However, you can use it to see how the same concept of filtering nodes based on properties can be applied to edge.s" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "098151bb", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V() // <-- start with all nodes\n", + ".outE() // <-- traverse the outbound edge, landing on that edge\n", + ".has('weight', 1) // <-- filter edges which have a 'weight' property value of '1'\n", + ".elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "2081d7b4", + "metadata": {}, + "source": [ + "## Formatting Results\n", + "\n", + "Having gone through the basics of finding and filtering data with Gremlin, let's take a look at the last step, formatting our results. Almost all Gremlin queries will return a value. How this is formatted depends on the traversal and formatting steps.\n", + "\n", + "\n", + "### Returning all values\n", + "\n", + "By default, Gremlin will only return the object id in the result set, in the format of `v[]` for nodes and `e[]` for edges. Run the following code to see an example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2d1af3bf", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person')\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "953027a0", + "metadata": {}, + "source": [ + "This is great, but isn't particularly useful unless we're pairing it up with data stored elsewhere. Instead, we'd like to retrieve properties about each returned node, and we have three options to be able to do this:\n", + "\n", + "* `valueMap()` - returns a map of all the non-internal property values. Use `valueMap().with(WithOptions.tokens)` to include internal properties such as id and label.\n", + "* `values()` - returns each non-internal property as an individual row.\n", + "* `elementMap()` - returns a map of ALL property values\n", + "\n", + "`valueMap()`, `values()` and `elementMap()` also accept a property name, or list of properties to return, as shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ce3ea852", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person')\n", + ".values('first_name')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a0442191", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person')\n", + ".elementMap('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "8713cbba", + "metadata": {}, + "source": [ + "**Note**, If you only need to return specific properties from a query, it's recommended that you provide the names of the required properties, so it doesn't return more data than you need." + ] + }, + { + "cell_type": "markdown", + "id": "dae29842", + "metadata": {}, + "source": [ + "It's important to understand the difference between `valueMap()` and `elementMap()`. Whilst both return properties as a map, they do so in fundamentally different ways.\n", + "\n", + "With `valueMap()` all non-internal properties are returned (unless `.with(WithOptions.tokens)` is specified). In addition, all property values are represented as lists, even if there is only a single property value.\n", + "\n", + "With `elementMap()` all properties are returned, however unlike `valueMap()` they are not returned as list members. Where you have list or set property containing multiple values, **only the first member is returned**. If you need to return these types of properties, you should use `valueMap()` instead. \n", + "\n", + "In addition, when using `elementMap()` with edges, additional information regarding the attached vertices is also returned. The following query demonstrates this." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81c472e9", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().limit(1).outE().limit(1).elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "05332a49", + "metadata": {}, + "source": [ + "### Returning property values\n", + "\n", + "Most often, you want to be specific about the data elements (node/edges), attributes, or a combination of both, that a query returns. This provides for efficient processing, both at the database and client level, and efficient data transmission, since we are only retrieving, processing, and sending what is needed. \n", + "\n", + "As we've already seen, Gremlin will only return the results at the end of the traversal, so how do we obtain details of objects that are specified higher up in the traversal? To accomplish this, we can use the `select()` and `project()` steps.\n", + "\n", + "#### Selecting and Aliasing\n", + "\n", + "We can use `select()` to refer to objects that have been aliased previously in the traversal using the `as()` step. Below is an example of how this is achieved:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9ba582e4", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".has('first_name','Dave').as('dave')\n", + ".out()\n", + ".hasLabel('person').as('friend')\n", + ".select('dave','friend')\n", + ".by('first_name')\n", + ".by('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "dc834aed", + "metadata": {}, + "source": [ + "The above query is quite a jump from our previous examples, so let's breakdown the steps:\n", + "\n", + "* `g.V()` - start by looking at all the nodes\n", + "* `.has('first_name','Dave').as('dave')` - find all nodes with a `first_name` property value of `Dave`. Store these nodes under the alias of `dave`.\n", + "* `.out().hasLabel('person').as('friend')` - traverse the outgoing edge to an adjacent `person` node. Store these nodes under the alias of `friend`.\n", + "* `.select('dave','friend')` - refer to the previously aliased traversals using the `select()` step.\n", + "* `.by('first_name')` - this determines how to format the output of each of the aliased objects. In this case, we're only outputting the `first_name` property for all nodes in the `dave` and `friend` variables." + ] + }, + { + "cell_type": "markdown", + "id": "0452038d", + "metadata": {}, + "source": [ + "**Note** When using `by()` after a `select()` you must specify the same number of `by()` statements as there are variables in the `select()`. Failing to doing so, will cause Gremlin to re-use whichever by() statements have been specified, starting with the first one. Now, this may not always be a problem, as we can see in the next example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ac2eff7d", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".has('first_name','Dave').as('Me')\n", + ".out()\n", + ".hasLabel('person').as('MyFriends')\n", + ".select('Me','MyFriends')\n", + ".by('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "bc56a6d2", + "metadata": {}, + "source": [ + "The above query is the same as before, however because we only want to return the `first_name` property from nodes in both the `dave` and `friend` aliases, we only need to specify one `by()` modulator.\n", + "\n", + "#### Projection\n", + "\n", + "Unlike `select()` that aliases previous traversals, the `project()` step takes data from the incoming traversal and moves forward with it. The following example shows how to use `project()` to return the same results as `select()`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04be1fd9", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".has('first_name','Dave').as(\"Me\")\n", + ".out()\n", + " .hasLabel('person').values('first_name').as(\"MyFriend\")\n", + ".project('Me','MyFriend')\n", + " .by(select(\"Me\").values('first_name'))\n", + " .by(select(\"MyFriend\"))" + ] + }, + { + "cell_type": "markdown", + "id": "943bdceb", + "metadata": {}, + "source": [ + "Notice in the above query how we've combined `project()` and `select()` to provide us with the same results. This is because to we've needed to alias specific portions of the incoming traversal, e.g. the node representing *Dave*, and the nodes representing Dave's *friends*.\n", + "\n", + "If we were to run the following query, you'll notice something very odd happen with the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a8c78c07", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".has('first_name','Dave')\n", + ".project('Me','MyFriends')\n", + ".by(values('first_name'))\n", + ".by(out().hasLabel('person').values('first_name'))" + ] + }, + { + "cell_type": "markdown", + "id": "d8628c06", + "metadata": {}, + "source": [ + "The query looks like it should return the `first_name` value of the node representing *Dave*, and then return the `first_name` property of all the outbound `person` nodes associated with Dave. So why didn't it?\n", + "\n", + "It's because the first `.has('first_name','Dave')` step created a single traverser. This was the input to the `project()` step. From here, the `.by(out().hasLabel('person').values('first_name'))` step is essentially executing a **sub-query** at this point, which is why it only returns a single row. If you've ever written sub-queries in SQL, you'll know that they're only allowed to return one row, and this query follows the same pattern.\n", + "\n", + "So how do we solve this? We can use the `fold()` step to bundle up all the `first_name` values into a single value, and return this instead." + ] + }, + { + "cell_type": "markdown", + "id": "4f89c0ba", + "metadata": {}, + "source": [ + "### Returning unique values\n", + "\n", + "To return unique values in the results, we can use the `dedup()` step. This can be used in two ways:\n", + "\n", + "* to remove duplicates from the incoming traversal\n", + "* to only return unique values based on a `by()` modulation\n", + "\n", + "Both applications are shown below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c6cf5578", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person')\n", + ".both().hasLabel('person')\n", + ".dedup()\n", + ".values('first_name')\n", + ".limit(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c8ab0463", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person')\n", + ".dedup()\n", + ".by('first_name')\n", + ".values('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "809468ee", + "metadata": {}, + "source": [ + "### Returning custom values\n", + "\n", + "In addition to returning simple key-value pairs, we can construct more complex responses. This is a common requirement, especially when returning aggregations or when returning attributes from different variables in the matched patterns.\n", + "\n", + "These new projections are created by using the `by()` step modulator (which is discussed more in the Loops-Repeats notebook). As we're previous seen, for each traversal step, we write a `by()` step to apply to it. The example below shows how we can return a custom string with the statement \"*person* is friends with *person*\"." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b6d4d8c3", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".out().hasLabel('person')\n", + ".out().hasLabel('person')\n", + ".path()\n", + ".by('first_name')\n", + ".by(constant(' is friends with '))\n", + ".by('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "870e2989", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "Now that we have gone through the basics of writing Gremlin read queries, it's time to put it into practice! Below are several exercises you can complete to verify your understanding of the material covered in this notebook. As practice for what you have learned, please write the Gremlin queries specified below.\n", + "\n", + "Using the social network portion (`person` and `friends`) of our Dining By Friends graph, let's answer the following questions:\n", + "\n", + "\n", + "### Exercise 1: Find the first name of Dave's friends\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer is four results: \"Josh\", \"Hank\", \"Kelly\", \"Jim\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ee77c9c6", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "f4b6049f", + "metadata": {}, + "source": [ + "### Exercise 2: Find the first name of the friends of Dave's friends\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer contains three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e6cc0978", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "91433ad6", + "metadata": {}, + "source": [ + "### Exercise 3: Find out how the friends of Dave's friends are connected\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the path\n", + "\n", + "The correct answer contains three results:\n", + "\n", + "- `Dave` -> `Josh` -> `Hank`\n", + "- `Dave` -> `Kelly` -> `Denise`\n", + "- `Dave` -> `Jim` -> `Paras`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e7b488b", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "c80aba29", + "metadata": {}, + "source": [ + "### Exercise 4: Which friends should we recommend for Dave?\n", + "\n", + "A common use case for graphs in social networks is to recommend new connections. There is a significant amount of research in this area (example [here](https://www.science.org/doi/10.1126/sciadv.aax7310#:~:text=The%20triadic%20closure%20mechanism%20uses,features%20of%20empirical%20social%20networks)) but mainly there are two prevailing mechanisms at work in social networks that we can leverage to help provide efficient recommendations to a user. The first of these mechanisms is called homophily, which is the tendency of similar people to be connected. Homophily is a driving factor in many social networks, with an important outcome being that people connected to you, or connected to people that are connected to you, tend to be similar to you. This leads to the second mechanism in a graph, the concept of a triadic closure. Triadic closure is a way to create or recommend new connections based on common friends or acquaintances. \n", + "\n", + "\n", + "In this exercise, we are going to leverage triadic closure to recommend friends for Dave. To accomplish this, we will need to leverage the previously written queries but extend them to:\n", + "\n", + "* Find all the friends of friends that do not have a connection to Dave\n", + "\n", + "The correct answer contains three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb26d6fd", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "d1f7523f", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we explored the basics of writing Gremlin queries and how they are represented in the \"Find\", \"Filter\", \"Format\" paradigm. First, we learned the basics of how to specify the steps used to match on data in our queries. Next, we learned several different mechanisms for how to filter the data found by our queries to return the correct results. Finally, we learned how to specify the format of the data being returned from a query to make for efficient use of database and application resources.\n", + "\n", + "In the next notebook, we will take what we have learned in this notebook and extend it to show how to answer questions where the length of the patterns is variable or unknown." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/02-Loops-Repeats.ipynb b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/02-Loops-Repeats.ipynb new file mode 100644 index 00000000..372f4299 --- /dev/null +++ b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/02-Loops-Repeats.ipynb @@ -0,0 +1,704 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eab505f3", + "metadata": {}, + "source": [ + "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n", + "SPDX-License-Identifier: Apache-2.0\n", + "\n", + "# Learning Gremlin - Loops and Repeat Queries\n", + "\n", + "This notebook is the second in a series of notebooks that walk through how to write queries using Gremlin. In this notebook, we will examine the basics of how to perform looping and repeating queries in Gremlin. \n", + "\n", + "\n", + "This notebook assumes that you have already completed the previous notebook \"01-Basic-Read-Queries\" so we will continue our lessons from the end of the previous notebook and assume that the data has been loaded into the cluster. " + ] + }, + { + "cell_type": "markdown", + "id": "0c12469c", + "metadata": {}, + "source": [ + "### Setting up the visualizations\n", + "\n", + "Run the next two cells to configure various display options for our notebook, which we will use later on to display our results in a pleasing visual way. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e655017", + "metadata": {}, + "outputs": [], + "source": [ + "%%graph_notebook_vis_options\n", + "{\n", + " \"groups\": { \n", + " \"person\": {\n", + " \"color\": \"#9ac7bf\"\n", + " },\n", + " \"review\": {\n", + " \"color\": \"#f8cecc\"\n", + " },\n", + " \"city\": {\n", + " \"color\": \"#d5e8d4\"\n", + " },\n", + " \"state\": {\n", + " \"color\": \"#dae8fc\"\n", + " },\n", + " \"review_rating\": {\n", + " \"color\": \"#e1d5e7\"\n", + " },\n", + " \"restaurant\": {\n", + " \"color\": \"#ffe6cc\"\n", + " },\n", + " \"cusine\": {\n", + " \"color\": \"#fff2cc\"\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5c80800", + "metadata": {}, + "outputs": [], + "source": [ + "node_labels = '{\"person\":\"first_name\",\"city\":\"name\",\"state\":\"name\",\"restaurant\":\"name\",\"cuisine\":\"name\"}'" + ] + }, + { + "cell_type": "markdown", + "id": "e5bebb15", + "metadata": {}, + "source": [ + "We'll be using the `node_labels` variable to provide a nicer visualisation when running the queries in this notebook. To use it, we need to pass it along with the query itself, as follows:\n", + "\n", + "`%%gremlin -d node_labels`\n", + "\n", + "The `-d` instructs the notebook as to which properties should be displayed for each specified node label." + ] + }, + { + "attachments": { + "dining-by-friends.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyYAAAG9CAYAAADgCWKbAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAPD4SURBVHhe7J0FeBRXF4a/uLuTBBJCcHd3p7hUqLu78dfd3YWWCoVCSyleXIMnuCUhIRB39+Sfc3YWQohnk+wm5+0znbl3ZCe77Oz97jGjUgUIgiAIgiAIgiA0IcbqWhAEQRAEQRAEockQYSIIgiAIgiAIQpMjwkQQBEEQBEEQhCZHhIkgCIIgCIIgCE2OBL8LgqA3ZOWlIzL5LC6lhiM2/SJSshOQU5Cp7r2CtbkdnG3c4OXQGt5ObeHv0hG2lg7qXkEQBKGpycnIRXRYPOIuJCHpUirSk7OQm5Wn7r2Cla0FHFzs4OrjBM82rmjVzgM29lbqXqGlIcJEEIQmpbikGEcvBeH4pf2ISglVBIYjXGy94GDlyttW5rYwN7GAkbEJSpVjC4rzkVuQpYiYNKTnJiE5K5a3WzsHopv3APRsPQTGRmIMFgRBaGxKiktw5uB5nAu+gNjzCSwwnNwdYOdsC1sHa1haW8DMwlR5nhspz/NSFOYXIS8nH1npOchMyUJqQjqyFUHTKsAdgb3aoGP/ABgrxwotBxEmgiA0CYXFBQgK/w/7z2+BmakFfJ3bo5VTAByt3dQjak5aTiKiU8NxKeUcipTrDvAfg8EBE2BqYqYeIQiCIDQURQVFCNl+Gsd2noWZuSlatfWAp58b7BVBUlsykrMQdyERMefjUVRYjO7DOqDnqE4wNTNRjxCaMyJMBEFodIKjdmHrmZWwMrNBgEcPtHbpqO6pP1HJZxAWfxT5hTkY3XEGerUequ4RBEEQdM2pfWHYv/4YLKzM4d/FF94BHuqe+hMdHoeIk5dQkFeAAZN6oNOAAHWP0FwRYSIIQqORlZ+OtccW43zSaXT1GYQA9x7qHt0TroiTE9FBaOvWGVO63QxbC3t1jyAIglBfKIZkx98HcelcHDr0aQu/zj7qHt0TeeoSzh4+D5/2Xhgxpx+s7SzVPUJzQ4SJIAiNAgW1rwz5CXZWzujRegQHsDc0OfkZOHpxJzJykjGz913wc+mg7hEEQRDqCgW1b/ljL+ycbNF5QDtY2Ta8UKDA+ZP7Q5GZmo2xNw2Gdzt3dY/QnBBhIghCg3My5hBWBP+ADl590dVnsNrbeJy4tAdnYw9jdu970LlVX7VXEARBqC1hR6Kw6fc9COjeBh37tlV7G48zh8IRfiwK428ZgoAerdVeobkgwkQQhAZFK0q6+w5DoGcvtbfxCY0LwbGLu0ScCIIg1BGtKOncvx38u/qqvY3P+RMXcfpAmIiTZojk1BQEocEg9y19ECUEvT7dx9/K/dB9CYIgCDWH3Lf0QZQQbZXX76Tcx8bf9iAmPEHtFZoDIkwEQWgQMvPS8E/wQnbfampRooXuo4NXH/wTspCLOQqCIAjVQ7VFNi8OYvetphYlWkicBHRvzfdF9yc0D0SYCILQIKw7/gfsrV2aJKakKrr6DIG9lQvWnVis9giCIAhVsfPvg7B3tmuSmJKq6Ng3ALZONtj19yG1RzB0RJgIgqBzDl/YySmBKfuWPtLDdzjCE08h+MIutUcQBEGoiJN7wzglMGXf0ke6DAjExXOxXE9FMHxEmAiCoFOoovu2s/9ynZLGSAlcF6wt7NHVezDfZ1FJodorCIIglIUqrx/YcAwd+rZtlJTAdYHui+qoHNhwHMXK/QqGjQgTQRB0SlD4f5qK7g1YPFEXUMV5CzNr7AnboPYIgiAIZTmy7TQsrS3g16nhiifqAiruaG5phuBtp9QewVARYSIIgs4oKS3G/vNblEF/T7VHv2mniJMDEVuV+y5RewRBEASipLgER3eeadCK7rrEv4svju86h9ISqYJhyIgwEQRBZ4RE7YGZqQVaG0iF9dYuHWFqYo4jyn0LgiAIVzh94DzMzE3hHeCh9ug3dJ+mZibKfYerPYIhIsJEEASdcTx6P3yd26stw4Dul+5bEARBuEJocCRatTUMUaKF7vecct+C4SLCRBAEnUB1Sy6mhMHbST8zt1RGK6cARKWESl0TQRAEFaoLEhuRCE8/N7XHMPBs44bY84nIkbomBosIE0EQdAJVU7e1dISDtavaYxg4WrvxfUs1eEEQBA1U5d3G3gr2zrZqj2Fg72LL9x0dJtXgDRURJoIg6IRLqefhYuultgwLuu9LqeKXLAiCQMRHJsHR3UFtGRZOyn3HXUhSW4KhIcJEEASdEJseZXDWEi0OVq7K/V9UW4IgCC2bpOhUOLgYlrVEi52zrXL/KWpLMDREmAiCoBNSsxNgZ+mktgwLcuVKyRHTvyAIApGWlAkbe2u1ZVjYOlgjPSlLbQmGhggTQRDqDdUvySnIgpWZYc6wWZnbIic/U+qZCILQ4ikpLkVedj4sbSzUHsOCCkLmZuVJPRMDRYSJIAj1Jq8wh9dUw8QQMTfR3Lf27xAEQWip5OcW8JpqmBgiZhaa+9b+HYJhYVSqoG4LgtAAFBcX89rExITXDQW9TmpqKtLS0pCens5LRkYGL5mZmcjKyuIlOzubl9zcXOTk5PA6Ly+Pl/z8fF4KCgp4KSwsRFFREa/p+rRdUlLC27Smx4d2eW3VPZjS8y5Ymtmod1Q/EjOj1a2qoMeXUZl1RVT/iCsoysO+sHWY0/s+WFno5v4bAz8DKWQpCILhkBCbhL8/2oSxNwyBhbW52ms45OXkY8vSINz28gxY21upvYKhIMJEEHTEq6++isjISCxatAj//PMPunfvjoCAALzyyiuIjo7Gjz/+qB6pgUSBjY0NQkND0a5d5bU/zpw5g9jYWMTFxfGSkJDAS2JiIpKSknhJTk5GSkoKnJyc4OjoeHmxt7fnxc7OjhdbW1t+TVqsra15sbKygqWlJS8WFha8mJub82JmZsaLqanp5cXY2JhFFq2NjIx4ySnIxEcbn8akHnfA2txOvfP68ffBz9UtoTJeuu47dUsQBKF+0MTTBx98gDfeeAM3j70XT734OKxsLdW9hgO5cW1dthd3vDbLYN3RWjIiTARBR0RERLC1oWPHjujRowdefPFFzJ07t1JhQhaH3bt3o2/fviwQKqN9+/Zo1aoVPD09efHw8ODFzc2NF1dXV7i4uLAoaSqKS4rw9rqHMLbLTTrLzEXCZHa/R9WWUB56f0SYCIKgCz7++GO8/vrrbA2n5ZnrX8fcu2Y0WB2TtT9tU7caDpo006LroW7Za9eF+t6Pvr8+Xf+BD29UW7VDhIkg1IAZM2bgjjvuwPTp07FkyRJ8/vnn2LZtG1sZ7rvvPkycOJEtFmTRIJeoN998Ez4+Pvj555+xa9cuHD58mK0U27dvR58+ffDbb7+x9WLcuHH4448/EBMTg48++ghdunTBDz/8AHd3d3z11VcYOHCgegf6z0cbn0Ivv9HwdPBTe+qHCJOqEWEiCEJ9+fLLL9naT79b5OJLkEX8hxeWodvgDnD3deE+XUPCZMqdo9SW0Nygz7euwkSC3wWhBpBFYsOGDby9Zs0a7Nu3D8HBwWwh+f777xEYGIioqCicPXsWN998M9q2bYt77rkHPXv25HPWrl3L7lokNo4fP45vvvmGZ6VItFCMB8WBLFu2DEeOHGExQ+5Vzz77LJ9rKDjZuCMzL1VtCYIgCPoK/QaRm+8zzzzDrsBaUUL4+/tzDZPsDEkGIjQ+IkwEoQaQZWPr1q28vXnzZvTu3Rt79+5FSEgIWzfI0qGlQ4cObA3p1KkTu1kRQ4YMwVtvvYU5c+Zg/vz5OH36NPeX59dff8XYsWPZDYxEiiHhae+LtOxEtSUIgiDoK/QbRr9LNKmmjTXU0rVrV7h6OyEjWWqBCI2PCBNBqAEjR47EuXPncPDgQW4//PDDbO2gGJGpU6dW629ZNridZqnISlIeEjgkaAg6hjJpGRI+Tm2Rkh2ntgRBEAR9ZcCAAVi/fj2OHTuGJ598kq38WnHSv39/ePq5IjUhg9uC0JiIMBGEaiCXKwo6pyxbH374IVs0hg4dyhYUWsiaUh2Uzao6KAuWIePv2hFZeWlIz0lSewRBEAR9ZvXq1ew+TL9lZOGn7I3kAeAd6MmuXBkpYjURGhcRJoJQCRQXcvvtt1/OdjVlyhSOAxk2bBibv2l2iWacyJpSHhIiFAzfkrCzdERr50BEp4apPYIgCIK+QmnnH3zwQY43IYs9ZeWiIHgSJjb2VvDyd0NcpLjnCo2LCBNBKENYWBheeuklDv57++23OYMWuXARY8aM4fXgwYN5PWHCBPbTpdS9Wqi2B0H77r//fixfvpzb5dEeR9Q37Z8+0c27Py6maN6v5gIVl8zLzVNbgiAIzQMSJbfddhu7IxM0EUfJXaj+FtG+tx9izsfztiA0FpIuWBAUduzYgW+//Rbr1q3DnXfeyQ9oqkVSH8hi4uDg0OAV3/UJqmfy0aan0d13OFrXsyq5vqQL/uj1j/DT1z9j5/EdSE5Kwbb/tmH6vGnwbOWpHtE0SLpgQRDqyvvvv49NmzbxUhnFxSVY9MoKdB4QCO+AKxNwukDSBTdvJF2wINQRyrA1efJk3HvvvWwJobSJn3zySb1FCeHs7NyiRAlhYmyKAf5jEB5vWBnFqqLv4H64+5G7YWVthbAzofj83c8RFy1B/oIgGCY0EUdZIsmFqypMTIzRfVgHRJ66qPa0PCjGNDcvF0XFRWqPfqCv96ULRJgILRKqJTJv3jw2Zc+aNYvrjzzyyCM1ClIXqmZwwHjkFWYjPOGY2mMYxEbH4rE7H8OwrsNx//wHsH3jdu6PiojCvl37cEFZf/Xh19z31gtv49O3P8P1E2/A2ZNnue/7z37gdlJC4wX/f/rppygqan4/TIIgNAwUQ/LAAw/g66+/vipbZGX0HNUJeTkFiDwdrfa0LLbv3oqOfdpi89aNak/T8euSn7FyzQre1qf70jUiTIQWxyuvvIJ+/fqhb9++HD9y9913q3sEXWBmYoFRHabjxKUg5BQYTsrjL9//CpvXbcHwMcNxMfIinn3wOeRk5yAxLgEnjpyAlZUl+gzozccOGj4Ivfr35P6tGzT1bZYuWsprV3dN7ZrG4IknnmDLHFVuTkyUIFVBEKqGRAlllqR6WjXBzNwUAyZ2x9lD4cjNanmxdm18/fDg3Y/Ar42/2tN0fP3DF/jr32W8rU/3pWtEmAgtBqpBMnDgQBYjFORuaJXVDYnebYZz+uCjUTvVHv2GAtw3rd2EaXOn4q3P3sT3S7/Du1++c1XQu529HQYOG8jboyeMwrDRw+Dh5YGNynnnQ88jPjYeM66fzvsbC3IVpHo3H3zwAae0fuyxxy4naxAEQSgLxVFScd/PP/9c7akZnQe1g0+gJ07tN7yMi/c/fjcWvPoMnljwCF5+6wWkZ6Tju5++xrAJAzFx5hj8s/pvPu6p/z2GaddPYvcogs677f75SElNwZ59u5R1MrtP0fGzb56GgaN7471P3mZXqs+++ZjPTUpOxH9bNvD2f5vXIzs7i7dpf2Xs3ruTj/nqh88xdtoIXLgYid+W/sLbvYd1w4NP3ov4hDi+Rmx8LEKOHsYnX3141X3tP7SPr/HOx2/y30Tbm7drLCmZmRl4/PmH+VoPPXUfX4/eC31GhInQIvjxxx+5oNRdd92FJUuWwMfHR90jNBRTus1HRk4SW070ncyMLGRnZcPWzo7bJEJ8WvvAwtKC2xVBmdVm3jgT506dw5KfNdaScVOqr2mjS6hCM5GTk4OSkhL88MMP6NChA26++WYcOHCA9wmCIISEhFx24aoLw+f0Q0ZqFs4cOq/2GAZnQ8/gj+W/Y6MiGNr6tcUvf/yEtz96A3NmzIOrqxsP2g8fOYiOHTrj6IkjOBh8ADGx0Vi/aS0C2wYiKyuT+zMyMngfHe/fpi3GjhqPr3/8Aj8s+hatfdrwMcdOHGWxQNs7g7bj+KnjvF2VVYOEEh3z/qfvwNrKWnmddLz4xvNo5dkKjz/4JNb+t1oRLV+gb69+sLWxhbubB/r3GXDVfWVkaq7xuyJohg0ejvCIMLz2zsug3FZL/lrMYqq1bxsWKXS9c2Ea92N9RYSJ0Owh162PP/6YLSb33HOP2is0NFTXZEavO3E29hBC40PUXv3E2cUJvfr3wr/L/sWq5avw/EPPY+boWezKVRGnT5xGfn4+Js+YxO0/fvoDw8YMa1Q3LmLEiBEwMzNTW0Burma2j+rtkBCnlNWCIAgkSijYnVLc1wWqazLmxkEIP3YBEScNKxieBvT7twbj9vl38SDdxdmVY/PcFGFCbNm+GVMnaqzdO3ZtxY49mvjCmVPn8FrLuo1reO3q4gYHe0feXr9xLYYOGsbbwccOs8jp1L4zWzGOHAvm/mGDRvC6Kp5/8gWs+nM9AgM64IcvfkbP7r1xKOQQ7zt5+jiGDBwGO1s7eLfy4e2KeOvl9/DCM69g2uQZiLp0gUXPf1vWs3D667eVWPjVr+qR+o0IE6FZ8/TTT2P79u3YtWsX1yQRGhdy55rV624ci9ql9+Lk/ifuY6vJgkf+hx2bd+LFd16Am4fmh4ugejOduneGja0N3lzwFiLDIhHQPgCdlT5i+txpvG5MKFaqooQN5JpGgfHkuiEIQsuGXDw7depU74kKn0APjLt5MLt0GZI4CfBvB1tlUF9UVIjzkeHcV6r8R4P8R+5/HL169IanhydGDBnJFoXN2zYqAqE9unTSWKS1aM8ljIyN+NwZ181SBI47unbuhm07t+DEqeO4784HERp+Dpu2/ceWDmcnZ/WsyunUoQuvz4Sexj2P3IEtOzahR9eeLKpqiqODRiyZmZnzmiBxYmFhAVMTU77n2lyvqRBhIjRbKCCYrCQbNmyAi4uL2is0Nl28+10WJ/rs1jV01FCERAVjXdBaHI44hBvv0ORgf/KlJ3Ey7gScXZ3hH+CHoNN7sPdsENp1bMc+x+6e7nzcqAmNn5OfEjhorSSEubk5bGxs+N88DUYEQWjZ/PHHH1yrpK4uXOVp17PNZXFiKG5dxmraflNTM0WE9EFySpIiGPqz1WPn7u2XB/JzZl7PcRwUn3HDnGuTA/Ts3ovXTo5OLBro3Bz1+Tt+9EQWJTTwnzJBU7DyUMhBTBijsapXh7bo8pmzp3h99633wcvTC1nZWdzWEqfc38VLUWqresh6QiLpvsfuxP9ee+6a6+kjIkyEZslvv/3GsSR//fUXrKys1F6hqSBxcvPAJxCdEoq9YWv1NlsXDezbtG0DSytLtedaTM1MYe9gz4Hn04ZP57TCdz18V5XnNBQdO3aEra1mBsza2ppjp7Kzsy/3CYLQcgkPD7/swqXL30ESJ1PvG43YyAQc3nLCoLJ1ffDGxxg9Yixuu+8mvPn+q/D1aY0hA4byvrEjx/OamDrxags4WcwfuPMh3DjnZo5Rufvh21FQUIBZU2fz/uFDRvK6f9+B/DsyWL3miKG1m7AapwgcLw8vjmX54LN32Q0r4kIEB+VPmzKTRcabH7yqHq25r8uo22X75s+7lS04u/fuYkFDwsnEWL/rq0nld6HZERERge7du2P9+vUYOlTzcBD0g8y8NKw9vhgRSWfQ1WcwAty7q3uuRV8qv1fFrq274O7hjvad21/9A9EIaCu/U5zJzp078dBDD+HLL7/E448/jnXr1mHfvn2cSlgQhJbJ+PHjOTVwQ2WgzM7Ixc6/DuJSaBw69A2AXydvdU/1NHXl9+SUZJ5c0ro/1QYSCWnpafB096zRc58yaJ06c0JtXYEsNQMUIVMeGpbHJcRVeH2KbSwpLYGVZc2EJgXxkyC5Yc5NiI6N5qxdJK7efe0D9YiGQSq/C0IZFixYwA9iESX6BwXE39DvIUzoPBfnYg9h26k/EZWs3xlCqoJSBnfo0qHRRUlZhg0bxoKEFoJiS/z9/XHHHXdwWxCElsdLL70EOzu7Bk2LTwHxk+4cjiHTenNQ/J7VhxAdHq/u1W9cnF3qJEoIEgVk1ajpc7+wsACpaanXLCRuKoKuW9n1KV6kpqKEsLGxxVsfvo5uAzuyKCFmqlYefUUsJkKzYtu2bbjvvvukloMBUFicj6DwjdgfsYWLMvo6t4e3Uzs4WGsyWxmCxaQp0VpMtmzZgjFjND84WmJiYjBo0CDceOONePfdd9VeQRBaAqtXr2YXruDgYLi7a2LgGprCgiIc2XYax3ad5aKMrdp6wNPPDfbOFbuVNrXFpCVBIujo8RCOtencoTNnFWto6mMxEWEiNCvmzp2L0aNH80NZMAyKS4pw9GIQjkcfQFRKKGwtHeFs44mo5DMiTKpAK0wqgwQLuXEsWrQIt912m9orCEJzJiEhgTNQUrD71KmaIOzGpLi4BGcPnMe54EjERiSyVcXR3QEOLrbKtjUsbSxYuGxdtleESTNGhIkgKMTFxSEgIACpqakcfCYYHhSDQvEnl1LP4/CFHRgc2Pg/rIZCUOjqKoUJ8dVXX+GRRx7heJP+/furvYIgNFdmz57NqYHffPNNtafpoBiU6NA4xEUmISkmDelJmcjLzlf3QoRJM0aEiSAoLFy4kGeJKT2iYPh8svlZigJUW2V9beWRpcEIT4x7X7NZBQ8//DC7OO7duxf29vZqryAIzY3333+fUwPToq+QRaUgtxCLXl2BsTcMUXuF5sbmpXtEmAgCBfsOHjxYqrs3E95Yc1+1FoGWTG3eH4pBcXJy4vTZgiA0P3bs2IFp06bh8OHDaNeundqrv/z25r/ISstRW0Jzw9bRGre8qKmmX1tEmAjNBvKrpUrXVA1bMHxEmFRNbd6fqKgoDBw4EHfeeadeuHgIgqA78vLy0Lt3b7zwwguYP//awoD6yDdPL8GtL89QW0KzQlEVv76xUiwmQsvj448/5gcxZR2iKteurq44c+YMFi9ejOeffx5vv/02nnjiCfVowdAQYVI1tX1//vvvP0ycOBG///67wQxeBEGoHvIWoNTAn3/+udqj/5AwqevAVdBzFFXxzTN1/3yljolgsNx9990oLi7muiUkSlJSUrgSNrVLSkp4vyAIGiZMmIBPPvmEBzGURlQQBMOHvAROnz5tUKJEEKpChIlgsFAg75NPPsniJDk5maul0pra1E8zSIIgXIGqwpM7F4mT3NxctVcQBEMkJCSEU+NTamBBaC6IMBEMmv/973/XVEelNvULgnAtNMPq6OgoleEFwcAhUfLNN99wfIkgNBdEmAgGDVlNaBZYW7eE1hRXItYSQaicn376CVu3bsVrr72m9giCYEhQXCXVK7n//vvVHkFoHogwEQyeslYTsZYIQvVQIdKff/4Zr776Kv7880+1VxAEQ4BqdVGtEnHhEpojIkwEg0drNTEzMxNriSDUkClTpuCDDz5gl65jx46pvYIg6DNhYWGXXbisrKzUXkFoPogwEQye4pISPPbEM5g0aQqvSyQDtiDUiKeffho33ngji5PCwkK1VxAEfeXBBx/kNPkjRoxQe1omJ0+exNq1a3mb3NqobIDQPBBhIhgUGdkFOHg6Hsu2nsPHf4ZgwXdBePyznXj7j+NoPfIxvLX4GB77dAf30/7l20Jx6Ew8nyc0DzZv3oxbb70V8+bNY2vZnDlzkJ2dzfveeOMNdOjQgZdXXnmF+yiNdI8ePbi2jYeHB66//np89dVX8PX1RZcuXS6nzo2JieFr0THjx4/nFJwtgYULF8LS0lKC4QVBz3nppZfYI+DZZ59Ve1ouBw8exK+//srblIWTfhOE5oEIE0HvKS4pxZ7jsfhs+RG88H0Q/t0dgcSMIvh4umBUv0DcOKkXbp/eD3fNHMBralM/7U9IL8TKXRF83qfLjijXiUGJcj3BcMnIyMBvv/2GW265BUFBQdi/fz8Hcu/btw/ff/891q1bh+3bt3PNjqNHj7IlgFyVqLbNtm3b+JxffvmFBQ7NOn7xxRd8XRI1bm5u2Lt3L2e5IXFC57QEKBie3re33npL7REEQZ9YvXo1x4WRC1dzZufOnbjrrrvYkkuTSZmZmTxpQhNG/fv3x/Lly9md7bnnnsP69evxzjvv4K+//sLGjRt5EmrQoEFcy0x7/NmzZ/m6NNE0atQonrSi606bNo37Bf1DhImgtxQUFWPd3kj877sgbNh/Ac6O9oro6I3bpvXD+EEd0KujN/y9neHmZAt7G0vYWJnzmtrUT/vpODqexIqLkz3W74vCgm+D+LqFRS1j0NkcGTJkCKZOnYquXbtizJgxiIqK4h8hMu2TSPn000/5By0+Pl49A3j00UfRuXNntp7cdttt/ANFP1R0LomXxYsX848ZBZWSNeXSpUu4cOGCenbzht4LEicvvvgiVqxYofYKgqAPJCQksAsXiRJ3d3e1t3lCz216FlHGsUceeYT/5vT0dJw6dQrvv/8+ixYfHx+8/PLLGD16NLtx0TM8Li6On+M0QUXxpmQJ9/T0xA8//MDXJSFDRWbXrFnDwoYmrwT9RISJoJeQheTlH/fh8LkkDO3dFrdO7YeB3dsoosNGPaJ2kFih80mk0PXoui8v3McWFMHwIBcuLSYmJlxcc8eOHRg6dChiY2MxcOBAFiFloR8zLS4uLuqWBrLC0A+ihYUFF+ik7G7k7uXg4KAe0fyZMWMGzz7S7GRLcWMTBEOAgt1pMoUmY1oC7du3Z+Hh7e3NbloPPfQQZyIjwULP6aKiItjY2PDz2traWj3rCpSZk86dNWsWzp8/z893sjhRTF1gYCAnyRH0FxEmgl5BsSDf/3sCf28PQ98urXHDxF7o6KfbGaKO/u583T6dfZXXCccPq04gPTtf3SsYKmTpoB9u+kHr1asXz7DVFBIqNJtGM2w0M9mzZ0989NFH/OPXkiAXBxIoJE5I7AmC0LSQlYAG1m+++aba0/wpO4n09ttv8zOZxMjs2bPV3qqhmDmCJq0IsqiUhQrMCvqLCBNBbzh3MQ3v/3EY2QUluHlKH/Ro30rd0zDQ9edP6Y2s/BJ88Eew8vqp6h5B3zE2vvLoIusGLfPnz+e4EQponz59OouUZ555Rj3qCmXPJbQ/XiRovvzyS3bnIlcxGgjQjFxLg/zYKbbmzjvvVHsEQWgKyApMcV/NPa6kKsj1iiwdZOUga3ZZ8vNrNqHo5+fHa7Ka0IQLxSgK+osIE0EvCD6bgC/+OoLA1u64bngX2Nk0zoCQYlLo9dq1dlNe/yiCzyWqewR9hczz9GOl5ccff2RTPwmS6OhobNiwgYPeV61axcHuJDTKzv5T/w033MDbc+fO5aBJYvDgwTh8+DD27NnD7gIUfNkSIeFG4oQCSt977z21VxCExiQvL49duKiIYrt27dTelgfFkDz11FP8fP/999/ZzYsKw5JVnOIJaZvQFlkui7bP1taWfzNosoncc3fv3i01YPQYI+UHW+z1QpNCouTndacwrHdbDlhvKkLORGNX8HncMaULerd3U3uFpuKNNffhpeu+U1tCeRr6/SFhQsLt33//lQw2gtDIkDslxdJ99tlnak/z4punl+CBD2s2+UMTRWQdcXV15QD33Nxcfm+0FpPqLNtaKwm5qVJMCk1Offvtt5cnpQQdo6iKb56p+edbHhEmQpNC7ltkKWlqUaJFK04emdMD7X2d1F6hKaCBt1A1DS3cKIUyZTijTDcUNCoIQsNDg+ZFixbx9665UhthogvI+nTkyBG2PpHlhSZeahqzItQSESaCoUKB7u8tPoT2bTwwuKfGB1Qf2HMkAmFRiXjmpt5waCSXMqEi5NFUPde6L+gait2htMnk/iAIQsMSEhLCdZTIrZTWzZXGFiYUPH/o0CFERkayGxilSBcaiHoKE4kxEZqMpVvOwdXJVq9ECTGkpz9cHG2wbEuo2iM0DTTolqXqpeGhFJ05OTm455571B5BEBoKmtmnYPfmLEqaAlNTU04jT/GFIkr0GxEmQpOw+1gMzlxIxYg++hnUN7xPAE4r9yd1ToSyUGaYjh07Ijs7W+1p/pD/NokTcn/4+OOP1V5BEHQNBXpTYcH7779f7RGElocIE6HRKSgqwdqgCLaUNFb2rdpC2bro/tYESYV44QqUWjg8PJyLN5JbQEuB6rpQpi7KjrNu3Tq1VxAEXUEFBKkWU0tODSwIhAgTodHZfCgKNlYWDV6npL7Q/VlbmmPTwauLMwktF8oCQ77KVLBrwIABLSofPrlAUK0Xqm8SERGh9gqCUF/CwsIuu3BpiwMKQktFhInQqBSXlGJ78CX01IMMXDWhZwdv7DgSjRLlvgWhbEEvKkJIFYmffPJJtaf589prr2H48OGcylQQBN1Az5EXXngBI0aMUHsEoeUiwkRoVPadiIWFuSk6+LmrPfpNR393mJuaYO/JWLVHaMlQdqqyZGVlcYHHQYMG4eTJk2pv84ZcupKTk3mGVxCE+vHSSy/Bzs4Ozz77rNojCC0bESZCo3LwTDzatzEMUaKlvSKiDp1JUFtCS4aKexGU4YUWqu3h7OzMoqSlBMTb2NiwOCFB9vnnn6u9giDUltWrV/N3SeJKBOEKIkyERiM9Kx/h0elo5+uq9hgGAb4uCLuUxnVXhJZNQYHm3wAFv1PqyXfeeYfz4mdkZKB///68ryXQt29fztRFWYQoYFcQhNqRkJDALlwkStzdDWuyTgCKi4vZnVfQPVJgUWg0Dp6Ox6o9Ebh1aj+1x3D4ZdVBzBjmj74dPdQeoSVCqYJJiBw9epQLoX333XfYtm2burflQX7xv/zyC1eo9vHxUXsFQbfQMEVS6FYPPY8MhYYosBgfHw9PT08WDEZGDVvniWIL27Zti4cffljtuZaFCxdixowZcHFxUXtaCPUssCjCRGg0lm0NRVJmEcYNbK/2GA6b9p6Fm4MZ5o4KVHuElggFf1PK4BdffJHb3bp1w6effooxY8ZwuyUya9YsZGZmiuVEaDC0wuSTTz5Re4Sy0PtDA+WWLkwoYyJNGPXr1/CTnzURJh4eHtiyZQu6du2q9rQQpPK7YChcSsiCq6ON2jIsqEL9ReX+hZbNK6+8clmUEA899BC+/PJLtdUyIR/5S5cu4ZFHHlF7BEEQ6sbOnTtx11134cYbb8Tzzz/PmRApMYCvry/69OmDlStXIiYmBj169EBsrCYpDa1p38WLF/mZTEKtovPIokLn0URKbm4u969du5avQc/2JUuW8HZFkBXm9ddfR0BAAEaNGsUCSMsbb7zB1eRpoesQzz33HLvrTZ8+HUlJSdi/fz8nSSGxQlkN09LS+DjhWkSYCI1GYloOnOyt1JZh4Whnpdx/rtoSBA00i0uFFltSscXyODg4sDghgfb111+rvYIgCLWHRAPFr1EFfJrs+Oeff7Br1y62yD7++OOYOXMm8vLyYGFhwckDCDrGy8sL1tbWOHjw4OW+8udRghI6l0TC4cOHERwcfLlgLL1mly5deLsi6FpfffUVH0eCZ/v27dxPbqzff/89X4f6yKpHrr4kUCh2iGpdkSvXTTfdxIKLjklMTORitULFiDARGgWqX5KVWwhbK/2s9F4dttbmyMopQIl4PgrloBk6+sFqyVAiAPrBpveiJcfcCIJQf9q3b8/FXL29vbF06VL4+flhx44dyMnJ4Vi2oKAg3H333fjzzz/5eBr8l6+tVNl5FPNBIkNrmdmwYQPCw8M5sQm55lbG+vXrccstt3CtmUmTJmHKlCncT0lPyOqydetWduslYUWWGRJJhL29PY4cOYLz589zwDy9LlldNm7cyPuFaxFhIjQKuflFvKYaJoaI9r5z8jR/hyBoIR/jv/76i6s3t2RoYPDMM8/wOi4uTu0VBEGoHWUTaURERHA1fBrU07JgwQJ2x5ozZw6LAbJYULp2rVDQUtl5EydO5LgPWigrGtWiImEzb968KgPmyX3Mzc1NbYFrzxAkfIYOHcruZDRBQxkbyxMdHc3Ha++FXL4oXlGoGBEmQqNQXKxJq2dsrLtMGdEJ6Y22JKRo4ksobXDoRcNZhIbH1taWxUlLt5oQ77//Ps86lp+9FARBqAvz58/nhCP33nsvZs+ezc9Zsm5Q/SgSE7SfrCckQspS2XmDBw/GsWPH2OWLhMrUqVNZJJBgqQqytFCcSmpqKk+8aGNTyFWMrkEWnl69euHUqVPcr4VeU5schdZUmJb6JFlI5UhWLqFRIDeuBd/uwR3T+8PORjfuXJ//sUvdEirjiydGqltCQ0LB3/7+/jxr5upqWHV6dA0FelKQJ/1Yf/zxx2qvINQdycpVNc0pKxcN+Om5QRYNgiwVZNnYu3cvB5NTvIj23wG5V02ePJljRUgUlE0XTM/iys4jQUMsW7aMXb4o0J4sJ1Q8tjIoPmXs2LFsoSHrB8Wj3HzzzRg5ciRGjx7Nz30qutumTRtcuHCB40xIHFEcDLmK0ZriTkiUEJs3b67SdcygkXTBgiFQVFyCJz7fiZsm9Yark24yc5EwefSmYWpLKA+9PyJMGg8aOFEApjYrS0uGfLiHDx/OQaH33HOP2isIdUOESdU0J2FSGSRQaOBf22KUtTmPJlUoHqQ85ubm/DwjwUMuYtpAey2UppiEEGUAI1JSUtiiQ58LZd9ycnLi/sLCQo41oRgTuqdmi6QLFgwBUxNj2FqZISs3X+0RhOYFuXNRZir6kWrpDBs2jEUJuVGQSBEEQagPrVq1qlOF/NqcR9aM5OTkaxYSGoSxsTGLirKihCCRoRUlBIkSgmJWtKKEMDMz4/iSZi1KdIBYTIRG4+OlIfDxckGvjt5qT/0Qi0nViMWk8SGXAAqAfOyxx9Selg3N4q5atYrdH1q6i5tQdwzJYkIuP3///Te7FjWWq46hWkxaBdReaDQ2JFbIYiLUjpjwBHHlEvSfP7ec48rv4wd1UHvqhwiTqhFh0vjs3r2bA79DQ0PVHoFSa9IMobbmgCDUFkMSJhTnMHfuXNx3330cY9AYGKIwObTxhLp1hbLD0fIZssoPVRtjP6X+/eijj7jmCCU5KUttr98S6Tu+bhXvRZgIjcaB03FYvScSt07tp/bUDxEmVSPCpGmggfgNN9yA2267Te0RBKE+0DCloYTJokWLuL7Fu+++y2lnKXUsBTX37duXA6Ypi1PXrl3ZNZHiDKj+xDvvvMPuPV988QXOnDnDbjz0fR8/fjwPYinjE6WWJcspuf5QsT/KwkTHPfroo1ynQ5fQ+2NowsQQoLgRcgWjOBWKKxEaB4kxERqNDq2dkZaZh6TUbLVHEJofVGSQYk0EQdB/aOBJ4uLs2bNcDZy2SVicO3eOt6mmBs2c0zaJE0pLS649L774IltH7rzzTm6/+eabXNGbXDkJqlxOQoRSaJMooUxQFFxNwoSqjwuCUDEiTIRGw8HGHAHejgi7mKT2CELz47rrrmPXpX///VftaRmQG5uHhwdvv/rqq7j99tt5WxD0GbKMEGQtOXHiBFs4KNWrth5Fv35XLPzknkXihArmUT0LqhxO/87JWkFQVW+yqhAkTCitbEhICIsfEiMUZ0VVyOn6giBUjAgToVHp19Ed5y4kqC1BaJ60RKsJuZPk5ubyNrm1PP/887wtCPoMZVAi1ypK0EBWEkpgERkZiT179nDwuoODg3ok0K5dO15TgDuhLeqnXVMtjLKQKxBB2Zzo+9GzZ0/ceuutdcouJQgtBREmQqMyoIsn8guKcDbScMXJudMn8M2nbyM25qLaUzHbN6/Dt5+9o7aElgT5qLfkyr5bt27lzESvv/765dlkgmal+/fvz7n9qXry9ddfz1YW8s2nmWUt7733HqfVJFcYcpGRUEihIRk6dCiLEkoDO2rUKO47fvw4p70uCwkMgqwsdOyyZctYwPz888/cP2LECF4TUVFRl9PG0r/3AQMGsHA5cOAA7O3tuV8QhGsRYSI0KlTPZGQvHxw5E632GB7nzpzAJ+++jNjoS2pPxWz5bzU+fuclGVQJlykuLualuUODMvLZpxlnClgm9xVixYoVPLtMs9DTpk1jd5jFixejT58+6N27Nw/g9u/fz5Wff/nlF3zwwQfso08+/4LQUJBYJnr06MG1JujfIkFioiIsLCw4sJ3EzIIFC9iNkSwtfn5+7K5Fa6pKTiKEAuWtrKzYikr//seMGQMXFxf1SoIglEeEidDojO3ri+zcfBw7F6P26CdJifF4bcEjGNS1FWZPHIg/f/sBFy+cxxcfvs7733jhUVyICMPBfbswb8oQPu6O6yfi0P7d2LJhFTav18QY3HfLdF7TcY/feyMfR+vUFIm1aa6UjbGgjDzh4eG8TRYE8lMvDw3cKb1kWFiY2tM8mDBhAq937NjB66VLl7KbV3BwMIsN8tcfO3Ys3n77bXZv2bJlC4uahIQEfk/mzJnDg76yxcsEQdd07tyZ40PIUkd8+umn3Pb39+c2WVGoXTbehLLvbd68Gb///js2bNiABx54gPtNTEw409e6des43mzIkCH48ccfsXz5cs7oRVZCQRAqR4SJ0OiYm5ngusH+CDoSicxs/a0E//O3n2Lxz9/gxTc/gY+vH1565gFkZ2Wi74ChvH/I8HFwcHTC84/dheSkRDz6zCuIijyPF568F75+AWjTVuOPPGX6PORkZ2H+jFGIi4vGrXc/jHWrluPph27l/ULzo2yMBYkUGohXBVkRaPBOQbLNCXJ3IYFGRRaptgsFFM+cORPnz5/n/TTwI0FGLjIkRiir0axZs/j9o5llcoVZuHDhVX7+gqAvUDau1q1bX1MJnP49U90Lsr5oIZdFbSyKIAiVI8JEaBKGdG+F9q0dsfOwZiZZH8nP16R0/Orjt+Dq7om/N+xD+07dMGjYaO4fPWGqIkyc8cGXv2DmvFsRevYUW1Qiws+hjX8AAjt04eOmzZmPHVs38LanpzdXkvX08sGubRtZ6AiGxYwZMy5n3FqyZAkGDRp0Of0nWUPIQqKNsXjppZdw7NgxjrOg2VWibGzF5MmTkZycjMLCQk4/SrURyP2D9pN1hSwF5OZEgbmGCv0t5MJC7wuJEhIbWqFB7wUFEtNCFpTZs2fj0qVLXFOC3gsSJWRlIXcvQRAEofkjwkRoMm4Y2wGJqVkIOhqp9ugXjz37Kp564S3YOzrit4VfsjvX8SOH1L0asjIz8NAds7H456/h7OKG3v0Hq3uuJipC46JjYmrKMSezbrgNDz7xglSHNUDIP5xcN4g1a9awaCCLSH5+PrsmBQYGXo6xoCD4tm3b4p577uGMPMTatWs5u89XX33FAbbffPMNx53s2rWLs1plZGRwUO2RI0c4qJb805999lk+1xAhywf9Xc8999zlSthaH34qZkeplbdt28ZuMmQ1Wbly5WU3OBIqFAQvdR8EQRBaBiJMhCaD6prcOrEjDp28iBA9DIZ/9J7rsWLpL/jfax/hpbc+5b6zp47xmjh9IgTRly4gOSkBE6fOxrhJ05X9x3lf2YD3YyEH0aV7H7UFDBkxFmdOHkXo2ZOwtrFVewVDYdy4cWwRIcgKQoPsvXv3clYpipPo0kVjKSNoUE0uHVTTgIJiCfI5f+uttzh+ggbqp0+f5v7y/Prrrxx/QZYUEin6TnmRrc1gRO4s5JpFkF8+Qe8FWUKeeeYZDiQmX3yKM6H3jqrmU/Yusqw4OjqipKTksqARBEEQmjciTIQmpUNrJ9w+uTN2BZ/XO3Fy3yPPIZcCcCcNwhsvPI6RYydj6uybFJHRCza2dnhtwaOKAgH3UyzKDdOGo0Pnbnzu+dCzGDhkJG/PnTwYQ0eOw9Mvvo2gnVs41mR/0A7ccudDvF8wLEaOHMnZeLSZoh5++GG2dlCQ9tSpU6u1gmlrIRCUNlRb+6MsJHBI0BB0DFWe1nco5SpZe4jXXnuNA4C1fPHFFyzWy/rik4sXpU8lqxG5bVF2I4Jc3CgJAMWj0PtM76s27arQsqF/X7JUvAhCc8FI+bGQXKZCk3P4bAIWrTuFvl18MbiHn9pbNZ//sQuP3nR1nnldQy42UZFh8GzlCyurK4OqosJCZOdkKYNHe87CkhAXAxdXd3bVKktubg4fa2ev8amn68VGR8FLuV75Y3UNvT9fPKERR4JuobSiHTt2ZDckCm6nOBAamJNlgAbcr7zyCiIiItjqQceS1WPu3LncT1WjKUsPQVaCQ4cOcWYfGxsbHohfuHABd9xxBy5e1NTJCQoKYiuLPKqFlgpZzeg7RPFYQsWQiyk9TwTdQQUyKSFJTEwMvLy81F6hoRFhIugNZ6NS8euGM3BzssXwPgGws7FQ91RMYwgTQ0aEScPxv//9j+sTUHzI/fffz7P8FB9Bwdy0XVaYkGi59957OTBehIkg1B76t0/fM6ppI1wLvT8Uw/Xdd9+pPYIuEGHSNIgrl6A3kFvXs/P7wMocWLz2sN7XORFaLhTQTQwerEl2QPU6KNaERIkWbYwF7aNBFdUxqAjtcYQkQ9C4hN10001qSxCuQNncZKl4EYTmglhMBL1kz7EYrAmKhI2iUnp29EYHP3d1zxXEYlI1YjHRHyiGggYP5PYnVA3VOxk4cCAef/xxTrcsCFqLiVgEKkben4ZBLCZNg1hMBL2E6py8dtcA9G7vyrVOfl19EPuOXUBSarZ6hCAYDhS8LaKkZlC6ZUqT/PLLL+Ovv/5SewVBEISWgAgTQW+hCvGTB/nh7fsGY2L/1khOzcAf64NZpGzae1Y9ShCE5sa0adO4yCLF2lDqYEEQBKFlIK5cgkGRnl2As1EpiIjJwO5jMZg64krNCOFqVu84Ka5cegil0f3zzz+xfv16tUeoDCq0SGmDqYhl2VgcoWUhrkpVI+9PwyCuXE2DCBPBYHnh+yB1S6gI+mq/fd8QtSXoE1TL5JdffuFsW0Ll0L/hQYMGcaFKer+ElokMvKtG3p+GQYRJ0yDCRDBYHvlku1gEqkDeH/3l008/xf79+7FkyRK1R6gMqoxPwfDPP//85SKMQsuiOQy8qYYVZd1rCMufCJOGQYRJ0yC2cUEQhEbmoYcewqZNmyR+ogZ06tSJg+GpdszKlSvVXkGoP/Hx8SwWGmN+9plnnsHXX3+ttipm4cKFUkRSaPGIMBEEQWhkzMzM8PDDD+PLL79Ue4SqmDVrFt58800Ohj97VhJfCLqBqqUfOHBAb+oHkfimWXpBaMmIMBEEQWgCyGryww8/cCV4oXpeeOEFTJkyhcVJSyEzMxNFRUVqq+FojNdoKHbu3Im77roLN954I7v75efn49lnn4Wvry/69OnDVjZyxenRo8flQT+tad/Fixf5e0gWk4rOI4sKnUefQ25uLvevXbuWr/HKK69U6YpZUlKC119/HQEBARg1ahRCQkLUPcAbb7zBcVO00HUIqtyekJCA6dOnIykpiV09Kb6KirbSv/m0tDQ+ThCaOyJMBEEQmgA3NzexmtQScumiASQNRJs79913H+zt7XHmzBm1R0NOTg7P8IeFhak99Yfq7Bw9elRtGRYkGn766Sd2+XvkkUfwzz//YNeuXewqSUU6Z86ciby8PFhYWGD16tV8Dh1DMQPW1tY4ePDg5b7y52VnZ/O5JBIOHz6M4OBgrFu3jo+n1+zSpfKskHStr776io8jwbN9+3bupwxz33//PV+H+j755BN+70mguLu747fffmNLzk033cT/zumYxMREPPXUU3y+IDR3RJgIgiA0ETRbS4MXGgAJ1UMucCROli5dig8//FDtbX4UFhby4HXPnj3o2rWr2qvB0tISO3bs4KBcQUP79u25IKe3tzf/2/Dz8+P3iEScj48PgoKCcPfdd3OaboIG/+Utb5WdN2PGDBYZWsvMhg0bEB4ejoKCAnTr1k09+1ooHfgtt9yCESNGYNKkSWztI/r3789Wl61bt3ISDBJWZJkhkUSQGD1y5AjOnz/PAfP0umR12bhxI+8XhOaOCBNBEIQmgqqcU/yEWE1qTvfu3XkWmoKJtW41zY3rr7+e12QBoJgaGsySIKMZespS9uKLLyIlJYWPoRiJ4cOHs8vPrbfeejl4mjI00WCdBse0b/LkyTzzTpw4cQJjxoy57EpEg2Mt7733HveTSxPF9RhC4k4SEVoiIiJYvNGgnhbK5EbuWHPmzGExQBYLSjqhFQpaKjtv4sSJ2LJlCy8PPvggsrKyWNjMmzevytgUch8jq6gWOzs7XpPwGTp0KLuTUba5zp07c39ZyL2TjtfeC30er732mrpXEJo3IkwEQRCaEK3VRKg5NHB/9dVXedabZpabG08//TSvyQWIXI7I3eixxx7jv5vcfGgGn2IeaKZ9wIAB6NmzJ5YvX85ihVyQCBoYUywDiV/690WuSN988w3vozgGsj6R8KABtxZyWfr444+5ZswHH3yA999//7Krk6Ewf/58mJiY4N5778Xs2bP5byfrBrmrkZig/WQ9IRFSlsrOGzx4MI4dO8bvAwmVqVOnskggwVIVZGmhOJXU1FTExcVdFtHkKkbXINHYq1cvLiBaFnpNEo0ErR944AHuo/MEoSUgwkQQBKEJ6devH3r37i01CGoJzfSPHj2aq8M3NyjImqB/G1oXn88//5wHs+Tqo4WCr8la8Nlnn7HV5KOPPmLRQgNhYtiwYXwOWQvIDYmsL6GhoSzmfv/9d8ydOxdffPEFH0tERUVxADa5MtE5u3fvZsuJIXHzzTdz8Di5dXl6emL8+PGX30/6t0J/O1mRylPZeRSbQiKEFhIuY8eO5eNHjqy6RtSECRN4TYKIXM3I2kUWFhJAmzdv5jYJRBIpZP0j6Np0XbLKkJsXtele3nnnHc7YJQgtASmwKBgsUkCwauT9MRxoNpSCW2lmVqg5ZDUgdxhampOwowB/mtGnWIbWrVuzdYNm1inAm0SDjY0Nzp07x2KlIjfA48ePswWFhAa5gBHkokUWEXJhIkuINu0yuQqZmppyXAPFs5CAIYsJuRKRRYoGxVpx1FTQMKW2BQTJYkR/FwWU14banEdCht638pibm7NQpMxc5CKmDbTXQlnQyJVLK/rI0kUChv5Oyr7l5OTE/RRrREKKYkzoniqjLu+PUD30GUmBxcZHLCZCs4Nmo8jXmsz2NLtIM3/a4OKK0jTSjwKZ6CnVJPlik7sEmfHpR4NmtSgTC0EPJ7oWHUOzaeTrLQi6YNy4cTww0QbnCjXDysqKB9600Axzc6aieAZHR0e2qtDzjRYa1JKVg2boCZrhL4+/vz+LGm2K4EuXLvGaoO13332Xn4lU7I8CwhcvXqzuNSxoQFlbUULU5jxysaKYnvKLNv6HqryTqCgv7EhklLVE0XefoM9YK0oIEqT0W1WVKBGE5oZYTASDpTKLwIoVK9hHeNWqVfwjTBlRqOIuBSKS6wKlX6QfCnrgk9sDmcppIXM6mfrJBE+zIxTgSC4SNCtLAx/y9SXoOMqYQz/YFy5c4B8ffUQsJoYFzXCTWw1l4RFqB30XyRWHMiZpXWgMmYosJjQR0rFjx6ssJjQbT38vBVSTQKG4EJpUoeBpmoSh9Y8//sjX1FpMSGy4urri7bffxp133sm1NmgfzfzTs5GySZGLmIODA7sV0TOTgvCbEq1FQKgasZjoFrGYNA0iTASDpSphQgGcNHNIkNigH20SFpSNhn6cqQYAuTP8999/bC0hYULFtshf+7rrrmMxQ0HJNFj89ttvecBDQadPPvkkP6BotpFqUJCZncSPPiLCxPCgIGYaJDaHwXVjQ5mqKFsXZV2iwbwhQzPxFNtAzxeaWSdhQvVMaDJFK0woVqRdu3bsAkjPO4Jm+klUUOwNWYTLCxMK4P7rr79YAD/66KPcP2TIEHYhpOclWYP79u3LlhNy5aIMaDTBo53RbypomEJ/r66ggHQKcn/iiSc4uL25oLWUCbpBhEnTIMJEMFiqEib0Y6wthEU+05T9RBtsSBlvKP88DWSouJVWmGi/CiRMaPb1hhtuuCxMli1bdnmWkWYStdAxTf2jXRkiTAwP+ndLA0FahNpDllJyZyqbaaolQGmAKUMXCZXy2aYqg+Ij0tPT0bZt26vcxMhaQ4KIXIroudgcoX8nlKaXrEqCUBkiTJoGiTERWgzVpWmsCrKW0Cw2/VBTLnua2aYMODRzKQi6gtKY0uw1WfWE2kMul5SRiqyZLQlyU6XA9ZqKEoImWij+oXzsCllqKMi+uYoSspRT3RYRJYKgn4gwEZolZeM+6IeXlqrSNJalfMyINoCUBA1lwCF3B3J/oBoA9CMuCLqEBtUUJyDUHkp2QeKEYsqkaKVQHorFeeutt/jfhyAI+om4cgkGS11clSpL01gbKD6FZhNtbW3VHv1EXLkME0q2QG4DZDWhmAKh9lC6W4oto4kIbbG6lgy5t/3777+cuUyb3rZNmzacvIMgMdcc68GUhb5XVJeEXHhvuukmtVcQKkdcuZoGsZgILYrK0jTWBvLj1ndRIhgulhamePD+O/HFp++jOC8JpSWF6h6hptx222147rnnuA4HDSpaKiRIKMCbEnRQMDxZikNCQjieLjIyktcUZ0fv06JFi9SzmifkgktpuUWUCIJ+IxYTwWAhi4BQNWIx0W+KcmKRE7MVuQlByE8+gvz0UEWMJCIxHfhzB/DwNM1xJpZuMLdvBwuXXrD2GAzrVqNhai0zeNVBA/G8vDzOvtfSoFTnr776Kif3ePzxxzFjxgx1z7WQJYWOp/TDzRFKYELCizK2CUJNEYtJ0yDCRDBY5B9u9Vxbkk1oakpLCpB+bhEywhYjJ24nzGx8YO3UExZ27WBu0wamVu4wMbOHkZEpSkuLUFyYgaLcBBRkX0B+ZihyUo6iMOcSrD2Hwb7dzXBsfwdgbKZeXSgLuWpSVfjJkyc3+wKMWqgWCVlA6KedhElNXLS01cbJmkKJPZoTVCCXXLhoTUlPBKGmiDBpGkSYCIIgNAKlRdlIPvoeUk5+DlNFeNi1mgA7z9GwtK997YG8jLPIjNuKjOj/UFyUCecuj8K5x3MwNpUsceXZs2cPhg4dyrPm9913n9rb/CBx8dprr7EAI7ctspJQZfiaQsUUaSEx05wgYUriTAo0CrVFhEnTIDEmgiAIDUzame8QtqQNsiJWwLPz02g78h+4tb+/TqKEsLTvoJz/AAJGrVSu9xRf9/xSf+V1vlePELRQBr0ffviBB6bNtao+BbSTNWDbtm1s9SBxURtR0lyhIpKU+lhEiSAYDiJMBEEQGoii7GhEb5yKhH1Pw7XdXfAb8gvsvSepe3WDvfdkvq5LwO3K6zyJS/9NRVFOyw34rgiqD0MV0snFiYoRNifISkKihOJpSKDU1RWLrCXNicWLF3NWtm+++UbtEQTBEBBhIgiC0ABkR29G5Mq+KC3Igv/wpXDym6fuaRic/K5XXudPoDCLXzcnpmVVP6+ODz/8EB07dmw2aXHJdYsECaX6JUtJS4mhqQmU0p2ycJEoqU3RSUEQmh4RJoIgCDom8/xSXFw/Dg7ek+HT50OYWTVOFW16HXo9h1aTELVuLDLCl6p7BIIG8adPn8bTTz+t9hgmZBmhFMAODg68rQtrh7a+SXPggQcewAsvvIARI0aoPYIgGAoiTARBEHRIRvgSRG+9Ee6dn4JbhwfV3saFXte985OI2XajiJMyuLu7szj56KOPsHDhQrXXsKC0t2QpoVotlIFLV7EkZIHx8/NTW4YLFVAkwfbss8+qPYIgGBIiTARBEHRETsxmRQzcxKLE2f9GtbdpcPan+9CIE3IrEzTQLDq5+FDcSVBQkNqr/5BwoBgZyrb1zz//6Nx16+jRowYvTFavXs1V/7/++mu1RxAEQ0PSBQuCIOiAouxLiPinDxx9p3LGLH0h8dw3SL+0Bm1mHOKaKYKGxx57DBs2bOCie1TDQ58hUTJq1CiuTUIWk4aoNWJkZMQFFg1VnCQkJKB3794sOqdOnar2CkLdkXTBTYMIkwaG3t70tHTkZGSjIDcfxkVASXEJsrM17cL8QhiVKH1FxUp/8eWqgfQjYWRiDGMTE5SYlMDcwhyW1tawsrGCCfcBZtbmsHWwg529HR8vCELTcem/KUBhHnz6vK/26A/Rwc+g1NQaPhPWqD0CMX78eFgrz9WVK1eqPfoHxX7MnDkTbdq04ftsiDTA2jgVEkCGyuzZs9G5c2e88cYbao8g1A8RJk2DCJMGIDkpGZFnzyMvIQuFmflISU5GZmoGCrLzYVRYysKkPhgrgqXUzAgWtpawc3bg2T4Le0tYetihbad2cHB0UI8UBKExSD39DZIOPM/Zt0wt3dVe/aEwNx6Ru26AW//34dhJajpoiY6OxqBBgzB//ny88847am/TcOONN2LJkiVqSwPFkJAooVTAZClpKMgtjEQPvZ4h8v7773Nq4I0bN6o9glB/RJg0DSJMdERSYiL2bdyD1FNxyiCgAMVFRSgtUd7aRnp3jYyNeCELi5WjDToM74ZO/bvBytpKPUIQhIaguCAD5//0h2vgPXBqM1ft1T9SLyxHUugPCLghEsZmdmqvsGXLFowdO5YH/hRQ3hQsW7YMt9xyC+6991588cUX3Ef3QzEln3zyCceVNCQzZsxg9zBDrPq+Y8cOTJs2DcHBwQgICFB7BaH+iDBpGkSY1IHi4mKkJaciJyULZ4+fRnRIBPLTc9W9+oW5sxX8egcioHMgbFzs4OjsBGNjyXkgCLoi8dALyL6wCn6DG25GW1dEBt0OmzbT4db3TbVHIL788kuuEk7xJv3791d7G49x48bxjL+pqSlnlSKXKsoeRpaMxqi7QqmH6fUMrchibm4u+vTpw+/ZTTfdpPYKgm4QYdI0iDCpJWePnkZCaAwunYtEdnwmx4bogiFzR/M69OApJFyIg29nP7Tu3Bb5OXk4tLb+mWOMzIxg6+mI1u394NHRB+06t1f3CIJQV0qKchH2uzs8uy2AfasJaq/+khGzAXEn3kPgzQkwMpHCc2V56KGH2JWJxImdXeNZlEJDQ9G+/dXPYysrK84Y1hBB7uWJjIxkYZKamtog8SsNCVmU7O3t8dlnn6k9gqA7RJg0DTJ1XgPIQhISdBjL3vgZe37ZhDPbjyIzOq1aUWJiZgIzSzO1VTVGJkboMrIXek8ezO5f5pYWCBzQGYWFheoR9aO0sBSZF1NxcmsIdi7cgL/e+QXHDh5BSUn94l0EoSWTHroIJpYuBiFKCPtWE2Fq7oT0c/pv3WlsvvrqK3h4ePBgtzH59ddfOQC/LGQJOHfunNpqWEiM9ejRw+BECWXfomKZIkoEoXkhwqQSyJCUlZaBMyGn8Pvr3+Pg4u1Ii0tBUX4h76sKsnbMXnAr7vj4Ufh2aav2Vk18RCyvW3fxh6WdFTKS0jlr1/mQ2v04mVmaw6mVKxw9nDlI/hqUWy/KK0TKpSTs+2ULfn/rB0ScDENGanq1f5cgCFeTGbYYDl6GIUq02CkiKkO5b+FayJ1pz549eOmll9Sehuf7779HTk6O2rrC9ddfj61bt6qthoOC3g3NhYviSR588EEWJ4IgNC9EmFRAdlY2Dm3ai40LV2Pnj+uRn3Ttj0ZV5KRnA0bKm2tsjPjz0Wpvzek2sjc4+6+ycAB9DXHxccPguaN4GXL9GPSbOgQ+narISa9cOi8uC5u+/hf/LVyFkG0HkZebp+4UBKEqqG5JTvwe2Hlp3DANBXvlfnPid6NQuX/haiglL4mTN998E3/88Yfa23CsWLGCXajKQynhLS0tOSPXsWPH1N6GgYLHGyOORZdoRQlVwBcEoXkhwqQM5NZ0cPs+rPpgCY6s2Y+k83HqntqRGpeMC8fDebtNt5pnCcnJyEJxUTH8erSDibkp9xUXFvG6Omyd7TFw1gj4dGyD7b9swMkdIegwqCvcWtcsdWlqRAKCVwXh3w/+QPCeQ2I9EYRqyI7ZCnPbNrCwa6f2GAYWdoEws2mN3Nhtao9QlokTJ+Ljjz9ml66QkBC1t2H44YcfLrvrat25yKf9rrvu4grm58+fR/fu3bm/ISBrCT3rGyOWRVdQkoJOnTrh/vsl7bUgNEdEmCgUFRUhMToBK75cgpC/gpCZlI7ScrVGTMxMYe/qACv7q32BK4ILKKZmolQROgG9O6i9VWNqaozY0EvITsuEtYMtfNnSQSYTzf7qCOzfCd7t22Dv39v5GinRiSgqKEJ4cM1dwUoKi5Een4pDS3di1XfLkRiTwPE1giBcS15CECydeqgtw8Jaue+cuD1qSyjPE088wVYEEid5ebq1IpeUliBPESOnzp3jyvMU6D558mSuxUExE1Rb5bvvvsO8efPg4uKintUwUHwJpQo2FBYvXszZy8SFSxCaLy1emKQmpuDAut1Y9ckSpJyNo+ASdc8VTExN0GV4D8x67mb49whUe6smPTEVuZk5cPX1gKlq/agKI2NjtpaEHTgNcysLtGrfml+3JlgrYqn72H7ITElHzLmL3EcV5S+cOI+MxDpU8i0pRfzxi/j306UI3rSfUyMLgnA1eUlHYGlXs+eBvmFhH4j85CNqS6gIEgePPfYY1qype7X8nIJ8hCXFY0/EOfxz/DB+ObQbC/fvxG+H9+D5D97BM998hs+2rsO8Vxeg1fCBSLYw5uNzCwvUKzQs//77r8HEl4SFhV124SI3N0EQmictWpicPxuOzT+uxqnNISjOvdZlysnLBS7erihRBurRyoC/1MgIrq091L1Vkx6fgpyMbA5Ad/F2U3ur59TuY2wlcfFxh6WNJYpq4MrVY8IAWChihtzHCvM0P2h5Wbk4+O8u3q4rJdmFOLpuPzYvXI3oC+KPLghlKcgIhblNa7VlWNB9F2Zq3E2FyiGLyZw5c9RWzSgpLcWZhBj8eyIYi4P3Ytf5szidEIuk7EwUFF15nk+96zYE9tS4aRUUF/F+Oo6O//1wEJ9P16HrNQRHjhzhVMGGYjF54IEH8MILL2DEiBFqjyAIzZEWKUwK8wuwZcV/2Pz5SqReSmLXq7JQBfUeY/tg5rPzMft/t8GnY2ukRidh34rt8AzwhrMiVqojOy2bxQEJEw/lnOrRuG0V5lEmrrNsLSErSmlp1el86fodB3VV/oZiJF9KZKsLQX7DBapIqQ/03qRcSMTaD/7ErvXb+b0ThJZOaXE+ivNTYGZZsxgufYPuuygvCaUl8n3WFUUlJTh8KRK/HtqNvZFhSMjKuNxf05g9Oo6OJ+h8ug5dj66r7dcVVFl++vTpBpEmmAooOjg44Nlnn1V7BEForrQ4YRJ3MRabf1mL8G0n1Z4KUH4cEqPikZmczs3h8ydwTZHQfafYRcqvR2DFqXjLkXghjsWFs5crjDjNVuVQDAuJC/phOrXraI3ri5BQouxfWSmZijBJUHsbAOV39cz6YGxZvB5JcYlqpyC0TEoKNM8GYzM7Xhsaxmb2vNb+HUL9IMvG4sNBOBYThULlOa4rEUHXoesdi7mIxcFB/Dq6gty4DMFasnr1ak4E8PXXX6s9giA0Z1qUMDm6PwTbfl6HS8ciyN6u9l4LTW7FnLuEY1sPc9vG0RYDZgxHz/H9cWzzIbTv35njQKrj4ulIXlsr51vYWvF2TUhPSOXgdaK6mTZ3fy9FJJkgOz2L41oGzBzOmcBMLWpW2LE2lBaXIio4HFsXrsXZE6fVXkFoeZSWaDIpGRnr/nvWGBgZa+LetH+HUDdyCgqw4cwx7IkIZXcsXVs1tBSVFLMbGL3OhjPHkVPPGBRy46I0xfouTBISEtiFi0SJu7thWicFQagdLUKYkPXhwOa9OLB4OzLj06od7Gs5G3QCuVm57JJFFo++U4dwKl+KHek0rPoUjvHhMfxa9q6OsHOqema1rEWFguajTiriSaG4oOqsWHRtcj2jTFyFeYWwc7bHhPtnYMC0oTUOnq8Vyt+TFpOMXT/+h+BdB2v8XgpCc8LIxJzXhjqwvyKsNH+HUHti0lPx97GDiMlIa7A4kPLQ68RkKK97VPO6deXTTz9lUaLvblwkSijOZ+rUqWqPIAjNnWYvTPLz83Fw3R4cXbPvmhTANWHLT2tQkJuHM0HHkJmcAb/uARwU32vCQK4dUhU0aE+Kioetky1bTaqiVYfWcPR0gZmFuTJoUM67GI/8nOrTVGoFTfJFjRsXvSYFzCdHJ12ON2kIKLVwyMq9OLxpn6QUFlocxuYOvC4p1MQRGBrF6n1r/w6hdpxPTsDa00eRV1SI4gayklQGvR697tpTR/g+6oIhuHFR+uTMzEy88cYbao8gCC2BZi1MqIL79sUbcHzjQZQW1u3HI+ZsFFLjUshQgK2L1iItPgUW1pYwNTNF70mD1KMqJ/JYGLtadRzSTVERamcFXDwVgYgj5zjYnKC0v0c2HuDtqkhPTGMhQ1Ycct/yaNuKK88nRMaqRzQcxXmFCFm7DzuXbmIBKAgtBbI0mFq6oTAvXu0xLIpy42Fq5W6wrmhNCYmBLaGn1FbTQvdRW3GiLaqoz8KE6qu89dZbUq9EEFogRsoDqln64mhEyX+IOR55jbtR624ByFUG8hScXhNad2mLUbdPxh8vfgcrexuMvfM6ThuclZqBTT+srvI6c56/BY6tXJGgHLPhmxUoyNHtAN5auZ8bXrsL5/adREzoRYy4eSJSY5Ox8oPF6hG6g1zGjE1NUFxwbQrjNn0DMfKmCbCwqD72RtANScGvqVtXU9OvdGUJGep7vpbqrlPf85uajHM/wdzKG1ZODVeZ27X9veqWbkk5/xsykw+izTQpslgbyH2LLCX6xpTOPdHKvmZuWVQ4kqCsXPpIbm4u+vTpw5m4brrpJrVXEBqf2NhYtGrVCjExMfDy8lJ7hYamWQoTEiV7/t6KCwdDrxnckOWi/7ShuHAsHDuXbGJrQ3VY2lph5K2TkJOWiZ1/bGJXrsFzR3ERxKObD+LQ6iDOqFURdi72bMEo71ZlZmnOtUdobWpuBlMzExiZmMBYGfzTLVOaYLKeFBcWcyYwqk9CLmW0XR5KX9xv6lB2LaO4kriwaOU+N6p7dYdnO28MmjMKe//axq9RFspSFjikKwbOGC7ipJE486MRrF36qC2hsdGm8q5OYNWVnORgdJxySG3plpijL8PEvi08Bn+h9gjVQYHuFFNCblT6hqWpGWb36Adrs6pjhtLS0uDk5ISQkBD07NlT7dUvKKbE3t4en332mdojCE2DCJOmodkJk8yMTOxSBuXRJy5UOOM64pYJnLXKzMIM+//dhRNbg9U9VRPYrxOG3TQOqz9dxhYSytRFYsAr0BdrPv8TmUmV+5rTwMXW2Q7ufl5w8XGDlb0tixJLW0uYWymLhTlMzE3ZGkHChKCA/ZKiEhQVFHFtk/zcfORl57LFJSc9C0mXEpAQGYfs1Ew+3kQRNnbODpx2mALhKWBfl1jZW2PMndehlfL3kjvbvr+3Xw7Q10LixLdnAEbcNF4q8zYCJEwaauAqNDWlOLO2X4N9vuHbpsNtwAewD7hR7RGqg7JvUcB5Y8eU1AQTY2O0snfCxI7d1J6KoaB3spRQVi59hFy3KDXwvn371B5BaDpEmDQNzUqY5OXlsaXgQnBYhaKEIItCp+E9OWtVUWExdi/dhPDDZ9W9lUNuTNe/cidSopOw8ft/uY9SBg+cORwXToTjwrHz3FcWJ09ndBzaA/4928HC2ooH7rTUd4aVrDwsXIqLOYNXePA5nA06hozEhqlJYG5tgSkPz4FbG092F0uJSYJ/j3ZY/fFSZCRfK8gCBnbCiBvHw9RUk5JUaBhEmDRnGk6Y5KWfRuTuWxB4czxMDLRAZGNzOj4GQZGhjZZ9qy4YK78rQ/wD0dG9ldpzLf7+/njsscfw+OOPqz36Q3BwMLtw0bpXr15qryA0HSJMmoZmI0xooL5/zS6c2BxcbfYtEhnkitV5WE+kxaVg+28bahRv4tXOG+PumY7Da4Nwes/xq923FK1haWMFB3cntGrvi/YDuvC2luLSIuQXZ/NSVJKPvKJMZBYmI6cohbfzS3KU/oLL7iHGRsYwM7aEuYkNrEzsYWPmBFszV1iYWMPMxBIWxja8j44j6GOkv+XcvuOIDY/hWij52dVn9aoOCxtLDJk3GgF9OnJtlR2LN3KQPQmV/f/sxInt11qcjEyM0GvKQPQeN5CLPwoNgwiT5kzDCZPEs18hL+cCfCdvUXuEqqAaIosP7+U6JfqOuakp5vceDNMKnrtkJaEBP9Uv0cc0wQMHDuT4l/vvv1/tEYSmRYRJ09BshMm+DbtxbP0B5VekZn8OuTwNnDUCXRRxknAhFpt+XH3ZLaoyTM1N2WpyYnsIL8WFmh8qGwdbtOvXCV6BPop48eG4EYLESEreRSTnRSG7MAVZypKtCJECRZyUUin1OmCs/GdpagcbUxdFrDjDThErrlZ+cLDwVLSRxhJDaYZjwy5xZq+wQ6eRl1k3ty6y7gy7cRwC+3fm7F/bf1uP9PhUjLh5Alp3bYv9/yrCpBJXOBNLM/SYOgB9Rw5QewRdI8KkOdNwwiRs63Vw6/c2HNrfofYIVXH4UiRXXieBou+YGpugeytf9PHxU3uuoM9B748++iinBv7555/VHkFoekSYNA3NQpgc3nUQwct3cWXy2mBpY8kDb/9e7ZF0MQFrPluGgtzKs2aRCxYFwtPAnwLTzSzM0WNcX3QY2JVjMCgtMJFfnINzqbsQm3MaBSW5GksIGsYv2djIBKZG5rA0sUMb+95oa99P6dO4UFHAPaURPrkjBKd2HuF4lRpjDIy5Ywra9uzAf++6L//i2JK+1w1B15G9+X1a+eHiKt3HjM2MMfCWMejap+GyFrVkRJg0ZxpGmKRf/BcJ575F4M11q3/R0iDXrV8O7jYIUaLFTPkdurXvUHbt0kJB7+TGRQN/fUsTvHjxYrz99ts4fPiwxCYKeoUIk6bBoIUJ3fql81HY+ct/yE6u2tpRGc6tXDHy1olw8XFH6IFTCFq+VRl0F6h7K0B51lvZ2aBVoA9bXGwc7bg7rzgL6fmxCE8/gPjcc9xXFhtTJ2QXpcLEyIwFTlFJIVs4aiJYjIyMYW5kpWyVstCpytpiVGoMP4c+aG3bE3bmruwORmQkpWHv39sRfz6m2sB4sgz1mTQI3cb0ZVGSl5UDE3Mz+pWGtYMNstOyEPTXNlwsF/xeEXYejhhz13Vw9/ZQewRdIcKkOdMwwiRi5w2wb387XHq9oPYIVUGxJfsuhCnPa/0LeK8McuMa5NfuqlgTspK8+uqriIyMVHv0g7CwMPTu3RurV6/GiBEj1F5B0A9EmDQNBh0AUJhfgJD1+5CTkqX21B4K5A5avo0zXQX07oDuY/upeyrGv2cgRt8+mRcSJRQfEpa2F4cS/sa++CUVihISIIGOw3jb0dwLTubesDS2g4tFa+UDMFHWbXhfRZgpgqSDw3D0cZ+J3srS3nG4InKc1b3XUmpUgoiMgwiK+w1HElfjYuZR5Uc1H/aujhh39zSMvGUifLv6q0dXDFlEOg3rgaLCQuxZtgWH1wUp4ggI+W+/0t6K9V/9XSNRQmQlpCN43V7+rARBaDqSz/+OkuJcOPd4Tu0RquNcYqxBiRKC7vdswtUxk5R6V+vKpU888MADXK9ERIkgCFoMWphs/Xsj4s9GV5qBq6bEhUdj08LV7PrUfUxfDL1hDFtQykJB4OPvnYbh8yfAu0NrGBkbIzrrBPbE/oqTqZuQmHseJaUVm/vNjK1QqAwICApYJyuJs6UPzEys2QWLxEpFmBpZYEirW9DBaTg8rAPhad0enZxGKn23wrkKMUMUluThUvYJHEleg71xfyA1L4ZjRig2ZNStkzDqjkmXY2G0OHq6oP/0Yeg9aSAfu3nhGpwPOQdre1su5HjxdCTO7j2BjKSaZ/+iz+bi8fPYvkYCbQWhqSjIikTS2S/h2u9t5dkl2fJqQk5BPhKy6maJb2oSsjKQU6iZDKIq6hT4rm/ChASJg4MDnn32WbVHEATBQIUJDXZPHDqKqKBz1xZINFL+KBMTzrxVGxIj4riuCVk32vbqALfWGmFCblfktjXtievh1yNQGcybIaMgAbtjfsGBhOXIKEyoVJBosTSxBcWZ8LapPQqK81iY5BalwdrMEXkl1/74kSgZ4HEDnCy8OY5EC7l1kVvYCO874W3TldtVQa+blBeJ7THf4VjSOuQVZ7DICuzbGdc9Nhfu/hpRRO9X4IBOijDTFOwL+ns7ok9fgIu3G8fQGBub1KgYZUVQ7E/E1lOIOHttSmVBSM/Iwluf/YQ9B5u2ovbx02F8Hxdj4tWe5kPcqQ9h12YWHAJvVXuE6ojOSOP6IIYI3TdVqSfIjeu2226Dn9+1AfFNBbluUb2Sr7/+Wu0RBEHQYJBP3aSYBJxYf1htqSg6xMXXnS0e/acPRe9Jg9Cub8drrAKVQWInLvQSwoPPYtuv63Em6ASf231sH4y5eyqcvFx5kB+atgd7435HYl7NB9kWpoowKdUE1Vub2KGgJAeOiuDILUqHtamjsr66FoiR8rG0sesFFytftadiurmMh7tlgNqqnvCMA9gb+wcuZh5TWqWK+PLE2LumosuIXjBRxFzw2r04vG4vslIzYW5hhk5Du2P4TeP5fY0IOYfcjGzNherIwb93Ijk+SW0Jgob0zCy8+N7X2LU/RO1pGk6cDef7aG7CJP7URyjKS4TnsO/UHqEmkNVBn+uWVAXdd3xmBge9kwDQJ2tJQkICu3BRMUV3d6mjIwjC1RicMCnIz8fxXcHITEhTezS4K4NsyiLVYWAXjpHoM3kQZ9ya+sT1nHWrJqQnpnKAOMVPWNnbYOj1Y9F/2jBY2VojoyCR3bbOpG1DjiIoaoOFiQ0KSzSuXJTqt6A4Fw7m7ixQrE0dkF90tcWELCz+9v04UL4qrJRzuyripLrjrlCKtIJYHEteh4Pxy9ndy9bJDoNmj8CguaO4PsmRjQdwYNUutB/YFYPmjIKrIkrCDp7m96U2eHdszUH0ZUmPTcHpfcdRpKZZFpoHc+55Fvc9+zZuffRlPPLC+0hNz8AHX/+KgEHT0WPsjfj973V8HNUaev3jH9Bh6Cze99hLH3Lf3U+9wfu/+nkZ/lm/DVHRcZhxx1Pw6D4e/Sffiu9/X8H7128N4va+w8e5/dpH33O7uLjkmnvIzcvHoy9+AN8+k/n1aJtea+e+YD7nuTc/53uj7dWbduL8hWi8+qFm4E7nh0Ve5G1DJyl0IdKi/obXqN9hbK5/tSv0mfiM9Hq7CTcVdN8JWelc6b1Hjx4YOXKkuqfpIVFyxx134LrrrlN7BEEQrmBwwiQ1Lhnhe89c5VZEqXqnPD4PF09FYMW7v+PHRz/hwXVhfiFcfdwx5vbJ6Dt1CKf3rQpKAZyfnQtLO2uMmD8egf07sYtTQu55tpKk5F+s1m2rIkxhjsLSAnYTMzW2IOMOjIxMFJlQytaUknKZuVyt/DmjVk2wVwROd+dJylbNXdc08ScnERT7GzIVwUWub52GdMeQuaNhbmmByCNh+OutX5RlEX5/4XtsXbQO2ek1TzBgpgicLsN7cb2Tsi519Jmd2XkUqfHJao/QHCAXKBIPKzdsR/uANvjyp2V4Vhn43zb3Oni4OuOWR15G0KFjLCxeUQb/N8+ejFvnTMHnC5di2erNmDxmCF+nX88uaN+2Dd754mf8+98OPP/w7XBXzifBQVaM5NQ0HDxyChlZGstd5KVYbtMgrPw90Plf/PQn5lw3FteNG8bbK9ZtQ1pGFp/zza9/YdzwATgTFonHX/4Ijg62GDZAU22a+p0dHXjbkEkOW4ikc9/Ae+wKWLkPVHuFmpKRX7f6T/pCRl4eW0v0qcr7+++/z/VK3nhDMxkhCIJQHoMSJvn5+dj421qUFl0ZyFOhxMGzR8HM3IxjIfpOHQprRagc+e8A1n/9N87uO8kzpb0nDMTgeaM43W1VuLb2wIR7p3OQOBVIjMw4xNaFnKKrLTQ1hdyyLM0cFEFTBDtTNxYF1mbOyClMU/aYwEjRV+XT/3ZQM3jVFEoPTJm+aktK/iUcUP62uBxNJjEqEjn6jslw8nLhdnpCWp3ct7qN6QOfTm0Q0Lsj2nRvp/ZqKMkrxrZl/6G4bNV8weCxs7XGpcPr8cid17OFhARFkfIZe7pr/i2t2bQL+QWaOKsvf16GiIsxWLHwA8yePBqzlIXo36sLunRoi6fuvxnvvfgo4hKScDpUk/0t9HwUr6ui7D1MGDkQX7/zPPeRECFOng3nNfHNuwvw4cuP48YZE9laQt/UMcP6875pE0YowsSetw2V+JMfIOrEz3j+nyEodRyu9go1hVyhCg38GXVg23au8q4vdUsoCP+tt95iFy5BEITKMChhcmDDbuTGXh2PUaqIjuPbDmPrL+s0WbVG98GE+2fCp7Mfki8lYvfSzdi1ZBOyUjNYuAwmq4C1hXr21bgpomTYDePg0bYVx5OcTtmGo8nr2eWqrnBRRnLlKs6Di1UbFji2Zi7KOpWtJ/QRlK1lYmvqAjtzN7VVcwIdB7MIqi0ZhfE4nPAPCzASSL6d/TkrGcXU1IUe4/qhx9h+yEzOwIbvViAz8VpBl34+CYe27VNbQnOgYzs/2Nsp/84Li3BOFRFkyWjj44UXH78LA/t0w7TxI/Dr56+jX8/O+GXZGsy66xl89uMSPrYsT7/2KbtaFRYVYfjA3movOA6KINctIlO1nGjR3gPx+9/r8eCCd3Hq3HmMVQVHWbQWEXOz5pWhKj8jFFH77kd2agj+OHM91m06wMXrhNpRoPzbM3S2/Pk3brn1Vjg6Nr0LX25uLh588EEWJQEBNY+LFASh5WEwwiQ1OQVRh67MeGoh96uEyDiEHTiNtZ8vR3J0IguMcfdMQ+fhPWl0hFBlH6UDpirofj3asUApj5WdNYZcPwZubTzYXSs0bTfC0vfUyXWrLCQWNDEmeXC1VIRJQSpszJyRXZgKM3LrUoRLaekVYeJl00ndqh2OFl5wMPdUW7WDhNfx5I24lEm++6XwaufLcSeUvaum0N/RcVBXDJgxnF3oqFBl1PEIGJuaoP2gLle7dCmfSfjOU8jKrHv9GUG/0IoGM2WgTyIkISkFQ/r1gJODPf7bvpcFwHtf/cIxIHffNAN7Vv3Ex4ecOMtr4mz4BSSnpmPrnoPo3jkQD94+l+NNCBLNrb01/75/WPwPPvn+D/y9diu3tWjvgbgch/L0/cjJzePtmkYLhJw4gzwDrLuTFPYTInbdCDPHjnAesx1ffLdUEYqF+OSTT9h9Rqg5JWWeyYZK+1498OCjj6itpoVEybhx43DTTTepPYIgCBVjEMKkqKgI54JOIDe9arciKpa47su/cGrXURQpg+Oh88Zg+M3jWagkXYhn4ZKekMpuRmUH3TaOthh12yS4+3mhuKQQZ1N34WzaDh4M1RcasJsZWbAwcbZqjayiNE0VeEWYaCwmRlfFmLhZ1S2lIwXCO1pcqfRbWyhr2NHktbiUdVJplSrvkR8H/1vaUMX5qqG/sXVXf/SePAjFymd1ZNMBFOTlI6BvR3Qd0Qv9rhsKR/eri0LmKJ/lmb3HxaWrGbLwo5cwZexQTJr/KJ567RP4t/bG6KH9cMcNU9G7W0fMvPNpDJl2J28veOQOtPJwQ+f2bbHoz9VY+u9/ePHxu3HsVCgCB8+8nK71dGgkHz9ycB8OkH/lw29ZvFTGXTdOZzeurqPm4chJjasiXVOL8k9WXV8RzHR9Oufh/72viCT9qpBdGaWlxUiN/BPh22YgI3YjvEf/Ca9Rv+G9Dz7nCQDNMaViNaklxtWkYTcEpt59O/z1IEUwWUlOnz7NRR4FQRCqw0j50ar/6LuBSYlPwhpFcOSl1DDeQRls+HULQJ8pg7hQYnp8KkI27ufsUm2U/p4TBuC/b/5hC4qFtQWG3jAOAX06sHXkdMp2hKbv0okoIWxNndHFZTyC4//BdW0XYH3kx+jqMg5RWUdRXFqI1ra9cEwRBLRNjPF5GPZ1cOUizmccxPHkDcrfUXc3BBJL3V0mcbpi4kzQca6MX1Sgub/ykCWk87Ae6DaqD+zdHLnCO1mwLK0t2X0u+myUcowxLhwPQ0bi1dnMbD0dMOn+WXByq7ySvVA5Z340Qscph9SW/pGYnMpWjPLxGhcuxcLG2gquzldcTCgOjILara0sYW5mxpm9TE1MWSiUJyUtA3Y21mydqQqKaUlLz4JHLf59kStaVk4O7G1tlXtvysFpKc6s7Vfp55uTdBAZ8duRGb0eJpbOcOr6OJy6PMb7MjIyOA0rxeRpsbCwQGJiIuzs7NQeoSqKlX+PPx3YqbZ0y+FLhiF6dcWhZSvh168XXP2rLgrcnPh2jv5V2RdqT2xsLFq1aoWYmBh4eVVcCFvQPQYhTLav2oxz/9W++Bqlv530wEx4BWrqgZw7cArRZy7Aw98L+/7ewbP1JFL6ThnMM6cXMkJwNHkNB73rita2PeFm1VYRPFsxoc0TWBP5Dvq6z8bRxHWwMXeCl1UHnEjdyKLIqNQYY1s/BFuzusV3pOfHYXfsIhSoqYnrClWjp3t0s/JnV7n9/+7E8a2Hr/GFsXNx4GB5D3+NpYbez6hj4TixIxjx52P53Orod+MI9BraV20JtUHfhYlQHzTCxG/obyguzERRXgIKsi8gLyMUuSlHlO9WLuzaTIV9wHzY+c9Rz9GwYMECfPzxxyhQkw0Q5ubmePLJJ/HOO++oPUJ1LDq4q0EC4EmY9PHRn2KHgm6hz1eESfNAhEnToPf26pysbJzfpcmqU1vInWv1p8uwZ/lWZCano33/zug/fRgiQkK5loZPxzZc6ZxESXJeFE6lbtGpKCFcLNso1yyAnbk7ikvyYW5sxTEnBaXZsDZxRH5x9uUYE1Nj8zoFsGuhFMPGRvUP5s0rzsTpVE29FmMTY/QY0w9eAT68z9zSnN83Kso4/ekbWZSQC93ev7bh12e+wqYfVyM2NLpGooQ4uv7AVQMoQRCuELn7FsSEPI+UC0uRn58IK+9RaDVmGTrcng3vsf9cI0rIWvLRRx/B2NgYLi6ajGjOzs5suaJ+iTWpOfYW1buxCoIgCLpF74XJgU1BKMqp2I2oppzeeRS7/9yCgtx8HN10EDGhF2HjZIfB80bDwsqSB+Ahiat4QK5rnC19+PqUaSs9PwFmJtYwNdJkBaM+iu3Quo2V9XevCyRKSPjoguS8CziWtJZFE6VYHkLvlY0lu2X1uW4wt01MTTieZMtPa3B8WzAHvdeWgrRcHN55QG0JglCWjneXIPDWdPjPOQ2fCavh2ud12PpOgpFJxZkFf/jhBxYh7777LpKSklig0JpiTKif9gs1w8Peod7PZEEQBKF26LUwoRSDlyrIxFVbyH/90qlIbP5pNU7uOKIMtoFRt06Eg5sTD7xDEv5FZmGierRuseWaJemwN3NDWkEcCwcSIuRBRy5bZWNZikuLy7Tqhp3yOroiNucsTqZs4W1nbzcumJifk4d9f29nEbJn2RYcWrUHqbH1K5h4fucpCYIXhAqp3cD4qaee4ufmY49p4k1ImNB3i4rsUT+5cwk1w93WHiYiTARBEBoVvRYmp/cfR16WbqrvkhC4dOoCbaDDoK5wa+OliIASRGQeRnL+RfUo3WJlTEG/RjAzNoe1mSNyFYFCblzk2kU+5DZKH9VL0UL9ZWua1AVLU90WhruYdRRJuZpgzVaBvmjbuz3iI2O5NkzE0TAWffUlLzMXJw9q0rsKgqA7TE1NOauhUHu87en5XP/nmyAIglBz9Db4PT8vDzv+2IjIw1dSfOoCWyc7jL17KqcGJhervbG/I6MwQd2rWzys2mOw13zkF+fAxNgM2YXJKC4pgrUiHiiDVluHATiSuBqxOWfUM4BR3vfVK+3vyeTNOJe+S23pBi/rjujjPlMRWJaIOXcRWxet5XS/uqTdoM4Ydv1YmJmZqT1CdTw3zwjWLn3UltDcyEk+jPeW1e/xbG9vj+joaMnGVUdWnjiMxCzduvhK8HvzRoLfmw8S/N406K0wiYuKwfpv/0FhuqY4mq6gYPcBM0ew7/CRpNWIyGi4rEYdHIejs/MYtXU1lIWLAt8PJfyNpLwr6SN7u81EG7ueaqv2HE1ap4ie/WpLNxgZGaO/+zy0sunElfZ3/LYB5w6cVvfqBks3W0y8dwbcW3moPUJ10L/hJ594VG21dJqfy83Hn3zGlt764OrqirNnz14OhBdqx+n4GOy7EKZTy4kIk+aNCJPmgwiTpkFvhcnZgyexY9EGtaUbLG2tcOMb98DM3AypedHYHvO9uqdh6Oc+Fz6211aZ15JVmIID8cuQXhCr9gDe1l3Q33Oe2qo9QTG/Iz5Pt1YmwsLYBuNaP8pWk9zMbPz56k8oyNNdNi0Kqh9773Xw71Z50TzhakiY6OnXV6gn9LlSfEh9P18fHx8cOHCAf1yF2lOivP+/HNytCBPdxcCJMGneiDBpPogwaRr0NsbkWFCIuqU7BswczqKE4jpOpGxSexsGI+U/iiepCiqqSBXhy5KQF670180nvKS0pMGC+PNLsnEmZQdvW9nZoPekgbytK8gSc2yf7j9zQWjJWFpactC7UDeMFfHfvZUvTBWRKAiCIDQ8evm0pYDq9PO6HWBTBfg2XQN4Oy77HNIKYni7oTAxMld+1EzUVsUUlxQqIulKdWaChEpMVt3qtmQUxHP64YYiOuek8hqaeJx2/TrDztWBt3VF4pkrliNBEOqPtbU1cnJy1JZQF3oowsTYSISJIAhCY6CXT9ug7btRUqQ7n14jYyME9u/EdTjIWhKfG3qNINA1lGGrpBrLR5FyTHmLCXEubRffZ22gtMMx2aeU6zXc35VXlIFLWSf4tSztrNB+QGd2J9IVJXlFOHn0hNoSBKG+2NjYIDtbt4kqWhqmxibo37otW08EQRCEhkUvhUnUfl1n4rKHZ4A3D6KzC1NYmDQ0NHjPLEhSWxWTkBOuHHWtAMsuSkVk5mF2zaopWcprxWafrfB6uoL+psTc84pAyWT/d88AH1jZW6t7dcOpnUfULUEQ6gtl45Jq7/Wnk0creDs4waSFuXQFb9iMfz/+EgdWrcOSV99B0N+rkJWSyvvSE5Owd8Uq/LrgVaz65CskXYzm/k0//oqdS/7Ctl+XYM/yf5Cr/PvbvWwFH7fig89wes8+Po44tXsvX/e7h5/Gyo++QGLUJe7f+ssSbFm0mJffX3wDOxYvQ1FB/QotC4JgGOjdUzYnOwcFSbp1PXD0cIKrrztvx+Sc4WxYjQGlBK6MnMI0RGRWvJ9iT0LTdiM1r+b1VU4kb2qwtMdlSS2IuRzH4unfiotU6pLsqDQJ6BYEHUHpgjMyMtSWUB+Gt+3A1pOWRGZKCuLOR+LM3gNwa+2D49t24uAaTVKanX8sR+jBYHQfPQLZ6RlY9dnXingoQHJMLIuPiGMn4ODuhmNbduLkziAMnjMDds7OLFoyk1OQFp+AXUv/hoWNNfpOHo+U2DgWIkRKTAzCDoWgMD9f+e325tePPH6S9wmC0LzRO2ESdvqczguCtevXCcYmJsqAtwThaVdmaxqaTEUohKVfm7o3vygLO6N/qtKdLK84C7tjf0FCLgXDVzZTVIqCkhzsjvkFcblnud3QlJYWIyJdk2LZxNwUbXq05W1dUVRQhPCzYWpLEIT64ODggPT0dLUl1AdrcwuMCeystloWcxY8hbF33oLWXTvh3IHDyExKQUxoOOxdXVCoiBEbB3sU5uUjNuw8H29maYGb33wJXUcMVX7PNb9fwes3wdreDrOeeQy2zk44H3yU+0fdfD36KMKk1/gxSE9IRNIljeXFxtEBE++7E0PnzeJ2YlTDFEIWBEG/0Dthkn4xBaXFuhtgmyqDZ78e7XibBvmFpY2boeZMylYWGVqyC1NxMOFv5JZUP1goQTH2xi3GkcQ1iM0+c038SFLuBeyN/QOJeZofg8YiLucsCoo172O7vp10G2dSXIyECAmCFwRd4OjoiLS0NLUl1Bdy5xrdAsWJ9hlvambO64yUFF5zf2kpvAID0HviWEVMOHK/o4c7zC0tebvflIkYMG0yLKytcGLHbnbnSrxwkYsoE6bmmmuaWVjwujBX02+tiB2C3IYFQWg56NU3nlx4ijLzderK07pbgPLA0zz4QtP28LoxKUYhUnKvzPSQi1bZgorVQYUYo7KOIDhxJfbFLUFq/pVsYiGJq5CS3/izSCSYLmUd521re1t4tvPmbV1RkCLpTYW6UawIW8rqJ2hwdnZGijqIFHRDgIt7ixMnh9b+hzNB+3E+5Cja9uwOVx9NXZzcrGz4du6IgtxcXDx9FpY2mpjDsmJi08JfcWbfQQyaPQ1D5s7gvuToWAT06sHbB1avR+SxEyxarOxs4RHgz/2CILRM9EqYpKelIyUxWW3phm6jevOaZvgzalHjg+qQmBiZwdTYnBfavrKYwpgXk8sLVUenhc4sC4ksChiPzwnlJTLjcJ0C1AtKchVBE4Gw9CA1KL4UWUWVvVd09/SfcZl7NL18/9q/ifrritadi+g6ope6pQMUTZqdnolcSXHapCxcuBDJybr9LtaUjRs34tixY2qrYh577DG8++67ausKzzzzDL7++mu1JVDF96b6HJszJE4md+oBC1PlmdoCZvSTo2Ow44/l7KLVffRwWFhbs5sVTfpRcPyJHXvQrk/Py1aOsvQcP5pjT/754HPsWb6S3cEC+/WGextfdB46iGNJ/vt+EbtxDZ0381oLiWRDE4QWhV5Vfo+OvIjNC1cjX0cz5uZWFpj/1n3Kw9MMMdmncThxRY3S8JLAaO8wFG3tB8DS1FYZK5eiWDmvqKSQ0wAXlSpr3tas6Zq0Tel/o7NOIjn/gnol3WNn5o7Wdj1YYBxLXqf2Aj42XZX71ggNMyNLmJtYK4uVZm1sBTMTpc9Y3Ta24Id9XPZZnErZUqegeSoeOcr7fliZ2iM/Nx+/L/gGxYW6qY5s7WmPcXdNhUcrT7VHqAhyo2ior6+Hhwe2bNmCrl27qj2Nx+23346BAwfi/vvvV3uu5cKFCzAzM7umovmTTz6Jtm3b4uGHH1Z7DBP6XHVR+f2vv/7C0qVLeS3onpyCfOw8fxbR6amgKvE1wZAqv+/4YxnOBB3AfV9+iJz0DFja2V4jHLJS02BpYwNTczO151qogG56YjJsnRyvOa4gNw+5WVmwc3KCsanhJxeQyu/NB6n83jTo1VRPaX4JinN1M7gl3P29YGyi+RNT86NZRNQEF/PW6Og0gkUJQbYHU2UwT20bM2c4mHvA2dIHblb+8LRpDx+7rmhj3wsBDgOUdgc+x9LEDh5Wyj6bbmhj1wcB9gPRwXEEOjuPRXeXyejoOJKPqy0UUH8yZdNVosTUyAp93WcryyxeerhNRifnkXw/vrbd4GHdDs4WPrBV7p3EClt3lP+8bDqiveNQ9Sq1g97L1DxNakcT5cfEuZUrb+uC/Mxc5GddW99FqDk7d+7EXXfdhRtvvBHPP/888vPz8eyzz8LX1xd9+vTBypUr+biwsDDMmjWLhQjtj46OxnPPPYeEhARMnz4dSUlJWLFiBQYNGsTH0PW0dTGmTZuG48c1Ln1nzpzBddddx9vXX3893nzzTQQEBFR6PrkXUd+CBQu4v3///jh79iyWL1/Ox7/yyivYvHkzX68iaKBNlhVy23r99df5tUaNGoWQkBD1CIFwc3NDYqJui9UKV6CA+Ikdu2OwX6DybDVVfieab9YusoZUFO9Rkdgoj5FynqOHW4XHmVtZwsHNtVmIEkEQ6o9eCZPC3AIUKYuuYGGiPBApTiO/OIstHzWhi8sYdn2qC3ZmLrx2tvRFP4/ZyjIHvd2mobvrJEWUjFbEyTAWDJ2cR8HO1I2PrYw2tn0ws+2rVy1T/V7AdX7/w5Q2C9DbdTofZ2vmyGKjLviS9QVV/6hUBFmISOwRJP48/K+eua4PJFBLC3QnUFsiVLvip59+QqdOnfDII4/gn3/+wa5du7Bp0yY8/vjjmDlzJs6fP8/uUD169MC5c+dgYmKCr776ikWBu7s7fvvtN043O3v2bBYaJGJIVCxatIhf4+TJk5eriufm5uL06dO8TcctWbIE33zzDRf4q+j8wsJC7Nu3j60ewcHB8PT0xA8//MBiaNKkSSySRowYwderiKioKMTFxfHfRPdMfyuds337dvUIgSDRR++T0LBQnZP5fQaheytfFiemFQzgDZFuI4djykP3qi1BEISGR6+enrqsUExuLg4uyoDd2IjrlmQX1iwzjb0ZWUNaq63aY6sKE0oFXFxN5Xd/h/7q1rWYGJkr+/sqW+Rfe2Wh2BByxTI3sYSZiZXSB1ibOvO6rvR20wQk1gYSeZSqmFIwk/hz8tL83bqgpKgYUkyr/rRv3x4vv/wyvL292Z3Hz88PO3bsYDHh4+ODoKAgdO7cmWMyPv30U7Z4vPHGG7C21gSwkigxNzdnEUAm7U8++YQtEmTWro7XXnsN48ePh5WVVZXn/+9//+P7I6sNCSV6PTqHBA2JlupYv349brnlFhYxJGimTJmi7hEIcj8QYdI4kCAhF63b+g3FwDbt4GZrp/ZT/KFhxkk4t/KET6f2aksQBKHh0SthEnup+gFPTTGzNIe5jZp+sDgXuUU1y+Uf4DhA3aob1maagoMUd1JSUrUwsTd3U6RGxR8BuYtZmmhcyarDxlSTorGueNt25terLblFmRyUT1AqSHLp0hXJSZJJqL6Q+NASEREBS0tLzlpFC7lQkaWEgsjJMkIWFhIHL774onqGhtTUVHTp0gV79uzh2A1yl6qI8gHWNFNPVHc+3RNB1pq6QCKH3JW0UKVz4QpUx4Tc3aT6e+NhrIgQsqDM6NoH83sPwtC2HdDJvRVcrG3Z3UsQBEGoHL0SJhnJusu3b2lrCWs7G94uKMlDbnH11Y/J2uFs4au26gZl7CLLBtUcKUbVwoSOJQtIRVibOSr7NMKqMrQWGTq2PpAbGAX61xaqz1KovLeEpZ0VLGw0g0xdkBTf8FXsWxLz58/nwf+9997LrlXk/lRQUMAWBhIHH374IVtOKG5DC+3fv19TIJT2kXChWBItlPHpyJEjvP3vv//yujxVnV8ZNLtMMTE1YcaMGRwvQwKILANr165V9whayCJ16ZImHkxoXCgGJdDVA0P8AzGre1/c2k8T01dYXCxLM10EQagfepWV69d3vkfeJd3M7Lm29sDYu6bC3tUBCbnnsSf2F3VPZRjB364Px4LUNb5Ey6aoL7h+ySCPm+BgUXlmqZS8iwiK/R2FpdcGere264keLlMqFS4EpR4OSVqFgZ43w8s6UO2tGxkFCTgQv5yD62sKBfgP8pwPRwsvpMQkYctPa5Aaq5vUpE4dPTD3kZvVllARVWXlogH6xx9/zJm1CLIsPPjgg9i7dy8HtlOcCblWURD5nXfeicDAQC7ER30U1E5CZvXq1Rw3Qm3aR0JlwoQJWLZsGbtkUYA9nUvxKBRQT8Hr4eHhvP3ZZ59h6NChLDAGDx58zfkU60KZt7T3//vvv3PQOy0Ua0ICat26deyeVRFk6aFsKZR9a+zYsRyvQtYSss7cfPPNeOihh9QjDRN6X3SRlYsYN24cp1Em1zqhaaFE7wvWLkN6rqRDb644Wlnj3Snz1JZgyEhWrqZBr4TJole/QUGibh7Yrdr7Ytw902BhbYno7FPKoPtPdU/FkADo4zYbrWw6qj0VQ0Ua84s0sTBkqWhbQZzIfuW1qGZJf/e5l7N0VUR4+j4cT95QYVC+l3Un9Habzlm0KuNc2m7O0DXG52F2CysLuVgl5IRz/ZaS0iK4WvmxgKgMShBA93I+46DSqtk/CROYYojXrXCxaoPs1ExsWrhaZ1XbrXztccvz96gtoSJImJAAqA3p6ek84C3r8kSB69RPAkObdYceC9SvjTehLFpURZz2U4wKWVloW2vZsFCrNldGZedXBr12RkZGhVXLbW1t2QqghVyV6PramJjmAokvXTyeKTsbZUC7++671R6hqaBP84G/FuE9Gbg2S+jzfV4RnpIuuHkgwqRp0Cth8sOzn6I0Wzem0DbdAjDu3mk8+AlPP4BjyVW7eNiYOGFs60eqLTp4XrnWUTVVL8VlDPO6g2uElOVUyjacTdvONUNMjK8O4DWBZuBUSpnCSrMrratiamTOQenetl1YuNBxRcV5KCjNV7bzWBxRymByUbvObwHMjK++hzhFGIUk/ssCxUy51mCvWxRhUnXmrLT8WOyM+bHaoP2yDPW6DW5WbVGQm49NP65C9JkodU/9sPSwwa0vV17HQtAIE7JONFfo0VTR44n+blqaO4cPH9aJMKGEBmStorXQtGiFiQxcmyfy+TYvRJg0DXolTH5b8C1yM3STmcuvRzuMv1eTTvdM6k6cTtW4tFRGL9cZ8LOvvoI5uTztj1vKVdepYCGJB69yVpGLWSdxKGEZHM1bwcM6kFPrktWC3mrNdrGylCCtIBo5RZXH1RiTTcLYQhmEGSvbmsrymhokVNHdGJkFSSxapirCpGw8CvWdVsTRubSdvE21VHq6TdUUVqyGPTG/IiEvXG1Vj1aYlBQXY+P3qxB14ry6p57YmeLedx9TG0JFVOXKJRg29LnSpIouPl9KbrBhwwYsXrxY7RGaChm4Nm/k821eiDBpGvQq+L2hUsSWlFZdG8XK1AG+dt3UVtVQgUVtOmGNu1QYi42y2Jtrig362Hbl2iXdXCagh+sURRxchz7uM7m2yQDPeYoYmsZxGhVhamSBQMch7M5FRRP7eczFQI8bOKaD3KeGet3BwfpkWVGGqJqTVAqKc5Caf4lFCVmAqLhiTUQJ0d1tMgui2mJsYnK5mKUuKCkmb2xBEOoLFZ+kVMyCIAiCoO/olTApbaDBaHFp1e5hVJVdk02reug4BwsP1eWrFBezjiGz4OrUtuTCRVB8R1U4WfrApZKaKV7WHbgqO1Vnd7cK4OMcLLxgZ+YKa0VIWZhYw1R5HQsT22vcWsglKykvkrfJxcvJ8oo/fnXQ9VvZdFZbTYeNWeWxNYIg1BwSJlTcUhAEQRD0Hb0SJg1FVaLD3NgGHtYBaqtmOJh7Xr4mZdTaH7cE2UWpoGKDBLlqmRhZXE6lWxlkxbAw0aQ0vhojtsxUly64SBE+mvOvCJO8okyEJK7ieyDIomKjFn2sKX72fZX7r301eF1iVM4KJAhC3aCaMpQgICkpSe0RBEEQBP1Er4SJLl2BylJVQLuHdTtYm2qKItYUypRVtjBiTnEqdkf/jFOpW3AubRdOp25TREpxlamCq4LiR8oHs1eElZkDCoqzcTHzKOJzwhCRfgh7Yn9DbvGVYpIUk1KdwCkPZfhytfRTW01DdqGk0xQEXdG+fXtO5ywIgiAI+oxeCRMT0/rVD6kMM9W1qjyUItjdqi2va0NJSTEHuZUlRxEDmvS9m9m9y83KH57W7dW9FUMxICWc2f5qtEHy1eFr251FyLHk9TicuALHU9YjozBe3auBrlVSUrvYHbLCeNq0VwRSzT8PmpEtLdFdILZRA4lUQWiJdOrUiWvSCIKuoWd/UVHNMzkKgiBUhV6N/gqNdFc1lQbk2ow2lia2vC6PlYk9x3DUluyiFFCWrfJQ1fjhXndhit9zHOBOVo9iRRRQ+l1yrdK4el0ZvFMMCrlelYfkSlFp9ZWvfe26Y7DnrWjvMBSuFn5XWXG0FJcWIKuw9kUPfW26K+9bRW5mVzCGqfKaGmtUcUERinX442Ru2XzqUQhCU0PC5NSpU2pLEGoP1dV599131dYVVq1ahXnzpC6LIAi6Qa+ESakOwxoow1dhviYbV2VFClvZdK2Ry1RZSGAk511ksVEWEgUZBfFsudgdswh74/7AwfjlCE78F8eS1uNUymacTduFsPR9XMSQltC03Vz9vSLS8+NZUFD9krziLGQq26l50VzFPjrrFC5kBCMi4xDSC+L4eDPlbzQ30RTDKwtlDqNAeLLO1AaqzdLW/trikWWh99VUrdNC73Vhvu6yqhmb1z4zmCAIFdO1a1ecOHFCbQlC7XnyySdx6623qi1BEISGQa+EibGF7ly5CvMKUZCjsTrQrH75AHia7W/nMFBt1RwSC5QiuKzlo5PTaE7hO8DzBnRzncQDenIRszK1R1FpIdLyYxCVeQynU7dydfWjSWt4CU3fowiHimMpkvIicCB+GYLifsc+ReQciF+KgwnLcTjhbwQnrcSRpNXKNdbibOp2xOWGsoBpbdsTvV2nwc2yrXoVjZCiyvd5RRlqT83xV/4OC+OK0xkT5PKljV+hAotaIagLqGK/IAi6QYSJ/rNy5Uqu0j958mT4+vriww8/5MKYxM8//4wOHTpwhrW33nqL3acyMjLQv39/Lpw5fPhw5Ofn44EHHuBkB/Pnz8ehQ4f43DNnzvB+e3t7rv6vdembNWsWXnnllcvXpdevir/++gsbN27k7X/++Qc9evTgZcmSJdwnCIKgC/RKmNg6Vj4Iri35uXnIz9FkxTIzoexXdmzVIIFCMSXtHAZXakmpDBrkn0nZzsUVtThZ+CgD+D4cU0JpfSnNr5/S7ug0kosaDvK8EaN87sNkv2cws+1rmNH2VUxu86wiIGbCqIqgfLLIkDWERE12YaoioyyU1whAB8cRGOgxH5OUa8yka/k9h5He96Cfx2x0ch6FNsprU80Ua1NH9UrgmiahqUHK/dcuHTO9T4M95yPQYRgczDy5TXEn2oxZ5CKntTjlZeddFoK6wNL+WuuPIAh1gwa6xcXFXChM0E8SExPx008/4fnnn8e+ffu4MOaWLVtw8eJFdqOifdqFimXS53nw4EEWnF988QWWL1+Oc+fOcc2aGTNm4PHHH+fr0vVIwJw8eRKOjo546qmnuJ/adP62bdvYEkIipSqioqIQFxeH7OxsFjVPP/00Fi1aJIJXEASdol/CxEmHwiQrDzkZGmsEFTH0s+vFhQ6Ht7obU9o8hy4uY3hfTaEq64cTViI656Tao0FTvLDmAocG9WRpaGPfE/52fdTeirEzdcNY30c4ZmWEz93opQidtg79FYHSpkpRRQUjXS391ZaG8Mx9bKWpbbyJo6UXurqMxWjfB/h9G+J5CwIdh7EAc7RodVmY5GblKOKk6rottcHVQ1OkUhAE3dCzZ0+EhISoLUEfmTBB+Y0aPhze3t6499572YpBS2BgIAsAsn6QhWPHjh3qGcCnn37KlgvKvLZ161YWIpaWlmzdIKvKv//+i5deeonF6dtvv43169ezwCBIXFBla7KwHDt2jPuqY/v27ejevTtuueUW9OrVC3feeae6RxAEof7olTDx8tZdyX+2mKgDZRICHZxGIMBhoDKY9qpVtikisyCRXacuZR9Xe65gYWpTZTriqiABURXkDkbFFGsLxX1YKvdVnguZwRzzklmQoPbUDnrfXK380MV5DPq6z2GXNe3fTq5cRQW6C3539/BQt4S6sHnzZp4FpaBUcuGYM2cOz3QS5PpBgxtatLOkKSkpPLihQQ25glx//fX46quveDDTpUsXBAcH83E0407XomPGjx8vmZ4MiN69e1/+HAX9xMHhyvM+JyeHrShkMbGysmILCS3XXXcdfwe1uLm58ZqsIvT5enp64tVXX8XIkSORkKB51tvYaH4P6HxCW5RX229sXPOhQHx8PLy8rvxW29npbkJREARBr4SJg9MV96P6QqlrczKyL2fmqjul2Bf/p1pJvYJr1eP61Z1pbFz3mBujUhIMVxcppAD45LwL2BWzCEXF9XO7IrcuS1PND1JpSQnS41N5WxfQj6aZedMWeDR0aKaUXEFoVjMoKAj79+/n2VRyEfn++++xbt06nvn85JNPcPToURQWFvKMKfmuk2sHnfPLL7+wwBkxYgS7ihAkamggtHfvXh7okjihcwT9p0+fPjh8+LDaEvQR+k6mpqYiKysLK1aswB133MFuU9R38803c5u+e+Hh4eoZV3jzzTexadMmvPDCC1i7di27aTk7O6Nz585sNSEoHmTgwIE8sVBXJk2ahP/++w9hYWHIzc3l+xQEQdAVeiVMjM1MYGKuuwD4+IgYlBTXfdBEsR1bLn6LrMJEtUdTRZ7jSuz6cTsyMwSXsk7wsRSAXhuqs1zkVpBKuDpIiKXlxyKlIIpa7NJV3kqUX5KNjRc/R1qebvzN6T1OiNSd77qxpQmMLSQrV30ZMmQIpk6dyoHPY8aMYR9xmlWlQQuJFHIByczM5BlQLY8++igPZMh6ctttt7FVZdSoUXwuiRfybadBDQ2AyJpy6dIlXLhwQT1b0Gf69u3Lg1VBfzE3N0fHjh3ZvcrFxQVTpkzh7+zYsWPZnYu+exEREVdlx9JaP+bOncsTCPSdpe8+WUNJmLz22muXrZwUXF82lkR7rnZdHXQcWUvoOaG9Hwq6F4TmCP1bpzFVWQuh0PDolTAxsTSFsZXuhElceDTP5tcFqi9yImUjMgo1vrimRmbwsemO3m4z0d9jHvzse3N/TlEqQhJX4VDC35wq+HDiPzidsp1T+lJcSmVpegtL8rlae1Uk5UaoW5VDNU8obuRS5gmcSN7Ir09Lonqur20P9HOfh77Kfbex63U5Hia/JAtHktawm1p9KSkpReKFqws71gczGwuYWUsdk/pCLlxaTExM+AFLvulDhw5FbGwsz5ySCCmLj4+PugUeGJWFrDAkZCwsLNglhAYp5O5V1v1E0F/8/PzYZYeCowX9hCYBSOhTlf41a9bw50XLZ599xn1k3dy9eze7Tzk5OfF3mr7bBAkSEi2UPYviUcidiyBRQt/bnTt3Ii8vDxMnTuR+uh6JHsLf35+vlZSUxFbS8gudS/fw3HPP8fG0TZMS9HpkYRWriWDIaN0kBf1Ar4SJlZ0NbBwrLoZYF3IzcpCdnqW2ag6JiaisY4jN1vjP+9n1wWifB9HHfQZ8bLty3EdavkawtLLuhGGtblcG/b2VN9MUcdnncDZtBw4l/o3t0d9hbeS72Bz1BY4krlbEyknkFmciWxEzO6MXoqBE4/NfGXklmQhP26e2NNC9ZRYmISxtL9dLWRf5AbZd+haHk1YgLGMfsgtT4GXVga06BNVJsTVzhrdy3z1dp2Kc78Po6jxeuVMzpBbEcKX6+pJ0MU6nNUwcXJxg63BlUC3oDrJ0kBXl5Zdf5sDV2hTdI6FCwbnkw/7ggw9yMPVHH3102U9d0H9IjJI7n6C/UOB6RTO0lFGLBERVmJqaolu3bhyTUhZbW1sWLjSpUBWUnjg5OfmahWLQykMB+uUnLwTBEHn44YfZFVJX0OQCZckT6oaexZg4wNnVWW3phlM7ap+FhqwlZM1o7zgC1/ktQC+3abBRBvdlg9zTCuJgbmyF1nY9OTsVWVCo2jtl0Jrq/yKGed2Ozs5j4GnVHhamtkjNj2YLzH8XPsbGqE+RUVgzC8OJ1I1sjTmWtAE7on/E6oi3FFHzIyIzD6MExXCzaqu8zliMbHUvpvm9gBHed6OzyxhFhEzhbGTpivjQQvdvYWKLQMchuK7tC+jvfr3Sa4TE3PrNoJ7YrttMP47OjrCzl4DK+lI2oJWsG7RQ9h2aAaWA9unTp7NIeeaZZ9SjrlA+GFY7K0uC5ssvv2QXDnIXoYd5dYMdQX8YNGgQxw8J+gfVL3n22WfVVtNALmSU+KL8QumHBUGoGRSvSYlkhLphVEr2Wz1i11+bcXr7UTIN6ARLG0vMf+f+ywOrmpBTlK4oNuPLwd0VsSN6IfKKMzHQ80Y4mFcdSFhaWoL84my+7sWso4jIOMiWj9pgZmTBNUrI+mFpYs9razNHmBhVHCReUlqELZe+VrZKMcr7Qc7UVRF0b2TBsTWr28wXZeP6bcG3KC7UUUYuI6DrhD4YPHWk2iFUBgkNbdrP2lBUVMRxJTTjSVBgLbmF1AZy4XB3dxdrSQNClildP54pCcJ9992HI0eOqD1CY0Kf5gN/LcK3c27XdAjNCvl89RtKAkFWfnJjpMQt7777Lv8OUmFSsgzS7yk9G2nCjibg6HeRMk+ShwAlDqH4L0oYQ5NyNMFD569atYqvvWfPHt73wQcfcEwYuczOnj2bXSuF2qF3wuTw7gMIXrYHpfUIWi/PpIdmwbdz1Sbw2rIh6iN+ClG8ibOlr9pbPXE5odgfv5SFQ23o4jwO7RwGXWW1qY7NF7/ggPzBXrfA3txd7dUtoQdOYdsv69VW/TE2Ncag28eiS69uao9QGSRMxFrRfKGg4oZ4PFNMEGVU0qaZFRoPGbg2b+Tz1V/ITZEStpDVf8CAAfjf//7HngMkJkiYfPvtt3j99dfZXZKKkFI2PEoQ065dO3aPpOMpGx3FV9Hzk4QK1RqidN4EJZWhpBDHjx/nY+hcqhlE2SuF2qFXrlyEf6d2MDGt+eC7Jpzdd5LTB+sSKxN7toJcyDzC1dlzizK4Wnt15BSm1VqUEPRaNRElZAGhe4nKPMrnkAmiuER38R9loWxcYQd1W8fC1MwMHbp1UltCdVAwqyzNb6E0rA0FFfArW6BPEAShuUMpuL/55hs89NBDaNOmDcdclc1SSPF3VIiU0nJT5jrKQEmJHSjJw59//slJYyhdPrFlyxZeV4S1tTVnwqS4LhEldUPvhImzizPM7TXVxHVFSnQi0hKuDd6rD73dZrAVw9jIGMeS/sPB+L9xPHkDQtOCkJQbicKSPPXIq4nJrnmwcVkuZR1HVe5fFBAfkXGI41gOJ6xQhMkRzsLVxXksHCw81aN0S/KlBOV91V39EsLKw5YDOAVBaBio8B7VyxAEQWgpkNtxSEgIZ6skN+SVK1eqezSQ+5UWSpdPmezIZZkyV5YtItq9e/erUuxrIRdpQTfonTAh3HtcSVmqCzIS0xAXdklt6QY7cze0cxyEri4T0N9jDnq6TYGzhS+S8i4oImU5tkd/j/1xS3Ep8zgKi/MUSVGCc6l7kJxft5oPFM9yMfOY2tJAQfqhabux7eK3CIr9jcWIlakTeij30tdjNgfF+9p1r5X7V00hF5PY89HISslQe3RD636B6pYgCA0BpaSlOjaCIAgtBSoqTMlayApCImLBggXqHg2UKltLaGgohg0bxq5e5KqlTSVM4x4KbNem2Sb3MC1U60vQDXopTIZNHMVB0LqCXI4iQkJRkKf7QlBUcJGC5CmGo7VdDwzyvBGjfO6Hk4U3YnJO42DiX1hz4R2sPP8aTqZuRElp3XNlByeuRHDCSpxO2YYtUV9gfdSHOJO6A57WHTDc+27OyNXOYQDszNxgaWLbIIJES0FOPsIPntGpixzFlwwcMVhtCYLQEJB7AdWkIT9pQRCEloDW+kHWEAp0X7hw4VW1S8h1i56JlOr3xx9/5Cx5lMWQoDaJmQ0bNnCbhAkFzSckJHCNHxI1FKOihbJakuuYWFHqhl4KE8rBbu2l23SxMeeikBARq7Z0D8V2ZBQkICL9IA4rAoJcr3QNWV0uZIXgTNp2ZBRp1H1RaQGnHk7KOc+xJY3FpTORSLxQ+4xQVeHY1p0DugVBaFjGjRuHjRs3qi1BEITmzQ033MDxe87OzhzQTlm5qKbT999/z/sp41ZgYCAXoiU3rttuuw1mZmZ45513cP/99/N5JFYoqJ3czUnk0HN0xIgRaNu2LZ+rhWqEEWRxEWqP3mXl0hK8/QAOLd+ltnSDg7sT5r18h04Gv2T5oLiO9Pw4pORFIa0gFgXFOcgtzrjKKkLuXUbKf8n5DWvmMzUyh5WpA9cucbXyY4uNvbmH0qdbgUcUFxVjyUs/ICej6gKRtWXE7RPRoZ98kWsK/TvW06+vUE/oc6VZt4b6fJcuXYolS5Zw+kyh8aBPs7qsTXVJ3y3oBzX5fIWmg56n4eHhLD5IXKSnp8PcXBk7qQVJSbhQymAKji87TkxLS+MgeBIgFNxeFjqeRAtdpyxkLaEkJmXjU4SaobfCJC4yBuu++gtFObrNKDVk3mh0GaFRsxVRXFqIzPxEXMgM4X/ExShU+pT/l+SioIiERzoKlG2yXpSH3LpMjc1haewAf4d+XCXe1MgMJ1I2ISxdt0XN3CzbsqWksCS/Blm+jGFhbAUzY0vl/ixgrNynlhLl7zVWRE0Pt8mwM3Plv6Eq6D05vC4Iwet0Wz3azMESk+6fCc/WrdQeoTpEmDRf6HNtSGFCP7QUAEruBuV/UIWGo6qBK33WkyZNwsmTJ1k4Uu2Eo0ePqnurhs6JjIzElClT1B6hKRBhIgj1Ry9duQhbF3u4+XupLd1xYkcI0ivIJEWuWIm5EQhOXIVtMd/hfOYBRGQdRFTWEURnH0dCbhjSCmOQX5J9jSgxNbJAW/v+6O4yBaO878do3/vhb99HEQIW/KAqLrkSIKUrXC39+bW6u0zi1/ax7QY3qwA4mnuz9eRqSvi+s4qSkVYQg5T8qMsLWXpS8i9gV8xPOJa0Dgk54VXGwVCGs9D9uk0RTLQK8IGjm8wSCkJj4OjoyNm5KCBU0A/IX53qJJDIoMw/5PNeUyjt6a+//qq2BEEQDBf9FSZ2tnBr6wUjE93GHGQmpSsD65PsjqSFslsdTljJaXYvZV2d+aomuFr6obvrZPjZ92Z3qqspZauGrqEaJVam9ooA6oserlPQ23U6+rrPQn+PuXC3qn1mqyLlHiMzD+Nw4gocUt6H9PwK0uEVFuHs3pPIStVtLIuRiTFc2nrCUjWnCo0HBf+VlFxr/aM+Cdxr3lx33XVYvXq12hKamltuuYXXc+bM4arR77//Prevv/56ziYUEBDAQbZUuZpqMFA9GqoqTQG7zz33HBdzI3/4ynjvvffw7LPPckCvh4cH12rQQvUZ6Jq0aPs3b97Mrz1v3rzLxz/55JO8PXHiRHY5I/bv33/5mnfccQdb4wShORAbG8ueCbQWGg+9FSZEuz4dYG6l28rWlKHr+LZgZJSxmpBrU2z2aY4PqQseNu04jqRiGkiYlGSqWxpMjM04E5eNmRNcrVqrvbUnrzgL0dknsO3St4hMP6z2akiNScSp3Ud0XqzS0tYKnQdIpfem4JlnnsHXX3+ttq6watUqHpAIzZepU6fy5yzoB1988QWvly9fzi52WjcuEh4UD0TF4aKjo/H0008jKCgIX331FZ544gmuz0DVrEePHo3HHnuMz6mImJgYvg4F+y5atIirXKekpFwOACbrGdW3oUrY9NqUuW3ZsmWYO3cu/vjjDz4+Ozubj09MTLwsam+66SbcddddfC71U9VsQRCEuqLXwsTVzQ0u7XVfHLAwvxA7l2xCfo6murK5iRUGes3nwPHaY8QB7pVBQ3iKSdE1eUVZ6ta12Jm7q1t1x97CXRFc7dUWkJOWhe2/bkBJ0bWz6/XFq1ebawLKBEFoWPz9/XmGXJsCU2haqPAb4eBQ3uoOvPbaa5xFiD4zig265557uFjcoUOH4OXlxeLEwsKi2ufo3XffjW7dunEsC12HajRQ6tO1a9dybRvKOEQZibQF5CjYl4TJmDFjuE1Vs+keqEo2BQPTPZB1hyyvlDaVrDqS7U0QhPqg18KEGDx9FEzMdV8JPP58DPb9s5MtKISrZWu0dxzKweG1wVwNKq+cUhRVUgW+PuRVkRqY7seoHh8tuaN1dRkPS1NbbpMLV9Bf25Aap9vq+YSxpQkGThymtgRdUpF7Brlo0cwnDSCo0B4NLLT8888/nOOdFppZJWjWlAYudC1yHSF+/vlnviZd46233rrsClbexYSg2d5Zs2axmwe5kdCMr6A/zJw5EytWrFBbgr5C3x+CxEtwcDALBbJmeHp6cmxKTSEBUxb67u7YsQNDhw5ldxUSHJQGVQt9n8tC2YfKQt9nyjpEwoQWOp5ElCAIQl3Re2Hi7OoMt+7eaku3hB08gzN7NDElRkbGCHAYAF/r2rkU2Zq5ciauyqBMKxQPomuqqllCmbUsTK7+AaoNnZ3GwN0q4LJ72sntIYg81jDF2NoO68zxRIJuqcw9Y9euXewC8tNPP7FQoH0EuWiQgCA3EXLzOHHiBPfTYIMCa6lNriY0w0ruInS+dqEgXdpf3sWEBkzvvvsuC51z587BxMSE9wn6w+zZs/H333+rLUHfobiPRx55BPfddx/WrFmD9u3b8/eTyM+vm8vwpk2b2K2P3MGo/sKpU6fUPdWjtaTQ+oEHHuBK2HQ9QRCEuqL3woQYMn4EzG10G2tCFBcW4djWw4gL087iGqGH2xS0tumlvDE1q5puZ+6iCAEztVUxhQ1gMSkxKkYpO4pdC92PuXHtXaPonO4uk7mCvZaLpyI4JkdrWdIllk426Dmwj9oSdEll7hkUIEtBtlQUitw5tOlFSaBQJiDaR4OTO++8k/u10DVIYKxcuZILSZEQOXPmDM+Q0oxr69atr3ExoTbNvlIMC51PwdZkeRH0B8rnT5+3WE30G21NBfrekuAnywUVbyOr5YQJE/gzpO/6q6++ysdVRtnaDJQmmlJSz58/nwUPXW/69OksUij2jKD9lUHXovoP9N0eO3YsW28o+P5///ufeoQgCELtMQhhYufqgDY9A696qOqKjMQ07Fm+BZlJmkwiZDnp6T4F/vb9r6r3URnk9kSB55VBqYUrqnmiCyibWEWQG1d19UjKQ6Kko9NItHXop/YAyZcSsfevbchJrzyepc4oH6VfjwDYu1zrTy3Un8rcMygA1s3NjbcJbfEnEi3kq66lfFEo7TlkMaHBiNZ1g8QGZRGqzMWErCu//fYbCyOyyLz44ot8HUF/oMxLf/75p9oSmgr6/mnr1gwZMuRy8Pvhw4f5u0xQJerdu3dzH33HySJKheJo0oACz++9914WGeUXiv/47LPPrgpMp+8ynUeChFyyKNaIXpMSImzbto2/r2SV0UL35uPjw9tk+VywYAFv0yQGxZnQa9B1KIZFEAShrhiEMDG3MIdPL3+YWjdMITAagK/96u/LlczJ4tDVZSza2FZeiFELCYDKM3IBmYW6j8vQQrVVKqIERbUOuCf3LRIl2tiUDEWo/fftP0iLv7bmiy6wtLdGQP9OMDXTffyQULl7xowZM9jqQak+qWItWVUIsp5QDQWKCaFqtZXNoNNghc69+eabOTXo3r17uZIuDX4qcjEhi4ylpSU+/PBDtpxIYKz+QcKE3LmSk5PVHkHfIaulq6ur2tJAwe8EfY7lF8q+VRUkbnx9ryRxKR9LUh0kmMh6StcRBEGoDwYhTIjATu3h06WN2tI9GQlp2PH7f8hK0cRukLWkp9sUBDoMq9ItKqcwnavFV0Zslu6LEWqJyjxaYfxKSt5F5BTVTBDZmDphoMeN8Hfoe1mUpCemYscfG5GVWrFFRhf49vSHdxvN7JugeypzzyC3D4IGHiQeaD9ZImm29tFHH+UBDwXalvdX11oryUWM3Da0x0VERODWW2+t1MWEsgCRVaVPnz4c01K2doKgH5C1i1K+1qagn6CftGrVioVm+YUmJARBEAwBo1Kt7dgASE9Nw4r3f0dhhu7rghA0+PLp7IcRN0+Atf2V4PGLWcdxJmUbV04vj7WJI4a2up3rh5SnoDgXWy59ybVBGgKy1vjadkcnp1GwNLVHblEmF4gMTQ9SBEv1r+li0RpdXcbB2fJK3RMqQLlj8X+ICb2oyXXcAFi42mDus7fAulyGGKF20L/Xqr6+VCCRXLm0M6E0a0rCgTLxkKAgMVI+vSi5YpCFw8XFRe2pGCqiRpYTSh1altDQUDg5OV01m0uZvSi1aMeOHav0WReuQJ8rvVeN9Xgma9lLL72EAwcOqD1CQ0Cf5gN/LcK3c27XdAjNCvl8mxf0+0lin1ygy7o6Cw2LQQkTIuzoGWz7YV2D/mDbuzlg8sNzYO/qyG0KMs8uTMW+uMXILEzivrK4WbTFYO9bYFzGAFVUUoDgxH+5WGFDQlYOqsNibGSCktISFJbkKusrVe0rw9umG3q5TYaZMVVb18yGp0QnYsM3/zSopcTY1AQTH54Fn8C6F4EUNJAwCWzbStmi70JZd8KK2oS2r7K2oE+Eno9tNGFCUBzSDz/8wPENQsNAn6YMXJsv8vk2L0SYNA0GJ0xys3Ow8dc1iD/ZcDP6hIu3GwbPGw2vdle7G51I3oiorCPXuFBZmThwHRRbMxe2rERmBCO9IFbdqy8YwdrUER0dR6KNfU+1T8Ol05EIWr4NafFXu4BZO9ggNyNHNwMkZSDt2zcAo2+YAAvLqmq/CDXh6O7f1K2WQa/htyFk5y9qq2XQY+gt6lbD895773GMEYkToWGQgWvzRj7f5oUIk6bB4IQJcTH0Arb/vB656bqvD1IWezdHdB/TBx0Hd4exicYaQtaIxNwIRGQcRFzOmYbURjrF1MgMre16K0tPOFp4KRJFM1tOKZNP7TqKY1sPITv1ivuXuaU5fLv6898evGEfYnXg2mXrYo9Rd06Gl1/D1KURmi+UAYxczAoLK4/nEuoHxQjRjy9ld6pt8LNQM2Tg2ryRz7d5IcKkaTBIh2/vAF/4DmyntnSDpa0Vuo/tC5MyWaIolfC+v3dg19JNyMvWZLkilykP63bo4zYD/T1ugI1Z1b74TY8RXCzaYIjXbRxP4mTR6rIooSxk23//D/v/3XWVKKFMWX2mDEanId1hYW2JodePga3z1elj60Lg2G7wbEOuR4JQO6hwG9VdEBoOqjtz22234ccff1R7BEEQBKFxMUhhQkGhI6eNhXM7Dxp36wRbJ3sMnDECg2aOUETKlYDgosIinA06wbEXyTGJKC7SxG+YmVihlU0njPa+Hx0dR7OLVE3qnjQWVI3e1swNfd1mYZj3HXC29OU0yARZSZIuJmDdF38h/NAZlKh/kxZbZ3t4BHhj66L1WPnBYpzaeRSura7Uvqg1ymfk0d0X/YYPvJzdSRBqA2UJ06ZDFRoOKpAprlyCIAhCU2HQKXLG3T4VDt71t1g4uDth5C0TOFuRaxsPjLv7Oni2875qEJ0QEYtVHy5B8Pq9SEu4EodBAqCT8wiMaHUPurpMgJd1R5gaNd3MrqWJPVrb9kRPl6kY5XMvfO26X7aQoLQUqTFJOLh6N/798A+kKNsVUVxUhFLlvQjs34mD1U/uCEHk8fPq3trj4ueB8fOvU1uCUHtycnKuySAm6J5BgwahTZs2WLJkidojCIIgCI2HQQsTe0d7dBvXB2Y2dZ9JtbCxxOC5o+Ds7YaokxHYumgdYsOjMeq2yZw6uCyF+YU4uukg/vtmJU5sD74qINzS1BYB9v3R220GhrW6A12dxsHa5NoUwg2Fk4Uvv/YQr1vQw3UKC5KyAolEV8imA/jvu5U4vi3ksuWnIrLTshCnvAe9Jw3C1MfmYcwdk9H3uiHoNLQ7XH3dL8fb1AQLByt0n9gPljaU/UsQ6gZVji9fjV5oGB544AEuhikIgiAIjY1BCxOyaHTu2w1tB3ask4sQDbC7jekLn45+XFhx/8odHFcSey6K3ZtyM3PUI69QUlyC9IRUzmD15+s/4eKpSBTkFah7wal7HS1aIdBpKCa0eRwTfJ9AB4fhsDNzg4WJDUyNLThOpW4YsbuYmbGlci1bOJn7oLvLZEz1ewEjve9GG7tesDd3ZysOowingtx8RB4Nw9JXfsTBf3cjIymdrSFVQX/j4bVBSIiMgZOXCwL6dlJEykAMu3EcZj1/C25+53749Wh3VTxORRgZG6HdsC4I7NpBXLiEekF1UxwcHNSW0JDMnj2bhaBU6W9c1q5dizFjxqitmkPfje+++05tCYIgGDYGmZWrPGQN2L7kP4TvO60Mumv+5wT274wh149h16Vti9bh0ukL3D9o1ggkXIzn+IvqMlEZK4PvVu1bw79Xe3i184aDuzMPyCuCCi2m58cjsyAe2UWpnOGL6o4UluShqKRIaRcpL0eigaqTKIuxKVs9SIiYmVjCBKawNXNl8eFg4XVFgJSD3o+0uGTEhkUj/PAZxIfH1CndL4mJgL4d4e7nCTMLc5hbmcPKzhqOni7cJre24/9v7z7ga7rfP4B/yJREIkuQ2ILYe29KbUWNKqq0VdrS6h60f91VtKWUVlV/imrt2nuv2lvslSB7CQn/+zw5l9CEIOvefN6v1+k953vuvQmpm/Oc7/d5ntX/IuF6gvGKO3LZ5ELpRhXRuOsTxgjRo1uyZAl++OEHLF682BihjCQJ8PPnz8fChQuNEUoP8imcWtUmCUxGjx6NVatWGSNpIyWeq1Wrpo1MKWvJz1dyYHObfnfa2NjAzs5Oi3bkyZMHzs7OOusrN1jMTWil4ESBAgW08pM0wpVllDJG2QOrcmUNqwhMxLVr17BuxnKc2XncGLm/gv5+eGJAe010P77jEHYv2QZXb3ecO3hSL76vRcfpBX5ayeyLm+n1Hr5eKF2nPHzLFDGN3X9mRIKQhJs3kHjrRlJQcuumaSzpxyF5ITKzIjMkkrRuk9tOx+5HktplBufY9kMIu3QVkVcePDuSVvLns7W3hb2jA5zyuWjFriIVS2hRgCung4xnGUwfyqUblEf9zs1gZ5+UcE/0OH7//XesWLEC06ZNM0Yoo5UqVQq//vorGjZsaIzQ40prYHLgwAG8++67WL9+PerVq4evv/4alSpV0gD9s88+0wumV155BQMHDkTjxo2xY8cOdOzYEfPmzTPe7W6hoaFo27YtmjRpgilTpugFsPybKlOmDObMmYNvvvkGJ0+eRLNmzTQolYvozp07o0SJEhqcent746WXXsLYsWO1rPTIkSPx3HPPaVGKjz76SHOS5IJa9jt16mR81ZzH/POd0KWvljiX8ubydxQXF4eYmBidiYyIiNCfR0hICIKDgxEUFIQLFy7g3LlzOH36NBISEuDv768/G2l6WqFCBVSuXFl/ZpS5GJhkDasJTERYSChW/foPQk9dNkZSJv00OgztDmf3vLh47Czy+XhquWBJCt+3cqfxrJSVrVcRXkXzY+fCzYiPjU/1wl9yV/xrlkX5xtXgbLqQlwv7XLlNWzotaZIf263Emxo8RYZE4MCaXTj579G7lpUlJ7M4Uvq36pO1ULhcCcRGRGPfqn+1saIs3Uoz+fZN/8dIn5MWpsDu3MFT2G/62snlL+2LZv3awNXV1Rghejxy4SQXRPJImWPcuHFYvXq1XrhS+khrYPLkk0+iUaNGGDJkCL7//nsNPP7880/tLyM/D7lgHTBgAAYPHqwXTBJwnD9/PtXPXLkAljvzEjhIgCF5RKVLl8YXX3yhd/RXrlyJWrVqoVevXmjVqpW+r1wY+/n5ab7RO++8ozNoW7ZswfHjx/Hmm2/qe86cORPfffedBrDyPfbp0wcnTpzQgCYnut/PN63CwsL07/jIkSM4dOgQ9u3bh7179+rvfPkZ1alTB/Xr1+cNg0zAwCRrWHSOyb3cPT1Q5+kmcPVNPelcAgZZquViCkouHDmDtdOWIio0Ese2HdCL+wexsbdFuQZV0PW9PqjVoQFcvVJe9x4fcw0H1u7BrE+mYMaIn7Fqyj/Yv2onAnce0WAg5PxlRIdF4sY1U3Bzn9hQlqZJnoh8j1fPBePcoVOm9ziMvSu3Y8UvC/HHR5Pw16e/4cim/akGJTIDJDkiPUe+gAIl/HDC9HrJD2n5YkddymabxlkNTz9vFKuUlFsiy7cuy0zJPYFWvqJeaNCjOYMSSldyR1F+QVDmkTvye/bswYYNG4wRyiyzZ89G2bJlMX78eJ0lkaDD1tZWgxUJEuS8BDEyC2L+rE3LZ+77778PX19fnQ2RGRJZanT27Fm9ABszZgx2796tF2FmUj5aAhS5CJbcI7koljwYuUkgMwISmBQrVgzr1q3TynkSyGzevNl4NT0KWeYlAYgEeV9++aUuX5XPv61bt+LZZ5/Vv/thw4bprFb79u01MDx69KjxaiLLZ1WBifArWhgt+reHR8n/rtOUJoHV29RDkQolEX4lHBtnrUJsRAx2Ld6CrXPWp2nmoFyDSjpLseXvtZoYXrNjQ52JuJ+4yFic2nMcW+eux5rfFmvlLwlUVv68CCt+XogVkxfcfzM9Z5UpCJHXyGvX/LYE2+dtxJl9J3At+prxVVKnsyumAMe8rOrY9sP6HlfOBOkMUMNnWuj4g+VC+UZV0LRva9TsUB+FShc2BSeXjHOAV9mCaPF8O3j5PEbPE6IUyDIHWYNNmUvujI8aNco4oswiQcDEiRP1IlWCD7NZs2bpz0QCxoCAAA1aHoajY9LvKsl/EHJ3vnz58ti0aZPOcjRt2lTHzYoXL66PMtMvy7nuderUKX1PCVJke++993TZEaW/IkWKoGvXrhqQbt++XT8TJXiRZX8tWrTQPKNPPvkE+/fvN15BZJmsLjARcmHcpNeTcPXzMEZMH8R2NujwRg9UaFJVS+UunzRPK3DJRbvMYNxIZbYhuRLVSpuCES99/tlDp3DaFGyUrFZGZyTSSgIEyV8JDw7Vi3pJuJeqWRK4pLSd3heoMzsyOyHVwGQm5mES/IV8vV1LtuLKuWB4Fy2AgqX89M++e9k23IiLh3/NcvCvU954dupklkeWbRXyL4zCFUpgqyk4Cz6ZdHfNvZjp77xnK3h4ZfdO+GSJ5AJI7sxS5ho0aBCOHTvGCl2ZSHIRJJ9KlnDJjIV5BkOCCMkzkWVesnTq1Vdf1ZkKIbkLEhg8rG3btumjLNeSWRRZPvQwZOmXBDkvvviiBlMyw3P9+oN/l9Ljk2V9Tz/9tDZElSBFZk6kAEK7du20H5EUC5GKbUSWxioDEyHBSYNnWsCjeNLMSeKNRMz58n84Y7rQP77tIKJDonQ8rewc7VGnc2NdwnRy1zHciL+uFavutwxL5PNx15kFt/z5tFlherExvZeTm/PtBPv63Zqhy/t9kMc19SBpw/+W63Kvmu3rw97JQQOek3uTigUE1Ktoeq2z7t/P2QMnsXHWSiwYPROXzwTpnTTJKWnapzWDEsowUnlIkrEp80kStiwpocwhS3RkGZ0ktZcsWVILu0jAsGbNGr1jLhek1atX16BE8kzkTnpKsx33Y851lNdIorX825IlWxL4yAWt5IkI8/NSy42UpUVXr17V5WGSw9KyZUv93ijzyXK7b7/9FmfOnMGIESN0VkUqf0nQKPk/RJbCqpLfUyIJ8dsXbMDZXSd0psHBdEHu5OqiMxYP80eXJU8NerRA6MUrWDpxHrz88qPVS50QFnQVi8fPQWx4tPHMu0nlqqa9WyMqJAKb56xF0PHzxplH5xdQDGXqVoCjs6POelw8dk6XVkn547lfTU+x/4qQ3BAJYOTPcnD9bmyatRr5Cnig6wd9tW/L2t+XatCVVlISuFTd8qjeti5zSijDyN1AuQMo6+wpa0hlKLlD37NnT2OEHoX8xklrcrRUa5LPVScnJ51FkRwTBwcHnUGRWYnkM4haBCUyEjt3ply8Rf79SMCTGskzkRwu+RoyMyMlbaXsbVrJ9ySvzemlbh/m55sZJB/ll19+waRJk7Rggvwblhk3Shsmv2cNq50xMZOE+MY9WsG/fnm57aOVtMKCQh4qKJH+HUVNAYZU1pKL/iLliqFJ7yf1l8HhTfu1wlVqokOjNOFeEt0vG8ue7lWglB+eG/XKfzavwj7GM+52+cwl0zlv+JYtiprtG2jAcWpPoOmPl/u+v0yknLBU7oqNjEHp2hW0tHF4UCj2r9ypCfAS8MifMS2kypd/Q1Ow1rUZgxLKUAcPHtRfqpR1PvjgA3z66afGEWUGmYGQoERIUCFBiZALpXuXNcrnvouLi5agTWl70DIvmXWRwEJIXsvDBCVCvif238h+5GcieT+yFFaW2knhhCeeeIJLMylbs/oZEzMJIjbNX4PArYdxIzreGE2bwqZApFm/pAREydewc7BDWHAojm87jOPbD94350NmEyThfuPMlTi0Ya8x+l/dRvRDvvweWDVlkTZ8lIBj7e/LNEE9JSVrlEHzfu10f+c/m3F0ywE07fMkDq7fg1O7U+/lIoFHs+faoETVMji27SA2mL4v6Z/S58tBujxt1ie/IuH6DePZKbN3ddSO7g3aNDFGiDKOLCOS5SJMws5asoyodu3aeOutt4wReljmO+rtylVJGiCrs+jQnmwzY5KSqVOn4quvvtKbPVI+ukoV/r+YGs6YZI0cE5iYHd51EPuX70T4+atJvyXSoEnvVihdpwI2/7UGrl75tBP6kvFzEB/74IpYXT/sCzfTa5ZPXqA9P1LT/vUe2jn+z//7FRFXwlCpeQ2cP3QaIReuGM+4m/QR6fPNYG26KE0ZpXO9zKDI+MpfFhnPSpnMlHR+p7fO/qz8ZaEmsDfo2QLlGlTGr8N+SL0QQC7As1h+VGpVC/4VyxiDRBmrW7du2rTtmWeeMUYoK0i1HykXK/k+/CX9aORXzph1S5MOyGq90Tj7L5eSfBSp4iU9baRpp3nGLL3MnTtXc5YkT8pSMTDJGjkuMJE/blREFFZMXYiQ4ynPRiRn7+yIPp8PRGx0rPYLaflSJ3gXzq/9SWRJ1P3I7ET/74Yi6mqEBgBXz6Xe+DF5YCL5L7K06mZi4n1LGHf76DnERcfBp3ghhJoCGOlzUqJ6GUwdNs54RupqdWqIKk/UwuGNe7FhxkqtOCZllu8XmOSv6IeWz7ZDHmenVJMhidKbdDyWBnCSpEtZSxLhZWmQVAIiIssmOSiyTHPt2rXa1DE9SdnoDz/8UCuHWSoGJlnD6nNM7iUX1K75XNFlaC+UaV0FefI560xASqRyVeNerZDLFGAcXr9Hlzp5F8mPyKvhaSrNmL94Qf160pk9Ouz+VcBs7e9U7HIv5KU9Rx7UV+Xi8XOa+C7d6z1NwZJsUqXLLX/qDSbNdi3eqnkvZepVhJuPO/J6umk5YOkmfxfT9+/skReVu9ZFp4Hd4eTizKCEMo00gZNlmAxKsoeRI0dqKVsJFInIskkOitxkkOaaMist3f3FjBkztGCCVIQTL730ks6ASJnq4cOHo3///jom10GSeyY9pnx8fPDGG28gLi5Ol4hJx3o5Nn9WyBIyCVZkBkWqhiUkJOg40b1yXGCSXMM2TdHs+TYoWLHIfy62JfmvQtNqKF65lCa3B524oP1K7BzstR9I4vUH/6PyLZ3UEE5eL/1HHkQuwHxMwYzkiviUfHCXa+ltUqCkL9ZNX4awi1e1UpitnS2KVHzw1Kkkwh8yBVvy527xfHsUKV8cm/9ae9eHhZQ3Lly9BJqa/o5qNalrjBJlHrmTJ92uKXuQTuGy7EM6iBORdZDeJ56enli6NGmZ4aJFi7TT/K5duxAfH69VveTmkMwcyM0J6UTfo0cPTJkyBV9//bXOpM6ePVu3zz//XMtISwlr6cMjOSzSCLRfv35a3vqnn37S18nziFKSowMTCT58SxZBi97t0Hxge9jlu9PB/eatWzi66QC2z9+gQYXMXvgFFNVzYRdD0hTt5y9WSBPjI4LD0lQFTL6fOl2aaB5LWsgsTL4C7rgeG4/tCzYi4UbSLI4k6z+IfD/RYdFIiL+BwJ2HsGrqYgQFnr+dd2Pv6YSWgzqhaY8nUai4H2dJKEvI3bZmzZoZR5QdSFM9uUPKCwsi6yHVulavXq378rkrneS3bNmC3bt368xK+fJJTZhlf/HixdoDR2ZbhgwZgsGDB+sNJJkJkZkR6YkjVeICAgK0l8qECRN0lkXKFUuXesltmT59ur4f0b1ydGBilscpD0pU8Efnt59F0dr+sHeRAOUWYsKjsGf5dvz1xTQEn5YSvT460yCd480X8KlxcM6jZYJlFiT4dMplgu8l7zvvmz8QdulqmmZkYsIiERcRC1cfd1w4elYbR0rAITM79nmSSkvez/lDp/DHR5Owd8XO231YHPI6wr9xBTz9dh8UKVMMjnnuBGtEmU3u4EnTNspepKqPXIRIQjwRWb4mTZrg2LFjt5sxSpPPDRs2YOPGjWjfvv3tm5MSWJjLSUvjzxo1aui+KF68eIr9po4ePar9VOQ9ZJMgRfI3iFLCwCQZaSrVqk8HNOrfCv71ysPBNU/SCQlCTJs0M9yxYKP2QXkQ6fSeJ6+zzrRcPZt60vttyWYkNs9eo40cHyQmLFobN/rXLKcB0/41uxB5JRyOLnng6ettPCt112KuaV8XYW/6s/o3rICmL7VD026t4Ozy4C7wRBlp2bJlWtJS7s5T9iKdwr/55huWDiayEtI3R6poSVl2CT4aNGigMyiyyWxKSqTLf/JARAKbVq1aGUd3eHh4aA8VaRQqm7xmzZo1xlmiuzEwSUGJ0qW0cWC7V59GwdrFkdsuKTE9LjIW+9b8m6bu7fnyu8PJ1Qkx4ZG4Hvfgvim2tneS36+cDUZMxP0rfokEUzASFRqJktWSSvdGXA7Duj+WwdE5jybQp4Wtox2KNQlA+9eeRv2nmqJI8aTlakRZbc6cOZqQSdnT0KFDdYZWEmeJyPK1bdsWf/75Jxo2bKg5JXny5NH8EJlNSYl8Pv/2229apOT69euaNG/uLC/lh0NDQ3VfAh1JnpdZkujoaF36xb5UlBoGJqmws7eHZyFvtO/TGV1HPIfCtUvCMa+Tdjx/UL6IlPotXL64dmS/dPyCMXp/0o9EygOb37t84yranPFBpARxnrx5kM/HQ4+DTF9v74rtpu/BNtW8kFw2ueBoCppKNCiLrsP7ouXTbeBZ0FsrgRFlF7NmzdKmfpR9jR49GsOGDdMKPERk2Zo3b66P9erV00eZ/ZBcE6m4JeSawryMS3Tv3l2T46XSloODg1bxMvebktcOHDhQE+LlM8LPz09nWuW9JIleloMSpSTH9TF5HOFh4Ti6/QCunAzC1TNBuB6V8kyI5HfU6tgQzvlcNJBZ+uNc40zqen4yQJdgzf92hjY+lCR4Kee7Y/5G4xkpq9CkKgIaVMbZQyexfd5G3Lp5U/unSEUtSWxPTjq2S88TrxIFEFC7IlzyuhhniLKXadOm6S+0hQsXGiOUXX3//fd6N5RLM4hyHikZfOrUKdjb2+uy2+Q3RGXGRJbI29jY6E3XM2fOaCBTunTpVG+cZifsY5I1GJg8gpjoGERdCcflC8E4sGkPYs6Ha/Wt5OQfnfRBcXBy1LyP+5GO7a0HPaWvkRkQ+ZG4F/TC/rX/YueCTcazUpbX01VnaGIjYlLuRG8KjPIWcUelBtV0VkR6nEiyP1F2JksHpIJLly5djBHKzuTnVKFCBa22Q0RkDRiYZA0GJulA1lZuWrEeF3edQnxoHBITEpKWZKXxb9bGNrcpiEmqfiV9SKSho5AyxWnpf5KcvNbG1gYOXs7wq14c9Zs30rWeRJZi3bp1ugTg8OHDxghld/ILvGrVqloq1LzGnIjIkjEwyRoMTNJZZEQEAg8eR0xQBOIjriHsaghiIqJxMy4BCdfuXlr1uGwcbWGTxw4u7q7w8PKAbV4HuBX2QKmA0qyqRRZL7r5L7xJJkCTLIcUK3nzzTfz7779wd3c3RonI2shndJEiRay+8AUDk6zBwCQDydrLiPAIxEXGIPFaAhLjExAdFY1LFy4iKjQC0RKwmMZlCZaLnbPOtGj/kty5dNbDxtYW0QmxcHR2RG4HWzi5OsPd2wM+hQrA2dkZNqYxCUxk3C2f211JaUSWSGZLnn/+eZw4ccIYIUsiHaClQo9U9iEi6yRJ7lJOWLq5W/MNJAYmWYOBSRZK/ld/Jw3MvJd0LvkPxxKSxYgehzRTfPrpp/HCCy8YI2Rp5GcoOULvv/++MUJE1ubAgQOoXbu2doFv3LixMWpdGJhkDd5iz0ISaJg303+MTU7oSd3ueg6RFZP8hNjYWAYlFu7nn3/WSl2sqEZkvaTYhfxbf+mll7RpIlF6YWBCRFlOykrKMqDPPvvMGCFLJWvPf/nlF12SFxgYaIwSkbXp2bMnWrdujVdeecUYIXp8DEyIKMsNGTIEffv2tdolATmNdJCWQPO5554zRojIGkkC/N69e/H7778bI0SPh4EJEWWpcePGabI7OwFbF+n2LMs9JOAkIuslwYlU5AsJCTFGiB4dAxMiyjIrVqzQO+uTJk0yRsiaTJw4EUFBQRg+fLgxQkTWRma6+/Tpo5/lRI+LgQkRZYn9+/fjmWeewbRp0/TOOlmn//3vf5g9ezaDTyIr9sUXX2DlypW6ET0OBiZElOmOHTuGp556CiNHjkTnzp2NUbJG3t7e+OOPP/DWW2+xUheRlbK1tcX//d//4eOPPzZGiB4NAxMiylT79u1DmzZttJLLwIEDjVGyZlWrVsXMmTPRrVs3bNmyxRglImvSu3dvODg4YMqUKcYI0cNjYEJEmWbZsmVo1qyZJkoOHTrUGKWcQMqKynIuaaB55MgRY5SIrIk0Vv3yyy+NI6KHx8CEiDKFVG6RO+bSlIszJTmT3FF9++230aVLF+2mTETWpXnz5pozKNUWiR4FAxMiylDnz5/XgGT+/PnYtm0bOnXqZJyhnOi1117TogeSYxQeHm6MEpG1eOONN/RGFNGjYGBCRBnm+++/R0BAgG5r165F2bJljTOUk33wwQdo0aIFOnbsiNjYWGOUiKxBgwYNUK5cOZ0dJ3pYDEyIKN3NmDFDE56lT8m6devwySefGGeIknz22WeoVasW2rdvj/j4eGOUiKzB4MGDMWHCBOOIKO0YmBBRuoiLi8OPP/6IypUr46efftLSkVIetlq1asYziO72zTff6P8vbdu2xbVr14xRIrJ0Tz75JGxsbLB48WJjhChtGJgQ0WNZtGgR+vXrBw8PD6xfvx7ffvutLtuSO+FEDzJ69GgNTqSEdFRUlDFKRJZuwIABLB1MDy3XLRNjn4jooTVt2lQT2iXBvWDBgsYo0cN55513sGnTJsybNw9eXl7GKBFZqhs3bsDT0xP79+9H0aJFjVHLcenSJRQqVEgrCPJ3W+bhjAmRhZP1+S+//DJ8fHzQq1cv7Ny5U8flw7Rr16463rJlSxw+fFjHu3fvjk8//RQlS5bEu+++q0uuzGRf7mDLe0pZ18KFC6N69ep6sShS+lpr1qzBkCFD+MFNj+Wrr77SUqPy/+rp06eNUSKyVHZ2dnj22Wcxffp0Y4TowRiYEFm42bNn49ixYzh58qTOXJgbF44cORLe3t7aaVvyPOSC7+bNmwgMDNTkdElMbNy4McaPH4+EhATdRo0apRVV5s6diw0bNmjyuryflHaV90/taxGlBymS0KNHDzzxxBPYt2+fMUpElkpKg8vvG6K0YmBCZOFKly6N1atX6+yHo6Mjli9frlPocpdKZjYkuJCZD+kncubMGX2NXABKoCIXgEKCF8kLkVkPqZQ0c+ZMFCtWTCtqSTlXPz8/bN68OcWvRZSeZKZu2LBhOnsi/08SkeWSG11yQ2zr1q3GCNH9MTAhskASZEiPEAksJJDYtWsXChQogI8//hhNmjRBZGSkJhI7ODggMTERuXLl0pkRNzc3fb0ELMLW1hbPP/885syZo8GILNMSp06d0sBDXivbe++9pwnKKX0tovQ2cOBA/f+1WbNmOktHRJarS5cu+juGKC2Y/E5kQWSJ1W+//YZVq1bh6aef1gZ1klhob2+vd5qDgoJ01iMkJESn0CWfRCpmyWxH7969cejQIdSrVw9jx45Fw4YN9T0PHjyIunXr6r4s05Kg4+uvv9b9iRMn6nvJBeK0adOwZMmSFL+WVOQiSm+SvyRLu6Qho3SMJyLLs3v3bv1dJL9TLAmT37MGZ0yILIB00K1UqZImpktuR3h4uJZhlMBEApQffvgBZcqUQf369TFixAgNFIYPH45x48bp7IiMS8K7zKAImUExK1++PPz9/TX4kKBESMLi1atX4evrq2Oy7EuS4FP7WkQZQSq+yXLCqVOnajBMRJZHmu3mzp0b//77rzFClDrOmBBlY3/99ZcmsUuA8Prrr9/OCbmXJK5L1a1SpUohT548xmgSSXaX4MLFxcUYSTu5UyTLvfLnz2+M3P9rEWWE6OhorQInywtl5s4cYBORZZC8MXd3d3z44YfGSPbHGZOswcCEKBuSJPW33npLgwrJ5ejQoYNxhijnkipwGzdu1OWMMtNHRJZBCqXIrL004bUUDEyyBpdyEWUzv//+uy7bqlChgiaaMyghSiK5UX379tU8KSbTElkOme3fsWMHwsLCjBGilDEwIcpGZJbkyy+/xKJFizRHhIju9uqrr2qlLkmGlzuwRJT9SV6j5IyxBDg9CAMTomxCqpacOHFC672bK2YR0X9JMQb5dyLLurp164aIiAjjDBFlV9LQ15KWclHWYGBClMWk+VSbNm00MVCWp+TNm9c4Q0SpkaafS5cuRfHixVGjRg0tLUxE2ZfccJObCUT3w8CEKItJyd+SJUtqzxAiejhfffWVVq576qmndJ+IsifJDdu3b59W2SNKDQMToiwkzQ+9vLy0NwgRPRppwig9ElavXq0BilTRIaLsp3bt2ti+fbtxRPRfDEyIssjnn3+Oc+fO4ddffzVGiOhRyazjsmXLULlyZVSpUgWzZs0yzhBRdiHLLnfu3GkcEf0XAxOiLCA13aX0qXRvJ6L0I31//vjjD3zyySd4+eWXcf36deMMEWW16tWraxl8otQwMCHKZImJiRgyZAjGjx+PIkWKGKNElF5atGiBvXv3Infu3KhYsSL++ecf4wwRZSWZzZR/m0SpYed3okwmvUrCw8MxefJkY4SIMsrcuXPxxhtvaKPSUaNGwc7OzjhDRFnBwcFBGy06OTkZI9kTO79nDc6YEGWi3bt3a0DyxRdfGCNElJEkGf7AgQO6pKtcuXIaqBBR1ilfvjwOHjxoHBHdjYEJUSaShPePPvpIK3ERUeZwdnbGhAkTMHr0aHzwwQdaDS84ONg4S0SZKSAgAEeOHDGOiO7GwIQok2zevFmrkQwbNswYIaLM1L59exw6dAg+Pj4oW7asBitElLnKlCmDY8eOGUdEd2NgQpRJxo0bp0nvRJS1vvzySy0t/Pfff6NZs2Z604CIMkepUqUQGBhoHBHdjYEJUSY4efKkVgYaNGiQMUJEWalWrVpYuXKlNmeUPJRXX31VE3KJKGNJz6ETJ04YR0R3Y2BClAl+++03Xddub29vjBBRdvDiiy/i+PHjsLW11Qum77//3jhDRBmhePHiOH36tHFEdDcGJkSZYMaMGXj22WeNIyLKTlxdXTFmzBhtfCqzKNIEbt68ecZZIkpP+fPnR3R0tG5E92JgQpTBNmzYoFWBatSoYYwQUXYk/0YXLFiA999/XzvHS7L81q1bjbNElF4KFy6M8+fPG0dEdzAwIcpgCxcuRMeOHY0jIsruunTpoj2HnnzySd2XZZhHjx41zhLR4zI3LiS6FwMTogy2dOlStG7d2jgiIksxePBgXQsva+KrVq2K1157jXd5idKBdFIPCgoyjojuYGBClIHOnDmjjdxq165tjBCRJbGzs8Pw4cNx9uxZODo6okiRInj77bdx+fJl4xlE9LCklxCbnFJKGJgQZaCNGzeiUaNGxhERWSovLy98/fXXerMhPj4efn5+xpmUJSYm6kZE/+Xt7Y2rV68aR0R3MDAhykCSOFu3bl3jiIgsnSTtfvfddw/sXP3KK6/g008/NY4enwREs2fPNo6ILJunpydCQkKMI6I7GJgQZaCdO3eiZs2axhERWYtixYoZe5lj3759ePfdd40jIsvm7u7OhqaUIgYmRBlo7969mjRLRNZp/vz5ulxT1sz37t0bFy5cMM4ABw8e1HPSJ6VXr163L8QOHz6Mpk2b6rh0oN+0aZOOb968GR06dNB9IeNdu3bFqVOnMHToUJw8eVKPiSxdvnz5EB4ebhwR3cHAhCiDyFIPqTzi4uJijBCRNbl+/bp2ju/evTv++ecfTeYdNWqUcRa69OqJJ57Ajz/+qI0bpT+K5Ke0bNkSefLkweLFi9GqVSut2ifJ9BEREVqm2Ewu3ORYgp4BAwZoYzp5DyJLJ0F5ZGSkcUR0BwMTogxy/PhxlC5d2jgiImsjnasnTJigZYWLFi2KMmXKYMeOHcZZoE6dOvjoo4/w7LPPYsSIEZg+fTrWrFmjJYdnzZqFBg0aYOTIkfrcVatW6WNKnJycUKFCBb3JUa1aNWOUyHLlzZuXnd8pRQxMiDKILLsoWbKkcURE1sbZ2VlnNOTur8xmzJs3zziTpEWLFsYeULlyZURFRemyrHLlyumFmVmlSpVSLJ2akJBg7BFZFwm2Y2JijCOiOxiYEGUQ6Xsgd1GJyDrJUiypvCWzIBJEvPfee8aZJMnLocoMasOGDVG+fHmcO3fudinhW7duaWK75JoIWR5mJp8hRNZIApO4uDjjiOgOBiZEGeTixYvw9fU1jojI2phnP2Q2REqf/vLLL3f1LpGlW4GBgVrq9+eff0abNm1ulw+XYwlmli5dqscSmMjnheSarF+/XoOaiRMn6jmRO3duXfrCWRSyBg4ODppvRXQvBiZEGUSWZkjSKhFZpx49euDatWvw8PBAqVKlNKldehdNmjRJz5ctWxb+/v5aWliWcfXt21c7yX/xxRcYOHCgvk6ClbFjx8LW1laDHEmWb9y4MUqUKKGvNTNX95MZFyJLZ29vz8CEUpTrlswjE1G6kwuJqVOn6t1UIrJO8iv0xIkTGnxIcCGVteSiS6puCQlcgoKCdFlnrly5dExIxS1JgpcARJa1JCfPl6BF3ic5mS2R5S/J81OILNGNGze0mEN2Dk4uXbqEQoUK6eoHqbBJmYMzJkQZRC48pFY7EVkvCTZktkSCEuHm5nY7KBGOjo4atCQPSoR8NkilrXuDElGgQIH/BCVCvgaDErJUo0eP1n8b3333HWxsbG4ve5RjGR8zZowep8XNxARcj4pEfFiYPt5KtoSSLBtnTIgyiJeXl/YykTufRETpJTQ0lJ8rZHGkb4n8XpQAWwJy8//HsbGxGqRIXlVKgbcEHyH79yH82FFEnzqJmKAgXI+MMM7eYe/qCucCBZG3REnkK10GHhUqwsHd3Tj78DhjkjUYmBBlECklKh+0ye+eEhE9qjlz5mjTxr///lubMnbu3Fk3zqKQpXj33Xd1ZiR59TmZHXzjjTc098pMZkAurFmFS+vXIfTwITi6e8DNzw8u+X3g5OkBh7yusHV0RG6b3LiZeBMJ164hPioSsSGhiL4cjIjz53EtLBTuAeVQsFFj+DVtjlw2Nsa7pw0Dk6zBwIQoncg09QcffIAvv/wSQ4YM0SRXWT/7ww8/6Ifx559/jtdff914NhHRo5E7zBKkyDZ37lx06tRJtw4dOsD9Me4QE2U0mTWRnj/Jc0ukQteVK1c0wE40jZ+aPxdnFy+CjWncp1x5eJcpC5dHKCQTHRyMK0ePIPjgQSRej0eRNu1QolNn5E5hmWRKGJhkDQYmROnkUaepiYgelVT7ksaO8+fPx4IFC7SpY/v27XXz8/MznkWUfSSfNUk+W3J+5XIc/2M67F1cULhmTfhUqGi84vEFH9iPczu243pMDEr16IXCT7Q0zqSOgUnWYGBClI7SOk1NRJTepALYwoULdVu0aBECAgLQtm1bLUlcpUoV41lEWSv5rInMlpw/fhzn/vgdIfv2okSTpvCtUdN4Zvq7sHMHTq5dA8/KVVDuhYH3zUFhYJI1GJgQpaMHTVMTEWWW5cuXa3f6JUuW6Kyt5KW0atVKN1lqSpRV5CaeLH8e3LcPOuW6BWdvb/g/0RKObm7GMzLOtYgIHF+xDNFXrqLia0PhmcrMDAOTrMFywUTpyNXVFUOHDr1d6lMeJa+EQQkRZTZp+CjNG48ePar5KIULF9YZXSnM0a5dOy3TevDgQePZRJnn/fffxxP16qHx1WDkL1sWFbs+nSlBiZCvU7FrN/iYvu7OT4YjaPMm4wxlB5wxIUpn905Tc7aEiLITaQK5YsUK3VauXKljzZs3R7NmzXSTzy+ijBS0eSP2jvkWpVo8Ab9atY3RzHdu21acWLUSlV9/EwXq1TdGk3DGJGtwxoQonZlnTWSpBGdLiCi7kSaQXbt2xU8//aRd6yVpXpo9zpw5E/7+/qhRowbefPNNzVWRGy1E6Sn0wP5sEZSIwrXroGTzFqbvZxRCTN8XZT3OmBCls1s3ExEeGoz+L7yEKT9PQj4PH9O/NN4DICLLsGnTJqxduxbr1q3TrVq1amjYsKFuDRo0YEliemTSLHHL28PgExCAEk2bGaNZ7+Sa1Qg+cgR1vxp1OyGeMyZZg4EJ0WNIiA9DzNUDiAs/hvio07geG2Qa++8dRlt7V9g7F4Cja3HkyVcaTp7lYevAX+5ElL3dvHkTGzZsuL1J0FK6dGnUq1fv9lasWDHj2UT3t/urz5EYGak5JdnN/r/+hI1bPlR9+z09ZmCSNRiYED0kmRGJuLAGERc3Ijb0MOwc3eHk6gtHZ2/Y5/EwBRx5YWPrgFy5bHDrViISE+JNwUoUrseF4lrMZcRGXsSNa2Fw8giAa6EGcPdrxhkVIrIYW7duxebNm3XbsmWLLlutU6cOateurVutWrW0nxNRcudWLMPRqVNQ84WXMi3R/WFIta4dk39Cmef6a58TBiZZg4EJURrdTIxHyMkFCDuzBLlt7OHmHYC8XqVNAcnDJ4pKgBJ19Rgirhw2ve91uBdtDa+SHU3xSdo60hIRZRfHjx/XYGXbtm3Yvn07du7cqcFJzZo1NV9FtvLlyxvPppxIOrqvf/lFFK1bD76m/x+yK+lzcmbrFjSeMBnBISEMTLIAAxOiNAg/txKXj82Erb0zPAvVgFv+csaZxxdx+SBCL/6LhOux8CrdHe6FWxhniIgsj1Qk3LFjh24SpMgmd58lV0W2qlWr6iYJ95QznPhzJoI2bkCNfs8bI9nXzl9/gU+DRnBu2JiBSRZgYEJ0Hwnx4Qg6MAkxIfuRv1gjuBesZpxJf2EXd+HymfVw9qqEAuUHMAeFiKxGaGgodu3apdvu3buxZ88enD59WjvSV65cGZUqVdKtYsWKWjWMrMetxESsfr4P/Fu0hI8FBKPBB/YjcNVKlP30S/gWLszAJJMxMCFKRWzIAVzcNw4OTl4oULI57BxcjTMZ50Z8BIJOrMK12BAUqvQKnD15R5GIrFNUVBT27t2r2759+3Tbv3+/9lGRAEWWf5m3cuXK3W5cS5ZFcktO/fUnag8cZIxkf+u/G4u10TH4ev5CtG/fHo6OjjouuVPjx49nG4AMxMCEKAWRlzbjwp7v4OlXG/mLNTZGM8/l0+sQcn4bfKsOhWuBusYoEZH1k5yVAwcO6Cad6Q8dOqRbyZIlERAQoFuZMmVQtmxZfWT54uxt+0fvw83LC8UaZf7v0kd1av06rFi8GK8tX2WMAE5OTnj77bcxYsQIY4QyAgMTonuYgxKf4k3h4VvTGM18oRd2IPjUGgYnRJTjyaXK4cOHceTIEX08evTo7S1PnjzaGFLKGJcqVUr35VECGRcXF+MdKCvEh4Zi7Uv9UaP/C3Dx8TFGs7/o4GDs/GUynlm0FKHXrumY/H8WbBrnbEnGYmBClIws3zqzfaQpKGlmCkqyvnKIOTgpUusjLusiIkrBhQsXdJbFvAUGBuomXe0lX6VEiRK3N+m5Urx4cX0sWrSo8Q6UUS6tX4fj06dZ1DIuszWjv8U36zdi9dlznC3JRAxMiAyS6H5q0ztw8y6TJcu3UiPLuiKuHkPxel8wIZ6I6CFI0CIByqlTp3Dy5ElNuJd9eZRzEpzIVqRIEd0KFy6sm5+fn25cJvZ4Dv88CdcvXUDZdh2MEctxYO4c/LroH4zfvZezJZmIgQmR4fyub3ArIQKFA54yRrKPc4fmIpedG/yqvWWMEBHR40hISMCZM2d0O3v2LM6dO6eP58+f1315TExMhK+vr25SOlY2qdBk3goUKKCbq2vGF0exRNs+eAdeRYrCr1ZtY8RynNu2DSvnz8Ow9Zs4W5KJGJgQmYSdXYnLR35DiWrPZ0r1rYcl1bpO7voV+QP6ss8JEVEmiYyM1JkVKRlr3qQni3kLCgrSO+kS5Pj4+GhFMfPm7e19e/Py8tLN09NTt5xSEnnN831RpnUbeJYqZYxYjpDA49g2cwZ6LVnB2ZJMxMCEcrxbifE4vnYwvAvXztA+JY9L+pxcPb8dpZqOZ4d4IqJsJCYmRi9eL1++fHu7cuWKblevXtXHkJAQ3ZfH2NhYDVA8PDx0uZh5y5cvnz5K4CL78iizMck3uUCWLXfu3MZXz56kf8nyHl0tLvHdzJwAv618ZQz/+GNjlDIaAxPK8a4GzkbUpU0oXqW3MZJ9ndozDS4FGsDb/2ljhIiILM2NGzc0QAkLC9Pmk/IoW3h4uG4RERG3H2XWRh6l74vsy6NskvcgVcdkc3Z21kdJ0pZ9eTRv8jzzJv04zJuDg8PtTXrEJN/s7Oxub9K7w7zZ2NjcfpTAyPyYK1eu24/m7brpe13Tvy/qDH4Vjuk0Q7T280+NPbJUrWbPNfZSxsCEcrZbiTi2cgB8SjaDm3c5YzD7irh8EMGn1qJ0859N/3qz990yIiLKODJLIwGKPEZHR+ujbDIbI49xcXG6L4/m7dq1a7e3+Pj429v169fv2iRwMm+yTM28Sc5N8u3mzZt3bXJJab6slMelXTuh3mtDYZ9OZZslMGny/ofGEVka+fkxMCG6D8ktCTnxF0rVeMEYyf4Cd06GZ6muzDUhIqJsK6NmTBiYWK60BCa85Uo5WuTFDXDzDjCOLIN8v5EXNxpHRERE2Y+tk5M+JhgNConSgoEJ5VgJ18IQG3YEeb1KGyOWQb7f2NDDSIgPM0aIiIiyl9y2trDP64r4qChjhOjBGJhQjhUbegB2ju5wdM5vjFgG+X7l+44NOWiMEBERZT9OBQsgLjTEOCJ6MAYmlGPFhh+Dk6uvcWRZ5PuOM33/RERE2VXeYiUQFRxkHBE9GJPfKcc6s/VD5M1XGB6+NYyR9HV449fGHlmrgNazjD0iIrrXxfVrETj9d9QeOMgYeTxMfrdsrMpFdB/HVw1AwVIt4eJR0hhJXxKYBDR42zgia6M/XwYmRESpig8LxdoX+6PGgBfgkv/xmywyMLFsrMpFlJpbiUi4HgVbh7zGABEREaUnB3cPuAeUw9UjR4wRup/EmzcRe+0aEhITjZGch4EJ5UgJN2L00cbWUR+JiIgo/RVs2AjBh1isJS2WbdoEj3oNsGjdOmMk52FgQjnTzaS7EbnYPZ2IiCjD+DZtrr1Mgg8eMEYoNSX8/PBWv+dQqkgRYyTn4VUZ5Uy5bfTh1q2b+khERETpT/qZFGnTDue2bzdGrFfPt97G4E8/x/MfDcfrX32NsMhIjJ42DQEdOqJm956YsXgxomJj0aB3Hwz8v5H6mpDwcD0eOfEn3V9j+nu6Ghamy7rk+U2f74+Srdvgox/G6RKvp4YMRfdhb+lr/2/CRH3t6QsXsXnPHt1fssGyGzAzMKEcycY2qSNtYgI70hIREWWk4p2ewvXoaFz4d6cxYp0OBAbilzlzsHDtWvgXLYoJs/7E+2O/R+927ZDf0wP9PhyOg8cD4e3hganz5iPC9Heyatt27Dx4CFUDAhAZHaP74VFR2Lx7jz5fZk/aNmqEb36dirG//w8+np6Yv2aNBj2zly/X528/cABrd+zU/Qr+pYzvxjIxMKEcKVduW9ja50VCPDvSEhERZSQbB0eU6vkMTpouqK9FRhij1imvsxNOLF2CQT2664yHBCEy0yEBhVi8YQOeNQUqYp0pmFi8fr2+5om6dXTMbM7KlfroY3q9u6ur7s9btQqt6tfX/ZVbt+L4mbOo6O+PnabAZMuevbpfuEABPW+pGJhQjmXn5IPrcWHGEREREWWUwk+0gmfFSghcsdwYsU5lihWDq7MzbiQkaOAgpDNH0YIF8d6A/qhVsSJaN2ygwci81avxjykw6depExzs7fW5ZsfOnDH2TBfruXLpa3u0bo0mNZN6r/0wfYa+x/Odn8Ka7TuwYssWdGzWVM9ZMgYmlGM5uhbHtZjLxhGlp7i4eN2IiIjMyr00EFHBl3Fy7RpjxPrkNnJY7WxtNQi5EhqKulUqI5+rqwYP9na2cHJ01CDjj38WIyomFt1bP6mvSa5WhQr66JHPDdXLl9fXxsTF6exJ/apVsX3/fjSrVRs1ypfD/uPH9bmt6tfTR0vGwIRyrDz5SiM28qJxROmpTvPnUKV+T+OIiIgoqa9JxdeG4uzmTTi/fZsxar1+GvGRzo50eOU1vDN6DIr5+qJJzZp67pk2bfTRv2gRVC9XTvfNcuXKhTee66uzIZKj0vX1NxB//QaeaZv0mnaNG+mjBDwVS5fWfZk9qXbP+1gidn6nHCshPgzHVw9E8arPwdE5vzGafnJy5/cffpqFhIREvD74GWPE+rDzOxHRo7m0aQP2jR2NUi2egF+t2sbog1lq53epsmWT2wbubkm5Ig9DGi6GRUSiUH5vDVgsGTu/E92HrYM7nDzKIirkmDGSs509H4TOvd6CT8mWaNPlNSxcsl7HP/36F9Rq0uf20iw59/LrX+j+jl2H0K3vu3At1AhPPvUqNmzerePbdx7E1h37db/3C8PRq/+HuhUOaIP+g/8PsbFJ1dDWb9qF7s+9p19THq+GhOs4ERFZr4L1G6LS0DcQuHKFVS/rMvNyd3+koETIsi9fn/wWH5SkFQMTytHcCjVExOUjxlHONuKznzB34Rq0aVkfJ06d10AiOiYWp89e1ADkptHz5d89R3Dk2GlN5nt2wIfYu/8YJv/wIS4FX8WAV0bqTMmhIyexZ99Rff6+g8fxx+yliIqORdVKZTHl9wVYYAp65L0bt34RFy5exmsDe+DPOStM7/eRvoaIiKybBCc1hn+C4EOHcODv2bgWYd3VuihtGJhQjubm2wQ3E68h4sohYyRnun79Bv6evwq9e7TBrxNGYNm8cfh98sjbMxspMd+9ORZ4FuMnz0bnDk2xfP542NomJf4l5+ebHwtmjca4b5OWtu00BTpLlm/Wfd9C+RF//bo+Z9mqLRrAEBGR9ZMqXXW/HoXcLq7YMXmS1fc5oQdjYEI5mvQzcS/aGqEX/jVGcqaIyGgNCNzcXPTYzdUFxYsWQp48jrCxSQo0ZCZExMXdCVZWLPgR77/5PIIvh+DjzyehYu3uKQYzBX289FGqlJgFnjynj7am95fZl+d6tceHb/c3BTw6TEREOYAkxFd9932Uea4fzmzejJ2/TkHwwQPGWcppGJhQjudZoiMSrkcj7NIuYyTn8fZyR/06lfHb9EWYNuMfzQupXK8nok3BSrEiBfU5o8dNx2tvf3N7RiM8IgoVanXD0eOnMWf6KDzz9JN67sy5S3r+QapXDTD2gCea1sbe/cdx8PBJuDgndeUnIqKcQ/qcNJrwE3zqN9BeJ9sm/ojT69ch+nKw8Ywk0kGem2VuacGqXEQmYedW4vLh31Ci2vOwc3i0BLV7WVpVrqUrN6N159eMI2DcqLcx+MVuOrNR/4n+uHwlFOXKlsC580GoWb08Vi2cgO8mzMDno37Vc3ldnDDohafx5SevonrDZ3Et/joObv9TAxwHeztsXzsNQcEhKOjfCsNefRajPhuKr8b8pgGP+fXzZnyLZo2TSilmd6zKRUSUMW4mJODCmlW4tGE9wg4fQh4PD7j6+iL8/HnEh7ExsqXK4+VtCj4nGUcpY2BCZDj/79dAYhT8AjoZI4/HEssFx5uCCanO5VswP5ycHI3RpK61UjHL08MNuXPfPdEq5+Q1foV8YGPz8JOwiYk39fWFfX1SzE/JrhiYEBFlvPiwUITs34fwo0dxbvlSNJn0i3GGLIrpWmHtSwMeWC6YgQmRQfqanNr0Lty8yyJ/saTmRY/DEgMTSjsGJkREmch0ubqsW+cHXthSNpXGnx9zTIgM0tekUOVXEXJ+K0IvsDIIERERUWZiYEKUjLNnBRSqMgTBp1YzOCEiIiLKRAxMiO7hVrDe7eDk8umk7udERERElLGYY0KUipiQA7i49wfkcckPnxLNHrpal+Qg+NcaZByRtTm+/UfmmBARZRbmmFi2NP78GJgQ3YckxAcdmGwKUvZrQrx7wWrGmQcL3DkZN66xrKG1snP0Qqmm440jIiLKUAxMLBsDE6L0I31Orh6bCVt7F3j4VoebdznjTOp0xqTZROOIrM3x1QM5Y0JElFkYmFg2BiZE6etmYjxCTs5H2JklyG3jCLf8ZZHXszQcnfMbz7gby8lat8NLuvPnS0SUWdIhMDl48CBOnz6Ntm3bYsiQIShYsCDeffdd4yxlqDT+/Jj8TpRGuW0c4O3fDf7NJsOrVBfERofi1O6pCNz5My4eW6xVvKJDT+BazGXciI80XkVERETZwY4dOzBt2jTdf+ONN9CnTx/dp+yDgQnRQ8qV2xb5CrdA0dqf6FIt79I9kduxICLDzuJS4PKkYGUHl3ARERFlhvXr16N///7o2bOnzoBERUWhX79+8PHxQa1atTB79mwEBgbinXfewZIlS/DFF1/gr7/+wvLlyxEaGoq6devivffeu/38o0eP6vsePnwYTZs2RZkyZfR9O3TooOOUcRiYED0Gacro5tsIBcoPQLG6n8G/+c8o22q66XGy8QwiIiLKSBKITJkyBQEBAXj11VcxYcIERERE4NChQ/j66681aPHz88Pw4cPRrFkzXcZ19uxZBAUF4caNG9i6dSvs7Oywa9cuFChQAJMnJ/0Ol0CmVatWWLRokQY2a9eu1XHKOAxMiNKZzKjY2j9caWEiIiJ6dKVLl9bAw9fXV5dpDR48GH/88YcGLBK4JCQkwNnZGQ4ODnBycjJedcf777+vr+3cuTNOnjyJyMhILFy4EG+++Sb8/f3x+uuvG8+kjMTAhIiIiIgsmsyImH3++ecYNGiQBiNdunQxRu/P0dFRH21sbPRRZlSSy5cvn7FHGYmBCRERERFZDVl6JTMdMsuRmJhojCaJj4839u6vWLFi+iizJlLA9vfff9djylgMTIiIiIjIakgOybBhw1C+fHn873//02VeH3/8MapWrYrVq1frvsiVK5c+Jmcec3Fx0QDn008/hZubGzZu3Ig8efLoOco47GNClEHY58K68edLRJSJHrKPieSVyOyIl5eXJrjHxcXB1dX19oyJ5Jrcj3mWpFOnTpqTsmDBAkycOFEredEjYB8Touxp5cqVWju9W7du+iHZtWtXxMTE6LmRI0dqWULZRowYoWNSyrBy5cpaqlBKGXbv3h3jx49H4cKF9W6QVBERFy9e1PeS57Rs2VLLHBIREeVEefPm1aBESMUt+X0rJCB5UFAiZOZky5YtWpVLSg9LrspLL71knKWMwsCEKJNJpQ+5C9O7d29s3rwZ27Zt06llKVc4adIkLF68WEsSjhkzBnv37tU7Pfv27cPNmzexZs0afc1vv/2mAU7jxo3xww8/6PtKUOPt7a0fpNWqVdPgRF5DRERED09+v8rvYukUf+TIkTQn0tOjY2BClAXq16+P9u3bo0KFCmjevLlW/5CmTv/8848GKWPHjtVp6ODgYOMVwGuvvYZy5crp7Enfvn11VkUaP8lrJXiZPn26zpasWLFCZ1POnz+PM2fOGK8mIiKih2Fra4s6deqgR48e+juXMh4DE6IsYJ5SFlKaUNayrlu3Dg0aNMClS5f0g1CCkOSSl0L09PQ09pLILIwEMjI9LRVIZApalntJwh4RERGRJWBgQpRNyEyHzKJIgyipHCIda9NKAhVZBysda6V2e5UqVfDtt99qMykiIiIiS8DAhCgL5M5955+ezG7I1qtXL80bkYT2jh07apDy1ltvGc+6I/lrhbkZlAQ048aN0+VcslRMShymJcGPiIiIKDtguWCiDPIo5WSlS60s5ZIcESEVuTw8PHQ/rQIDA3XmRGqwU8ZhuWAiokz0kOWCKZthuWAiyyOJduagRDxsUCJKlSrFoISIiIgsDmdMiDKI3FEn68YZEyKiTMIZE8uWxp8fAxOiDBIbmvbkdbJMTh53V04jIqIMcp8LW+nZJZusOngUj/t6SgMGJkRERERkFe5zYTt58mTs2LFDmxQ/innz5mHatGmYM2eOMULpLo2BCXNMiIiIiIgoyzEwISIiIiKLJr2/6tatqwVkvvrqK1y7dg2yKEhK50sZ/cqVK2PChAk6JubOnatjss2YMUPHRo0ahY8++kj3xYgRIzB27FjjiDIDAxMiIiIismibNm3Sfl4LFizAlClTsGrVKuzevRs//fSTBiHfffedBh7btm1DTEwMOnfujDfffBNTp07FgQMH9D3q1Kmjz7tx44ZuY8aM0THKPAxMiIiIiMiiNWvWDK1bt0bVqlXRr18/DVBk6927N+rVq4cmTZrghRdewKxZs7B27VpUqlRJz8nzn3/+eX0PeZ6bmxvWrVuH9evXw9vbG7Vr19ZzlDkYmBARERGRRfP19TX2AHt7e+TOnRtnzpyBl5eXMQqdBRHBwcEoWLCg7ou8efPqo7ymf//++Pvvv/HXX39pwJIrVy49R5mDgQkRERERWbRly5YhNDQU4eHhWl2rbdu26Nixo+5HRkZqMCLVt2RWRTZ5fmBgIOLi4u6qxtWjRw9Mnz5dt549exqjlFkYmBARERGRxZJZjXz58qFYsWJwd3eHg4ODLu1q2bKlnvfz80OBAgV0lqRx48b6+Nprr8Hf318T4+Pj4/V5omzZsrpVr14dJUqUMEYps7CPCRERERFlb2nogyGVuEJCQu5a1iWXubKkS4KV5Mu3xIULF+Do6AhPT09jJEnTpk0xaNAgPP3008YIPbY0/PwEZ0yIiIiIyOJJkJE8KBEymyIzKfcGJUKemzwoOX/+PLp27YqLFy+iU6dOxihlJgYmRERERJTjyXKwAQMGYN++fbCzszNGKTMxMCEiIiKiHM/FxQVPPvmkLvuirMHAhIiIiIiIshwDEyIiIiIiynIMTIiIiIiIKMsxMCEiIiIioizHwISIiIiIiLIcAxMiIiIiIspyDEyIiIiIiNLBjRs3jL20SUhI0O70lISBCRERERHRPZYvX67NFtPqypUrsLe3N47SpnLlytizZ49x9F/h4eH46aefjCPrx8CEiIiIiOgef/zxBzZv3mwcZY2rV6/irbfeMo6sHwMTIiIiIrJYshTqk08+gaurK8qXL49ff/1Vx7t3745PP/0UJUuW1Av8bdu2oW7duvDx8UG/fv10NkLMmTPn9njPnj0RExOD2bNn6/iIESOwcuVKXLx4EV27dtXntGzZEocPH9bXHjp0CE2bNtWvMXz4cB27n4iICPTu3RuFCxdGr1699PsyGzlyJMqUKaObfF3xzDPPICoqCp06ddJj+bPJefl6n332GW7evKnj1oKBCRERERFZrN27d+Pnn3/G3r17MXXqVAwZMgRhYWEIDAzEjBkzMGHCBOTLl08v8vv374+1a9fqsqthw4ZpTkiXLl00gJHnS1Ai79GxY0e0bt0ab7/9Nho3bqxBg7e3N7Zs2YJq1appcCJBweDBg1G1alX8888/CA0NNb6j1H3//fca5CxevBiVKlXC5cuXdXzr1q2YNGmSjsv3N2bMGP3zTJw4EXnz5sW0adNw7tw5/bNNmTLl9jZ9+nR9vbVgYEJEREREFmvRokXo06cPihcvjpo1a2LHjh2wtbXVczKTIkHE/v37cfLkSSQmJmL9+vU64yA5JHZ2djh79iwuXbqkwYAEORI4SK5Injx54OzsrO8jAYDMlqxYsUJnO86fP6+BgwQRH3zwAcqWLauBzoPMmzcPQ4cORcWKFfH6668bo0CtWrU0uFm9ejXGjh2rsyTBwcE6CyTkUV7r7++PAwcO4MiRIzpzsm7dOj1vLRiYEBEREZHFkoBDZhXMZN8cmEgwIS5cuKDjEpjIJhf1ErTIzIos/9q0aRNKlCihy7LuFRkZqYGCg4ODvjZXrlwYP3787Qpc5q/t4uKij/cjAY2np6fuy/dofq0EGA0aNNAAqU6dOihXrpyOJyczJhIsmf8M7dq10+Vl1oSBCRERERFZrA4dOmD+/PkaQMjFu8xexMbGGmeTNG/e/Pbjyy+/jOvXr+vsh+SdiB9//BGdO3fWmQgzCUDi4+M1kGjVqhUKFCiAQYMGoUqVKvj222+1olbp0qU1F0XyXCQv5UF69OiBWbNmaZngNWvWaMAj5Htp37695qnI0jDJXTGT50ggIt+fBFLPPvus5sjIsrITJ04Yz7IOuUx/kSyeTERERETZl+lydVm3zmg1e64xcIcEIW3btsW///6rMwpycS+5H9WrV8d3332nMxFCcjIkqVyCEiFJ7RJY1KtXTxPhZVwCkD///FOXdMmyqhdffFHzPtzc3PDqq6/qjIfkhUjFLkmUlyBDgo38+fOjQoUK+pr7XVqbk+Xj4uI0Z0W+pixFk9mTZs2awcvLS/eLFi2KM2fO6LK0gIAA+Pr66rIxWf41c+ZMfb3kqCxZsuSu2aJs6z4/v+QYmBARERFR9paGC1tZBiUX++ZlXCmR5Vey9EtyTJI/T/JMChUqpGMyKyGBSO7cubWKlizRsrGx0edJgrzMnCRftiVBjTxPggkhlbZS6k0ieSuNGjXSWRiZ2SlWrNhd34PMosifQXJYhCTTe3h4aJK9BF/mrylfT75HyamxGAxMiIiIiMgqpPHCNjuQ5PkNGzYYR3dIjoq57G+Ow8CEiIiIiKyCcWFbqlsPY4AsTeCfMxmYEBEREZGFM12u7vjkwQ0MKXur+fFIYy9lDEyIiIiIiCjLsVwwERERERFlOQYmRERERESU5RiYEBERERFRlmNgQkREREREWY6BCRERERERZTHg/wFPI2pFpDc1kgAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "48e9a85f", + "metadata": {}, + "source": [ + "### Looking at our graph data\n", + "\n", + "As we examined the data model in the previous notebook, we are not going to examine it, however we will leave the data schema for reference.\n", + "\n", + "![dining-by-friends.png](attachment:dining-by-friends.png)" + ] + }, + { + "cell_type": "markdown", + "id": "ab986dac", + "metadata": {}, + "source": [ + "\n", + "## Looping\n", + "\n", + "When working with any property graph, some of the most powerful queries you can write are ones where the number of connections between a source and a target entity is not known. These types of queries are so common that property graph query languages, such as Gremlin, have first class support as a key piece of the query language. In Gremlin, these queries are written using a mechanism known as Looping and Repeating. Loops allow us to specify a sequence of nodes and relationships, whilst Repeats allow us to specify the number of times to repeat the relationship in the pattern matching syntax, or until an additional pattern has been matched.\n", + "\n", + "In Gremlin, a basic loop query to find all nodes within 1 to 3 hops looks like:\n", + "\n", + "```\n", + " g.V().repeat( out() ).times(3)\n", + "```\n", + "\n", + "Examining this query we see that there are two defined parts to a loop in Gremlin. The first is the `repeat()` step, which acts as a wrapper to the traversal pattern that we'd like to use. The second part defines the *limit* to be applied to the repeat (we don't want to keep traversing indefinitely!) The *limit* portion can be applied using three different mechanisms, as shown in the list below:\n", + "\n", + "* `times()` - used to specify the exact number of times a `repeat()` pattern is to be executed\n", + "* `until()` - used to specify a traversal pattern that, once satisfied, will stop the `repeat()` for a traversal\n", + "* `loops()` - used to extract the number of times a traversal has gone through the current loop" + ] + }, + { + "cell_type": "markdown", + "id": "14b59d03", + "metadata": {}, + "source": [ + "### Diving deeper into `repeat()` ###\n", + "\n", + "The `repeat()` step also supports two 'modulators'; `until()` and `emit()`, which can be both used before or after the `repeat()` step. Using the `until()` step before the `repeat()` is similar to the common [`while...do`](https://www.w3schools.com/java/java_while_loop.asp) programming paradigm, whereas using the `until()` _after_ the `repeat()` is similar to the [`do...while`](https://www.w3schools.com/cpp/cpp_do_while_loop.asp) concept.\n", + "\n", + "The `emit()` modulator works by returning the results of a traversal as it is executed, and can be useful when used in conjunction with other looping-limiting steps such as `times()`. An example of this is the query below where we want to limit the `repeat()` to two hops, however we also want to return paths which include only one hops." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "37564e65", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".repeat(\n", + " out()\n", + ")\n", + ".emit()\n", + ".times(2)\n", + ".path()" + ] + }, + { + "cell_type": "markdown", + "id": "7553a654", + "metadata": {}, + "source": [ + "We can also place the `emit()` modulator _before_ the `repeat()` step. This will cause the result in the previous step in the query to be emitted before the results that follow.\n", + "\n", + "Run the following example, and notice that `Dave` is returned ahead of the results from the `repeat()`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "caef7b44", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + " .hasLabel(\"person\")\n", + " .has(\"first_name\",\"Dave\")\n", + " .emit()\n", + " .repeat(\n", + " out().hasLabel(\"person\")\n", + " )\n", + " .times(3)\n", + " .limit(10)\n", + " .path()" + ] + }, + { + "cell_type": "markdown", + "id": "5bfe8e31", + "metadata": {}, + "source": [ + "Compare this with the output of the following query that doesn't use `emit()` prior to the `repeat()`. You'll notice that `Dave` is no longer included as a path by themselves." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "034bcde1", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + " .hasLabel(\"person\")\n", + " .has(\"first_name\",\"Dave\")\n", + " .repeat(\n", + " out().hasLabel(\"person\")\n", + " )\n", + " .times(3)\n", + " .limit(10)\n", + " .path()" + ] + }, + { + "cell_type": "markdown", + "id": "f28802bc", + "metadata": {}, + "source": [ + "Now that we have a basic understanding of Gremlin's loop syntax, let's look at how this is applied to answer some common graph query patterns.\n", + "\n", + "### Static Number of Hops\n", + "\n", + "The simplest looping pattern you can do in Gremlin is to specify a fixed number of hops for your pattern. This is accomplished using the `times()` step. Let's execute the query below to traverse outwards by 2 hops, and return the path." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deabe58e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".repeat(\n", + " out()\n", + ")\n", + ".times(2)\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "attachments": { + "looping-example-v2.gif": { + "image/gif": "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" + } + }, + "cell_type": "markdown", + "id": "ec458d20", + "metadata": {}, + "source": [ + "### Explaining the previous Gremlin query\n", + "\n", + "Using the `repeat()` step, we told Gremlin to traverse all **outgoing** edges **2 times**. The graphic below demonstrates how Gremlin creates additional traverses when there are multiple outgoing edges to follow.\n", + "\n", + "![looping-example-v2.gif](attachment:looping-example-v2.gif)" + ] + }, + { + "cell_type": "markdown", + "id": "c2178818", + "metadata": {}, + "source": [ + "### Variable Number of Hops\n", + "\n", + "While the example above works on a static number of hops, sometimes we do not know the number of connections we need to traverse to answer a question. In this case, we can use the `until()` step to specify an additional pattern that will stop a traverser once the condition is met." + ] + }, + { + "cell_type": "markdown", + "id": "df52d879", + "metadata": {}, + "source": [ + "**Note**. The performance of graph queries depend on how much of the graph needs to be traversed. It's important that you have an optimal graph data model to ensure fan-out is kept to a minimum, or large portions of your graph aren't traversed when they don't need to be.\n", + "\n", + "Execute the query below to see how many paths are connected via any number of `friends` edges. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "651a0f21", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " bothE()\n", + " .hasLabel(\"friends\")\n", + " .otherV()\n", + " .hasLabel(\"person\")\n", + ")\n", + ".until(\n", + " not(out().hasLabel(\"person\"))\n", + ")\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "81777d83", + "metadata": {}, + "source": [ + "We can also do the same using `outE()` and `inV()` steps, ensuring we're only traversing in one direction." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "64e01107", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " outE()\n", + " .hasLabel(\"friends\")\n", + " .inV()\n", + " .hasLabel(\"person\")\n", + ")\n", + ".until(\n", + " not(out().hasLabel(\"person\"))\n", + ")\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "07ab8a08", + "metadata": {}, + "source": [ + "Now execute the following query to limit the number of times we repeat our loop along the `friends` edges:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b417d5e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " bothE()\n", + " .hasLabel(\"friends\")\n", + " .otherV()\n", + " .hasLabel(\"person\")\n", + ")\n", + ".until(\n", + " loops().is(2)\n", + ")\n", + ".path()\n", + ".by(elementMap())\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "807eef5a", + "metadata": {}, + "source": [ + "There is a 'gotcha' when combining filtering using `has()` and looping using `until()` or `loops()`. \n", + "\n", + "As we saw in the `01-Basic-Read-Queries` notebook, `has()` provides the functionality to filter on the existence of a specific property, or match based on a property value. We can use this when looping through our graph to stop when we match the specified criteria. For example;" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "154f043a", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " bothE()\n", + " .hasLabel(\"friends\")\n", + " .otherV()\n", + " .hasLabel(\"person\")\n", + ")\n", + ".until(\n", + " has(\"first_name\",\"Dave\")\n", + " .or(loops().is(2))\n", + ")\n", + ".path()\n", + ".by(elementMap())" + ] + }, + { + "cell_type": "markdown", + "id": "8213e885", + "metadata": {}, + "source": [ + "What we're asking in the above query is:\n", + "\n", + "*\"traverse from every person node across the friends edge to another person node, and loop until the first_name property matches \"Dave\" or we've repeated 3 iterations\"*\n", + "\n", + "However, it doesn't quite work in the way that we expect it to. This is common misconception. Whilst we're filtering using `has()` in the `until()` step, no additional filtering is performed on the `or(loops().is(3))` step resulting in additional objects we're not interested in. To mitigate this, we need to apply the same `has()` filtering to the output of the `until()` as follows:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b0ff391", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " bothE()\n", + " .hasLabel(\"friends\")\n", + " .otherV()\n", + " .hasLabel(\"person\")\n", + ")\n", + ".until(\n", + " has(\"first_name\",\"Dave\")\n", + " .or(loops().is(2))\n", + ")\n", + ".has(\"first_name\",\"Dave\")\n", + ".path()\n", + ".by(elementMap())" + ] + }, + { + "cell_type": "markdown", + "id": "ad636a93", + "metadata": {}, + "source": [ + "### Cyclic Paths ###\n", + "\n", + "When repeating a traversal in Gremlin using the `repeat()` it's common to come across a pattern whereby the path loops back on itself. This is called a cyclic path, and can lead to your Gremlin queries looping forever.\n", + "\n", + "To stop this from occurring, it's good practise to include the `simplePath()` step. This removes paths with repeated objects, thus ensuring cyclic paths are not traversed.\n", + "\n", + "**Important**. The `simplePath()` filters for repeated object based on the previous step, such as `in()` or `out()`.\n", + "\n", + "The following query provides an example of combining `simplePath()` with the `out()` step to filter on all connected `person` vertices.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e1c9425", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + ".hasLabel(\"person\")\n", + ".repeat(\n", + " out()\n", + " .hasLabel(\"person\")\n", + " .simplePath()\n", + ")\n", + ".until(\n", + " not(out().hasLabel(\"person\"))\n", + ")\n", + ".path()\n", + ".limit(10)" + ] + }, + { + "cell_type": "markdown", + "id": "974bbde5", + "metadata": {}, + "source": [ + "\n", + "### Visualising Results in a Neptune Notebook\n", + "\n", + "A key part of using any graph database is being able to visualise the way the objects stored within it are connected to each other. We've already shown how to do this in previous examples, however it's important to understand which of the Gremlin steps support this type of functionality.\n", + "\n", + "* `path()` - used to provide access to all nodes and edges within each unique path traversed\n", + "* `simplePath()` - used to ensure we don't repeat a traversal across an object we've already covered (this can lead to infinite looping if the model supports circular references)\n", + "\n", + "If you're running this in a Neptune Notebook, we can use the `path()` step we tell the notebook to automatically present a visualisation of the output of a query. The following query returns 10 paths visualising the connections between `person`, `city`, `restaurant` and `cuisine`. Run the following query, and a graphical visualisation will automatically appear." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4a54b895", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + " .hasLabel(\"person\") // start with all person nodes\n", + " .out(\"lives\") // traverse the outbound \"lives\" edge to city\n", + " .in(\"within\") // traverse the inbound edge from city to restaurant\n", + " .where(__.inE(\"about\")) // filter on restaurants where at least one review exists\n", + " .out(\"serves\") // traverse the outbound edge from restaurant to cuisine\n", + " .path() // return the path\n", + " .limit(10) // only return 10 results" + ] + }, + { + "cell_type": "markdown", + "id": "dcfe37a1", + "metadata": {}, + "source": [ + "Additionally, you can combine `path()` with the `by()` modulator along with the `valueMap()` or `values()` steps to return some or all of the non-internal property values stored against the objects within a path. The following query builds upon what we've already run, by returning all non-internal values as a map." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "859ca5de", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + " .hasLabel(\"person\") // start with all person nodes\n", + " .out(\"lives\") // traverse the outbound \"lives\" edge to city\n", + " .in(\"within\") // traverse the inbound edge from city to restaurant\n", + " .where(__.inE(\"about\")) // filter on restaurants where at least one review exists\n", + " .out(\"serves\") // traverse the outbound edge from restaurant to cuisine\n", + " .path() // return the path\n", + " .by(\n", + " valueMap() // return all the non-internal properties of all vertices within the path\n", + " )\n", + " .limit(10) // only return 10 results" + ] + }, + { + "cell_type": "markdown", + "id": "ddc1ee5b", + "metadata": {}, + "source": [ + "The following query returns only a single property value by using the `values()` step instead of `valueMap()`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "26bf25b5", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V()\n", + " .hasLabel(\"person\") // start with all person nodes\n", + " .out(\"lives\") // traverse the outbound \"lives\" edge to city\n", + " .in(\"within\") // traverse the inbound edge from city to restaurant\n", + " .where(__.inE(\"about\")) // filter on restaurants where at least one review exists\n", + " .out(\"serves\") // traverse the outbound edge from restaurant to cuisine\n", + " .path() // return the path\n", + " .by(\n", + " values('first_name','name') // return only the first_name or name property value (whichever is applicable)\n", + " )\n", + " .limit(10) // only return 10 results" + ] + }, + { + "cell_type": "markdown", + "id": "ec12aeca", + "metadata": {}, + "source": [ + "**Important**. It's worth noting that in the above query, just specifying `first_name` or `name` will result in no records being returned. This is because neither are properties across **all** vertices in our data model. For example, the `Person` vertex uses `first_name`, and all other vertices use `name` to store the name of the object. In this case, we can list the different properties and Gremlin will associate whichever property is applicable to whichever vertex.\n", + "\n", + "We will dive more into using `valueMap()` and `values()` in the next section." + ] + }, + { + "cell_type": "markdown", + "id": "85de2ce8", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "Now that we have gone through the basics of looping and repeating queries in Gremlin, it's time to put it into practice. Below are several exercises you can complete to verify your understanding of the material covered in this notebook. As practice for what you have learned, please write the Gremlin queries specified below.\n", + "\n", + "### Exercise 1: Find the friends of Dave's Friends using a loop\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer is a three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3d1cc0f0", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "6521e66f", + "metadata": {}, + "source": [ + "### Exercise 2: Find all `person` nodes connected to Dave\n", + "\n", + "Starting at a single node and trying to find all connected children (a.k.a. root to leaf) or trying to find the parent of any child node (a.k.a leaf to root) are two very common hierarchical graph query patterns. Commonly, these queries supported bill of materials, information organization, or compliance use cases.\n", + "\n", + "In this exercise, we will be applying that same query pattern to find the hierarchy of people within our social network. We'll accomplish this by writing a \"root to leaf\" type query where the root node is our `Dave` node in the social network.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Keep traversing the outgoing `friends` edge until there are no more outgoing `friends` edges\n", + "* Return all the paths\n", + "\n", + "The correct answer has 5 results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "10b4aa1f", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "0ce0b6c8", + "metadata": {}, + "source": [ + "### Exercise 3: Find all the ways Dave and Denise are connected\n", + "\n", + "A common extension to the path traversal query we wrote in Loop-3 is to return not just \"if\" someone is connected but \"how\" they are connected.\n", + "\n", + "In this exercise, we will be making a slight modification to the previous query to return \"how\" Dave and Denise are connected, not just that they are.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Keep traversing the `friends` edge until you find `Denise`\n", + "* Return the path\n", + "\n", + "The correct answer has 3 results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "007a9efd", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "b5acefc5", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we explored writing looping and repeat queries in Gremlin. These queries are a powerful and common way to explore connected data to answer questions, especially those where the exact number of connection is unknown. \n", + "\n", + "In the next notebook we will take what we have learned in this notebook and extend it to demonstrate how to order, group, and aggregate values in queries." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/03-Ordering-Functions-Grouping.ipynb b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/03-Ordering-Functions-Grouping.ipynb new file mode 100644 index 00000000..6083bf87 --- /dev/null +++ b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/03-Ordering-Functions-Grouping.ipynb @@ -0,0 +1,824 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eab505f3", + "metadata": {}, + "source": [ + "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n", + "SPDX-License-Identifier: Apache-2.0\n", + "\n", + "# Learning Gremlin - Ordering, Functions, and Grouping\n", + "\n", + "This notebook is the third in a series of notebooks that walk through how to write queries using Gremlin. \n", + "\n", + "In this notebook, we will examine the basics of how to perform ordering, grouping, and aggregation in Gremlin. This notebook assumes that you have already completed the previous notebook \"01-Basic-Read-Queries\" so we will continue our lessons from the end of the previous notebook and assume that the data has been loaded into the cluster." + ] + }, + { + "cell_type": "markdown", + "id": "0c12469c", + "metadata": {}, + "source": [ + "### Setting up the visualizations\n", + "\n", + "Run the next two cells to configure various display options for our notebook, which we will use later on to display our results in a pleasing visual way. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e655017", + "metadata": {}, + "outputs": [], + "source": [ + "%%graph_notebook_vis_options\n", + "{\n", + " \"groups\": { \n", + " \"person\": {\n", + " \"color\": \"#9ac7bf\"\n", + " },\n", + " \"review\": {\n", + " \"color\": \"#f8cecc\"\n", + " },\n", + " \"city\": {\n", + " \"color\": \"#d5e8d4\"\n", + " },\n", + " \"state\": {\n", + " \"color\": \"#dae8fc\"\n", + " },\n", + " \"review_rating\": {\n", + " \"color\": \"#e1d5e7\"\n", + " },\n", + " \"restaurant\": {\n", + " \"color\": \"#ffe6cc\"\n", + " },\n", + " \"cusine\": {\n", + " \"color\": \"#fff2cc\"\n", + " }\n", + " }\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5c80800", + "metadata": {}, + "outputs": [], + "source": [ + "node_labels = '{\"person\":\"first_name\",\"city\":\"name\",\"state\":\"name\",\"restaurant\":\"name\",\"cuisine\":\"name\"}'" + ] + }, + { + "cell_type": "markdown", + "id": "111cfabb", + "metadata": {}, + "source": [ + "We'll be using the `node_labels` variable to provide a nicer visualisation when running the queries in this notebook. To use it, we need to pass it along with the query itself, as follows:\n", + "\n", + "`%%gremlin -d node_labels`\n", + "\n", + "The `-d` instructs the notebook as to which properties should be displayed for each specified node label." + ] + }, + { + "attachments": { + "dining-by-friends.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "48e9a85f", + "metadata": {}, + "source": [ + "### Looking at our graph data\n", + "\n", + "As we examined the data model in the previous notebook, we are not going to examine it, however we will leave the data schema for reference.\n", + "\n", + "![dining-by-friends.png](attachment:dining-by-friends.png)" + ] + }, + { + "cell_type": "markdown", + "id": "ab986dac", + "metadata": {}, + "source": [ + "\n", + "## Ordering Results\n", + "\n", + "When working with data, one common requirement is to return that data in a consistent and ordered fashion. \n", + "\n", + "By default, data returned from an Gremlin query does not have a specified order, and consistent order cannot be assumed across multiple executions of the same query. To give our data a consistent order we must use the combination of the `order()` and `by()` steps. These enable you sort your results using the values that a query can return, such as nodes/edges, ID values, as well as via many expressions. \n", + "\n", + "**Note** When the data being ordered contains a `null` value, these will be sorted to the end of the results for ascending sort order and the beginning of the list for descending sort order.\n", + "\n", + "\n", + "### Ordering by a property\n", + "\n", + "The simplest ordering in Gremlin is to specify a single property. This is accomplished using the `order().by()` syntax. By default, items are ordered in ascending order and descending order can be specified using `order().by(, desc)`. \n", + "\n", + "Let's first look at what our data looks like to find all the `restaurant` nodes in our graph and return the `name` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7a0df81", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant')\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "91e99c64", + "metadata": {}, + "source": [ + "As we see, there is no discernible order to the values returned. \n", + "\n", + "Let's see how to order our data by executing the query below to find all the `restaurant` nodes in our graph and order them by the `name` property in descending order." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deabe58e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant')\n", + ".order()\n", + ".by('name', desc)\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "4eee92c8", + "metadata": {}, + "source": [ + "As we see, with the addition of the `order().by()` steps we get our data returned in a nice organized manner. \n", + "\n", + "### Ordering by multiple properties\n", + "\n", + "A common need when ordering data is to use multiple properties as the ordering criteria. In Gremlin, this is achieved by adding multiple `by()` steps to the `order()` step. When multiple properties are specified, the results are first ordered by the first property, then for equal values, the next property, and so on for all the specified properties. \n", + "\n", + "Let's see how this works by executing the query below to find all the `restaurant` nodes in our graph and order them by the `name` property, then by the `address` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "168bcc76", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant')\n", + ".order()\n", + ".by('name',desc)\n", + ".by('address',asc)\n", + ".valueMap('name','address')" + ] + }, + { + "cell_type": "markdown", + "id": "6d36e1dd", + "metadata": {}, + "source": [ + "You can also use internal properties such as `id` and `label` as the ordering criteria. In the examples below, we first show how to order by the object `id`, and then show how to order by the object `label`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "55f2aaf9", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\")\n", + ".order().by(id)\n", + ".values('name')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c63b78f6", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\",\"state\")\n", + ".order().by(label, desc)\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "55c2ef57", + "metadata": {}, + "source": [ + "**Important**: Ordering a small set of data (<1M records) in Neptune should be performant. However, when ordering larger data sets (+1M records), it's likely to experience high latency. In this scenario, the recommendation is to query for the results, then use a caching layer such as [Redis Sorted Sets](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/elasticache-use-cases.html#elasticache-for-redis-use-cases-gaming) to perform the ordering and return the data back to the client." + ] + }, + { + "cell_type": "markdown", + "id": "9b78432a", + "metadata": {}, + "source": [ + "### Pagination\n", + "\n", + "One of the most common requirements for applications is the ability to return the data in chunks, or pages in the response. Gremlin supports pagination through the use of three steps: `range()`, and `skip()` and `limit()`. \n", + "\n", + "We have already used the `limit()` step to specify the maximum number of entities returned. When used with the `skip()` step, which specifies the number of records to ignore at the beginning of the result set, we can create an effective pagination mechanism. One important thing to note about pagination is that we need to explicitly order the results to retrieve a consistent set of data in our pages. Without ordering the results, we have no guarantee that results will be returned in a constant order, meaning that the data shown for a specific \"page\" may differ between calls.\n", + "\n", + "Let's take a look at how we could use `skip()` and `limit()` to present a paginated view of the restaurants in our graph by retrieving the first page of results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0335cb50", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\")\n", + ".order().by(\"name\")\n", + ".skip(0)\n", + ".limit(10)\n", + ".values(\"name\")" + ] + }, + { + "cell_type": "markdown", + "id": "70d12ad6", + "metadata": {}, + "source": [ + "Let's see what it looks like to retrieve the second page of data. To accomplish this, we need to set the value in the `skip()` step to represent the page size we would like to skip." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7371ac06", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\")\n", + ".order().by(\"name\")\n", + ".skip(10)\n", + ".limit(10)\n", + ".values(\"name\")" + ] + }, + { + "cell_type": "markdown", + "id": "978fff4c", + "metadata": {}, + "source": [ + "As we see, the data we retrieve from the second query represents the second page of results returned from our query. Please don't hesitate to try additional values for the `skip()` and `limit()` values to see how the query reacts.\n", + "\n", + "Let's now take a look at how we can use the `range()` step to perform pagination in Gremlin." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6cd418c3", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\")\n", + ".order().by(\"name\")\n", + ".range(0,10)\n", + ".values(\"name\")" + ] + }, + { + "cell_type": "markdown", + "id": "48c15eac", + "metadata": {}, + "source": [ + "Let's see what it looks like to retrieve the second page of data. To accomplish this, we need to set the value in the `range()` step to represent the page size we would like to return." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b34b445a", + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel(\"restaurant\")\n", + ".order().by(\"name\")\n", + ".range(10,20)\n", + ".values(\"name\")" + ] + }, + { + "cell_type": "markdown", + "id": "a0c9db04", + "metadata": {}, + "source": [ + "When should you use one approach over the other? In some cases, both `limit()` and `skip()` are shorthand alternatives to `range()`. For example, to retrieve all restaurants from the 10th record to the end of the list, we can use the following approaches:\n", + "\n", + "`g.V().hasLabel(\"restaurant\").skip(5)`\n", + "\n", + "or\n", + "\n", + "`g.V().hasLabel(\"restaurant\").range(5,-1)`\n", + "\n", + "**Important**. When using pagination it's important to understand that even though you're returning a range of records, the query must still retrieve all records and then filter out records outside of the range you're asking for. Therefore, pagination does not improve query performance. Instead, you should use the [Gremlin query results cache](https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-results-cache.html).\n", + "\n", + "The results of both queries are the same, as is the amount of time to execute each query.\n", + "\n", + "Now that we have looked at the ordering and pagination in Gremlin, it's time to take a look at another major set of functionality in formatting Gremlin results, grouping." + ] + }, + { + "cell_type": "markdown", + "id": "952c7825", + "metadata": {}, + "source": [ + "## Grouping Results\n", + "\n", + "Grouping results in Gremlin is done by explicitly calling the `group()` or `groupCount()` steps, similar to the `GROUP BY` clause used in SQL. In Gremlin, grouping is also controlled by the use of aggregating expressions containing one or more aggregating functions (`mean()`, `count()`, `max()`, `min()`, `sum()`).\n", + "\n", + "Groups are determined by the use of the `by` modulator step that proceeds either a `group()` or `groupCount()` step. Let's look at an example to understand how this works.\n", + "\n", + "**Example**\n", + "\n", + "|id|first_name|\n", + "|---|---|\n", + "|1|Dave|\n", + "|2|Josh|\n", + "|3|Kelly|\n", + "|4|Dave|\n", + "\n", + "```\n", + "g.V()\n", + ".groupCount()\n", + ".by('first_name')\n", + ".unfold()\n", + "```\n", + "Results:\n", + "\n", + "|result|\n", + "|---|\n", + "|{'Dave': 2}|\n", + "|{'Josh': 1}|\n", + "|{'Kelly': 1}|\n", + "\n", + "In this example, we're counting the number of each occurrence of the `first_name` property value, and then returning it alongside the `first_name` value itself. Similarly, we could use the `group()` step instead, and combine it with the `count()` aggregation function in a second `by` modulation to do the same thing:\n", + "\n", + "```\n", + "g.V()\n", + ".group()\n", + ".by('first_name')\n", + ".by(count())\n", + ".unfold()\n", + "```\n", + "Results:\n", + "\n", + "|result|\n", + "|---|\n", + "|{'Dave': 2}|\n", + "|{'Josh': 1}|\n", + "|{'Kelly': 1}|" + ] + }, + { + "cell_type": "markdown", + "id": "57de99aa", + "metadata": {}, + "source": [ + "Before we start on grouping, let's learn about `fold()` and `unfold()` steps, as no doubt the keen eyed amongst you will have noticed that we've been using the `unfold()` step in some of the previous examples.\n", + "\n", + "### Fold and Unfold\n", + "\n", + "The `fold()` step converts individual rows into a list in a single row. The following query is an example of returning all restaurants as a list, rather than individual records." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dcd6555c", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('restaurant')\n", + ".values('name')\n", + ".fold()\n", + "\n", + "// Results in:\n", + "// [\"Perryman's\", 'Spicy Heat', 'Rare Choice', 'Super Delish', 'Eastern Winds', 'Saucy-Cheesy-Saucers', 'With Pasta', 'With Brine', 'With Wine', 'U-S-A', 'Pick & Go', 'Rare Bull', 'Satiated', 'Good Bull', 'Southern Fire', 'With Salsa', 'With Curry', 'With Shell', 'Taters', 'Awesome Suace', 'Prancing Pony', 'Mexican Hut', 'Rabbitfood', 'Hand Roll', 'Northern Quench', 'Western Granola', 'With Noodles', 'With Sauce', 'Without Chaser', 'With Rice', 'Food For Thought', \"Dave's Big Deluxe\", 'Quick N Greasy', 'Lonely Grape', 'Breaded & Fried', 'All Night Long', 'Black Pit of Des Pair', 'Without Heat', 'With Ginger', 'Fat Fried Fast']" + ] + }, + { + "cell_type": "markdown", + "id": "507d044c", + "metadata": {}, + "source": [ + "The `unfold()` step does the opposite, converting a single row of list values into individual rows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9db81493", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('restaurant')\n", + ".values('name')\n", + ".fold()\n", + ".unfold()\n", + "\n", + "// Results in:\n", + "//1 Perryman's\n", + "//2 Spicy Heat\n", + "//3 Rare Choice\n", + "//4 Super Delish\n", + "//5 Eastern Winds\n", + "//6 Saucy-Cheesy-Saucers\n", + "//7 With Pasta\n", + "//8 With Brine\n", + "//9 With Wine\n", + "//10 U-S-A" + ] + }, + { + "cell_type": "markdown", + "id": "821a71e4", + "metadata": {}, + "source": [ + "### Group by a property\n", + "\n", + " the query below, returns all the `person` nodes along with the number of nodes with the matching `first_name` property, and ordered by the `first_name` property in **ascending** order." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f66d367b", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin -d $node_labels\n", + "g.V().hasLabel('person')\n", + ".groupCount()\n", + ".by('first_name')\n", + ".order()\n", + ".by('first_name')\n", + ".unfold()" + ] + }, + { + "cell_type": "markdown", + "id": "2c92cf2e", + "metadata": {}, + "source": [ + "### Group on a pattern match\n", + " \n", + "Another common need is to use multiple different elements in a pattern to perform a grouping/aggregation query. To accomplish this, we combine what we know about filtering with what we have just learned about grouping to achieve this aggregation.\n", + "\n", + "Let's take a look at what it would look like to find the average rating of the restaurants in our graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f646e881", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('restaurant')\n", + ".group()\n", + ".by('name')\n", + ".by(in('about').values('rating').mean())\n", + ".unfold()" + ] + }, + { + "cell_type": "markdown", + "id": "60b2eab1", + "metadata": {}, + "source": [ + "## Combining Queries\n", + "\n", + "Now that we have learned about all the major features (finding, filtering, formatting, ordering, functions, and grouping) of Gremlin, we have one more topic to discuss in this notebook, how to combine traversals together to create more complex traversals. In Gremlin, we can achieve this by using the `union()` step.\n", + "\n", + "The `union()` step combines the results of 2 or more traversals together and returns the combined result from both traversals.\n", + "\n", + "Let's see what an example `union` step looks like:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "190af502", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant')\n", + ".union(\n", + " has('name','With Pasta'),\n", + " has('name','With Wine')\n", + ")\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "89545b7b", + "metadata": {}, + "source": [ + "We can also combine objects from previous traversals into a `union` step using aliases." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6328a541", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant').has('name','With Pasta').as('a')\n", + ".union(\n", + " select('a'),\n", + " __.V().hasLabel('restaurant').has('name','With Wine')\n", + ")\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "e31b0932", + "metadata": {}, + "source": [ + "An important point to note that `union` works in the same way as other Gremlin steps in that it uses the *incoming traversal* as its starting point. \n", + "\n", + "The following query traverses to the `With Pasta` restaurant and then uses a `union` step to combine the results with a traversal to the `With Wine` restaurants. Let's take a look at the results." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b049f90", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('restaurant').has('name','With Pasta').as('a')\n", + ".union(\n", + " select('a'),\n", + " hasLabel('restaurant').has('name','With Wine')\n", + ")\n", + ".values('name')" + ] + }, + { + "cell_type": "markdown", + "id": "f0c9a4e2", + "metadata": {}, + "source": [ + "Only one result was returned! This is because the second traversal in the `union` step *starts* from the **With Pasta** restaurant, and looks for a `restaurant` node with a `name` property value of **With Wine**. To resolve this, we need to use the `__` **anonymous traversal** technique to search the entire graph, irrespective of the previous traversal." + ] + }, + { + "cell_type": "markdown", + "id": "d29116ed", + "metadata": {}, + "source": [ + "## Optimizing Query Performance using Caching\n", + "\n", + "**Note:** Whilst not specific to wholly Gremlin, this section is useful to understand the different approaches to optimizing your query performance within Neptune.\n", + "\n", + "Amazon Neptune is a fully managed, memory-optimized graph database. As a result, it will try to store as much of your graph in the local memory of the instance that is executing the query in `Buffer Cache` - a specific local instance cache type - for fast query performance. When the required data is not in the buffer cache, Neptune must retrieve it from shared storage before adding it to the buffer cache, which adds to the latency of your queries.\n", + "\n", + "There are several caching mechanisms supported by Neptune:\n", + "\n", + "* `Buffer Cache` - This is an always-on caching technique, whereby Neptune allocates two-thirds of the memory of your instance for storing requested data. It works on a `FIFO` (First-In-First-Out) basis, meaning older cached data pages are removed first. The ratio of buffer 'hits' (queries that retrieve data from memory rather than shared storage) should always be >= 99.9%. You can monitor this using the [`BufferCacheHitRatio` CloudWatch metric](https://docs.aws.amazon.com/neptune/latest/userguide/cw-metrics.html).\n", + "\n", + "* `Results Cache` - (Gremlin only) This provides a mechanism to cache the results from a specific query on a per-instance basis. It is [disabled by default](https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-results-cache.html#gremlin-results-cache-enabling), and works on an `LRU` (Least Recently Used) basis, meaning older cached keys are removed first. See [Paginated cached query results](https://docs.aws.amazon.com/neptune/latest/userguide/gremlin-results-cache.html#gremlin-results-cache-paginating) for an example of combining results cache with the `range()` step. Note, this cannot be enabled on T instance types.\n", + "\n", + "* `Lookup Cache` - This is an always-on caching technique, but is **only available for D instances, e.g. R5d, and not Serverless**. It uses local instance SSD storage to store property values (strings) or RDF literals for fast retrieval. This can be useful when frequently returning or filtering on a large number of property values.\n", + "\n", + "As a general rule, you should look to optimise your queries by only filtering on, and returning properties that you need. \n", + "\n", + "In addition, monitoring your cluster and instance health using [CloudWatch metrics](https://docs.aws.amazon.com/neptune/latest/userguide/cw-metrics.html) can alert you to causes for query performance degradation.\n" + ] + }, + { + "cell_type": "markdown", + "id": "f5d352e5", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "Now that we have gone through the main concepts of Gremlin read queries, it's time to put it into practice. Below are several exercises you can complete to verify your understanding of the material covered in this notebook. As practice for what you have learned, please write the Gremlin queries specified below.\n", + "\n", + "For these exercises, we will be leveraging the majority of the different entities in our data to show how we would build a common graph pattern known as \"collaborative filtering\" which is often used to provide recommendations to users based on other's reviews. Collaborative filtering works on the idea that if two people share the same opinion on a topic, such as a restaurant, then they are more likely to share similar opinions on other topics. With a graph we can leverage these connections to help provide recommendations based on these patterns of connections. In these exercises, we will be recommending restaurants to our users based upon reviews.\n", + "\n", + "\n", + "### Exercise 1: What are the 3 highest rated restaurants?\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find the 3 highest average restaurant rating\n", + "* Find the associated `cuisine`\n", + "* Return the restaurant name, the cuisine name, and the average rating\n", + "* Order the results by average rating descending\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Cuisine|Avg Rating|\n", + "|---|---|---|\n", + "|Lonely Grape|bar|5.0|\n", + "|Perryman's|bar|4.5|\n", + "|Rare Bull|steakhouse|4.333333|\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36adacaf", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin" + ] + }, + { + "cell_type": "markdown", + "id": "04ab5b59", + "metadata": {}, + "source": [ + "### Exercise 2: Find the top 3 highest rated restaurants in the city where Dave lives\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find the average rating of restaurants in that city\n", + "* Find the top 3 average ratings\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|Dave's Big Deluxe|\t490 Ivan Cape|4.0|\n", + "|Pick & Go|4881 Upton Falls|3.75|\n", + "|Without Chaser|\t01511 Casper Fall|3.5|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dae9d211", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin" + ] + }, + { + "cell_type": "markdown", + "id": "678a243d", + "metadata": {}, + "source": [ + "### Exercise 3: Which Mexican or Chinese restaurant near Dave is the highest rated?\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find the restaurants in that city that serve 'Mexican' or 'Chinese' food\n", + "* Find the average rating of those restaurants\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "* Return the top 1 result\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|With Salsa|24320 Williamson Causeway|3.5|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f96b91e5", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "e93f266d", + "metadata": {}, + "source": [ + "### Exercise 4: What are the top 3 restaurants, recommended by his friends, where Dave lives? (Personalized Recommendation)\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find Dave's friends\n", + "* Find reviews written by Dave's friends in the city \"Dave\" lives in\n", + "* Find the average rating of those restaurants\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "* Return the top 3\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|Dave's Big Deluxe|490 Ivan Cape|4.0|\n", + "|With Salsa|24320 Williamson Causeway|4.0|\n", + "|Satiated|370 Hills Estates|3.666667|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "81e5d4bc", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin" + ] + }, + { + "cell_type": "markdown", + "id": "b5acefc5", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we explored ordering, functions, and grouping in Gremlin queries. These queries are a powerful and common way to format and mutate data within your graph. This is also the last notebook in the set dedicated to writing read queries. In the next notebook we will take a look at how to write queries that mutate data through insert, update, and delete operations." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/04-Creating-Updating-Deleting-Queries.ipynb b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/04-Creating-Updating-Deleting-Queries.ipynb new file mode 100644 index 00000000..6bf47551 --- /dev/null +++ b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/04-Creating-Updating-Deleting-Queries.ipynb @@ -0,0 +1,824 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eab505f3", + "metadata": {}, + "source": [ + "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n", + "SPDX-License-Identifier: Apache-2.0\n", + "\n", + "# Learning Gremlin - Create, Update, and Delete Queries\n", + "\n", + "This notebook is the fourth in a series of notebooks that walk through how to write queries using Gremlin. In this notebook, we will examine the basics of how to perform mutation operations, create/update/delete in Gremlin. This notebook assumes that you have already completed the previous notebook \"01-Basic-Read-Queries\" so we will continue our lessons from the end of the previous notebook and assume that the data has been loaded into the cluster." + ] + }, + { + "cell_type": "markdown", + "id": "0c12469c", + "metadata": {}, + "source": [ + "### Setting up the visualizations\n", + "\n", + "Run the next two cells to configure various display options for our notebook, which we will use later on to display our results in a pleasing visual way. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6e655017", + "metadata": {}, + "outputs": [], + "source": [ + "%%graph_notebook_vis_options\n", + "{\n", + " \"groups\": { \n", + " \"person\": {\n", + " \"color\": \"#9ac7bf\"\n", + " },\n", + " \"review\": {\n", + " \"color\": \"#f8cecc\"\n", + " },\n", + " \"city\": {\n", + " \"color\": \"#d5e8d4\"\n", + " },\n", + " \"state\": {\n", + " \"color\": \"#dae8fc\"\n", + " },\n", + " \"review_rating\": {\n", + " \"color\": \"#e1d5e7\"\n", + " },\n", + " \"restaurant\": {\n", + " \"color\": \"#ffe6cc\"\n", + " },\n", + " \"cusine\": {\n", + " \"color\": \"#fff2cc\"\n", + " }\n", + " }\n", + "}" + ] + }, + { + "attachments": { + "dining-by-friends.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "48e9a85f", + "metadata": {}, + "source": [ + "### Looking at our graph data\n", + "\n", + "As we examined the data model in the previous notebook, we are not going to examine it, however we will leave the data schema for reference.\n", + "\n", + "![dining-by-friends.png](attachment:dining-by-friends.png)" + ] + }, + { + "cell_type": "markdown", + "id": "ab986dac", + "metadata": {}, + "source": [ + "\n", + "## Creating Data\n", + "\n", + "When working with any database, one of the most common tasks is adding new data. To add new nodes, edges, or path in Gremlin we use the [`addV()`](https://tinkerpop.apache.org/docs/current/reference/#addvertex-step) step. \n", + "\n", + "\n", + "### Creating a node with a label and properties\n", + "The simpliest option to create a node in Gremlin is to do a query similar to this:\n", + "\n", + "```\n", + "g.addV()\n", + "```\n", + "This query will create a node with a default label (`vertex`) and no properties. If we wanted to return the newly created element, we could by adding a [`next()`](https://tinkerpop.apache.org/docs/current/reference/#terminal-steps) step like shown here:\n", + "\n", + "```\n", + "g.addV().next()\n", + "```\n", + "\n", + "We can also create multiple elements simultaneously by combining `addV()` steps, as seen here:\n", + "\n", + "```\n", + "g.addV().addV().next()\n", + "```\n", + "\n", + "While these examples help in understanding the basic syntax, they are not very realistic. In most scenarios you will not want to just add a node, instead you will want to add a node with a specific label and associated properties.\n", + "\n", + "Let's look at what our query looks like to create a new `person` node with the first name of `John` and a last name of `Doe`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f7a0df81", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.addV('person').property('first_name','John').property('last_name','Doe').next()" + ] + }, + { + "cell_type": "markdown", + "id": "8364e41a", + "metadata": {}, + "source": [ + "In the example above, the first and last name properties were added by calling the `property()` step after the node is created." + ] + }, + { + "cell_type": "markdown", + "id": "67c4a339", + "metadata": {}, + "source": [ + "### Creating multiple elements\n", + "\n", + "As previously mentioned, you can chain `addV()` steps together to create multiple records in the same statement. This is shown in the query below:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc64a6da", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.addV('person').property('first_name','Fred').property('last_name','Doe')\n", + ".addV('person').property('first_name','Jane').property('last_name','Doe')" + ] + }, + { + "cell_type": "markdown", + "id": "91e99c64", + "metadata": {}, + "source": [ + "### Creating edges\n", + "\n", + "Another common task is to create edges between nodes. To create edges, we use the [`addE()`](https://tinkerpop.apache.org/docs/current/reference/#addedge-step) step, which we can supply the name of the label we'd like to use, for example `friends`. \n", + "\n", + "```\n", + "g.addE('friend')\n", + "```\n", + "\n", + "As part of the edge creation process, we must also supply the `to` and `from` nodes with which the edge will connect. We do this by providing a traversal to each. In the query below, we find the nodes we created above for `John Doe` and `Jane Doe` and connect them with a `friends` edge." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "deabe58e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.addE('friend')\n", + ".from(__.V().hasLabel('person').has('first_name','John').has('last_name','Doe'))\n", + ".to(__.V().hasLabel('person').has('first_name','Jane').has('last_name','Doe'))\n", + ".next()" + ] + }, + { + "cell_type": "markdown", + "id": "6d36e1dd", + "metadata": {}, + "source": [ + "### Creating paths\n", + "The last major task people want to do when adding data to their graph is to create entire paths containing both nodes and the connecting edges. Using what we have already learned, we can accomplish this using a query like this:\n", + "\n", + "```\n", + "g.addV('person').property('first_name','Jim').property('last_name','Doe')\n", + ".addV('person').property('first_name','Joe').property('last_name','Doe')\n", + ".addE('friends')\n", + " .from(__.V().hasLabel('person').has('first_name','Jim').has('last_name','Doe'))\n", + " .to(__.V().hasLabel('person').has('first_name','Joe').has('last_name','Doe'))\n", + "```\n", + "\n", + "You will no doubt have noticed we used the `__` step in the edge creation process to locate the `to` and `from` nodes. This is because the `__` signifies an **anonymous traversal**. This means it will create an additional traverser outside of the main traversal to find the node(s) matching the specified filter.\n", + "\n", + "**Note**. The `__` is not required if you're running this type of query within a notebook using the `%%gremlin` magic." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d716202", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.addV('person').property('first_name','Jim').property('last_name','Doe')\n", + ".addV('person').property('first_name','Joe').property('last_name','Doe')\n", + ".addE('friends')\n", + " .from(__.V().hasLabel('person').has('first_name','Jim').has('last_name','Doe'))\n", + " .to(__.V().hasLabel('person').has('first_name','Joe').has('last_name','Doe'))" + ] + }, + { + "cell_type": "markdown", + "id": "e0d3236d", + "metadata": {}, + "source": [ + "Another way of performing the above is to use `aliases`. This can save us time and effort (and potentially costly typo's), effectively removing the need re-type the `from()` and `to()` steps." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5774c284", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.addV('person').property('first_name','Laura').property('last_name','Kirk').as('a') //alias our first person as 'a'\n", + ".addV('person').property('first_name','Peter').property('last_name','Jackson').as('b') //alias our second person as 'b'\n", + ".addE('friends')\n", + " .from('a') //add the edge from 'a'\n", + " .to('b') //to 'b'" + ] + }, + { + "cell_type": "markdown", + "id": "9b78432a", + "metadata": {}, + "source": [ + "## Updating Data\n", + "\n", + "After creating data, the next most common task is to update data within the graph. Lucky for us, we have already learned the building blocks we need to know to accomplish this task. In Gremlin, we can use the same principles that we used when creating and filtering on objects. In the example below, let's update the `first_name` of the `Joe Doe` node we created in the previous step." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0335cb50", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + "//filter for the John Doe node\n", + ".hasLabel('person').has('first_name','Joe').has('last_name','Doe')\n", + "//update it using the property() step\n", + ".property('first_name','Joseph')" + ] + }, + { + "cell_type": "markdown", + "id": "b4116def", + "metadata": {}, + "source": [ + "Now let's run the following query to take a look at our `person` node with a `last_name` of `Doe`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8e088afc", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person').has('last_name','Doe')\n", + ".valueMap('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "58f5dfe0", + "metadata": {}, + "source": [ + "From the query above, you should have the following results:\n", + "\n", + "```\n", + "{'first_name': ['Jim']}\n", + "{'first_name': ['Joe', 'Joseph']}\n", + "```\n", + "\n", + "Hang on, that's not what we meant to do! We wanted to update the `first_name` property to `Joe`, not append it to the existing value. Why has this happened? It's because of something called property cardinality, which we'll discuss below." + ] + }, + { + "cell_type": "markdown", + "id": "70d12ad6", + "metadata": {}, + "source": [ + "### Single valued properties and multi-valued properties\n", + "\n", + "Gremlin supports both `Single` and `Set` properties. Single properties are those that will only have one value at any given time, for example `age` or `first_name`. Set properties are those can have multiple values, for example `favourite_sports`, where it makes sense to store the values as a list or map, instead of individual properties.\n", + "\n", + "When creating or updating a property, you can tell Gremlin the *type* of property you' using either the `single` or `set` keywords. By not specifying either, Gremlin will assume it is a `set` property.\n", + "\n", + "In the following example, we're going to create a single `age` property for the `Joseph Doe` node, but first we need to ensure we've only got one `first_name` value." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ebce174", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person').has('last_name','Doe')\n", + ".has('first_name',within('Joe','Joseph'))\n", + ".property(single,'first_name','Joseph')\n", + ".valueMap('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "a9b2ec8e", + "metadata": {}, + "source": [ + "The above query will have updated the `first_name` property for `[Joe, Joseph] Doe` to `Joseph` as follows:\n", + "\n", + "```\n", + "{'first_name': ['Joseph']}\n", + "```\n", + "\n", + "Now let's create the `age` property." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2c0fdc01", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person').has('first_name','Joseph').has('last_name','Doe')\n", + ".property(single, 'age',32)" + ] + }, + { + "cell_type": "markdown", + "id": "ff20b063", + "metadata": {}, + "source": [ + "In the following example, we're going to use the `set` keyword to specify that the new `favourite_sports` property will be used to store multiple values:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7371ac06", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V()\n", + ".hasLabel('person').has('first_name','Joseph').has('last_name','Doe')\n", + ".property(set,'favourite_sports','soccer')\n", + ".property(set,'favourite_sports','tennis')\n", + ".property(set,'favourite_sports','baseball')" + ] + }, + { + "cell_type": "markdown", + "id": "32c06e2f", + "metadata": {}, + "source": [ + "Finally, we can confirm our properties have been correctly updating by using the following query:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6aaa7fdb", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Joseph').has('last_name','Doe').valueMap()" + ] + }, + { + "cell_type": "markdown", + "id": "e299d1a4", + "metadata": {}, + "source": [ + "## Upserting Data\n", + "\n", + "We have learned how to create and update data in our graph. However there is another important mutation operation that we want to cover. That operation is how to perform an upsert, where data is created if it doesn't exist or updated if it does. In Gremlin, this operation can be performed using two approaches. The first is combining the `coalesce`, `fold` and `unfold` steps. The second - and more recent approach - is using the new `mergeV` and `mergeE` steps.\n", + "\n", + "Let's start with exploring the new approach:" + ] + }, + { + "cell_type": "markdown", + "id": "eedeb3a0", + "metadata": {}, + "source": [ + "### Upserting Nodes using `mergeV()`\n", + "\n", + "With Neptune [supporting Apache Tinkerpop 3.6.x](https://aws.amazon.com/blogs/database/exploring-new-features-of-apache-tinkerpop-3-6-x-in-amazon-neptune/) in version 1.2.1.0 and above, you can now have access to the new `mergeV()` Gremlin step, which simplifies upsert functionality that we've explored previously in this section. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43384470", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.mergeV([(T.id): 'jamie-1'])\n", + " .option(onCreate, [(T.label): 'person', first_name: 'Jamie'])\n", + " .option(onMatch, [age: 39])\n", + ".id() //not necessary, but helps to optimise the serialization of the output" + ] + }, + { + "cell_type": "markdown", + "id": "9487e727", + "metadata": {}, + "source": [ + "Using `mergeV` provides functionality to support different actions depending on whether the node was created or already exists. For example, using the `option` modulator, we specify new key/value pairs that should be added when the node is created or updated.\n", + "\n", + "We can specify a map of key/value pairs that is used to perform the 'matching' process - in the query above we're specifying the `id` of the node must be `jamie-1` - however, we can provide as many additional key/value pairs as required. Note though, that for a match to exist, **all** values in the map must exist on a node. " + ] + }, + { + "cell_type": "markdown", + "id": "d624367a", + "metadata": {}, + "source": [ + "### Upserting Nodes using `fold`, `coalesce` and `unfold`\n", + "\n", + "Prior to the availability of `mergeV`, the `fold`, `coalesce` and `unfold` approach was used to perform upserts to both nodes and edges.\n", + "\n", + "There are four sections to an upsert in Gremlin:\n", + "\n", + "* `fold` - This combines the objects of the incoming traversal into a single row\n", + "* `coalesce` - This accepts the incoming traversal and checks if the pattern exists\n", + " * `unfold` - This converts a single row of values into individual rows\n", + " * `` - This adds the object as specified\n", + "\n", + "Let's take a look at what a simple upsert statement looks like with a single node pattern match." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2ce3f5fb", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Mike')\n", + ".fold()\n", + ".coalesce(\n", + " unfold(),\n", + " addV('person').property('first_name','Mike')\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "8715cd5f", + "metadata": {}, + "source": [ + "In this case, we created a new node as there are no matches for the specified pattern. As the `addV` step is part of the *create if it doesn't exist* process, we can specify additional properties at the point of creation, as shown below." + ] + }, + { + "cell_type": "markdown", + "id": "b1858d5f", + "metadata": {}, + "source": [ + "As you can see, the `mergeV` approach is much clearer and far less complicated. \n", + "\n", + "It also offers the functionality to apply different properties, such as `CreateDate` or `UpdateDate` depending on whether we create a new node, or update an existing one." + ] + }, + { + "cell_type": "markdown", + "id": "8f4538aa", + "metadata": {}, + "source": [ + "### Upserting Edges using `mergeE()`\n", + "\n", + "In the same way that `mergeV()` helps reduce the complexity of writing upserts for nodes, `mergeE()` offers the same functionality for edges.\n", + "\n", + "Let's first create two friends, *Jamie* and *Peter* using `mergeV`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "97753e2c", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.mergeV([(T.id):'person-1', (T.label):'person', first_name:'Jamie'])\n", + " .mergeV([(T.id):'person-2', (T.label):'person', first_name:'Peter'])" + ] + }, + { + "cell_type": "markdown", + "id": "024935b1", + "metadata": {}, + "source": [ + "Now, we can use `mergeE` to create a `friend` edge between the two nodes. When creating the edge, we use the `option` modulator to specify the label, as well as the `from` and `to` nodes. If the edge already existed, we would apply the `strength` property to the edge." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d2b10575", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.mergeE([(T.id):'friend-1'])\n", + " .option(onCreate, [(T.label): 'friend', (from):'person-1',(to):'person-2'])\n", + " .option(onMatch, [strength:100])" + ] + }, + { + "cell_type": "markdown", + "id": "afa87073", + "metadata": {}, + "source": [ + "The `coalesce` pattern can also be used to upsert edges. Let's use the `Jamie` and `Peter` nodes we've just created to upsert an `friend` edge between." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f66d367b", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Jamie')\n", + ".out('friend')\n", + ".hasLabel('person').has('first_name','Peter')\n", + ".fold()\n", + ".coalesce(\n", + " unfold(),\n", + " addE('friend')\n", + " .from(__.V().hasLabel('person').has('first_name','Jamie'))\n", + " .to(__.V().hasLabel('person').has('first_name','Peter'))\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "663dc3ea", + "metadata": {}, + "source": [ + "### Conditional Upserts using `mergeV()` ###\n", + "\n", + "Sometimes you may only want to update a property depending on its current value. An example of this is `last_update_date` where you only want to update it if it's less than or equal to the new value. Combining the `onMatch` option with `sideEffect`, you can check the existing value of a property, and choose whether or not to update it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a32fd5e7", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.mergeV([(T.id): 'person-3']).\n", + " option(onCreate, [(T.label): 'person', first_name: 'Kevin', last_updated_at: datetime('2023-09-11')]). // when creating the object, set first_name and last_updated_at properties\n", + " option(onMatch, // when updating the object\n", + " sideEffect( // use sideEffect to execute a standalone traversal\n", + " __.V('person-3') // find the person-3 vertex\n", + " .choose( // use the choose step to perform an if-else \n", + " values('last_updated_at').is(lt(datetime('2023-09-12'))), // check if the value of the last_updated_at property is less than the new value\n", + " property(single,['last_updated_at':datetime('2023-09-12')]), // if true, set the last_updated_at property to the new value\n", + " constant([:]) // if false, return an empty map\n", + " )\n", + " ).constant([:]) // finally return an empty map\n", + " )\n", + " .id() // not necessary, but helps to optimise the serialization of the output" + ] + }, + { + "cell_type": "markdown", + "id": "60b2eab1", + "metadata": {}, + "source": [ + "## Deleting Data\n", + "\n", + "Now that we have learned about how to add and update data in our graph, the final operation we need to learn is how to delete data. In Gremlin, deletion of data is done with the `drop` step for removing nodes, edges and properties.\n", + "\n", + "### Removing a Node\n", + "\n", + "To remove a node(s) in Gremlin, we first need to match the items we want to delete, using the filtering steps we saw in the 01-Basic-Read-Queries notebook, and then remove them using `drop` step. In the example below, we will remove any nodes with the `first_name` of `Steve` from our graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "190af502", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Steve').drop()" + ] + }, + { + "cell_type": "markdown", + "id": "a68c7a83", + "metadata": {}, + "source": [ + "### Removing an Edge\n", + "To remove an edge(s) in Gremlin is very similar to removing a node, except that we need to pass the edge to the `drop` step. In the example below, we will remove any edges associated with nodes with the `first_name` of `Joesph` from our graph." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2beb5c72", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Joseph').bothE().drop()" + ] + }, + { + "cell_type": "markdown", + "id": "fd55000f", + "metadata": {}, + "source": [ + "### Deleting Nodes and Edges\n", + "\n", + "A point to note when comparing the process of deleting objects in Gremlin and other languages such as openCypher is that if you attempt to drop a node that is still attached to an edge in Gremlin, it **will work**. Unlike openCypher, where an error will be raised, Gremlin removes all the attached edges for you." + ] + }, + { + "cell_type": "markdown", + "id": "2c9d4fb8", + "metadata": {}, + "source": [ + "### Deleting Properties\n", + "\n", + "As we've seen in the previous examples, we can combine the `drop` step to any traversal and it will delete all the objects in that traversal. We can do the same to drop properties by specifying them in the traversal pattern. In the following example, we're going to delete the `age` property from the `person` node with a `first_name` of `Jamie`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b32e6979", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Jamie').properties('age').drop()" + ] + }, + { + "cell_type": "markdown", + "id": "eb0cd8de", + "metadata": {}, + "source": [ + "And to confirm we have successfully removed the `age` property (and not the node itself), let's run the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f517eb8e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "g.V().hasLabel('person').has('first_name','Jamie').valueMap()" + ] + }, + { + "cell_type": "markdown", + "id": "f5d352e5", + "metadata": {}, + "source": [ + "## Exercises\n", + "\n", + "Now that we have gone through the concepts of Gremlin mutation queries, it's time to put it into practice. Below are several exercises you can complete to verify your understanding of the material covered in this notebook. As practice for what you have learned, please write the Gremlin queries specified below.\n", + "\n", + "### Exercise 1: Create a new person `Leonhard Euler` and connect them to `Dave`.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Create a new `person` node with a name of `Leonhard Euler` \n", + "* Connect the new node to `Dave` via a `friends` edge\n", + "* Return the new connection\n", + "\n", + "The results for this query is the ID of the new edge" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "36adacaf", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "04ab5b59", + "metadata": {}, + "source": [ + "### Exercise 2: Upsert a list of `follows` and add an edge to `Dave`.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Given the following list:\n", + " ```\n", + " [{first_name: 'Taylor', last_name: 'Hall'},\n", + " {first_name: 'Kelvin', last_name: 'Fernsby'},\n", + " {first_name: 'Ian', last_name: 'Rochester'}]\n", + " ```\n", + "* Add or update `person` nodes for each item in the list\n", + "* Add or update a `follows` relationship between each new node and `Dave`\n", + "* If the edge is created write a property `creation` with a value `Created`\n", + "* If the edge already exists write a property `creation` with a value `Updated`\n", + "* Return the new edge elements\n", + "* This query should be re-runable without creating new nodes or edges\n", + "\n", + "The results for this query are the three edge elements" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dae9d211", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "678a243d", + "metadata": {}, + "source": [ + "### Exercise 3: Delete all `follows` edges and remove any connected nodes with no other edges.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find all the `follows` edges and connected nodes and remove the edges\n", + "* For each of the connected nodes see if they have any other edges\n", + "* If they have edges then ignore them\n", + "* If they have no edges then remove them" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f96b91e5", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n" + ] + }, + { + "cell_type": "markdown", + "id": "b5acefc5", + "metadata": {}, + "source": [ + "## Conclusion\n", + "\n", + "In this notebook, we explored how to write queries to mutate data in Gremlin. In the next notebook, we'll be discovering how to read explain and profile outputs from your Gremlin queries in order to understand the data contained within each section, and how to use that to write performant queries." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/Gremlin-Exercises-Answer-Sheet.ipynb b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/Gremlin-Exercises-Answer-Sheet.ipynb new file mode 100644 index 00000000..0d0cd9cd --- /dev/null +++ b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/Gremlin-Exercises-Answer-Sheet.ipynb @@ -0,0 +1,662 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "856cb409", + "metadata": {}, + "source": [ + "# Worksheet 1 - Basic Read Queries" + ] + }, + { + "cell_type": "markdown", + "id": "355b2b35", + "metadata": {}, + "source": [ + "### Exercise 1: Find the first name of Dave's friends\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer is four results: \"Jim\", \"Josh\", \"Hank\", \"Kelly\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4c6c741d", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".out('friends')\n", + ".values('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "76bbc174", + "metadata": {}, + "source": [ + "### Exercise 2: Find the first name of the friends of Dave's friends\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer contains three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6680e1d4", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".out('friends')\n", + ".out('friends')\n", + ".dedup()\n", + ".values('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "886f9699", + "metadata": {}, + "source": [ + "### Exercise 3: Find out how the friends of Dave's friends are connected\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the path\n", + "\n", + "The correct answer contains three results:\n", + "\n", + "- `Dave` -> `Josh` -> `Hank`\n", + "- `Dave` -> `Kelly` -> `Denise`\n", + "- `Dave` -> `Jim` -> `Paras`" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d4191ccb", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".out('friends')\n", + ".out('friends')\n", + ".dedup()\n", + ".path()\n", + ".by(elementMap())" + ] + }, + { + "cell_type": "markdown", + "id": "2042c3f5", + "metadata": {}, + "source": [ + "### Exercise 4: Which friends should we recommend for Dave?\n", + "\n", + "A common use case for graphs in social networks is to recommend new connections. There is a significant amount of research in this area (example [here](https://www.science.org/doi/10.1126/sciadv.aax7310#:~:text=The%20triadic%20closure%20mechanism%20uses,features%20of%20empirical%20social%20networks)) but mainly there are two prevailing mechanisms at work in social networks that we can leverage to help provide efficient recommendations to a user. The first of these mechanisms is called homophily, which is the tendency of similar people to be connected. Homophily is a driving factor in many social networks, with an important outcome being that people connected to you, or connected to people that are connected to you, tend to be similar to you. This leads to the second mechanism in a graph, the concept of a triadic closure. Triadic closure is a way to create or recommend new connections based on common friends or acquaintances. \n", + "\n", + "\n", + "In this exercise, we are going to leverage triadic closure to recommend friends for Dave. To accomplish this, we will need to leverage the previously written queries but extend them to:\n", + "\n", + "* Find all the friends of friends that do not have a connection to Dave\n", + "\n", + "The correct answer contains three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a068ca6", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave').as('dave')\n", + ".out('friends')\n", + ".out('friends')\n", + ".where(neq('dave'))\n", + ".dedup()\n", + ".values('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "4e8077f9", + "metadata": {}, + "source": [ + "# Worksheet 2 - Loops and Repeat Queries" + ] + }, + { + "cell_type": "markdown", + "id": "d0551517", + "metadata": {}, + "source": [ + "### Exercise 1: Find the friends of Dave's Friends using a loop.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Find the friends of that person (i.e. traverse the `friends` edge)\n", + "* Return the friends `first_name`\n", + "\n", + "The correct answer is a three results: \"Hank\", \"Denise\", \"Paras\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2ddde36", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".repeat(\n", + " out('friends')\n", + " .simplePath()\n", + ")\n", + ".times(2)\n", + ".dedup()\n", + ".values('first_name')" + ] + }, + { + "cell_type": "markdown", + "id": "84d8182d", + "metadata": {}, + "source": [ + "### Exercise 2: Find all `person` nodes connected to Dave.\n", + "\n", + "Starting at a single node and trying to find all connected children (a.k.a. root to leaf) or trying to find the parent of any child node (a.k.a leaf to root) are two very common hierarchical graph query patterns. Commonly, these queries supported bill of materials, information organization, or compliance use cases.\n", + "\n", + "In this exercise, we will be applying that same query pattern to find the hierarchy of people within our social network. We'll accomplish this by writing a \"root to leaf\" type query where the root node is our `Dave` node in the social network.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Keep traversing the outgoing `friends` edge until there are no more outgoing `friends` edges\n", + "* Return all the paths\n", + "\n", + "The correct answer has 5 results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6367292c", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".repeat(\n", + " out('friends')\n", + ")\n", + ".until(not(out('friends')))\n", + ".path()" + ] + }, + { + "cell_type": "markdown", + "id": "a6fba6ab", + "metadata": {}, + "source": [ + "### Exercise 3: Find all the ways Dave and Denise are connected.\n", + "\n", + "A common extension to the path traversal query we wrote in Loop-3 is to return not just \"if\" someone is connected but \"how\" they are connected.\n", + "\n", + "In this exercise, we will be making a slight modification to the previous query to return \"how\" Dave and Denise are connected, not just that they are.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the friends of Dave (i.e. traverse the `friends` edge)\n", + "* Keep traversing the `friends` edge until you find `Denise`\n", + "* Return the path\n", + "\n", + "The correct answer has 3 results" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa0b467b", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel('person')\n", + ".has('first_name','Dave')\n", + ".repeat(\n", + " out('friends')\n", + " .simplePath()\n", + ")\n", + ".until(\n", + " has('first_name','Denise')\n", + ")\n", + ".path()" + ] + }, + { + "cell_type": "markdown", + "id": "c3e24581", + "metadata": {}, + "source": [ + "# Worksheet 3 - Ordering, Functions, and Grouping" + ] + }, + { + "cell_type": "markdown", + "id": "b033e716", + "metadata": {}, + "source": [ + "### Exercise 1: What are the 3 highest rated restaurants?\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find the 3 highest average restaurant rating\n", + "* Find the associated `cuisine`\n", + "* Return the restaurant name, the cuisine name, and the average rating\n", + "* Order the results by average rating descending\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Cuisine|Avg Rating|\n", + "|---|---|---|\n", + "|Lonely Grape|bar|5.0|\n", + "|Perryman's|bar|4.5|\n", + "|Rare Bull|steakhouse|4.333333|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d3004eb3", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V()\n", + ".hasLabel('cuisine')\n", + ".in('serves')\n", + ".group()\n", + ".by(identity())\n", + ".by(in('about').values('rating').mean())\n", + ".unfold()\n", + ".order()\n", + ".by(values, desc)\n", + ".limit(3)\n", + ".unfold()\n", + ".project('restaurant name','cuisine','avg rating')\n", + ".by(select(keys).values('name'))\n", + ".by(select(keys).out('serves').values('name'))\n", + ".by(select(values))" + ] + }, + { + "cell_type": "markdown", + "id": "854c9109", + "metadata": {}, + "source": [ + "### Exercise 2: Find the top 3 highest rated restaurants in the city where Dave lives.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find the average rating of restaurants in that city\n", + "* Find the top 3 average ratings\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|Dave's Big Deluxe|\t490 Ivan Cape|4.0|\n", + "|Pick & Go|4881 Upton Falls|3.75|\n", + "|Without Chaser|\t01511 Casper Fall|3.5|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea31dd30", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().has('person','first_name','Dave')\n", + ".out('lives')\n", + ".in('within')\n", + ".where(inE('about'))\n", + ".group()\n", + ".by(identity())\n", + ".by(in('about').values('rating').mean())\n", + ".unfold()\n", + ".order()\n", + ".by(values,desc)\n", + ".limit(3)\n", + ".unfold()\n", + ".project('restaurant name','address','avg rating')\n", + ".by(select(keys).values('name'))\n", + ".by(select(keys).values('address'))\n", + ".by(select(values))" + ] + }, + { + "cell_type": "markdown", + "id": "825631b7", + "metadata": {}, + "source": [ + "### Exercise 3: Which Mexican or Chinese restaurant near Dave is the highest rated?\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find the restaurants in that city that serve 'Mexican' or 'Chinese' food\n", + "* Find the average rating of those restaurants\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "* Return the top 1 result\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|With Salsa|24320 Williamson Causeway|3.5|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3cd2eae2", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().has('person','first_name','Dave')\n", + ".out('lives')\n", + ".in('within')\n", + ".where(out('serves').has('name',within('Mexican','Chinese')))\n", + ".where(inE('about'))\n", + ".group()\n", + ".by(identity())\n", + ".by(in('about').values('rating').mean())\n", + ".unfold()\n", + ".order()\n", + ".by(values,desc)\n", + ".limit(1)\n", + ".unfold()\n", + ".project('restaurant name','address','avg rating')\n", + ".by(select(keys).values('name'))\n", + ".by(select(keys).values('address'))\n", + ".by(select(values))" + ] + }, + { + "cell_type": "markdown", + "id": "a195b2d2", + "metadata": {}, + "source": [ + "### Exercise 4: What are the top 3 restaurants, recommended by his friends, where Dave lives? (Personalized Recommendation)\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find a `person` node(s) with a `first_name` of \"Dave\"\n", + "* Find the `city` that Dave lives in\n", + "* Find Dave's friends\n", + "* Find reviews written by Dave's friends in the city \"Dave\" lives in\n", + "* Find the average rating of those restaurants\n", + "* Return the restaurant name, address, and average rating\n", + "* Order by the average rating descending\n", + "* Return the top 3\n", + "\n", + "The results for this query are:\n", + "\n", + "|Restaurant name|Address|Avg Rating|\n", + "|---|---|---|\n", + "|Dave's Big Deluxe|490 Ivan Cape|4.0|\n", + "|With Salsa|24320 Williamson Causeway|4.0|\n", + "|Satiated|370 Hills Estates|3.666667|" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2b8b31f2", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().has('person','first_name','Dave').as('dave')\n", + ".out('lives')\n", + ".in('within')\n", + ".where(in('about').in('wrote').both('friends').where(eq('dave')))\n", + ".group()\n", + ".by(identity())\n", + ".by(in('about').values('rating').mean())\n", + ".unfold()\n", + ".order()\n", + ".by(values,desc)\n", + ".limit(3)\n", + ".unfold()\n", + ".project('restaurant name','address','avg rating')\n", + ".by(select(keys).values('name'))\n", + ".by(select(keys).values('address'))\n", + ".by(select(values))" + ] + }, + { + "cell_type": "markdown", + "id": "897b88c4", + "metadata": {}, + "source": [ + "# Worksheet 4 - Create, Update and Delete Queries" + ] + }, + { + "cell_type": "markdown", + "id": "8d71b8ed", + "metadata": {}, + "source": [ + "### Exercise 1: Create a new person `Leonhard Euler` and connect them to `Dave`.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Create a new `person` node with a name of `Leonhard Euler` \n", + "* Connect the new node to \"Dave\" via a `friends` edge\n", + "* Return the new connection\n", + "\n", + "The results for this query is ID of the new edge" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "49e157a8", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.addV('person').property('name','Leonhard Euler')\n", + " .addE('friends').to(__.V().has('person','first_name','Dave'))\n", + " \n", + "//OR\n", + "\n", + "//g\n", + "// .mergeV([(T.id):'leo', (T.label):'person', name: 'Leonhard Euler')\n", + "// .mergeE([(T.label):'friends',(from):Merge.outV,(to):Merge.inV])\n", + "// .option(Merge.outV, [(T.label): 'person', name: 'Leonhard Euler'])\n", + "// .option(Merge.inV, [(T.label): 'person', first_name: 'Dave', last_name: 'Bech'])" + ] + }, + { + "cell_type": "markdown", + "id": "8abdb992", + "metadata": {}, + "source": [ + "### Exercise 2: Upsert a list of followers and add an edge to `Dave`.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Given the following list:\n", + " ```\n", + " [{first_name: 'Taylor', last_name: 'Hall'},\n", + " {first_name: 'Kelvin', last_name: 'Fernsby'},\n", + " {first_name: 'Ian', last_name: 'Rochester'}]\n", + " ```\n", + "* Add or update `person` nodes for each item in the list\n", + "* Add or update a `follows` relationship between each new node and \"Dave\"\n", + "* If the edge is created write a property `creation` with a value `Created`\n", + "* If the edge already exists write a property `creation` with a value `Updated`\n", + "* Return the new edge elements\n", + "* This query should be re-runable without creating new nodes or edges\n", + "\n", + "The results for this query are the three edge elements" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4d82cd3e", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.V().hasLabel(\"person\")\n", + ".has(\"first_name\",\"Taylor\").has(\"last_name\",\"Hall\")\n", + ".fold().coalesce(unfold(),addV('person').property('first_name','Taylor').property('last_name','Hall'))\n", + ".V().hasLabel(\"person\")\n", + " .has(\"first_name\",\"Kelvin\").has(\"last_name\",\"Fernsby\")\n", + " .fold().coalesce(unfold(),addV('person').property('first_name','Kelvin').property('last_name','Fernsby'))\n", + ".V().hasLabel(\"person\")\n", + " .has(\"first_name\",\"Ian\").has(\"last_name\",\"Rochester\")\n", + " .fold().coalesce(unfold(),addV('person').property('first_name','Ian').property('last_name','Rochester'))\n", + "\n", + ".V().hasLabel(\"person\")\n", + " .has(\"first_name\",\"Taylor\").has(\"last_name\",\"Hall\")\n", + " .outE('follows')\n", + " .where(inV().has('person','first_name','Dave'))\n", + " .fold().coalesce(unfold().property('creation','updated'), \n", + " addE('follows').from(__.V().has('person','first_name','Taylor')).to(__.V().has('person','first_name','Dave')).property('creation','created')\n", + " )\n", + ".V().hasLabel(\"person\")\n", + " .has(\"first_name\",\"Kelvin\").has(\"last_name\",\"Fernsby\")\n", + " .outE('follows')\n", + " .where(inV().has('person','first_name','Dave'))\n", + " .fold().coalesce(unfold().property('creation','updated'), \n", + " addE('follows').from(__.V().has('person','first_name','Kelvin')).to(__.V().has('person','first_name','Dave')).property('creation','created')\n", + " )\n", + ".V().hasLabel(\"person\")\n", + " .has(\"first_name\",\"Ian\").has(\"last_name\",\"Rochester\")\n", + " .outE('follows')\n", + " .where(inV().has('person','first_name','Dave'))\n", + " .fold().coalesce(unfold().property('creation','updated'), \n", + " addE('follows').from(__.V().has('person','first_name','Ian')).to(__.V().has('person','first_name','Dave')).property('creation','created')\n", + " )\n", + ".V().hasLabel('person')\n", + " .outE('follows').elementMap()" + ] + }, + { + "cell_type": "markdown", + "id": "9abe4c7e", + "metadata": {}, + "source": [ + "### Exercise 3: Delete all `follows` edges and remove any connected nodes with no other edges.\n", + "\n", + "Using the data model above, write a query that will:\n", + "\n", + "* Find all the `follows` edges and connected nodes and remove the edges\n", + "* For each of the connected nodes see if they have any other edges\n", + "* If they have edges then ignore them\n", + "* If they have no edges then remove them" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6a3ca71d", + "metadata": {}, + "outputs": [], + "source": [ + "%%gremlin\n", + "\n", + "g.E().hasLabel('follows').aggregate('edges')\n", + ".bothV()\n", + ".hasLabel('person')\n", + ".where(out().count().is(eq(1))).aggregate('nodes')\n", + ".select('edges').unfold().drop()\n", + ".select('nodes').unfold().drop()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/__init__.py b/src/graph_notebook/notebooks/06-Language-Tutorials/03-Gremlin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/unit/notebooks/test_validate_notebooks.py b/test/unit/notebooks/test_validate_notebooks.py index a9b39338..1955c837 100644 --- a/test/unit/notebooks/test_validate_notebooks.py +++ b/test/unit/notebooks/test_validate_notebooks.py @@ -62,7 +62,12 @@ def test_no_extra_notebooks(self): f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/02-openCypher/02-Variable-Length-Paths.ipynb', f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/02-openCypher/03-Ordering-Functions-Grouping.ipynb', f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/02-openCypher/04-Creating-Updating-Delete-Queries.ipynb', - f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/02-openCypher/openCypher-Exercises-Answer-Key.ipynb'] + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/02-openCypher/openCypher-Exercises-Answer-Key.ipynb', + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/03-Gremlin/01-Basic-Read-Queries.ipynb', + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/03-Gremlin/02-Loops-Repeats.ipynb', + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/03-Gremlin/03-Ordering-Functions-Grouping.ipynb', + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/03-Gremlin/04-Creating-Updating-Deleting-Queries.ipynb', + f'{NOTEBOOK_BASE_DIR}/06-Language-Tutorials/03-Gremlin/Gremlin-Exercises-Answer-Sheet.ipynb'] notebook_paths = get_all_notebooks_paths() expected_paths.sort() notebook_paths.sort()