From 73e83e886a40302704bf7a4499768c51100187d8 Mon Sep 17 00:00:00 2001 From: Gerald Haesendonck Date: Mon, 30 May 2022 16:50:37 +0200 Subject: [PATCH] # Conflicts: # CHANGELOG.md # docker/docker-compose.yml # pom.xml # src/main/scala/io/rml/framework/Main.scala # src/main/scala/io/rml/framework/core/util/ParameterUtil.scala --- CHANGELOG.md | 12 +- README.md | 4 +- configuration_example.properties | 1 - docker/README.md | 14 +- docker/docker-compose.yml | 4 +- documentation/README_Functions.md | 180 +-- documentation/README_Netty_Snapshot.md | 31 - pom.xml | 34 +- .../flink/util/FunctionsFlinkUtil.java | 183 +++ src/main/resources/GrelFunctions.jar | Bin 291954 -> 0 bytes src/main/resources/IDLabFunctions.jar | Bin 3361 -> 0 bytes src/main/resources/functions_grel.ttl | 1275 +++++++++-------- src/main/resources/functions_idlab.ttl | 210 --- src/main/resources/grel_java_mapping.ttl | 322 ----- src/main/resources/idlab_java_mapping.ttl | 125 -- src/main/scala/io/rml/framework/Main.scala | 60 +- .../io/rml/framework/api/FnOEnvironment.scala | 94 -- .../core/function/FunctionLoader.scala | 140 -- .../core/function/FunctionUtils.scala | 36 - .../core/function/model/DynamicFunction.scala | 156 -- .../core/function/model/Function.scala | 52 +- .../function/model/FunctionMetaData.scala | 20 - .../model/std/StdRandomFunction.scala | 0 .../core/function/std/StdFunctionLoader.scala | 95 -- .../framework/core/util/ParameterUtil.scala | 16 +- .../io/rml/framework/engine/Engine.scala | 3 +- .../io/rml/framework/engine/Processor.scala | 10 +- .../framework/engine/StaticProcessor.scala | 9 +- .../framework/engine/StreamProcessor.scala | 9 +- .../FunctionMapGeneratorAssembler.scala | 42 +- .../statement/GraphGeneratorAssembler.scala | 18 +- .../statement/ObjectGeneratorAssembler.scala | 3 +- .../PredicateGeneratorAssembler.scala | 5 +- .../PredicateObjectGeneratorAssembler.scala | 3 +- .../engine/statement/Statement.scala | 57 +- .../engine/statement/StatementEngine.scala | 11 +- .../statement/StatementsAssembler.scala | 13 +- .../statement/SubjectGeneratorAssembler.scala | 5 +- .../statement/TermMapGeneratorAssembler.scala | 16 +- .../engine/statement/TermMapGenerators.scala | 39 +- .../flink/function/FnOEnvironmentLoader.scala | 118 -- .../fno-testcases/RMLFNOTC0004-CSV/output.ttl | 2 +- .../fno-testcases/RMLFNOTC0005-CSV/output.ttl | 2 +- .../fno-testcases/RMLFNOTC0006-CSV/output.nq | 2 +- .../external_jar/HelloWorld.java | 7 + .../external_jar/function.csv | 2 + .../function_related/external_jar/mapping.ttl | 37 + .../function_related/external_jar/output.nq | 1 + .../external_jar/simple-test-function-fno.ttl | 46 + .../external_jar/simple-test-function.jar | Bin 0 -> 3073 bytes .../kafka/RMLFNOTC0004-CSV/output.ttl | 2 +- .../kafka/RMLFNOTC0005-CSV/output.ttl | 2 +- .../kafka/RMLFNOTC0006-CSV/output.nq | 2 +- .../tcp/RMLFNOTC0004-CSV/output.ttl | 2 +- .../tcp/RMLFNOTC0005-CSV/output.ttl | 2 +- .../tcp/RMLFNOTC0006-CSV/output.nq | 2 +- .../rml/framework/FunctionMappingTest.scala | 29 +- .../rml/framework/KafkaStreamTestSync.scala | 24 +- .../framework/KafkaStreamTestSyncFnO.scala | 129 +- .../rml/framework/OutputGenerationTest.scala | 15 +- .../scala/io/rml/framework/SandboxTests.scala | 14 +- .../io/rml/framework/StreamTestSync.scala | 22 +- .../io/rml/framework/TCPStreamTestSync.scala | 7 +- .../rml/framework/TCPStreamTestSyncFnO.scala | 5 - .../engine/StatementEngineTest.scala | 9 +- .../util/fileprocessing/TestFilesUtil.scala | 2 - 66 files changed, 1301 insertions(+), 2491 deletions(-) delete mode 100644 configuration_example.properties delete mode 100644 documentation/README_Netty_Snapshot.md create mode 100644 src/main/java/io/rml/framework/flink/util/FunctionsFlinkUtil.java delete mode 100644 src/main/resources/GrelFunctions.jar delete mode 100644 src/main/resources/IDLabFunctions.jar delete mode 100644 src/main/resources/functions_idlab.ttl delete mode 100644 src/main/resources/grel_java_mapping.ttl delete mode 100644 src/main/resources/idlab_java_mapping.ttl delete mode 100644 src/main/scala/io/rml/framework/api/FnOEnvironment.scala delete mode 100644 src/main/scala/io/rml/framework/core/function/FunctionLoader.scala delete mode 100644 src/main/scala/io/rml/framework/core/function/model/std/StdRandomFunction.scala delete mode 100644 src/main/scala/io/rml/framework/core/function/std/StdFunctionLoader.scala delete mode 100644 src/main/scala/io/rml/framework/flink/function/FnOEnvironmentLoader.scala create mode 100644 src/test/resources/sandbox/function_related/external_jar/HelloWorld.java create mode 100644 src/test/resources/sandbox/function_related/external_jar/function.csv create mode 100644 src/test/resources/sandbox/function_related/external_jar/mapping.ttl create mode 100644 src/test/resources/sandbox/function_related/external_jar/output.nq create mode 100644 src/test/resources/sandbox/function_related/external_jar/simple-test-function-fno.ttl create mode 100644 src/test/resources/sandbox/function_related/external_jar/simple-test-function.jar diff --git a/CHANGELOG.md b/CHANGELOG.md index baa8652a..1580b039 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## Unreleased +## [2.4.0] - 2022-05-30 + +### Changed * Use of external [FnO](https://fno.io/) function handling component - +* Use `docker cp` for copying files between Docker containers. +* Updated Flink from verion 1.14.0 to 1.14.4 + +### Fixed +* Parameter for FnO docs (internal [issue #150](https://gitlab.ilabt.imec.be/rml/proc/rml-streamer/-/issues/150)) + ## [2.3.0] - 2022-04-26 ### Added @@ -181,3 +188,4 @@ can be set with the program argument `--baseIRI`. [2.2.1]: https://github.com/RMLio/RMLStreamer/compare/v2.2.0...v2.2.1 [2.2.2]: https://github.com/RMLio/RMLStreamer/compare/v2.2.1...v2.2.2 [2.3.0]: https://github.com/RMLio/RMLStreamer/compare/v2.2.2...v2.3.0 +[2.4.0]: https://github.com/RMLio/RMLStreamer/compare/v2.3.0...v2.4.0 diff --git a/README.md b/README.md index fb65e907..a55ad700 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ If you want to develop, read [these instructions](documentation/README_DEVELOPME RMLStreamer runs its jobs on Flink clusters. More information on how to install Flink and getting started can be found [here](https://ci.apache.org/projects/flink/flink-docs-release-1.14/try-flink/local_installation.html). At least a local cluster must be running in order to start executing RML Mappings with RMLStreamer. -Please note that this version works with Flink 1.14.0 with Scala 2.11 support, which can be downloaded [here](https://archive.apache.org/dist/flink/flink-1.14.0/flink-1.14.0-bin-scala_2.11.tgz). +Please note that this version works with Flink 1.14.4 with Scala 2.11 support, which can be downloaded [here](https://archive.apache.org/dist/flink/flink-1.14.4/flink-1.14.4-bin-scala_2.11.tgz). ### Building RMLStreamer @@ -83,6 +83,8 @@ $FLINK_BIN run toKafka --broker-list --top ``` Usage: RMLStreamer [toFile|toKafka|toTCPSocket|noOutput] [options] + -f, --function-descriptions ,... + An optional list of paths to function description files (in RDF using FnO). A path can be a file location or a URL. -j, --job-name The name to assign to the job on the Flink cluster. Put some semantics in here ;) -i, --base-iri diff --git a/configuration_example.properties b/configuration_example.properties deleted file mode 100644 index ecb63a05..00000000 --- a/configuration_example.properties +++ /dev/null @@ -1 +0,0 @@ -flinkBin=/home/pheyvaer/Applications/flink-1.3.2/bin/flink diff --git a/docker/README.md b/docker/README.md index af9916d4..4fabd22b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -157,12 +157,10 @@ on `/var/lib/docker/volumes/docker_data/_data`, as shown by the `$ docker volume Copy `scenario-1` subfolder to our docker data volume, that can be read by RMLStreamer: ``` -$ [sudo] cp -r scenario-1 /var/lib/docker/volumes/docker_data/_data/ -$ [sudo] chmod -R 777 /var/lib/docker/volumes/docker_data/_data +$ docker cp scenario-1/mapping.rml.ttl docker_taskmanager_1:/mnt/data/scenario-1/mapping.rml.ttl +$ docker cp scenario-1/input.json docker_taskmanager_1:/mnt/data/scenario-1/input.json ``` -(TODO: is there a more user-friendly way to put data on docker volumes?) - ### 2. Start RMLStreamer Go back to your browser, and fill in the following `Program Arguments`: @@ -178,5 +176,11 @@ If all goes well, you will see that the job has finished, after a few seconds: ![Job done](images/scenario-1-job-done.png) -The result is written to `/var/lib/docker/volumes/docker_data/_data/scenario-1/output.nt` +The result is written to `/mnt/data/scenario-1/output.nt` inside the Docker container. and should contain the same triples as `scenario-1/output.nq`. + +You can get the generated output from the Docker container by copying it back to the host: + +``` +$ docker cp docker_taskmanager_1:/mnt/data/scenario-1/output.nt . +``` diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index e583d479..1d64d036 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: jobmanager: - image: flink:1.14.0-scala_2.11-java11 + image: flink:1.14.4-scala_2.11-java11 expose: - "6123" ports: @@ -14,7 +14,7 @@ services: - data:/mnt/data taskmanager: - image: flink:1.14.0-scala_2.11-java11 + image: flink:1.14.4-scala_2.11-java11 expose: - "6121" - "6122" diff --git a/documentation/README_Functions.md b/documentation/README_Functions.md index 3b5d3177..3db0f51f 100644 --- a/documentation/README_Functions.md +++ b/documentation/README_Functions.md @@ -1,54 +1,56 @@ # README: Functions +## Built-in functions -When deploying and running jobs on Flink, make sure -- to either place the external jars (e.g. `IDLabFunctions.jar` and `GrelFunctions.jar`) in Flink's `lib` directory, -or package the RMLStreamer along with those jars by placing them in `src/main/resources`. -- to place the following files in the directory where the `flink run ...` command is issued. -These files can be obtained from `src/main/resources`: - - `functions_grel.ttl` - - `functions_grel.ttl` - - `grel_java_mapping.ttl` - - `idlab_java_mapping.ttl` ---- - -## Example: RML Streamer + Flink -Flink's `lib` directory should contain the jar-files with the custom functions. In this example, these are marked with `*` -``` -flink-1.14.0-scala_2.11 - └── lib - ├── GrelFunctions.jar * - ├── IDLabFunctions.jar * - ├── flink-dist_2.11-1.14.0.jar - ├── flink-table-blink_2.11-1.14.0.jar - └── flink-table_2.11-1.14.0.jar -``` -When running the RML Streamer on Flink, the directory should look like -``` -. -├── RMLStreamer-2.2.0.jar -├── functions_grel.ttl -├── functions_idlab.ttl -├── grel_java_mapping.ttl -├── idlab_java_mapping.ttl -├── mapping.ttl -└── input_data.csv -``` -Note that the function descriptions and function mappings are present. +Two function libraries are supported out of the box in RMLStreamer: +* GREL functions () +* IDLab functions () + +No extra configuration or parameters need to be provided to use those. + +Check out [src/test/resources/fno-testcases](../src/test/resources/fno-testcases) for example RML Mappings. + +## Using other function libraries + +RMLStreamer can also execute functions from other libraries. +To use functions, three things have to be provided: + +* A JAR file containing the code to execute functions; +* Function descriptions: a document describing the functions in the library semantically using [FnO](https://fno.io/). +* Implementation mappings: a document mapping the functions from the function descriptions + to the implementation in the JAR file, also using FnO. + +Often the function descriptions an the implementation mappings are bundled in one document. + +How to do this is explained as an example in the [Function Agent](https://github.com/FnOio/function-agent-java#example) +library, which is used by RMLStreamer to handle functions. -The command for running the RML Streamer on Flink should look like +A minimal example is provided in the tests: [src/test/resources/sandbox/function_related/external_jar/](../src/test/resources/sandbox/function_related/external_jar) + +If there are a JAR file and FnO descriptions, RMLStreamer can be invoked with the `-f` or `--function-descriptions` +parameter, like so: + +```shell +$ FLINK_BIN run [Flink options] -c io.rml.framework.Main \ + toFile \ + --output-path /tmp/helloworld.nt \ + --mapping-file //src/test/resources/sandbox/function_related/external_jar/mapping.ttl \ + --function-descriptions //src/test/resources/sandbox/function_related/external_jar/simple-test-function-fno.ttl ``` -~/flink/flink-1.14.0-scala_2.11/bin/flink run -c io.rml.framework.Main RMLStreamer-2.2.0.jar toFile --output-path $(pwd)'/out.ttl' -m mapping.ttl -``` - + +Notes +- The paths to funtion descriptions or JAR files can also be URLs; +- One can pass multiple function description locations to the `--function-descriptions` parameter separated by a space. + ## Test Cases ### FnO Tests -The official FnO testcases that are working can be found at `test/resources/fno-testcases`. +The official FnO testcases that are working can be found at [src/test/resources/fno-testcases](../src/test/resources/fno-testcases). ### SandboxTests > These tests are still experimental. -The resources can be found at `test/resources/sandbox/function_related` and are executed from `io.rml.framework.SandboxTests`. +The resources can be found at [src/test/resources/sandbox/function_related](../src/test/resources/sandbox/function_related) +and are executed from `io.rml.framework.SandboxTests`. Every test output is compared to the RMLMapper's output (e.g. `output.ttl`) for that test. A test passes when its output is equal to the RMLMapper's output. Tests marked as `pending` should be considered as not working.
@@ -79,6 +81,8 @@ The sandbox testcases are - `equal`: uses function `idlab-fn:equal` +- `external_jar`: uses the `HelloWorld` function from an external JAR file. + - `notEqual`: uses function `idlab-fn:notEqual` - `using_trueCondition_and_contains` @@ -89,101 +93,7 @@ The sandbox testcases are - `idlab-fn:trueCondition` - `idlab-fn:equal` - - - -## Tutorial: Using a function from a local JAR - -The following FnO-testcases use the function `toUpperCaseURL` -- RMLFNOTC0004-CSV -- RMLFNOTC0005-CSV -- RMLFNOTC0006-CSV - -The following steps show how to integrate the `toUpperCaseURL` function in the RML Streamer. - -### Step 1: creating the JAR -This step is based on the best-practice example [`grel-functions-java`](https://github.com/FnOio/grel-functions-java). -- Create package `io.fno.idlab` and within that package, create the class `IDLabFunctions` -- For these testcases, we need a function that returns the given URL in uppercase. -- Make sure to set the Maven compiler to a version compatible with the RMLStreamer's version. - -The following listing serves a minimalistic example that shows a possible implementation of the `toUpperCaseURL`-function. -```Java -package io.fno.idlab; - -public class IDLabFunctions { - public static String toUpperCaseURL(String s) { - if(!s.startsWith("http")) - return "http://" + s.toUpperCase(); - return s.toUpperCase(); - } -} -``` - -Use Maven to build a JAR-file, and move this JAR-file to the RMLStreamer’s `main/resources`. - -### Step 2: defining the FnO descriptions -An FnO description represents the abstract definition of a function.
-The aforementioned testcases require a function that returns a valid URL in uppercase. - Its description is shown in the following listing, and can be found in `functions_idlab.ttl`. - -```Turtle -idlab-fn:toUpperCaseURL - a fno:Function ; - fno:name "toUppercaseURL" ; - rdfs:label "toUppercaseURL" ; - dcterms:description "Returns an uppercase, valid url." ; - fno:solves grel:prob_ucase ; - fno:expects ( idlab-fn:_str ) ; - fno:returns ( idlab-fn:_stringOut ) . -``` - -### Step 3: map FnO descriptions to the corresponding implementations -In the previous step, the abstract functions were created. -The current step will define the link between abstract function descriptions and the corresponding implementation. - This is illustrated by the following listing, extracted from `idlab_java_mapping.ttl`. -```Turtle -grelm:IDLabFunctions - a fnoi:JavaClass ; - doap:download-page "IDLabFunctions.jar" ; - fnoi:class-name "io.fno.idlab.IDLabFunctions" . - - -grelm:uppercaseURLMapping - a fno:Mapping ; - fno:function idlab-fn:toUpperCaseURL; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "toUpperCaseURL" ] ; -. - -``` -This mapping instructs the RML Streamer to look for a method called `toUpperCaseURL` within the `io.fno.idlab.IDLabFunctions`-class of the `IDLabFunctions.jar`. Make sure the JAR-file is located in `main/resources`. - -## How the `FunctionLoader` works - -The function descriptions and mappings mentioned in the previous steps will be used by the `FunctionLoader`. - -First, a `FunctionLoader` has to be aware of the available functions. -Therefore, it can be instantiated providing file paths to the function description files. -When no such file paths are provided, the default function descriptions are used (i.e. `functions_grel.ttl`). - -Secondly, function URIs are mapped to the corresponding implementations by parsing the function mappings - (e.g. `resources/grel_java_mapping.ttl` and `resources/idlab_java_mapping.ttl`). - During this step, every function URI is mapped to a `FunctionMetaData`-object which contains the necessary metadata such as: the *download-page* of the library, the *class-name* of the function, the *method-name*, *input parameters* and *output parameters*. - - -## How the `FunctionLoader` is used - -Initially, the `FunctionLoader` is used to read and parse function descriptions and mappings. -Afterwards, when running FNOT-testcases, the `FunctionLoader`-instance is used by `io.rml.framework.engine.statement.FunctionMapGeneratorAssembler` -to load and bind every function as specified in the testcase's `mapping.ttl`. - - - # Remarks -- When the RMLStreamer is unable to find a function description or function mapping, bind method parameters to values, it will be logged as an error to the console +- When the RMLStreamer is unable to find a function description or function mapping, bind method parameters to values, it will be logged as a warning to the console and the function will not be applied. \ No newline at end of file diff --git a/documentation/README_Netty_Snapshot.md b/documentation/README_Netty_Snapshot.md deleted file mode 100644 index ac371745..00000000 --- a/documentation/README_Netty_Snapshot.md +++ /dev/null @@ -1,31 +0,0 @@ -# README: Using JitPack -(kept for reference only, not applicable anymore for RMLStreamer) - -### Using JitPack to get unpublished Maven Dependencies from a GitHub/GitLab repository - -If you want to use a Maven dependency that is not yet published on Maven Central or you want a specific version, [JitPack](https://jitpack.io/) can be used to get a specific snapshot from the GitHub/GitLab repository. Using JitPack is very simple, you simly go to the GitHub/GitLab repository and copy its link and paste on the JitPack site. Select the version and build system and get the config generated by JitPack. At the moment, this project uses JitPack for Bahir-Flink. - -### Step by step by step example - -In this example the maven dependency [Bahir-Flink](https://github.com/apache/bahir-flink) is built via JitPack. - -1. Copy the url of the repository you want to use. - - ![Step 1: copy the repo link](img/copy_repo_link.png) - -2. Paste the repository url and look up the repo on JitPack. - - ![Step 2: look up repo on JitPack](img/paste_repo_link.png) - -3. Select the build, commit, ... you need. - - ![Step 3: get desired version](img/get_build.png) - -4. Copy the `pom.xml` patches and paste them in the `pom.xml` of your project. - - ![Step 4: copy patches](img/copy_patch.png) - -When using a repository that contains different subprojets, you can also select one of those subprojets, instead of the entire project. In this example the `flink-netty-connector` subproject is selected from the Bahir-Flink repository. - -![Select a subproject](img/select_subproject.png) - diff --git a/pom.xml b/pom.xml index 393f93fd..7b0f3ac9 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ SOFTWARE. io.rml RMLStreamer - 2.3.0 + 2.4.0 jar RMLStreamer @@ -36,7 +36,7 @@ SOFTWARE. UTF-8 - 1.14.0 + 1.14.4 1.7.32 2.17.0 4.3.1 @@ -55,6 +55,14 @@ SOFTWARE. + + repo.maven.apache.org + https://repo.maven.apache.org/maven2/ + + + jitpack.io + https://jitpack.io + bintray https://jcenter.bintray.com @@ -376,6 +384,28 @@ SOFTWARE. 4.1.4 + + com.github.FnOio + function-agent-java + v0.1.0 + + + org.apache.jena + * + + + + + com.github.fnoio + grel-functions-java + v0.7.3 + + + com.github.fnoio + idlab-functions-java + v0.1.0 + + diff --git a/src/main/java/io/rml/framework/flink/util/FunctionsFlinkUtil.java b/src/main/java/io/rml/framework/flink/util/FunctionsFlinkUtil.java new file mode 100644 index 00000000..bf679b08 --- /dev/null +++ b/src/main/java/io/rml/framework/flink/util/FunctionsFlinkUtil.java @@ -0,0 +1,183 @@ +package io.rml.framework.flink.util; + +import be.ugent.idlab.knows.functions.agent.Agent; +import be.ugent.idlab.knows.functions.agent.AgentFactory; +import be.ugent.idlab.knows.functions.agent.dataType.DataTypeConverterProvider; +import be.ugent.idlab.knows.functions.agent.functionModelProvider.FunctionModelProvider; +import be.ugent.idlab.knows.functions.agent.functionModelProvider.fno.FnOFunctionModelProvider; +import be.ugent.idlab.knows.functions.agent.functionModelProvider.fno.exception.FnOException; +import be.ugent.idlab.knows.misc.FileFinder; +import org.apache.flink.api.common.cache.DistributedCache; +import org.apache.flink.api.java.ExecutionEnvironment; +import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import java.util.*; + +/** + * MIT License + *

+ * Copyright (C) 2017 - 2022 RDF Mapping Language (RML) + *

+ * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + *

+ * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + *

+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + **/ +public class FunctionsFlinkUtil { + final private static Set functionDescriptionLocations = new HashSet<>(); + final private static Set implementationLocations = new HashSet<>(); + + final private static Logger logger = LoggerFactory.getLogger(FunctionsFlinkUtil.class); + + public static void putFunctionFilesInFlinkCache(ExecutionEnvironment env, StreamExecutionEnvironment senv, String... functionDescriptionLocations) throws FnOException { + //if (!FunctionsFlinkUtil.functionDescriptionLocations.isEmpty()) { + // logger.warn("Flink distributed cache already initialised. Not adding any functions!"); + // return; + //} + + // initialise a DataTypeConverterProvider + logger.debug("Initialising DataTypeConverterProvider..."); + final DataTypeConverterProvider dataTypeConverterProvider = new DataTypeConverterProvider(); + logger.debug("DataTypeConverterProvider initialised!"); + + // if no function description files are given, add the "defaut" ones: IDLab functions & GREL functions. + if (functionDescriptionLocations.length == 0) { + logger.debug("No function description locations given, so adding IDLab and GREL functions"); + FunctionsFlinkUtil.functionDescriptionLocations.add("functions_grel.ttl"); + FunctionsFlinkUtil.functionDescriptionLocations.add("grel_java_mapping.ttl"); + FunctionsFlinkUtil.functionDescriptionLocations.add("fno/functions_idlab.ttl"); + FunctionsFlinkUtil.functionDescriptionLocations.add("fno/functions_idlab_classes_java_mapping.ttl"); + } else { + logger.debug("Adding given function description locations."); + Collections.addAll(FunctionsFlinkUtil.functionDescriptionLocations, functionDescriptionLocations); + } + + // put function description files in cache + for (String functionDescriptionLocation : FunctionsFlinkUtil.functionDescriptionLocations) { + // try to locate the actual file, e.g. when it is on the class path... + String fileLocationPath = getRealFilePath(functionDescriptionLocation); + env.registerCachedFile(fileLocationPath, functionDescriptionLocation); + senv.registerCachedFile(fileLocationPath, functionDescriptionLocation); + } + + // parse all FnO documents and get the external jar locations, if any. + logger.debug("Initialising FunctionModelProvider..."); + FunctionModelProvider functionModelProvider = new FnOFunctionModelProvider(dataTypeConverterProvider, functionDescriptionLocations); + logger.debug("FunctionModelProvider initialised!"); + functionModelProvider.getFunctions().values().stream() + .map(function -> function.getFunctionMapping().getImplementation().getLocation()) + .filter(location -> !(location).isEmpty()) + .sorted() + .distinct() + .forEach(location -> { + try { + String realLocation = getRealFilePath(location); + implementationLocations.add(location); + env.registerCachedFile(realLocation, location); + senv.registerCachedFile(realLocation, location); + } catch (Throwable t) { + logger.warn("Could not locate '{}'. Certain functions might not execute.", location); + } + }); + + } + + /** + * Tries to instantiate a function Agent from function description locations and implemenation locations known to this + * singleton. If the locations are mapped in the given distributed cache, those will be used to initialise the function + * Agent. + * @param distributedCache The given Flink distributed cache. If the locations are known to the cache, these are used + * to initialise the function Agent + * @return A function agent ready to be used in a RichMapFunction. + * @throws FnOException When something goes wrong + */ + public static Agent initFunctionAgentForProcessor(final DistributedCache distributedCache) throws FnOException { + // map functionDescriptionLocations to cached locations + String[] mappedFunctionDescriptionLocations = new String[functionDescriptionLocations.size()]; + int i = 0; + for (String functionDescriptionLocation : functionDescriptionLocations) { + mappedFunctionDescriptionLocations[i++] = getMappedLocationFromCache(functionDescriptionLocation, distributedCache); + } + + // map implementation locations + Map implementationLocationsMap = new HashMap<>(); + for (String implementationLocation : implementationLocations) { + implementationLocationsMap.put(implementationLocation, getMappedLocationFromCache(implementationLocation, distributedCache)); + } + + return AgentFactory.createFromFnO(implementationLocationsMap, mappedFunctionDescriptionLocations); + } + + /** + * This method tries to find the real location of a given file path on the file system. + * If the file is not located directly on the system (e.g. in a Jar file or a web URI), then it is copied to + * a temporary file then *that* location is returned, so that Flink can opy it into its cache. + * @param path The original location path + * @return The location of the contents of the given path. This can be to a temporary file. + */ + private static String getRealFilePath(final String path) { + logger.debug("Finding real location of '{}'...", path); + URL fileURI = FileFinder.findFile(path); + if (fileURI == null) { + String msg = "Could not find location '" + path + "'."; + logger.warn(msg); + throw new RuntimeException(msg); + } + if (fileURI.getProtocol().equals("file")) { + String realPath = fileURI.getPath(); + logger.debug("Found a real file at '{}'", realPath); + return realPath; + } else { + // write contents of file to temp file and return that location + logger.debug("Path '{}' not a real file on the file system. Copying it to a temporary file.", fileURI); + try (InputStream in = fileURI.openStream()) { + File tempFile = File.createTempFile("rmlStreamer", "tmp"); + logger.debug("Created temporary file '{}' to put '{}'", tempFile.getCanonicalPath(), path); + Files.copy(in, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING); + tempFile.deleteOnExit(); + return tempFile.getCanonicalPath(); + } catch (IOException e) { + logger.warn("Could not read content of '{}'. This might lead to missing functions.", path); + throw new RuntimeException(e); + } + } + } + + /** + * Returns the location as known in the distributed cache, or the given location if not found in the distributed cache + * @param location The location to search for in the distributed cache. + * @param distributedCache a Flink distributed cache instance + * @return The mapped location or the given location if not present in cache. + */ + private static String getMappedLocationFromCache(final String location, final DistributedCache distributedCache) { + String mappedLocation; + try { + mappedLocation = distributedCache.getFile(location).getAbsolutePath(); + } catch (IllegalArgumentException e) { + logger.warn("File '{}' not found in file mapping cache. Using this location.", location); + mappedLocation = location; + } + return mappedLocation; + } +} diff --git a/src/main/resources/GrelFunctions.jar b/src/main/resources/GrelFunctions.jar deleted file mode 100644 index ef7c392b8c4b231b8c86d70e4912d694d2f2c736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291954 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

-6RfX zUO=jY*~dX1z+n2Vj?Bi@qV+_|<@*0$lJc8-H|8qbt63Af`6C?*vRE@FAFvZ1Nk6)C z)AHITt+UYf43|*05|d8Huqa4JF%nf0vB+AniYzyRb7c*;nsw7Ho@JV?r9w-by48xx zvBVBl%Lz+_4oM4~!f(J)&V+P^RF&Aa7{w+Gu)5+98T?Qsnr^MEI8A#$CI@a8ra?sl+T3fJ7WR6n)Ue5wOe&MLXorx2es(KKQ5q z+M7b7l)LNC#B`}Fx{jSi;$N3-{Hz~K*!FE~=`t6DPw0TQE0$~3)uO4&h-Hm%QOV2Y zYSi_BieZeAD12!)J5{U2&COI^a_vJVq8AJXt_vdUqqg{Iz_prwKa~A;C1(9XR+_@) zZt-?V_j<~?)b;YXQma8gBl^f>D=QLR@yrwA{bo^Ggs6Z5(ZR1Pslv4EL>XUHhR4K< zfQT=(O@^EkJ=-T`{kq-WwqyjF43kyz17+vBW@|#Hl+S}Cd0Mqjhmbp>$Rjzl86Cws zyneUCUv5->7wTY^xYq=h9Bo&rRlac@S8FT}Xz{vsq?S)*8|Qoy0Pe6DUoscfDi>9A ze1pE6f#Q4Zj-(%4sTeTs$_ZJ*PSZai_@GHY^cK~Y)zXyGm4*669I94R)fa?vu4}0E z@&vcOywSMTcVw3=$ZlbshCV5k2}CRIq>@!G)d-}O^}>nogN=16lUh~xk*FZ)bmXOU zGRc-dSSwr66jTU!6U3PWV6zm^2vh3y)A>f;WYOk+ju;lc@G9|2pjqlsk+9^yq&FYl zt||LuQ2Mcuj0hywmzhgBihyOYD1Fc?eGn-51W|tdrtB3$^XCMQRFKrkm9@J}rQ_PB z5qGo&TP;D;%DQDBx4lGF?BDnz#@}sjS9>RDAAV1bl)qa7q2)I z=UN7|xIoe7rL_83roL9F8wH%rq~~$S02$^IiE~Ofn3cLCDFJe5=ix?tO4THht24j% zoEKB;Bz4@D4#RD=k{gSvY3H2BZr^PpuEZNUDPm3vNnePG-zZQ%s+vf(WzLCF7qY@n zW<(!AkROp3z(rXZ!3)ic>4xs8+(bw3=x}xXgcX>*OxUuAM=I^}Z%N_0)iCEJ`yg7E ztj~C3*e4dq-^l8N#PbRka-3W!K2a=67v|i)~$C2ynxpJGO)VL;=cd?V&LhHrq?XbdBpN z+EavyPZR`cmJ*CoKfDC8Mc&;C^L&knUm3(opJL-TDs%Ua`f!`Wr*5T+|Cs6nL!zgIsz|xORUr_ipGF4 zqG2ZJINWUN^27stj@ZM+rtGD3uTNtnH?*GNkDn=5$;CXITf8b-n|ME2wINsVBGyjw zw`5tH@Q0(nr)62x-6ER!x4IF=c0%*qe?;qzDlVh4&skNs?>t)^ov#2 z2#|3(Qh8$QTkb6xd;TCSra<7s!5d2dNF)8apPee*-TC;xOsf9N@~M@m_Rj|BKR4-r zt)evl3pFhzDr4&TKc%NJ$`f{f1b_NovN4gv4rM|JYl5N9Q63FLLWGO$ z0&Chy;t&ADGa*R3g9!8;zmNksf3@E!g`YiH3{yKg(A8A|dYqoyuJic8VH_udf=rRh z9L+G;)swl-|6#$opuFSCS_~{6-CqfiRB|ta<3hWLD{Gmsn9U6MppHAIOKU! zA3=j!GRB6PchWLEG~+@GJqE)nj%G-55j}|1_(5x^6Uc@R{QwuiA6#)L$l|XS$>yd* zyw#>SQN$OvTbRZud%RiW*-{=EtWDEToyz2ZKfH9`1s7Cw=^7D~<5TJFSlyT1^u&%5 z)I_-i^#wS-c!Qppm_EA0nQ>Yk{JPVO)t_mSp&>hC))7Jah^=F$Wa1DLnkFgLqtB)1 zA8P(c8Yhi-o#NnhWMPG=i{jf5Boq8=L&)xUhPtExpJM1c$N{@0Gri zsbw8><5lvd2uM632#CP{VvZ>Pk7N2juXj~@ z6&EK9@B+@ejvPn(5xl$;b7h<9VR_DR!O*v?=U$;w{sY&%Q!@-(FX(!B_5gPU;XOe37Gt2OLNZGknCq}m;f|NRVe6X3k7dwsZbGE&<3IYqJOlV6bs^N z@g!DWHGDWRWxg|PL$<}G${*#d>WvMiO-=kdfMhN-b<`^EIP9$yYEjXl=v7(#0wf zVXtjWC()LQyjkE3^|OJ^WEj`*)Irka`Us&$;NT4w!g<&7AtZcOyg)+>I|aLl@)aC> z*j!YYUKz%K+2>k|pb}CA+7vulGL~n@Po}?(fr9md)(9U2x%1_pAyAG-QBEx11ytjP{O~iNe>S8pfJ$i{ZXu< z<;l>Lp{cg1St?@QQ2#KyI?~}6!~(A1RAoD*4I=%ftpreKk_k(CHxos&?GUO|B8n-g zNL?ij+(tXiChPdg79~4TV5xbE51CRXc7y4r#=?!gru2t zM`K`qk?x~+PX=X8Y+;P#4FH^X=a|0&S3Pg_J%dBT8uUgpEK(gYII0#VQ867^NcYWr zbVvU=A?!ohIPcmsf6Wel1^7?CU~W6?%3*(x>M+-i9GiB}^vpS4C%q)YUypN={zVbS zKtX`Zs-J2{T%8&u%BJ5<6w4h?yCw3`94))W)@m0E5PVE%)XL{ImSU|KEs`##B8XGs zd(y^aYz!66H`7za$02R2;#*z;MpbHw70{Mid|`?)&x%LU@)}jrMv6tyN{eO4c$g~D zmrfK4%chO|=>9*HeFbbKF|utY%$!Un%*@QpxnX8zW@ct)W=zys-^aIyW4ivE!kD&Q*vUI>aN`kY=Vh-g>NBl#7N3ZXO)PK!>ZwEOLH2H zT9tAokW20Sm>0EjkJU@BExMSgq@pT@)iLpNdJ&nMU69&mRv+{%DXemjVVGnWlzNm< zQQ2zsm#6EC+jGmComR@m+SyQnGV-O3TGFdWpwQVLRfoi$PoXX~us)VdA($T!M_ho-$kgZr}>A z_#Rm?11iu~lfA;qApv@(`np)-fa{&kXxn@`u76tg_r=40MIb=_2Cs+AIKN+P{o;U{ zikS|Pd?D!7J(PiQ=nns%&su`e5`jp8L2H1)TZ8ENCVuPh zdEiVx{!ujamKAqJ8La|a6_*XI3ir{GJF>=dH&epp9~-T*paX&oHUwK_8Mze_O@Ajf8-f@ z?E+u)I-8={A2>P|s2IeeGbq?OR-;j@m^8)XO#$cmq-rzb4AUpKxibM;Qu5Q*pW%D! z!SA}CZ+nbOb{h`#ZP)xM|?V1%m#oJ(sa`^ytF3xxf%^N=?#S1ZfK$ORPD=NP4EsI}2FvJ&U zC1s4ujAeXiwEfG;sD?mj1cg$+H2S$VA<~Ij(QCx|$C#kAK=wUjR zRA=nA^L*22)~3Fpys}2B;`R*I_acZmlWa=S#$qKWgVw`EaJnT!Ss}Kv0&Hc4SfU7T zua8}P^RA(B$270Xz49)LJP$>0lgdwKbL`ZEAai9Fb*}0aoQ!QneTB0m(9n@S_X?>Bfn~j)p+fv+$yD2H-G8Z`9*4%sNWy-2>qPGQ3 zySL|A8{Z0XoT8bWV9GtHK7ptXj@zHU<(6BwDV_<(g$h~m#FpQxN|VQ{lpTr|1CmR{ zIAyegFfBF3VVkosTlYzxDbJe!s7KbRKf_B32$x29E&_~2xY;q|<2R;85% z&S`bNz?x3~(X7uW{AhAz&+Ct$=}I$ZB47FZ4zW;R+p2&a=HDHD$u6q>CzA{{lPon+ z^JKkM`vTbVV0yOh!~0(aoeey2)&jWmf$+5Dkw=Sll`*cxY-t=g7m9;kHmEgC@HK`u z96!;)s;O@nVcV1FHign5I^EF~(v2CD+BU zV~(549!tue;rj5&#^H>}#AT?yKrEtFNFPnQq}+@y)g74>cX;*lHyB)F$(`)D2c7GU z@Hrz(kzz1TyQe;utk0Ct>vf!Mi0CMb=n!9q{w!w{8CDxQCZi3QF7uTuc1*|bo78@9 z-k~|QKN12Q6xbF0N%cQR<3Z$;=ZIn%^({(&;;0bqmV&sUOOdfxw)BVkc7}YM+$|Lup@>BkT!xWSioyur20^bi_LGMoCcM6LE(!F-B>A9NqM1 zgd(g$xy)M1d)OuQ=rG*73*PYl2l3k3VJgL+?TBXICZ!PnFrq4UZO_RI#^LVPRFbfY zQEyep)l}Q>nzOR`pDt>hYeW>69cq5Wml!tA$wXGPY&BDI+SF`>&Srv4u#+?kH1X=q zvBY|V4AIyL8(7U>aO8FB%*y6e*ir783w4=^d6{g(gANc`%GWGRlBEsUVxY3$#O#-+ zywlWA6Rnti5~laKohh(=>9ug0&sqUI(Y~q`8 z;~^JKfU45g_Bz^rp8aogHtjIn4!4j%@MJXZA93ps1?C$QpHv;{Vb?+)=MKA4s(H(c z>>O}N-1IU@*zIylO>lP8L!N5Y^K+n@%@1Pq&RU)G&YL%)mNnu@f^_KTd{*#2G?OHe zfHg+XLQ)N$%89XC0I&cfDY_i%T|JFdJC1 z=WbtR!9&!?uE}6*8c=Oel*kSnkIv2lVtJ1DJsLF5FuKoW!7yZGc*ceY$5L2 zY*)IUrX#h-YGqeIL0E^uPBJ2Ucp9cb(MCD~(M5aKR%|7<4oa7y)Asar4xs=?)V-~p zf@t1|lBl(KBhU_gOU|Wh_ENkJDpxdJC|!&r&JHv;^rP%&ek^_X%)pvuj_Vwi3x8+N z>0=>H0Z+hH0T%P{>)(e`lGETSKBZaD$?wu^? zny4*Zx-*?tB@4y7L-)EA&1>XSgaOJ+R^t8~)@yp+)-+!ZW6L1WmwW4d`B*teM8TO8 z^aQb|1s~Jo8wA%x(ES}@xiS9r%%8SB{0G1m$(S4%|z)SUVd2lMS}dmBpDdo z&`jWlb;^TS8wg%hPS`0peu7T$W*eu3n->)NG!b&UBa8(fu0T%}R|OyU#Wwj4*O(B1 zH9#XpBud6hvD@h({}#2BirQ zdId4j29Kx|8r4itgJqry0^AVFP)2|!G(aavAs970jVn3DV|iklMD>UAqw9c){)pQldzMfpZbGg2v{w{EL*ak{{ZKqo1oc4zyVoF_LqI zqrEDe%!Fe&UB&|@ytsHuxb&C>?F?+3lw%MXa~-Pd^p(L&M1DuGv5^n9sc*@kDwd-) zsxx~_MIqQ-Mv`)n3X`9bm~2k9PvN>=L1QH?&7 zOnT6f(9#;J_wNkAt6|29(C|TNZ|;_sorn!5__)FTOatP(KDV4X&Vy)-D-R{9*YMJd zB7fq_l7l0&!!oJ_cwh_5h)R>*(^Q*yJ;k_;r5J(&j(8onYoR5EfHL5mGS_Om(=Oy~ zA#-g&r!>C@o<=Z;cFT+bjB9-3`z{in23BTb2`F%l<1LGiwv@_7i!OAjJ@CGMoW>J| zk%RdP5F-ncqusV4q&KZ2ui!`+ICxM zov()~V)t7&qBiP=TaIYL)~W2mYuoYuSpl7^?MiU-GK9N|4`J~q3^urWc`rdyNShb} zBhlt1s*o^sM4;c6Pg)vk$jPKY20M+So@8FuFjbD!TfTOwlT@4X$$%OaW?YI2cWz~H z*;uwsMVoX>>7!M8sd{F4NV$#st9Y&jtCm|U(QN11D%rUN@sEOdfp#uklAWt9MD>hX z*Iexkrc_(!W00zOb>*3wd31@kZg}lE`)L8}0tG{xXlrUSey8A8&kA;@0Si#=WF=SX z>rE_F7S)|+=UocU!l{&hiulEPkO8r?{NmMeqC9&OsKb+@RO-bhaw((>;iV!@PIMb2 zna8z9_T`;CMZP^~ySNO0?Q*uAs1(C!HgFeQM&}|hK2RRLe&5V@74cxnjJzGS{@hPd zoh2srD1b?WcJK>Z#*Z8qQ7Yl$Pr*(r1}@`$+(BOk8Mtj}A7Y!Dmz!~>N-m2U1GD%$ z$fG8SkZQud>)tpc{SHhu$pXFy$<-4%*F$YXP2Pr`sY{6XoduTuoC5nkh>D~Ga_u@G zgYWUf?eu`Jz5r&g*uJrAi?k_qOy9l%_GZul^$GC?Jc@zZE+q0kz37u_ALTVq z1W8?EA+lyLHuBrQ)XszJjoT=e4qsCW$i<1)=8*G|8n(f?D>C;hmZFNoX1&4wnOWcW zt7&}V`F;|H`}vOpv?a~cm=TI*)G^*tzPpP5x1!cVyp~cBMKDhZ1av|x?QO*kSmYMI z>xxT=i1kGGMa1BWi@ShRUXlC40Uzcjz_dhx!8RxaLeUJ1S3-jjAJBm`@RH|;F$HybSrCtIjcpK*cKl z1Z_*_4%*rE<;{h)9G(p6J8W-nUFQ07we2t9h{S$`A3XX zt7NXX(~)xKk-xx0UR{FGp1X(?JoLakM^(}tc|)CJgD57L2FDd3v{Vs1U!fFMRE!B- z041dT0x16gLUbqjSsarn?v?oSL{eZMUG1bx{ml0AG*Ofm74vuwkg0%&8 zStvoVYg(!HxIpH1kaYu8HeHr`Nv7xTFWUWs!C6 z64wc%+%wO(gj}qb_<%lM(&+#{b6l`-BRtHwBn$6VYFWj?c}`i@xxlzI9pjZ+Smius zKn~UOjbYOwqiVRox2!U6NYQ>w<(d)DlCKCgMcz+~=tZE{zQd@RDFh{}oI9F=N@~Mf8GX=r*RjSc1pqkbQW!snP&HGHNiaf)ST3^KNy% zgRjW0T>u-VrbMe|+fvB3f^DUl7Qcin3i^vYRBwz%o6E|sooh!pGf-m9>SH^P=F`GZ z@s1bMmr2J}#q#bvW>}{e@rAOkQ+AfVbcXy7q6No`HDa>r+q5jhSP2L20W8mxlRPBp;jMxDc81R1U`dWJrqII zzW(@|+|j%*k|X|wc2}S(P`*??sJ{Az-b{kYWc3;aA*`ap*l^4Gmn9O^;(lIpJ^#d8;vWiKuw0uq9yiLAX|op zUlhlx<*Nf5oV9k$bYa?2TtOND_ZcG##WGB1=Q^WjWM2({|BTTha&mOXNHdll#A$>f z6A9)OAO@p}MxDtg;^Jq<1>I&Qmim-klRj_Tjmz&*O`qyeO&_-EBekzFkyRKIShef~ zslkl?)uFF_Mh;h~9>Q#vHnDtoxrYlSSgd7jvxh%kiXHNyABCZGw9xn7Jj1%W51Y4j z;5l$5$`@B%;wzlLs`2y!)F83%L_kr2CBmVdU z>=A#o7w#(T_s2MiLSl>Y2|D?uL={%xr?b*n2kpjM?L{|34@R{s{V%t#gJ0cHk1Qub ztvp>=_W4hw^mMoM`}&ty1+^PDAidubRNfE zxna$0bI@EYXW0R!5Yf(?^4zzzQP3k%-6&F6D*(1u>9(p{k*8(8d98IP$|6bTs(qY| zyWw1DyVCC&a^XC8!iCy;B#MU0TGvqiFC25WgAu7kp5!EG+s?836IDByPel|i>lTxQ zW(vJls5s*ysjZ(PM#XUMiDMDb5VWX|e|InqKjevd<0l68wmbB@>Xzx>!GfOJeyxp? zLwf$^6;4SQKz^f@02{v*e{#)nd}$uZTQy(S6O^YiVTE9%b%&vF4`qtm!iPS{05B<2 zK0>g+g3ho&;`cpo1&y=yIp#84xmcMqCN38?&w)zk|Eo*BNQPwA?~AiV;2#vcR$!ktJQSl9Z4>)1Kg~8IFikES*-9#*N;0LwCp8FNDUuqK_nW z@v&#(nC{nOY?gn~qwJtaZ`a14v*3*(V&3zJ^O=~D<(2f%{6S5!uh1BH+PnlT}EE+}%tlyt7rJ+?g!047qcNQ1LPtMkx&& zwdTi08TF%F?~^D(5yP$k>g3c-52roa(a14i4m!7{t}co&${X_PATTi8V|aFP$9|V- z9+I5VZWreCd=&@m*WwiyGyKBeVA7%SN`ng1!h}T=Dqc$&e95pTsSC=|=JVVBzJ$wK zg{ZqC7ac3L@YL+dy4AJx%us-zpO9=n6Du}>UL|z>Fr&}B;TRy6rj%FrO3lC7_ibEv z*nAYl4v2|??{EeM-!o>D$=9fLm%6{~=K!avs^;T1H*undt#dc2mNvkr9kt}wY#q$jy)XibrkCXd=5#YCxiXJIrKmE(bY=W(n)_^HtR%u*h+I+FGPV&_ zZCERbp7F1Z&)zuyJQD)qfKQ05PYk9HoDafYlFGk=;(w+1`z>-J;M#S5bp(BGS&2*0 z`<8K}5}$4txBPbin^w%H{0; z32ZNCX!}3Pd6KO4h9Gj-P9%o5TgtCa+jBn=B)I~`E11yz)kQJY0w?(Ck(#5CHNxw# zR9t9MzQ?C#zUEmGe?fnhGfBiUu6yJP19vy^YhIqLx%wReKhT@o?l3W%<=tJORQXs~ ze6^d1pJ~$7qVwtOs^SE$NYM9bKR21Vr$c65i8Cj}rtpbVo>JA;XoM>}mMA#sSdv1P z1TBBaQHWT28)Z0{kT5bCLkz9;A#$%pO2cFqo>6AT2s0(}p_!_kIi~0y!q!)}G}nrj zRGJ)R_pdfE%!v9Be|%wS=%nUD^F4+ur^b{#*dO*ifA@(0X;O;SlU^w`^OEP~Ov8zB zVg$*9n>WE}tVqYKj58TW&A$g}M3L^T5p=T0l;`0QWgar~w=(|bPOZSmZcUN;gwrl< zfprC4b34Y?WS^HQrLT=!G`ZU7CNvUqUW)c%{Q-uPR8qACAn zle~@f#*WZNslCRt(y5w6&`r8|7H)O7ZH!2{*nsPuaLF>y;LY$*gLr>IGLJRdi+n? zFG<#Z;U7|AyE)8crz}iG=97*;FS)oG-5w$e)3{D8N3yGAn`7IUdLVWoEA|(jfFrKI zP!jj~+dJiOjk4-}e<5lb??I;T$?fmopRXSW6agUF_)+bbhA3>-Ur9u}wFi4puUKkK zgk|#JLuN{(kvbW$R%OCU%cNO`lv#Fx09vC@#;|>sOzA&4g$g^^jGVG;sPL%@Wk&Ao zc(7Y1Lm|vd3L_y$;N{P}XBm-GSj)wc^Jew-ec4-7byfs&`YN*~94{XFn1&AY{U<0?+Ve>H3EL&x4jei?cX z8KdB!dM0L_X*8SmhRQ_P(md@M1INI4?{CMm5O~cj{^pba$kTxl?HUi^8W%;JGH;zM zcbj_Pc(hqQuHH(NjAbpy%ac7WSB>TN?)lvFt6#e6<&Jr+AHo!IXi>c0rP?Yj>Orq4 z1W)(LEQ0X3ADoF~p1fZw%1Eqd?G0wjVWDM(HK+8M9>Hi-y!m6mlGL2UFS#SC2;jSkp4;JZgJB?usLV^?0w9#A`$T8JP(&3 zf#p$!xVW%9&SmyoEK!o1NM2b;3XelB3{hY=IMD&})&l^>MHC+vCy;1JhxPNX9HUzu4l;1x{6`)d8tBG%SqV z22!Iv9txA4wRxA3_wzdP2Rr?+&_ucLWhrs8ZFYRi_@i}C<_PaBoM=f2x7WmiVsEt- z{%R62yo*>?^6Vf+saF(5l;HqBiOTlRT21r6W^Tm+X~z$FeGXmr-COE*=>r|B^Xsc2 zy|FG$KVyCv35qie&veyvDRhKj z808Hz@)g(xjA!11I$tnkjyYYMwFHwOcY{WiFs+FjR2-XDPz|1008UQhl%Zz5ga3Y4&OKvoWzIdq~YbK3`H zQw51vZ%8TfenUdFI{lKivpgutO-AI{45;P3MwjE}f^kB1GW>p0-g(11qu$}bc2e%_ z1W94uc|$w%%WaPgeybnoCCBdIL_)#g=){7gIR>QTy~L#7n!xklJ7kw* zcXHyPaCdMjNBes|Y)7#@(juF)c{%LO*~ftrH}KZ(B0z!kv-rx{h*+K7xp5>Cm}7rr zl8v^&>7S5{PhsYSe{9l)*2MK?B$1;ycKk%9=*rO;e;LZ*-5)lZad*C>M7zttAsC~` zu{cTVbG##^@INt$$H^ZoU+eXEc=#cgcXaNoYCd zQ}29+K;LsV+IC|rw{5s|?KI|Xw;BDm`ONRP8;1Qp8~bC995oBn`rNlPal>j9pDU62JdOgw%lCE53I#;7 z$N3xESm*G~boTJIb`Kb z^>EMH+Gfvc*yg6oujwz6wS`=jZqm9B-C-Rv*eCQ>89@qbv)dir^DBGSdVBRYcKRKS zJ#-pt=hoVK9nCbe>-*O=F{q6AM6TSj_4@M)0>;wy2~$5<(ifNHEh}`Hi@jb`Mz@de zM=M!QrgWLDXHq&}LwjPSjX&-+5nfeRa;U}@Ic9R3pozNnNOvmvWnVTia{csWM7*2o zQ&q@aAwD{D4=HSjxfaW~<2I1zE2>_pis*vZ&$Zue3k5A6RP-IhWWC|ux;uL4L}O!# z^vxp##VwZL$wKXz%%rv9_OzC(y?X0gCU;J+Z(Lu6FLR;sTO{l&u2M4%ZPbrQCEAiO z_07xeTQZVsRA0RomcpzyB_N-18lMNo#Ai@EP_BPTx!xjv5q4Jw@3D(UemJ!@&uEoyVF zE(p_sS?$9)uOs_wKJSt>vtPds%6>B-t5IuuhBs5GG7F&%I_Xo{}`~$~xP$9QS_wiWjuX#p6pW6G-EcFBi z?GIa0fzxXX1-LAq5H3vIAJJSzrcU18)jKO?)N->c6pCH6MrIJqvw(4wcuxXZ1@A%hz^q)RrXdBiVv8I9Npp};Pwq%ikZqxQoEK8O& zj0AywYr1hafJ+Fn8+%ZBFF+=2(hpe(%q#k&I6CvWNGQ}-Y$xBknwX#); z6iXV}D%EmTE$o$Yxhm$iN!Y+xOmbTOQ!*=c0_|pE*)k370CLbp4aAW5d(QE4ktFC{ zE4HgDP5bLc$Jx4OUeS#O6B^j^kp?L(K%%Cl6smkvNf&?Jl~;7<1>J>ROm){>(UtgQ zC&kzj-&)ZXFwJ#kcuCh-(LL65tHsfEMQc&lTGL%uXUi4SbwzV|3tinkS#0Z^JdHSS z&{sW>_I5VD1L2D#otw=~`zM=GU{dKpy;{Vr%SpGTB)v$=xi@i;Q)lFGrxQ zFmus}?C1VyU z=ueTImWv!Y2$hgOWv4E^s&9T_9LK&S0(h+Km6pFmdEeUieQlvK@|iCjDJ*Lxr`g$E zMYd6;>{4LNrKBQ-s2-(qOJSm{iG=NMh-k+wHmIN_@-{Z4Saxf9E&6q_5RPC!>X=T;t(R0lPHrlYU(R$!h4lXiEJ6Ni2N{pR(5+AO&R}-EC ze%uRQ=GY3@8;zEp8TuX0M&cK`d8<;?o3zPPSx_*tJHqDvk4s9PiDEl7TpsYUK%*2t ze>p^KY$s3A93BrlMnC;l$2@wbjW0)@qin%Ogd5P6qt)G&UAf@TB{$#s(hOxB9mFT> z7OY?J4r-60xfg`nP%*3@ls`%Q;{)x@o7{0~X`BaQp8Acqhxh=&jRb`MU_Qn>L^XOl z96OZ*2gQ?v6N63B!I=@nRq$J-LpLZ=MQ9|fP1qa8>R@ndRqzDHYT09MVSn)E%8-=C zC67$trOw6x+Zedt6O&Y6F7GB&;FEIFQv!EpmV0F=3@q=IGXCD7ss}K#kNO$sv(5nY zvrtly42Dc9u;=G5sx|ay$s`QiZ*SgO4&;6to6nC}ddWX^JOC6|kWzKZ&9DqZmxb#O3RQWP5I@J40DCyGe zDn*hoNgGsT)JcOmevycFZa?VSyWE6j*BJK5Fw`Wb1611m`mJ)Ei zWG3r(#18ad>r5DQ^p^tYrF8B%OKHU>(wr#iOLfF1hPWXpj8c^+)Js6A#;7o;l@eJc z6QepBz`vb78=kcsD>S8-!oEY;iBz(;_Jwo#+y6@FcSL-&qe zLG2q2fh|E>A$+Tg)1rImwS!4t6d?nMZB?c%yA8moPhDC&yiz}h+S(kkIa^Mm1=pjF_P-JSm5VKyx|cng6^}f zJmodNgTQ0`9%sm1wy%%;PU2<#dRcqf)>gN(UFPT2^yW1T7bm^f5_05Ao6&n!R`A1c zUe6xC*ym>MD~-2?8q|_IP3OfM;yg+`gI{iE&JZ=zBL7lfRXT2brhrs(ql)+D^vd=% zQk+CDHaYc^6O0ZL$Lvfm{#QIpn;FOiN7TDp;ttUr&k}EZJWGm<52)gwE-}CO@oNmO zT+zk%Z;AGpFPL+Es)rk*Z^6XZD4rVk_TL}yih7k72~c0?69s7RBo=w0>G|~%UE>vP z8IRucy=e@vO2+zIe>`VCa+V^t*yF{PvxH&^L?23~ocspqD6~N;N%eFO(j}JXIh?B>sM@2F+<}M_ z+Zb3Agq|GSrT()oC;4+Ah_17W*g@$P1ZE4c-wHx-$_(^^{!{d9L8O1%!KBu=TvbuYqDnab_^W_-z~GV^=EGLEeUFwM>MX{k64zBZ`4?z0y@ zg@QCVPw7MsUj-y|=Z4{I{&uJ^kA?8Zgut^QZ-Wqyo@OZVDpUJ>E?Mw2xq9$RRmp%h z!c4@9A2$p|SIW!}aLkqhvmHp(d+HU!A&#d3#Y`yYj2LlZNK>Oe8Sx_yxVhTt^DvGO zYQi{bLeLadbqcH`dl0T`gj}a&djVcWJK`M++G_Y=jr@{Uw1!}u4xQ9R8aU*l4rlo{ zjnvC9^$ICX1o}%Oy`sfFN#oZWPZ%NtwDEQvz{L$@Auf1$f3`}}QtGnx7VTE2rf9g?*2YcT zPrFoyb%Vw_4cAQ#wpyc@aB%|y;|L8Kif+8!QDs659vF9ISVnL%53P`Rs0&KSFBb>TbD*G&ZRMo#q0X(F+{Qe%0NR|Qg`cHFs3jCS_i?S2P5Tyak$4#Ib3bX zsV9=?PdDd{C-!$~HsFHlm7`y{TeG|aYhus0Xi;uszyq{Lip)LH?vU891n+n-oK-G} z)S_T%bT8lr#fNsPC&wi5!eWlO1C2Vbh%QJ5t;#hmZ%pH&$T zg4$fDh>Pijz>R_o_MdwdwlQCLAb7LTTNfm|Xl(24!(FMebRPt^V9X!IIOUMj%VkVN zs;a*O&L0$XZaD$lARQ@7HUTaZRvd!F#_&TabgX4@S#g?3B&%!Gk7K(TjDXA0crjCo zSw&*_h0a?HY^!K|E4ZPCt>=V_-=yW%BG*NQ3o9a2NYk@k4(g+7Nxp057|BV`t*)$iXXN93PGEjr$S0_iVR{t0_>3^C@hcE*h^Z>~F}~fU_*R z?7M|r)F4wlMqk>;$m%{cIPN9G0U&#QH`Ku7^WpmHffxs$IPrO)-T0A^6!ry$Yp^y= zF5sSE8)1Tz=eyHoyj|flb!wQTUKByS%1lSZMo+T{D8Ib-d^97teo)~vY|8$HLZtny z@ri83Xj>u5PB8fXS_ zd@A+pa-Pak*JB0gGJfjtdU2A5x5_JEi{Hdggrqf;>%30VyoK4xqIxfqO17Xl^KtgU zs`y^@YF52NME?k}Q0lmiR@kpN;hL7@QH`FFx&kVkl}_pDM#% zXuyB(3t0H?0M$)mP$?$5j|dc}+D+|MQG!NV%fBrOK+rq8w8qyj?F@) zHr$x4p)y+*k~9Tin*4Y-&kl&?3O1>E-{!dRGBZ>WXwK@r(R!n zr@ZpfeGPy$`XQQqkLGIW9h&+{t@YzIf0H!zwV5wC443Q8%yO}fm+MPTIldZ^PrdS8 zr3vw@SeBWsZSMXg6Hby1gx5|YYx+bs`@nB9O=wjWZ?fSkpGNnhLs^!fG;0EL!_#xe*2e#}YqWMD=%WnL^jEQ;BhmR}^LgR&U03=xLac zV^N0<9}_ng^i?f`c3Uo$Rk@&s)?^ZT?pH&&`ytHJa5`>{2@7=wZq-+@6B!ri?)pUV zUZmFbitc!zF(|N>2Txl zoEaFDSD$-43<6W8mSb~kad@;j+*%pc#MAvUUSddZHfqE=BVFovWj2fX?!-A82aR{W zna4YO{8lXEjw$2zl0Axkz(-SF(r&r5Vt&AuY|xb{(}N;wy@+hXDVT5lR%OF6D7rzX zAn(g!+cqGa{YdOc{f!pon49vHBI>PWtu{-h=a^ntlaH&kpB12hNBYM;YVgL>D3Z(} z<+2Q?lxg!CD*ZAr!a;sEmF#o^)x{KMunqUh?qZK$1nDXBc&|5m@Pi5VX^cwxQ+)4} zwBwQr_Q{-bGrtA>Dw1ih4!S#gn8nD)rafI0id*DiJk{k?1#4pC+C0}7E>jDP~1CChsgsV z9ab4ce3h%#e|vpd~v;07Hili@q^u zl4k$}G{`@O51C~EWiaF{H7p&1=1zrN$-2XbmcxhCPLpTDhd+i7zuJ2aAHJkzOvM<^ zvj~!p&D)-X0Q7_ab!6k}sLARm$?9my){($3x_}%vDKnUN{t2)nCAV)I{wgp}awp4j zCr3|bZb}3AB>|5K+O25GJQ2XJuh<#gDaruMzUJZUwbiGfo*?A;WaRlI&p3=K_FV&*B-xm8_4FtdExb2BiC{*g;7a zKuzvLPVUn(VrB>fzJFup%DS5RV6k);3gY|5{M&B4fkHTv59S}7%mY36T?uBwEYFzf zp8!~g>o;X+9yZA{Xzb@srZ@+@0y3M^gNOKGHy@>)CM_s`#s}^_iWCm|fycBEe6eB> zi#!@~{E)~{!xx0S968w)`~}O%iJFNkHlv1w947+!#ezl!MopKW0D5BbY+5Ew$_!kS zT%cJl5Yw3)Z1@m3Y(mpf8k=E5LCzBiq&K=#kpW@Wik;@>a0WTte7j#UORs936_E+Dd^gqXva)B3yDlhmqY1aYV zRb@5dG0gU!JN3veR16DMC!*e>AD*kdD5#fhB2gcRdyd$SHsw^eP+Riz7t1`-mTe95(QX zhjJc%`rmZE0}g<^1jBdFeDoZ%IFO-vGZy_gK-nSba0S{CX&(Qoojx?p0=_{3y^lfe z!Y=fSSfQUP?!q#F-m!;0_=cV}y!4ieM1RKi%_RR!kzSJl-w*?uRV2>8Oa774nfDqe zCSKqQXx?dR1o-`G^p^(z#F_v7H<0)31cm(YBI?c+?Tf_Esmozg5r@X8vEQ%z?f&u$ zTlou^PQ2@OCUh!w4^NqH4yk}G>ch5k4-Uga@%_YuN!TxdY9(PZ@;yF>b#@KyczvB3 zVZQu==D^jj$P?#!B1`9kpjT3NV))@EwDaBR+;>Y6q_H@`1u<%uTyrHgrr1Kl#E$wF zndnK9Xhp9TY}sacq%!}4Yl38W)s@K&H`Z8%$+$r}qOv3>cGo=#_=G(i6aB1GtsWB- zzHexBM~Y&PXzzzaiZkxC7_g;?^Nlo#_LDj(5Z4ZtbOhR@j4FY|qS0j+DBF;HD~S;v zb1-Eq#k4*z-1>a5>J+KP{{_RVgl{hLLWDACL|Lld_qZh zI{;ZD3RuhlrD6tMGlVT!#+6J&89x9&jN}v?1RY1OVfm(Hu!)k#0^tNNhml+kM<~@S z%QeqnbCdQU80e_(lk8U6)_>*!g+A7W(w^j^BX#aR5mUX5uHJyMLQ&RU_7GjY8euK4 z_ZsHlE79H?A8g&#?^;7uCk#eUk+E-e`dz*7Te|YMwM=k1b6ComMb36F@Vc|I_W9WM zJAmW#SA8eSio+mVkV7n~&NgTJ63;!HZH_E2^AfBo8`ay$pPGu2K)5w7ISXx9ysro-*tpbW!eVv-3LrnI(=|-8sL_d z&L(UfmgqGkN~_xj*t&MLsCC;A5(*7=w81mPWNyI6N%zENAxa$(V*;av1~J28{Mu2T znN7oGcD+^wotG8;(2lIB`ZDh(Df>e2qAB|@?mh|r)jQ|vj2_GPvZISw z7&?jB8QYtD;g|ehz#C<4dsHDTJ}@}i6fLdNmWl^8nt~0C7Vu)GZ^CG(&1E|9kA^I? zIIECuz(%YOv@DM|xZay02J)>_Is24OYGqH0Z5YmRw<_>-_#ROW)eOthQVM)$aL*y*Ap$>DqSD zNaSHL+3-$Hbr=^%R;pox$ad_lEjoImWf2~4N@8JNAyy%FOd;UZCmvsX_6ly`$gfS1|EVX;}4_bUARUONh|-khYF zz4uP}JQy-(*%y(vW zcZ|h6Y7W0VjlXzyILXqVe3e41B{sB1o@A&PbzTS@=Nz9W%d8Q{V?~eVlEt-YT5vFG z+q<-FSim2p;c3o#<^}M(LnomZ++niRiAZ3Rq$mTp25*1x%0Dl{>k;N;3`B>do84Fr znwvQ!L86Jz`YgW@jazGptT7nmcc-YzhjC63i+u$W_H*Twvqiya@KClAD)J{xd zeuN3Wu>>tjdA*|SX*p2KQn3Jnl2oqU_5ReoL{aN2A0muwE8o*ec}egIc*IPm(2R=d z+_fv;^D1hc-SUO1`-AA*_B~RR5n~gntO3lA)csDJj!`$zW)VF6~2kt_Q}FEFszgdski??9sW{$ zn+8myCQ-LJt@>R*T-0~W(sH#Is@ha>FmV+=s>hzY*Ljx&H zCa+(o#X3z7U2L;jov&TL=2mZkR_BY)igj+iNzDN59l2ZT4=raMiY`eGLrWn3E+J)E z`|x0wOdO3m&WhdsZhIR|%|tryW|ggGAIV&!GW4W;?mUT~raR$>*_T$}2@1e$4XsbB z@!V~Y+~p=-;GThDI(%KN?l?N@C^|x;i}1m8;scdK^$~4MMxlm}#<`>IQ*<5JWJy<| zE|8&WCr`0a6v(JFSGpzf(p9r=`6~r=DP*CIG34@1g@ZDBpb>hbYwgy~X)3YxQu>md z334)-aqx6vd`c!iagIm4ibeL+$@K4__&eVgd_ML_)88oFMjFuLM zXze}Ey0~94$lf|?(ou9KDNrW0)sXhRO4VNegzl@>O(>UyccK}e1i7R+ygP*c%C$8* z?!$H|iHrb!nz}l(%_4n*%)BgX4hDFH<_B#v` z2Av5TY4_wcxSNg{+ef1OtU|Ke)CJMW3{JrfMT7#(exgqvZvUZF%XF_e;TDyLT!sXe zMOy%}iFl1_n?JAM6WQAlc)i}8SeQcn&>lf!j%eJt5k3qZp^V0YSTv`|np2#;VUnzF z3E5T|k7hBN?V_IVbjBAYpKp+hUobbj>UDsm>V=VvreS={j?MkvjARpUPQM@LbF89SIXcJ z=M5cgV~AyA%%cURX@vxzN#`IfH=YaKE7b!JSN)X?IweuM3K!UebdL$uxFMpOmvnG0 zktgJ-BXY||$|#Vhp5S2QFp#{-VnM4tk`l>MdX+c7vQ)4a;U`mOwJRU%G__1v2 zFTR+J)s}eXieHp%lI!b7dqfadvX$xjOiSO8IF`^>#=@A92^ z%w2PQ`+b4`#+;V+bPUTDvY(~)oKW~oAgE@l*~>vZ`Bc1Z!tn$|(9u(Rj>ZFtuge}S zP;y9toA@sat2inRb_AsWfq_5|&oke(WX)J>1#Wms&s0dsOp%@{(Xo&qO$st;2 z*4SfPAcupGI0dRXE&b81GJ>x<%Q>Fm_52R>(SFq%kZHz>jyV9apTR^?gtOCaWyOv( z3Y7L6xNK+cVxm`E<0mpfH?8FT@WZbDq&0yLeK zlt?=l_nl{5j@S@mZHhSYUFovzt(FIC$f?U04KIt*9#%lmb>n zUlWo}<4mAu9HFjPgd!LE3E2qt<}?>^{7ZuCLxUexgR?JyA_zKZ4FU3!P%Nv~H!-2) zQ3`*8;iMTL)&eu{o03f*d7OOGvf$2bISxH@Rlt@i(~SQ2k1%hUtIFR(zgyWF?CZ_$2e(Zg0~WBS3kv75f?Y zK&bVQxFJ0K4q@Ga!BOaWJ#c6~axvS1`ML>G`@aHL*R(khIDI}O3yrI%7Q!{z5X~xP zIl?Cyus*20i<&kEHYLbHxy_O244u*qY`s@(hc4P-R{!|nF&Ky>q@RDVz(&Isa9{{I zq~MOPPI#m|-$)S%6a+$X>{Ce3&S4HPaE2Q=LHDEKK0AMPq@TrkOdR5m5S?^r{0S@F z#*5twTXW%fW8+=hBdanPbV;JJE46@_k&O&97H@J{n&(p)s!JS#{}7sZPp+Fa7`b%- zyF+aJXy3zjJHc`*4nHULEJT??S!GfliC1x`|8QSqFplAi7jw5HBR;gA%%{rjH{yT7$-#~>M>051rR7s@PO@sutOa z=mHDa;#kD+9E#((xr>Xx9^(aa8oAl|Pqq=$z{|{Xw*44ReCE7nf1bH^0k6ZcYM?B} zUJ!ZGD5l>fkW>U5!OUAX!|Ww|e_r;4Ho|Gc{_TO@UxM=64g@pjJQ%@;Mc)beN~#m2 z?Gs_~6F0?s-!f$qJnbDa=QE5^+)82LC$hxDjF>R%ChV)=`)U*NAC6j>edSaxXH1_mGBKOBaxv`r-skrDx>2_vb$H@jX_nhc7X9Ro3$QNQvy3YPf%6=sGbZ}V zB>OY3o0{HHqq4h+7f#QP)8d9_V5*O=a1lBtR-CK%9Ov$*kHWyZda~C3nl}dVB zTYKdSTaId8fB$7oiKWQWo)H4!WKnNZvY$@NR16S0c63JEB5dR{r$s{!)D2SpB{0X! zRTDFGPDVSQ{&{E0>myibTsa@l)M6Wuvym#pJ#a!jYoI!qh($hS?odAz)xu^tmfWkZ z?U^o^3r#cO#3&|1W~%#fQ9=~`-X(auoDETgxTxkpn>xKn@1`3lc}q$|OZVf{!XUHz z%L2S6Qv-ORCY8OpvV}MLkp+&5=;DirB~fc2JQwnZRC~`NbERIT-}Zc(mkFf%S`bQN z_xx3j!xaV(l3}{uCXiXrQ3-{6>rxgu%W$KlZ#7!4+$7I}crxmTG+?=9?W=3Jqg%Aw zqu-(vsfL@Ls`9M~Kck5Ebo@I2mB-}BgMir~F&hAy7U*!G1v+Q69DE`sd+K1cJkWlJ z2WrCH1LUpop2myg`HO+dR!d$QUUyIpaSUE}cnU&)FeDJ=l-*JM)@QW#U66PRy~)y$ zV%;!mdTjrAEE!^l>PJ)y;eJt?cD*ol73%|cnR*1mzK#K>J6;kZBBd%3*PoB^q2~rNFzCW}L24fhbDsu)}7~AR`s%mK9|& z@>?f62`b%coM>h^)d&|rl5H(tKH~xt7-Y{pHIK}!pWfjoQwj;5-q(8+T`GFGV%v;A zeQq-reIb1=w_lqROl7EB-t^naD-sN&Ulk(U(&_oeg$NHz9Qrtn{ozB+NQwq*1!7?-vssAi5usWBShonMAOJp2 zWu|107$yA7K&^Rf_rsXRJ& z<`v>eb;et96-lvYR1|Y#!Hhd@(Fcq85{GKi0snD;sYY{Kl`R|+>XG(;2-Pi_`|{HV z*4T`Y);DOIk#Lg^49n?lg{g&C(JXg_R@1G~Xz4Diy=#M3)eG8WWB0yrm~G^Wp)LaY zCf2DRjt?-Q`3m;_NH=>J(=~dTh&v3-DY<_B$Zk>eGr>Dui%fV9&&ilyEwrwVCVyM?nVKV~)xo2$+6nn#~x90>q#jv(Nn?9KehivGmF%q~4| zyy*i->@WK3@F4UP@JsEDL4EevY*X~SV)fU~AIW=nYSwfB-qreRXKtUYAeZQaQXzFh zjlK8nPB2CkaV{!5iVf9R5_bM;nhl$*aWk*mX->8?H|JwY`I~wxq>>3ff2BglQ*A%g z;40$iJRuoofYV;KY0pqTw#J#Kn>g{!y>v~jcxMhUO}Hp?R!n=p1O5}rMN#S=dw-ZA z$PbkN-*&G*P_E``W$W_);d!e1<_|f<{LVFR&MqmW3oTXE-XJcq^A@R8f^lX-rEK|; zP89C6O|$D3WhCL1V1dQaCFk%nO4!Wt0YkDijT5kmIH z6`_Q1Q>sOr-y1%7iNniFJ{ExDCcHEe6sGpEsNQPAPFQ&v3hdh!)0)Kw))u`r1tTqz z$^^~&Q`sRYD8#3?giJ_BbI-qIha~aXozp&^*wHMun!t%aGq*I;6WNdt%{7Qwm=dKn zf076IR?!GJoJGo9{xm8-kq0`vOiIdO$4&4BYEC(RJDE)WiALb!qTy?+eDv?C7_*qV zn2Op$hq_{H=3)`TkpiCK=d#MOhyXOE1;Apk=!+K5xjQd@6HCCvpMH-KPeymCi-tD5 ztWoSK%=4XFQx68XnL4{JlUDd7A7w1XvEGlAq)KOTMY1u`Kc>TvbFEu|flv**mnefI z_(VEI60>BIx6hO=h;7l4y~!&bg;<$K@>`Y3hBGNqFiY70S_BoWxZ}{s6xqs~&4V&V znF0%vSr*+V6V9Jg{)tpd8IqM}_P1I6Lq5Fotr+5B$!10_d&c54;_X!3!TS-a;mjyvw4=1&B^n3#oF)W ziEfgHo>EJBYjtib`5T-Wl5-K1Y#;c43Yfy==;M$tt${2ePyqny5ewZEBQ%LuO`u%G zmz`y=bjlF#nqyp1P;4q9G~4hwzUml%*!~V*JTr;PNsrEgsvrPTz& z6G%N>q2n`d#1*icKRWOWHb4G>6|qa;#yvG#zXJ-k*Vs|*`XStA|G*f7Cb60qMRC=! zIN2C=j$uDkAqh3xR0Nu5TS=Cu(}5`-XW7qWqvNF@C{O0G)OMD2Lc!@u+*$%)gf*1- z|8Q*;FH>`vd{vEQObX0kz@7qce*?2GQ+pTil(k-LpwV{zw*HA#dRD4~q!;Xsh(hQz za1vcJK9?2L?Rgg&NBhxXHKWLI^$B{+F6O2~J>m-W%dVd+#A!6(*B9ZitOu>lN3StO za5%y_9ANc`A@7tuut*-_t$miC%@%*e7Qq9bX$C@V9vL9t(YCtJyQ3g5p6ZnpWF~6I zhhw(7Uk(lTT%361ye`gAx|`78?^h^!#B_bLSog`m7OA^gDJ}CCWn-KjkAvMq7e84| zD4D$9$$m>(#k%+!E&HZ#RlK%MN2fBBoma&yOu9ozUAZ3?&%TVrObUJ|2|(7P9N{`3 z?Z^$i2bJ}k!uyR9cZdPCPfV|Y-NNJS+NBM8&|hwcG{(_Pv{3`2;YMJrUjx?b_Hm1I z;;~8aH*F|WEqMOaaqA#j@R^gm5+`GM8l@SudY=t7Rpd<-uh3KVE8f(LKH#JsdT4(p zzkCr72F#IgD-U4ZMbu?W0LK2_4?vZg*=Y7+My5$1+o{wU{XH1!5drfk{IM|+>JL58 z)=ykhZRpuBq5Pxq@7pctC>kz`TQ$O4H4@^qD6!sBWrAx(#nJ7LORKpPMMT>x`pc<1 z=Ym{v{QSS-2j6O{jH)|d*a?e8mRppYiKs1_WLHOhn=_>?-^aB#hcQ(H+2ol+P*%6) zH#fOso9*|C3bmg4C=wQIl;;y|Ga=Z>KlJ48jFP<-=sbJZGR)Ib$g&{d|}ALjyO@&`ui*@M(Pzs{sXdeo)9Lu+r*5 z^oSUZCBrDBR86%z+Ux51hFBu&^C7_n8OHWGL)1*M0+m2MQ|qzV zBK5GSYtEcmsFF3ko|jaXYgL|mCS%~^cV;jzUtV9@->hA`W(>~YW8eS4wfn%+|FHQm z{{4Ax1LWtq8*V@Cbw^6?N%*=q)Pu;3?rRx*P<$PYUjkO*hg5LCF9SmV@D&3Y%@4*% zA$Vw(7T^q`e{7~N7>INBq4EzvgRgruO}67AH_(K*<|Hye17Z);G3w*c{aauO=4BHU zxZe5D!Sgl?vYusmT*4T|C0PX}ve77P{*>%2YB@czMRm6%Pos4iNJNCU8qHN|$)ZG7 z$;h%vE;CwAb|eXI#v<4J4NhjMWW^p?LB>mJHI-LuB?jNZ&?yO$p!EQyXLUf4qr$q% z|Ht|5EYrwwycxE|`>>*l%4BrZi%fuQ#sZa|n?@!Ri>m&e~cqc6KiA2W|}rml8Ta63o23m2Ke0!LQwaG!`s` z?=*tlF%L}c4y%b9oXeEa9RHbkmW%?!D&E54(P#{Kg}aHS);NOQ(dUyBI+cd&w3P1PHhNhZ^;t`1=@QtA_^u8HRzKg5T_h?Ia`#8fo>kEW$**A~uJuZQC?DKu$xM7w+QmGNP#^F910X z%%PCefYDBy1e$`xw)oqE<1@jUh&TwJQM6Jm7;m`@sHE%94Q;9&VCklPEWhjtU&n`` z6|4UM;1}loq&&gN(FOAaJNysm8&ny(%fz1aj&|jPj0AVYMb-N?mIE02t?;37<^ZGO z_07by66txX8&N}9H}pL(6z*0)fPRUEM8s_-Y&%Azq#=aQ);NBFmLEN;uJ8$TxyeUq z4d#4xuadM6!dqy5i^FyVDUX7{>EPFh>_Gxm3)dSY>sELIoR`M_yPGTcqX$jG%~GF0 z!CN@HDN7`;HSr<2bB6SFxwr6Y+pe4NHreu=Vt77I#cEP#gl}$l%z8J<00fo*h0Si^%WiMaxb|}5- zs)}iBYurZm#ERO{?E8WyZnunxJ<~RuA_FCN8%zf&PmYWK;xhOhT8)cKadB)cYyUZf zX1fs&46(P?s(Zqj0Ep6c_80oXW>P!+LN?>M-3^1Mrid0TCrS+>q4A4}$qA2Gzas=)V@Y=xNHNs zD_aKYk=4qqPu3Yh>Wl$(#}!{fBwd!t1P@!AiZV+$dR0IF^pgXKww7K2y@QP;Fe0B9B+Mha;AaHRL-C3;;0e4{NHOs5 z!t?fTa6pX!eGH8h10qAOh;Yi*2BnI-%IcQFBd|1{866$qm`lRXb-;5X!|&_+Kk00- z3nK>{CJ;~w3lI?H|7kOAYvkhczd?DfHngwm%8I~Auar5n*I#llC@?KJByu7{LH7hC zK~O0uFd_D<1h@%9W)yRBC`z5}s@7G#LV8P`Lt!)%96{6;`sLcywl?+JwzMwSMz=Hb z_lakL=iW>&7Oaq`^pETAsm_zU&pel8j6Tmx#$T~ZFk7sF;apxF$r2q>hfCWfE>`H< z(rz?I4Re(W5##8%k3J?lRftz8o{GOt^-tW%~Py6pKBy=aRysOTDIch>sJ zqbD*hfvg6JV-z#mR#~N1`)o~X3 zofzeqdPc|CrQY4t?UCv0*88A)-MK#C`R7v}eKUE$*CX!gzbWR;N*;`@;!E*6}nuyhKp8e5DFJmjP$mmR#o9>6+3y<9&xJEJ6^;&kpRm(6f#6ZbZ}$L>~JNrxI&MpVR( z`Pe=g#~;2N8dPgY;pS~$VPn@VFa!OtDZ-zlXg(W0R9o67Z{U*M-@>)L0KBcuI(goS zWFs1~wrGrjvUJ+iH+jXwVvdzuOul@8!3Q4n6;>D5`gNe`Mw)=av z;Su}cYp+>mGWvx483gArZGzu^h;m{ys|N_{4W8D z8|j`ih=pi>73VgWFKm$B1wk<(IPV(V$JwQ)936C#FbmasiG9&%R`sUZA=@Xl!! zcu{HLwSEcIc8!-Pnb(nt21L7A_j5K$;${<*$961gN%%7hn~AORHM1^fL}-21OhnkN zF6-33sKsQl>i#ytfZGYm_zPJ?{|_bo3I|5L3bw=a(tk^p05FXyz3BZa3)6OgdC5BL;)Ga#PQ77Li@~A zC>t5p<{W8qlWy#ubbfylj&<$5*p6r_lHZi-(Z?xG{bp&4G{zXFA}@?^xXYxMLw19&fGt2jKCt>TU2csn+M^-!(VBb zbszr@KYmdNM6v8Q_8C%Q4v^UyPezAVa_L>HM*c}UjCcDkeawf;$FhN0vK5?<*`1xB zIA*1Yha|l&LY3^KQ7(fR<5(+MtZfJ5F7RRj7Pj4S4P!mr4`j*OtfeL4z-OW*!%VZ$ z5%Ex|pxL_2CrA*?Nta}&4iyOQS1@3N=gDkl$~EVJ1ZQ3Ap9O;n7cmMB80dw#I{Ad~ z%f5EM2M$KOH-YdAzaC@7V?0ISH=QT)PKt!{*DXL?K!o=X`mw<)&wwV(sAqnG60o{e ziJ4J&U`hB>#RefTH8*ivF(`0w0`DJa5YnKMJFu7jVip`QU61*J;*U0ANgYDvCG@Of zH%I{V%TJI18}JMJ zDgd&0j3v~xAg+Pq9mVrL8OGS=U0~CZ-^tu zxYI+eFCJI1d})`hiEqZ2{11lU9}gTH0ONM_Je;0dR##Pvs~S~{I=SuCULYWJ@Ou#d zOWRsXod|y?ww`@kOD&@-R3MT7+ru2rWy4a>A7a(?EJsi_q@w_7c4C@+<7ve4T=1>)th(kN78V z=dEy|iEX&RVc`m5TdbW#O+j;rt4|U~nmM?S21FUQOtL0wy5QZEXszvc&{V;@SsNo0 zPJKI^w_w^mvJCYlCctnKSiRM3ekTRAWS#lchdDbxgUyC67+-p@PMWSf&BU@(J5Oaw z;#7#(dY<1K%mc8Ysh8O}OFQAof1c&8HhTvmD>1E|kj>buo|?o9=~O*hb?HfeoIRLr z#Y<5cl=O3NT&*9jjjO7^lLj}!z6~o3WrHKQ66daUhai&hUivMmjhIT>LyqKmR;p^A zC`i7NMqb%(ls?&YP0UDZBL$K)Ys9?mJ-Bv(U5#p0TIttgXmR2ZaHh1(Kj}_5!g1^Q zBg$$#m0(n&#a8yBG&2ReH)_ReP%2^bGC4*0UYH95_3W<@TPaoFKtt2Q02i1mCg4DK zyqt1V0R!?rTd5mW`*zFR35Jk=a3kc*A()xa?>w7IjL=?eY*rK1oTbJqF`t!tR+O^9 z9%3SLX%Nn&LJg^5ofD%NqI))0OoNw4#BgkS%m-0YXj>AhZPdb=UMpSpvzUV2-r?wD};ZQ4q!M7o2#mGB9AIcSWrg5N;4ae3^cK> z;zJTnKfzRWIJ`uyDRwp@GeYE)g4AbL%*hYG z2Wa`j@h)V&in42@LJZ(cc^v^1WeoKMQ>TI#FWb~dy@<_UO}mmuRK3_!C>o64AEe|e z^xUN@Ndzfib?yvZ-XeR(LL#=E=)T-hd8Rh^CKKh+`g9`})Bzq<>0FV{VrMD*d=n7q zp&&>y$Dv;{a>xd-NyH#!WfXdL83p^UEZf4O;Ht9ii*_R|uq3hWCNW@;pT=Fo>;V*G z9+j^`Nqki|e5=o!tIs^=7fGm4?_H70r+p<0pHjt;N#cm)u}|c&ed(;;lvaQSJJzVJ zq$b0yU?r5Zf?P{ML^JOx#3YsSBffvs&sp0Ns5bFMGh|+iH$}D^lAmY9Z~Wq)GqnKF z(Kdkhf(SjyXpGwc7#sQI?R9w#7@C{5?v2tU zD1oR#GpXuUqLdE21f~-?dv^{3VXH^ir9s3m?(N~%$6`|a zHqSzi{-$(kbMFTknHD}p0}it^&b~z%5p%DVcFQc22zQJlbe?+|a6pSyoCqsw3p@=3 z-td%G1!w&|+*SM!0kQxQB#uivq1m%@dd&im2Ke*CU3lMx}aG#=W z2n&?v0$92t^@H{Off-)NMxJTN1|rK6eh&f)-hZEHML1H-K$I18zLI0h2nZ{T?lffLem%tW%avzTzHSx^weP{^uY`_d!aX3fFQf5kw#qQjbnmJ};z zkA1nbVJi^SHi(xkpp|HwQ61SW1AYymD-{g1SoWhb4qagWVjBJ}F(@g%7TDGF7Ijk5 z&~rc-yI|=RD(gz{E#noG^DBaVWO!nbgfdx1Xi<{-pAzeDi6uq);)P2!Q#cmH2C#IQ zU?ZOTy%%Am7nEr$!qXK_AsR;Xrf6j-Y5_t0&Hc~O4o_}`{J`P4q5Wp37hIfOu{+RQ zMrE#fI)z`WOwYlTkbNwL&1ZXUJ^J}?`DG08g#OfkUy$T(fvtoz!=kth{@qm8MVj>T$BhD_WhN8Iub1Vg#t6IiKmK{AWk7G#8XO_n;`4tZji7ZrLkt zsrGdg&pR#V$c3XnBqN-vdb!BoQ~*S8rKXOgLm*L+KkHxSK-xFAoYvqp@pFYhHiwv2 zXn2!&W&0dF*YTlrlj+YI-W4x;NEMCWmGyy@)dR~bhUXWmqigfBeQC4%7nVc@1Z#?9 z*G>yz4NUyA;=RQB>lsy;$m~019<=ObI)ejebZdz7BfU-_%w+zK^)te`036C()tmOy z%!nPi#`#L)H;d~sI6nr`!^=V`*r^!@JlR#)WW3W*Cxl9BF2Q894CX~d+{j|N&^{@8 z|LCm`_M9WU`&)-ffqt3b7tGkbU6Gy}p^|Y+<^ar-elXu`bQtD?5&71L)Sa8tjQid8 zvuCT<{G6fwW7z`%^K*HyJ0H5QU5;N?wdSS=JOi~8KKymHRNWJ2r{v*%?WP#H&=NUK z(NWW{x;MaCRk$L%I`;IQhphTu%QA<9dOzi-Xc{%x(GEGx&;SOr5P>>tY&84m*2)lAQFkPs+k zAN|8Xzd(n#LcARY;N>?goh{8$DpQknstbTOII(MD!#VPVQnk_4tWYeA*dvcElh17J zVCa_1lzZ8eXIIP@obA|i>(!DCvPEh)bTu$5~)n&)hVv*;?k2L&5sC006A5}Obac}-RrjhS#6uctaOJKyeT{9u#zy7%2Q|=L8X-mFmCp^KY z)NVt;*cS?4sY`yaQ;)7yU&YB3KnXBZ<-k%9`$tk>5L3K2qq*}($rv&lj^vFVf;GJMVtihtVtLkh_N|R?uFty z5ZptK!brp5Qq7BJx+MavU1g^+Jw+r9;#LiMKRd@8wjv;(BE zq*#TUeAm#C1RlD76O{c8igE3z`Dfr`Z>ljQcIPuKi$|us<8-{6wK85?z}BawVvlGN zXD#^FywYBIqmY&pQ4*EEN-@p7E1@CO78qA~I3vN$G~Ps0Y%P>C`KkO@KuX;j0HWM* zX_JBrC+k|`^5y_n9<7>2`@g&5YMj5W9@2hRA{)O+Pq*~7-G8SY4q@TQ6pfx6nx5d5 zph?E72AI{<-&b2Xu}OHFN3qd0b1sR7b(Oup@Qh}jCs@teJIlGa5qvu}F1hQP zH@X-+-;EX=4ef4UWUY2sMJbdk=E{D%t<~K_A%SJ5meDi&E&cYbT^8W z7rOFUkleXY+LN7a`qgkUsq36756FYkjYLjnK#g(so~n8Zimv zQo39zrJPnw4d@Jk_oCz^uV-uQGLU8#DTzm0HpdUB?<$7yT%ABQ-RhdpZfLb?U|-}Q zTC^*p^@Bw_$54s%hfY1$v8w5dEj!<=6yKGKebcb2^rxy_UBx@afH z-xbf~UL^J7I67-rN%V(=U$`l`dy!v!9r}U)KyXnf6{|_V>B_^Yuo8axlj6|Tk6Os#cLB%XS-rxLRe!SM2IL*2;0F=sr-`=w zdv3&1Vr9-34Sc!%D@)5GHV2YB#oa?zM*ZLm0ILzBqh~6^WR8IV-hHe19_bFJCia%Q z=YZ>$Z`e2PY%Di8j?<9CSF7GPzc2E{`*|t!-kk9Tf3lv@;8At^k*TMd zZ7?{>A`TZ7w=?DFPqD28@DV5P@@^p9=t8_W=i8FyI1u(BWf}E2q4p)F_z73olJ~e| z6sPzC`ncsrO+?B*=!@&y8^kyp9Q*VVvJ#BL4G3MkcG zUzbQpyl=c086SIhJnBrmi_3ujGDPUbdIx)kNo zpU3JBxPel}lkUAcp%k-^h*jzvb{@Lp`*Fw9ux>he)4k{g1T{SC0KRhk8eVm2b8CES ze@<}nY>pn}=G^W(cU*#f?EzaM3I~BUu(@USs2I-OzFQf=h6GEAceUare_<}VlF^A& zSr;8FnV3__c!RQD;Is#qtk4(=S9-Em9e>ZBz`Ft)2=njA*ZQKhKE$@9dMvT`;XL^e zT)}T~3^2vWlq7(Z3F8whgzL&AFJHkAn-nS@7XEjw`=&co z?ad3Z`X7meq=|)}ccGx0is%SQ4xLL^Hwib6c?6!4J75R=@vc9K9Oe9C|&+c!` zFyQz1(8z8fzlA$4y7Xd()U21qEZ5u`&q;iLfDc%~Zy9o0+45Ud7;8_ez$NQErQs>^ za4nSjJvEg2eK!<{9Z5s}Ko)3P%Ls>;*6jy6cx|a*B@YKKY~#EdZZ~*}ItKd*Jgo{z zhvJ549SY&+q6;pWne(hegJc^t|1-Us zR5LTNw>ob`0qj`0bV0onUxPM!Px$tQF5-4JO|m(c4`Z>_i>On8@ysseA3LobSC}L1 zR_%v#JEcLawaRz`@d9ZQ4P|fF&b~ULT%Rq;23yK<=`ALHlR$+kmmcpWkEp2pTWsXK z=5AcDRMXbwS?W<|GB|RrxTn05n8N`!jat6GB#V+`=i0OM+~~Tf)3a|{`RZPDd1AXl z$Zhnl`P#x0%Ain-d7FK(H`*8z&Oi>jo=_L)oOZ>LO?3J_V~`t5%8xl&L?=DHP3K8? z_$L%0?%8tg^E%KPnx@7HakV2k^E{eVRj}MP?Z+^cBdf}PDK?w3E7!7hwPt;;)8z%@ zPAB3j>gN*o2<`s_mKpC!Q84%Mng+~o?*Wy2URQ7{p@!yrgVWPoP2B=$r^CkGj{DiCDdm5 z0*rYkw05(4r@p^?nuudoASD|jD$^&-;+)jX>Ng0$s#9DA^TlJ1$YuA76l{$&eWP+J zz?OgZtP$MtN;xnwCrskMf->VJ#-1ZZX?15QuO$SEDqsqS^!y_J38w+mR+9NiYrrBV zHkD^cy6@(&q)7S=M4&^&h!DvUjy6sFcAsZ(PekJ|ibjVyKsO(?pp2SRLN)-avZyQ~ zV6lx;&KN~icwU^K%?5ycBZ*kW@al=v$GD`_ZOGf-<~Z}0F_@+n5HMB%%*t7IhgA`p zSe_kVugU|y7Ox4Q@7aStl7#$2;VzW!+)zsl`!5BN14-T*2_?k@!X^^>el0490z~W< zCm%zE%fKq&(`Ev7PDnl<8&uWdHH{8&bo#J+BiJi(C2fJSWF`!@#qJB3Y^g9P3J8vM5OW-z7>x$NE!Nt0ACb8GWNTd}* z^`A{YM#@AJ0n1wqL4~Cqx#WlGRgLy9NAuu;=(0`fI6er~Zes2O4Io5oZ0Pf--DaOv*Xk1@u++$FHRK!K*0~M4&57*xxR+30)N%)xH^b!RygUOOb+k zOV?13!DY`$g7*BnvDiB*eb)=uo5&OZc*yQOOP0$$FmYVj10~3Kt7rSISQN_LyU8<3WgQ1NTf{%>0hu!Gv95UpxhM39othx?YmjgUlotb_LPg<=z9LiMn>!R##71*3MD;YjpU z%7sq?XWWAwbJE>_&& znxD(=vRd8Ny*eAe)@FigC~!WNsdf2Ju_Jaw()b5}{33Y$LOuaZV`nJ1g$hcAbB;;; z5~+Oy$$(O-PV*?*1ATf`V*vz1f*a+ofxZ~5m?u-&Vnb2$SG%sBX3nactu%8M$OcX3 z$@3p4b=d3%n`@f{4ZXVdvd7M`KV1-=Gd7Yq{f=?zF*eivbIjNKuZs_1cX*oLt^q+5 zU|pfOez8Jt5W@gEnJpH;N4@f~-G!EZgfo~V?LA{!djIsoiO^~9ORIsgabkq7r}m=y0q|B3>S zx$@;l#tJE`JQN&uM07mQ+ciAyh{60Z61V@$^y|NQAvAE~3@rT=uJli83FH5yfd3ny zhbHt^4GAKJ&RNQ`eqm_qXktcpBN}=sK~bUyePX6#O0g%!4*9Xc5)6bRul*4l9HKgg z%W;?;&~-S01q!SS4hv>4oZh4>6v(=H9U(SHi&D!Iqt1ER$ugvpCoSZ-?^Os=q!TJ|6*lvkKm~vauWQGq6%cvcwR}oz0Bwc~FEjCqQ!w%)f zdUcNXpB+xnr>2kn=Wqyqd|6okCkG^HXTRPR?+9w zTLX+LD)dy0%5!V1R8NY7ObR?8tvo15V1R&Zb}Wh@{eXTtJJZj>-2M6L^A!zfye_y4 zHf&%N1{;AL*OvLma8dmgTBOpC(Xhd1BGG`ubK`pZ|xlvy7@U*wS=@TY`JAgS)%K!QCB#ySs(p?(Pl; zcb5b|xD(vnA-E2=Z%?o3J8RwP`BU}#TUB4x-cRlQzI9+0si9EAgqYT}2n#yTBw32^ z2@krPFl;>XhF1gV7@XA;lN9l5-E@XG>?&_YLMYL-Pq}+E`{EJ^$fjI_HoS|5hi^4R zqUL2kEqt@FcaM?%Y6yNH8;ifAXHeSG)5c)gJfSt<*tR1qA&8YGnFmErATFMLTY%W7 z;#XQ0Nv@QE8x{TjxC^;n3RR&=%hl9d-A9Q8ZkQ&M560uDGu06I7mt*==w)BFk2Qe& zuoe3s-88cH_SUWr|GE+%2OQdmg_v0@U2w3Ib(3C|MLq;Y!C_`o33(cdhK$IbFi{4z z-QjV)OiFOSyI(kC_X2RXA7~)=Li+}LJ5~=MA&Xuz*&kbS?j9X`ygC`>{6H%aq#+{T z5UNKH2NA?pt~FH^l^s-s(@6}uCo-=tC9^bPM9+)gv}J+gXl}n2u5@S51;2w2LqipE zT4H1GkZ<-KOK%H?e`_NRhZx858G7p(Mn|IvSpwbVR&MTaME0apNmd>7Q7_BwmIoWI zHv1hQ%PY@sg61)+sV9Y5PO~#eway}~mUE7}d}%_EtVWx^v>1j@gYyE~&s$$Ja3a>r zluozF>C>!lXLiw%vIoKKnyP6YPm4>Uijd z2vdnE!_KKK?4H?#^hcRGC9;@W)def84&buKYnAhQc2*QUP^r6jjH?x%A!KoFpZJs; zvGRzZW@hFU;QT^G4pDI#02}1HJZLX(S<5az$M$q!JSenMD~oB$ULy|8gG4)2_B_KY z9@}{@aGo!p4}Mi>Ql4xgqaJvJuOt==y1@759J`ykUo2!;m+Aew#4(96YX6`Fz(O3v#w8VLmHT516 z!oI{AHV_Y=dM>$={=m)QS|ExR{Z*zvM)a0zhH6THk!Ii%q+(=EtK2q ztixxgW2Ye(MQ@#^)QN42}5j|mThgnPkv(yctQgs+WM>8RnO zwE9P8Tsl&Er`BQU@C^w=S}A<4?S&R*?(aI+mOZt~(&oe7-%`}h5b3{(&&im6nm|yK z;fB2Jsbs6qUw?>=#dyQhZT^5j7K#e&+J>jw%Kw_7bM->cH!v%3=6PLwC9*HkVZ+Xd zpPBkfz~!n%wP=BQFY;#NJ>iA$>IG7#2c(^ePGJ+)5eT+oyD;F5&ApGzln}4utVvPf zprYr8asom`I>a}KL#Q$+tRqoq&dRn?HS1j9iZum-o+5M+LM-JXq3&?;o&%_!rJY~J zRe!7Ue!l0F%x7O{oy8cz%#=wyIG$!VVF=L;sr75-zWu5)o3p7GFVh!y@?Z_N|0Ym{QXza zZwuah(zy7>n+S_vXjAF|gCALFf_>8qD#>1+57OC}0$6_fmq4z%5)3cwh-Ed2X41qj z$6+e-iLKI02xerX?7DG$AFTs~h1x+Bys;}=V1xgD1v<->3(kIQ`NfYd|L^pY{^P9u zN9M2SWNG`s0NhOf<@C+|PXou27Wy+MOVmau)H)GHaCuk(aUNVfd>%Yh@6L?fNP=6- zlAY9x0-pr{r5{B zu0=1?7xRRkTQrASv0E=6-Lq`5ILzb$Y1HY=j(`48fpO_s`+xqT-#+cqaACOcY|*;TngopO6L4-Zm?ZSt6$kq zgdh>V5cGu{dAP?iAbgSBFeMiz(!0U2NIHZM`%9gdN;2UsYyDFI52v0&QadP@ERVJU zIfXmO-k0c24@wd#0cSb*CT2`Px6}`jJCFeITcF^>{UFk%9zVuzH7^;wRRWt`Y99PD zo#`1XbceEad+y6dK)gMKS5|a>N?2fxJuR4@?JJJVi+bqG5D+?1{9_f3@(vKbf+6)c z`twD<Gy)3w|w@N9Y-XR+wYPnnj z^6bqIaklsy&*$=XI?GS-3r=}4_hF4r4{)Etmzm*Xex#nDn@Movn(CwH$bZxi`aBD|q)d#Jb-@voWLMrQh&ueaY1=-+i0dHeo7_qG1* zfhB=hqF1Vx$=S>pJQAcZ9Yh;aAy#>fo%&;gEVvPlKwQBvQPgN)fo!Mr@{(#XQnDdn zFL*-r&Vzg(Y0rOw&UWY#L!!|Ysi;5z_S-Wg`Q)bB#Z2a$z^zHw=IS? zB4gUF+HKM0eMO981@izAhSHj2~IbBi_=Ss~}%12u1Zt&YKwN||rxD`HwC2hhlqAB;F9_f?!Lfu2r z>?F_LvI0VR+Fi0h87dC>a=Lg9``_0gxY#Xb>)WSKLp+~8QTz{r_J6|3=yZ4=wSoEH z=KEu#yzrkPQa>4Lppd}J+y%|oN}0f;G>6eKGBOSawglayabPR<_-;62W3OUj|MsoY zw$`z(YFhq}X}Nu_O6?c-!Gv!cASHH#@qXfQ(#>olo%=vf|K)CLC>UkuhIPp*XgS50 zkW%Fc!z(MJ5Mll%1KTzb4J%&~l z6uSkK=jMCC&rd47Ld-KNbwwR(fb@lLtyOCZp1zd-QGCUkKLPy+J^rFB3#HoN(B2?lyflOG2-+DcQ(1MhMSc05_5Q3zGXg<^|@q*yt&`~K!WX010 zm@v1fg0zDy;bu|Ih{u3w!47P_HbFc=#wh#5V`6EcOhoyFhM#*yg2dpyz(t~_5Yvfi zhSYw`N8Qp4!h{uV4%>bXcO{uW`7H|ibnYN&%?FC-i?;8bie zw3cX#Bq$V>P}l=wi#ccrHAlz;ZHqdn6g5ZK18a*CZjyvA_7b930aYLPfZHnrCn)g% z-OGroFaChpOAGf)+yirq6Rw8j1#8PSXoIBF|B|Bj0`=|ZB~~vH>bm#?dM_`WpZEh} zuL0`%hnqpKH=Lh@2hkQ091*ck*d=POAnIH2C37z&TrR*To7;ENaXKDc1)@iE5eWGN^%UC z8vqUE5k`7_JH7(RD5e%Li0Z|(L%5P3)6C6-tQ8f6_)%}k<`R_@g!wUVl|a@?3Znc3 zw@7oWN|PeKY{yHW6Gfsxudl~#po9FJ*mlBOh&eeUCI{Op70|*EA68T{By!|J zMljbRJzdC=jPRIwla(o3ePS~im)9*9aUQ7>ABMbUH+8DmJ|21=2Ux*4MkAnGrxv?_ zF0R@3^9Z)=E9qgUtPI+tYb;$QwYH%c&93cR-<1wIgzt@1SF%%Y_?DiEinx znZu7KmFeFAGS@1jPm1Nt-YHVMBH@h%SN0&ywvgjR(nq>Aj-Q7OjSP9)7I7KPrJ9&jK#*J5jexHE0R zu%qiOD`zn28Nswk@0@Tusp$*-xNT~20RbxM-8h@wG)zl)H`0akKfg zhP_q~`LE-jU~_VnE5%U1=la5@o)v^`x(g z?vq192@`Er1sO>dSmk1ERtU)@Gse{!lmic z>F%2$ph$==?!8B7~4miTGP;jHj(4t}eih3?v3^tFF zOtfp>Lr|GdTAl({TlPz{O7ft&!IrU1PPFoRu}A0FY>bISqb8K?W1*ExMrwlT!pIAu z$r4t7l_xR8aGWcfs{T|hN**=)L4X|WIY?9ZiERae)mz=Wl9j-Gt-M?^ed10Tt6VQX z3c65;7~}jjEKXGpufK2$!&*`9d5TavSTnB>C6+EW<;y<4yaz)J{Vy$nt)d*tM1}!PBzZEkk->+rK6JnrPAul zkxJ%tXUI+27YP-^l##M}Qao!nTB$|#& zdcIm7P?7tJqz5M@5QTP9OJ&Bfn^;owI`vN|i5~~?i>9Q+UjSKDuA2ylWwpe+(XUF# z4rWn#C2(yO8Y@W4(9ez~C(y@TikvZTKR$+drYBRnhm5KI2NTPKSIW8oRY{Q zWk2S$oMob+A)xIR;iO!`-A-b40#+Z6A|D<0=IJmaxi}gdQx=Bpn$0W@`07V2H zv^t+~b7Ub?f<`yJZ*!-ez(F5Qrl-HR`|iK2>5adJ#eV8I3m~W#B6N45B6KHbxr~w= zTSym!GH)&|WJb^xr$8h+ajh(w{XS~4F<{#qvMTq7yh><-gK}>DT)OCeRk5>d2{W3) zN}m!tn$W6ShfNx^r^Ju|bL(?d2eWHz<*y_5m(fbbDSh8QthqgsI5c2@gfOy`y0yp} zepkLWFIr+V)25w%_O+AvEaeETJXS(`Z5kXavc6sypLr@W4E9&IzW@*Vn|+M^J(7R= zO^mw++{h3EH5d%>z0lTFl{(yQ)?L@v<2@UU(z{3@E4Uczdk^!`?BY2r&>0H@*d*P~ z^n#~_nw&9%RVCZJB|fv$%6b3k1sK4tt1C+ee|4v&&Vk|WPzN$&F0Y*x{zNd;DY33! zTa%6`^)G5k#!!q;%~+TH3edsIb2a0M9@+H6s^GOgnh574CYM$;Iou@-Ih}YU)bN&B z1zxlxKJu}eX_QEeUoLC}a;<2#X~VvJ@e>Y!;}lD+voezg+G+O8^WE(7ZEs>iIhPW> zc!mH?Cu1;;5bR13V0@Y>(&RfHXe}9>Hw}!;o*t**{>3Ijj(8qr;+ZVlW@?4`wT*PD zF4&OM^G=`usqdr#1#Fvtr zF`PVUcbTSrQQNjHz`ZCOT3>v5zAWRMD6xpW?QFyb%YwXKJOND{>qtGXwoeLTxbtWs zyMo(N&KUrzu;%&_5lpId_xYZyq#YQ+TbH6avsRBc;@F@puykvu|6|6J(wMhzL3JMClW}63p`kvgA>N-TIS}Fi z?&=%idMoY#@)$+i_0y7iTi~--P(dPk{EQ)+=@iTQc`Uh_NVE94pgDzAqRZ6S zsERf|zS*V`BAqcMq630kn#K&;X#>a_>Q3s^i+zE1)ZagoWu6GObWfG^ot49lUm&u+ z10t08tENhla=L~$5{>6CEJ%(d52LX9u+UFDh_5!aW}fxWkkkm86P7WgLnIE@DAOg! zKO^(bDeUUHCY6t?%^ot#5M)=BR4iY-;#AsekN#@>`fB_Po69;xP(SK#z&S+t!HT9!V0sOMYd~?5O+o z4mrKuoYdx#X@vU56HFj=ap0A!^wCz4f*DDs&8ZvD+vUOuP}N$G5tali62VmoVDQgNbYET1`4B3kT^*l!G(?q*bUJ%< z76eA!*t5xkyfH%NyRkE)nM@}4@su=!g-N#Djy_ZoL!TwnzW5!c?T-{ zPIGXSH5(Of(lj)68#QiL>Dwp$fHzj(8We7R6nNA)oU?b;M-km%c)I0$7RO=|GwD$R zV4FqcDAHbk4_SKG;&ac(WuIK+FUs&J4KZoNDd?>fOW`IMr|ISW2)xo9qXiOdh}f#M z#~OW0go-Er1iFVCNB)gIInaPX_zUSRwgImNtu-0R{OI3V#Tnis*7bab`5GCO)L?+2 z$ZWr@&-}dwM;TZpNAioxzK9wF)5O%O#d=4y#bwDoLM!tpCg9UhIAN{wO|Y5~TqRbY zVKh}x91gOa5g=#)DJ;x$iUNcc)~izmhFP}Shd0m{WCLg4iDLa?F3kt z;2U?>M&5u-PgA~7Kh$^`Lp4iTw2 z)A|@}907BN9_SXCgU*&-EtGgRsJX&Ds2|AMj89!ZuC0J3ylC~}`Jtjv3J2R9`Prca z2Z?v=ky|t>q`^aO&ulP%KP!Qt3D=x>C5n!RqamSgp+MNNNV@id_Q@iF+>?vPt)6^Zi5ngS^+;ZU9fTcw;H_Kqrw3i~)UpWYosZ zhKi;t-{Prws;8cN*Bag9*M?o*=!$i6uO9va!PDVZTD{SA7iioa49y*=ano$B-&_&h zQ5_>7f)HHnguciK!%KZfoJad&LS0-i^6rUVy#({4(GOGgAL{GilY!F5&s`-fnpvF8 zf~^|g^ur%P)!1!fk6Nd-_Gy?(h~*;_lj?uqDFu0n++CX%4YG*FhPsR%g1)IORS}1p zjgC)tsaGeh7Th;)v9Z`9IO?F@Gx+K=g>M`awg9u;F)g@J83Zx6&{Vsg=9^?(&lzwokfQLpt zAr{@={ak%L8}c68Kf|z(Xz7n%;A_E$g!33lJFwh|o(%hOS$Wl)8y0_=MHO-&M&3zG z(W5ZH=Akqel-e)y(54Cf3uFAU-Xd6|-|M02@TbPW)g^x27kzZ|zLRZ{hwMdo`v}-g z`YVhVB|gN9FoPb0fs@N>5A=0x`yTIY+lP(^))&!EM52h;P2($EA3%4Af}GKH`dG-M zsltOY&t>u{qQR)}Wfb4HZbSFB-n1v%9R!kO4oACEE^*g1)(t(3$X{jhJ7mI2)Ngql zX=o9_+m=n!N%aF>buzXr6G@~z{jU2W26XM=I|G7oGo&l3zoMBd=I1wM?%%rwn8 zLTgzak8CxKZ2U36OVMe&mMGBM=! z0b$0&jzD#^BjaHjKt=ejPJM`En52PBMp#hzO+!(-WRRqvjCNQf8g*?^v}6+algt8| zmV`+jIWxc!5J)G5B87%)BgGqk3k=ar03=Yb%q4sUWCKIA>ixmufKaXaaIhI5RHr@| zd<6{Aae|0P509$dB?IV$e={8B08paiS`JeK<;k6j$XCKoiCIPxX2Y`NO&ZC~QMeN& z^U2Loxicl>$q!JtQzh%j4^X*t!8kGu#7-pfbt$^QT_eB_U0V>i7&xfogd0B^o}}pn z9iI)9rf*9Cs{u#o+A_fGz!Cbk6tF9hhOR9K`~^ruza+LR4p2*31@4*w=0D;V6V7-% z89Q<({CN13Rr%eo0Cf7cM6e!^Ld%IW-aAaTc~>9sG1ct~0PfM#t%f0igk(-h1M-yKtd9hwFHT9K5>%}@>q1w0I;k~4%szEyjBXI+%7IaLg$(;J{Kk3 zcGwx1L#b>&j0pT8y^ABGPj<};aHjJN2Tz8NHSJ;pe@L0+kTaq`V#YtFbc*c$0UpzP zCWGz6=xTS_0l&!WrxN~zzr=t6GV8?G6!9=JKNNP6fmk}%Sn+~rT1LYwz&D^t8Tkdu zBWt{A%1bcVAe^pcR}bJv`k_X?#l56Vt`4k`V-3^SMywuiJqF#a03`QT4QyB<@N0G%pP;WbkhVSH;(TqX9GMgRM zDEpFzVWh>3Vcg2hkOnx;MP^u+&@2*W%!p4S>7?;m&5UW>ETLMQ23*c23=QYqKlj0e zV_r`p8Ki&HZm*%)CGO1jA9^!LpP5GQp*bY(Ocy4xm%lCLYWXv^ayxx$@bA9d2MdqE zJVRuWhBDzFBRa->8$4w)h;!cE8Vh;u%_5ax;_byg{KlQI6yL3Q09G0ke-6kdMNG$h z?9C>POpm^T=97pq<(R;}{>Gi770!6bU7w_t&UngQpQRPdc*$L#pq0#c!(E@D70vj- z?F7*f-hFuhmKvjYhR7o=Wy(B8^pD|-(5hmD<8i`kIO=9P1mljGJwfD?nltk*VkN<@RN=%rmUm%9Z=>E3JXQbkBLT!LC&~(`~GL!M~pN^MF zr~ex)F2P{FaEKTa!o}(V1W`n)!K`zJ7$2kCN4JZZ5MyJ6br&op!ND5& z08vb;lh*VkQcSv%Cg$5S6K|bf^*2~XVlZvM_w#H#yqS~%*u{jm;kG;P2#nFt$Y{e; zAE;Hz=)mIy*$~}5bp)0h<9H4zC2e8iUB?z6@PueU_x(HRN#KdsFzcH?7jMqQJBuw#;EC1H;JY;!f56212V0TAld$2hFUfp7 zHdDtGwkm-qYD1*2;e325Q^y>(CV?kz!>Dime7pwJ$`N99OlQK9TKDBKxFTI|2eCG$ zGiAxO8|4IilD@WySRb=Ga4K$)=DI64W_JgzEwSEf)518%bFFUH@)%G>YH#iq%DBpN zEpO)j2vJRXVdfUgxXW{`Z|3bI{3rgNxnl#{jo|SUtNiMMhYcgE{F(^i%4Aex3q>sd zSk!Dw?GT~qAiQqF5TW@XwQj$$0?Q6r^?keD>yzwN<4zPOMc#?TXmEpJ!JI#@$ zWx<${Wyi%Xdr04C5MFQ0_}BMAYQ0rsM%JAohOIh{G)L{!o5hMTt~%@cMe8xHCY_7A zKk1H6sn?76V_aP_-lz9tTsBGv0bB4 zDqZ7*-m$op-a34D0<7})G53qGV_aLjJ;p@LJ4qM7*w;v0N?%IPQ*^VeJKNhu^D)`& zKZ`Ope>V@1etq|-hy7*pfZ3|CNOB9|@+-f7- zwNbn^^2mYZCQ$v__m?01m^WhX;SbAAqWX%Xe<(Zwr}nuok`GLsj|aXqLUxh|!LWAr z2WDZE=OZ!R5}OAfGlisj#?6YbXE}MlhT%=ODiAQ2p8Q&%IduJn_t=N$U>!3ycdAhs z#n*n)aLpEPo@3nqO^KqnfW{-Jb!7JjKg*_VdN?sN>xWYVt76U}QYs~Puv3K!poJUL zse@JP+`($kazfU#{r;DfeDh&dOsT!^go6r?zf2-@Ir`&st}^A7a|K@C-vSzCQq?-o zSoRA?2(c8;SWc&K&(sX}bkEdG_h3&AD^<09J=dhHBumcr1C7?m#WV(O!XgZ*qcQdmAy zahF_r;yfmdri>IXbm*CAaxb6XsCLq)i=YT^_OiG)+WgFaygl7P3jOR37OTuW)C3uJ zea6Sf;<(c6YNyE2WU4EU$_dcBy_V%;uN!Ady<`?;<=e^i{7?=0`t{*~oJ1|dgz`FZ zw@>pM2!}L9Yc(vhm3v$^+`M?ncCB;>;2mUyt8IvN z^$>QzbI)jzM5@I!c2R8lqv!iYX&D%nnGr#_7TfI6^7jxQUO4ec0+~!C@&1t|@eB?8 zourE^g`Al$xSS8ozL;i3v6_IrE84V@iEf<3b0`wk)^djSm3Z(X zLJvZK;z*gQpB{83*QU^Cx_NWv0LZ1zci;E1qM};THpmCk#lR;fO-?!1WDj*XGW4x! z@Y%Qjso7cM`!gtL4h-!E177I^sffi7_o!GJONyK9tmUdO(~B4;0w&x{`eO^xax{y?Q5iu;#d5CuL=5J+vGnxeKftl z>!{(rXJ;01%Gv)JTCiJU)$3@In@t(w_|8;x!t-Z3rOpk1?Pq*Ri(E5X%cwD9>CZff zg0Nl_D$pT^p(t;26M-6!5bmaq5Ku`7MNtStY+z{rKHEE!+_rsO&}owU-siykrF-bn zE=S<)lJt|6SQX-Pt-(MbP4`|vfPKez(Okp|M`HXY53pElARljkLtp3gMX%G%-;U4N zFpj{1K6#|JxKIJg?mmo-y>W>woPAaa&npmmY+cb%_5)$fuiQXN2ibu{*{h_8QoXcb z$d_x_mj^=*vrP%U=emg8Rwh{3tOx2?LFerQK7l@r$^A|4mjErk$ykGO5C8P{i2EPe z(b!k`Ij<@A`bIOU*&e}7583E7*AIMx`a44xYMtkRWk}gO82kr{+$YG%H_$dc<+|Gz z!OL*CyPoD)$ok08+i9=CWlqGe@`ucbd$kw60l}GJ9jaufX<(R_D1?n(=Fox$t>NIh*inS6E4Jd-9FC52|WTiRxlRkmip-Z>Yt~N z#pLBBS>j2h8YW$>ri@1;46)XB328$n4PmBlil zW;=##d(9DX7GQ{#3QSp`UXxHu8hI*}h?;+`Ay$l3=3=w?a@gf4P0v9ov^eA{qv*EC z&Zm`B zZ!An|)kZx^M+@Q1k{piIt<;>8U7f#b!MrUK4I~>!GCk2EyDJb{qyg?C(ePHQlcIh( zlo8cctLMhBO2f9LoAxf`DXVcW7qJlO@rB5l9Y#${M*xv&7r3Vbr$MOmL0@vGQN)o2 z@2n2ROGCIAA^D!^>}DNcKgz8NWiZ|3xPVw%Tno_C=RoB7GK}dxTj8}n3Xj%JPcO8( zR!XCOeu8$1i=$}!zc@+?WT;;e$E3eJM~tv3mrMnXctN2SpyZQPF()<-O3&b_7lkA? zhO}8c;GNIb#+QvMNcmoiPX(d3z>iH9Nvg(D7NEv%pv&AGE8(IN7LN9jZ;)!>@oZ{{ zHB;yUhLSufOo4s$4;Xu^!^%zK_x8Ih2_psK0u%H7Q1PYVJ`e0lKUbh5Bw)9;fg0G9 zTa`$f=pNyc7Ahk5o+Io^R1^rZ)c1-{-YPd3M4THGSZ?} z*jGp5ucXxLb{nxQTSJnwdbwKJnbj~Xjqvy{9ar8c8bClsL4&Vw%nj5SqYoxp+rlC7;}98JXp=J(;}YcPf2L0DVZ6W4E6& zo%N1paeE4!yEHiPZCyW`qo3zVPwZ@d80TBKV2~I)x9VI`y5)j<`!D6Zq(7lcu<13T z;@9+mS)zDhGmeatOT2}Y;4Fy&Rju^2f1TXgF{8@U>JyZT zWM&skwr6;%p7Yveo=boAC;Ty2w+HACu~*a@sS@?=t%!F(9GHK13pusruT+u$9oGMv zFL|n*9W|CPag1@9y^khM55H<2Vk(#{*zB1R_ZHHxj7rQ&4&WCz2g$fKqh%#6tJ()~ zqfqC-0aG76r{)%y#UYeq(_bQJ2akSVi`KPk(#;VVE*C2mhU(|Fayl>Gp)n8F42t@S_r->t0kd0>aO{O!~ zK*iC+oy-HPX>^^Th^OB1Dr?B@qwDC%*h?494+^GlxF0$5nAa(Z>|cT& z7ibA)PdUNmI^-FoR7#ubzIH>XW6g%qI{aal=aoZJ+ai?F zb_ca9j&Q|l5{f0?v8AWYN$n;tzpz0KYrYJe`3~c&q;dZE}1I@*t7{l~CNjSEAQ8C2;@~^;v>fZ60rO`a2 zG!cNXV_ChZ#Hu{&?AbtX^f*Q+!clxMJzGOO2Zzl72SR`^M#st(Dwjn!BvDgALn4Sf zYy?j4YZxjen;Jo&=#3gG-%Y!A_qmMGZ`7}j^w$HfX=K%u!<Ch5gm0u)l=H^Jet zTiP;4KP_z7+PeZlTMwkn0<-4IE@u|Z?kEG<81KCCq~{4nd=!wDbh~3vzYXD4B{yAL z*U?&)&7d5O{cW(tX0&XUmI}$&6cPxDrJmzx31yiI(rk{$$q;JtBfqhq~$ZvI*Xk)ghON-!A|aRDOT`<)X~&6Kq|bytBp-*QMgahTV5 z6V4C^$HlMjJW08|yQSF2Gx0FVfsX#!gov-zoFs=+ z%c8nO$WPTg2CUOQdJD5X(7$ZcS7O*3cX_1N?-M}vdrM)%T6Ds5%7nR$R`NtJpaZb| zz?v}Ka&u5jZb*hOdrt)v%9CrS-VlZxTxyl`obs4DY1$FmAe59i%8K$McPMNX!_BBX zwK6&}Rd*jc%Zu=AHOg$GW$$nDju34{K3#xX5v8e;#i{&7L#nSpOiUdN%4XW78GXj1 zUl4l_Y)gaH%Z5uQMap)|nKGR%;8TXpShCS;ZCb8x>!M&nOze^Vq*ez_De8w4uQ9{& z=R)LE6E5A~M4Ss--cky8W7jkngj}c3ZQmE~RQ$8St9Ob#apG!8lWaFTqE4ZJA?vR< z`*tPffNo?)!-OIj=f@G{34c*;>~a=l?hzjmr_Uu+h)UITy}=^`nnk(^2_mD3shdvi z6~Badur3ARa1}?^1V^U!aFv$B8MQ-^wXi)D@w{gG*G!%)GTlf72MXF>MK!ZJ{f@_< z&9{kDF6rl(oDk^=2-!=< zS+Dl2HBr{stTo!IYl^CCZFTs!q2KjZk(fUZP<@V>=Pqx>7CAiWfA8t}aq~Yw>^w@N zJD&eO><4XEt^!duqWJc(vIihh5leTp~6+90?!nmP7BfkE)Nl0f7um57D;M+zchX2tt@%f`^ zg6@BkUH=~<%*lx|_On7LL+^QEvzD%@e#Sq4|(?ObKNZ~1%Gcesr2dXFgjDs3Kw1% z)&VM+k~v_6=4_NFnI+;{(NGGbq)>o-WDQ&r&?p{)UWbiU%}=$l&vI;zyI9RfNEMU6 zA8oHkG8p=z>EZ#sRuMy;HM3_UGO!1Nq9e&^!rA}o(}|+Ok{F&C39C`ogLx3V@@Y4` ztZW{)fOo1ae*8&mitT_DIeaW9m^&LfLoM9UmNpY!o7KVcXx>)q&G=|`J_;NC^FPFN zZxy@7JF4xgvAweNTaWLP3JMH<-3>v>+jIN*KRvtUj)wzOy%(2H`S+4N#*=>ecVEjO zXe?@XLh$;Wxy2uFddCGp(_LGYcU%3InNV$8x^^QfV-ywPQ0kPNqYXsT9boqjI{8)@ z8QTm12fR`zQwE7DJN38l6&wcUNBC z(suFm{Z{;8B3uyXCF4d>H3zGdO|(IQHHrce|5%N^utJ=^!A2)TX>?zu0%<)Kehoi*iVI#hqq2bFMZ5b9oIN`hdrawN(Msy3G_TbQvVVakIsPIjfb7 zoZ%It$wn#`GJvUV$X2&okmeulB>qPF4k5y2cr^LcHGh+chcBpEC017n!?k|AH;8** z^y?Y`gXYVwcDF2>b}C{kE{nvC!*h1ug0)>|>mw8TFYA|@XG0f1|*KXJYG( z9%4mc!o_YuDY6i7d{mF)mdKH%?qKo;;*_6PlpdylKiep)bu2;ZjuY)Jkz=w(oQA+sO}FYV1Q>6A zm+%Z)hN}tXj!1^}3-Yx;^Xl;i4aHdu;Vl5{F6l!n@}lH+BPHF{>L>{>mN(Sve*J#% zPt0C`{wFnUEVM*<3G>kV-F%JApbV~?ig60ga-`Xg_|*fabB>cvuhI>FlOK~@7hL@p zG@CuFIE9SCqw~W3!QI1mJu=d`rP=V>dPQBIGf0oh$RX$+19JL#7RcjD@qA(j1!e6G;K_P02z`;9UE17J z?XHCLB;`3PE)w)DStaK?$C~gBAq?UXY*>}8kwtmnmPZ!MG7jpUz)*}!t)PIk8?3@w zFrdEWFbbXdw4^%t3VHgB=4t z*fGQZ<92iYcksC510IV(GbTmU>m@7s%%!ElkPZigXHZ=3y5Jtgb zZ)ot#i-T~{1I&~f_78lFl?z=XjrmuP`G>e19KA3779#v-~-=( zjZZHl)i`$J5{`x~G_%ppPj06%i9sO|ys!FuVShDydw=ou!bVa;BVp?o(FR{h{D5$R@fUp#zUjVe zkD5VlYRY2=V*)Dmm!kHUKT_3s@|{HA>-gJ$>r~c$=2-mPoc8<6b%&qycia})30u;O zO^OfO5(bEEhyRNoBY7+ye(+=34}SdboGAXmkN>$<{x?AO{Ejh?``)#*HfF|30xR{M z8yk*n$p%eP7}_!#MVbjd322e0&XFnQX4rs!w^=@~Ue+R3A=ZNrO_vAbPZqbJ*_3xz zy->Kk+_ykT*i>bEmjBw#nP{45^XYxj^J4sY-TkF|$G2h9&*c>UlUl({uuaaSO!!4@QE8S(#-B-(tq!j0Z73DKifwLeio!?(fyvklQzJn4WCIcCAs=ye zdapm$d^-|>oP8M$M^<}T2^N1D5<7m;7 z5nd#UJYx1=O(XpB*hhO~L1zMFDAS`NPJuIFWCGN+3ZfZoAyc{xh5o&tC(LLviWD-F zd#x|oA3d%}h2Nd4y0yR5Am7e+Q0w~TOvsEp2Sg+I2R;t`C5jE^{0BbvRx|#<$BpQ= zW)^jVSi0XE(fmPsu8D?r2uUz$Vs)stjCbx&kiuPD-(6hdqzA?dH7QBzjIhY#QhRj} z%od_EN&m@@X(oe`8|&vy(j0|9__3dKUad>(vMDXpX~_h)Ykt^z+@ZyEq1;0d`nMGt>Nueafp$&TNOZ`t2 zq!=&ko|}^fCe*RJ7Du|Lmq@h?^yp zj17Br+sD9CfIn_j38G4If+E%$|JekH%ojOuj^Ir+nUs<#wYe}2n@M_$h`wisV!|-n zc&SDZOEMO$sCPm_I1HoE8gtU1ELi<69V}*LgW3L!xklqXb>0L#HBk3N&JJvE_QaCkM zx2lqz{u3uC5RD32NxmqIV7p|G1U|x2y}!7SRcruj#Sxl-UIp1kK0Cj zS6MX37E?qP9^vf6r~w6f#rRAkaVQfegP25t5FBP{l(}COL19=KsxTD2=46AWO3(?-!p^R-qMy z$mX+zNd67NVihkQWnh$DmxDZ!$*x(EP10Y3c%R?Xq*Mmmkm;MIXyw8P0S*LjutyXY z87W|zX_8Z0gG_!@W6;Wfd=am(MD8^;i~8U)4ZnK^WX)7)YI4L{kURO(wqUp}o?zPV z1^G{Ej7dvK#B5tN3H?KjWfq2w&*wemR|JkypXL1ANbIJfr-i#RFI0Wc;=e+wT4P*6 zr=5>|&eF)|2pmMC|*rnZtak=h4fCU_~`+!vTFZ?O=iRQxxS z!=2G<3Ru?`CG8a>7l4Q+1H|uy@jE8%f;!fRNfF~cClA$>IR#Hrup(7P3=5ti7HA_e zaW(;AZ+b^ViomqlXLZ}dUigofy9ji$LnbQ`$`@P}je8y|xt6NPWKuCpU|ZLflEuch zBGVXs3%tER`8ERkvYs&ExLD7cw@*Ds%D4K-BRL zptq(iJJPy`l8nZ;_(1u9*ZBvgykcjghb_HwgV2JWZlRgWs6kEXc=ybw&*(tL=$*I* z57%tg&7K}^`%l+^9$M;*Q{uT^+nM7OEO}~DFsFKW#qXhr<$F$e?LMaB36%ceIM;!t zm}(Y`qpjIMt62PxeC4716Lw>Oet(@sd?jbYWc9c?!bn8~F|sSPjA#jAWhh#q=;Wf~ z*bfS&u0*kYrU)q&4?58+epful%m*j0_?4N&3m>v-wYTM}IoMW?=g0$f?K^fTS$wjd zdNh%#F!_2kj7L+pN^>I^yJ!}+;n5g|P6g$?jUed{>~;ZFwj+A%QzA!HG00krG_-@6>}$Rbx|k!Z z6zOdGx9p2Lhi4_gZ`6xy3et>SwToGg_&R`h4Cb7oa{c)I?Q=Mw=_0!ws5sDVBfjhb zJM@qvcMdAw<(DJFNtn@vM*2cUfDDz4|H857nv!lqgJffs$EGY617n?^6kT7fhs>gY zcviZ!?L*tke>-|jM9HZUo)S=&K6T`WVK1ot1i>z>%HAzlLAiHPLj;bs4;TAEx*`GY z(ZqPtkfVlDP1?xf5sy#)RQ4q#4E)Tjm|NSr%8s82=y_*M6dji3>1E;j7Lng(@g%WQ z47f=F%&3m0K)dxIl*G3auaPA7zb7H~hk@2;Ba1Vv*QyH=bx9@a;)~T1Xmq6*$aj9Y zvFpFMG4-+Ev;5Z${I^@gx7XnJ--X+q$U4o>nF0lS3Bs=v>>=xf{cxCV1?&IB#v)qS zy7>RZ#_?B9qLV+^_%|?zSFQxh_765z3g7qU;yHdc+#VO`^fIWUyCE!KX^%cX0ZmOz z86_kU>#IG~M@Av8ON?_$22!RHDOcE3uZL+jr8u{9+YQ@b2STNKj!h6HD@!vHvm9QQKrU5n_J*8SBqV?-P<6qWqOjw@ zNWzP6Ti17mnLk{a*!+O5ai4K(252X$q3+7LS9$4pV;U6_rLo4|?0uH%@^%8{NC_Qum4C6<6S zy-g{p4iGBPENjM>f`m`3L9YT)D6AgfCW(HNBqj+-C8p~maaP+A>%K1zhUW4>#^d*QOr1D^EHwUW9X;13t{uAy>v7L_Z>MoZ*dDdzQby z956mIa8Ld_Rz(#Bza7ze>P+yrU3Y_CmGpJ1ITzpTWp_xJwOQNbPRVDD7vA%lU z9CY_LNS-H9ink9!tBWqQy~m1QDz10Ho%inub~k-zLvaVy4#<7nL-KBRDUQ@&R`3P; zp8w>=SO4I~egEXfl@~!Z8Hej$yQgXYvwJehlIt3<_ zCs4r`fx=fF{UFsTsr9a~E<^l=%7x&@&wWz}*DynwC$=Q|q`%O}dAPca{`)Z#mj}Sj z-JoA+X@K-XjcmWu3!GwIv75YCXsW-_DzDYq0I072NOZO%53)!Ofa_iP5HPrVj1vp)m+4WhEe_AI}Y!_DGdzS&%bdM%JGCDNV2>)tpLRp|I4qe#Nydy5+voWQjvl zwx#X}j?MOxsZ>VK0Dd$QZyY?e4F2Yn3YH(>zY`myD%*aZAM0lSpR4%)o!I})t0Sgh1 z&ztXi3Z5Q-T&;<1W-QA0hCb3qH_cuY>lf^Ky+tCEm3$s{$@8-5bp4jI!{Noc^ZEA- z4dC;25E9QbYH!dM!RHtEt}uaThGQHw+&%#sZs;WLUqV4yMrf`A{oV+OLfP`w3Fi;t zLE*t1@~~t7>16@3XQDm+L>m~g@!5-B)#Fr0Lx{L=_FZ8bT$H=?@DUMif_(|_T*ty` z;Roi<7Yy)R6RX95lT{vY9CqUUdjH1aMEN82xJ2>Fj%A!xYW`IMebua55?Bo;&qH;| zhCEuxJQrQfuPlGU6sw;J$1Il0Qp^hwWfqW^aiK;&QY!?%vIO}SajX0WG5;DFxFiP) z`K9DoMxIe&0e1u9gIT#aKJtLO6mb5G>12~LpDcNXay2kwkX!6M*(I^9p#I}jXw!r*sM3BGckF6Us;=oX_nY=8yPKW=v z^(EKG3nf8O%G#<6Q6({{l0FV}y4S<7e``{P1B`&qFQ&Nub_9|n>YiXmcp@>sPD9}* z`ZqOW957~~2y$wn0Dxta9Ou)V3i(Cnbw~VS7{Qdpu)nR#Y3DTyR%!ffZ zbD>4N$$Tl<`g4;tE|{%qdX)SE2EDDQBn2J==i6a>*YgTt@wLiEFsdB$9Mog7Jy~wL zJ=aYEb*BPSLS+XV!gha99fhHRO`dFVIqno@?o39OU;ysft!hIFU zAAfI1yImPT*zcAqk{`hx!A`;*OH3F$#U5sha67>sn~WGlK%_2bUe(5t5zA~zS(UW} z3@jOB;)OWJR&^~_@u7Y-7k@^&dvkZ^e zJK9Eg3g!yGmr02U;`VQxYC7_KNBu%PEJ;=vZ6-OcWtcMc(-KS#49dmK@+ zDc;}Z#?3H^RiPOA2ln)PM$MQJu-pku7J;wGm6O=4;mx)`#*Lwz+AX1wS=BLbVbNS_ zQbDwoWL(L>V0d_)Yxaj(V|5aytjRJ<8Nj2N+9*lcw$ruq6qHWwnRS|L%A%*x1($L^ zBQwkcR%{~@)hKtB!Jy1XMJ!?_tWFm+l0ywHNF3H6NWHSG@a^-#9q#M>(iy~uR?iLo zupaeKTlbmS7Mx}sOwR@-ygOpEsz(NubZ{PTl;`p-SvzrtEmTaTBvlkOkxR@VrALdZ z;LmBGOMH*WdI<~!Vnug_9FIr>zd9S+z z3!h7?;6a_4^+JStB_@dq)O%Uj)ix?^EZQxn3(MDC4PNu~LZC6krR1e&ijoHy0^P7t z*aJN8Z3_VFfyy8zEuj2Dg>*y>KE11*Vo&l>=-I6j|NgIRz1@qo+JK{vEuXpu{D zVC|rK^VLwZbiN=$i8A6xwmYVSCrATF!2xa{)MwMl&jM)<@ZNZ=LW_A@i0i)R47ie( zGE7*}S|n!+LqhjO%46bU2x;7)k9&#jxvCX2WM$|HkVsrpdKNoukRL}gf#c1INVx-T zc!xiJM#KBa&a|eolN{OIS8lZRGwH4Iq<&{N!w~HXhs+pp0@6;4G zvh_-eOU<+@zcQCK+7|zy$9`;Ti7TjG>9$9HI>_F#-1p?wJ23*(LsQ%^Ub*42OubQv zz#F|6TigZH_!4eq8@)HHT%f}~c9rZ6QEV;>>Y}13VOfT?u;k#qwWiNDoby&m2pveJ+lS)V=%>q#^06Manbm>*OkZA)*Wh8bg9C-H4U zZMcnOb9Su#SJwXOk`#Z&;BYC}i#8YgY(Wf!$WBZ%#-+x5Y3hySlKhgo^k95HO zzexw~Mke;o7IwCDLe_S+CZYxw)<5dyf4=+=Mx2v4A&VsdFJkw`G6)C*5_StA;kqgs zEnG|v)rS>CLKFo`YPyBnHjFdnT;xIg2Fn|QqKNwD@2#AC-XH*BP0&zL`KOZ8MQh9N z`|lTU?@%XWsvW}zB7rM+ z9)zfg36YR_ouv0V4isGp&OAt=T|UyOJ=`7{^(<{D=rkLGppNd|RJicj^1}_cO`vfw z2-}-&9=ws0a-Hl>nvcSm585u4;03%#p-cuxxe`Qjtts70@62^xuFkl040Z#RuvWox zGo9>v6AM9QiFxs`xh0$m1zlLf;K=$r$@Kw<*waql<9nd@+D$^S(ACTu6ArXXSZw(h z)n*As97=BK3PK@OD+jdH25Vo)wW_y~7^y9sF)3c7>t@R%7}bd)OZ zZ%5pef8|q~ZC`po8sG;I4}us=FhVAT0}c=pLl2ZBn+X zcJ2j2EvrYShzOEHS!&u_Rn_Pux2|7VS!q?-^pxx<{`u~{nVOJdM7V(4?snSgKFM{u z{{Fn-fYbXpX_G}z;K*}Q`gOv|KGUbPX}ssnM&X^1#jU-2ESP&<%H@&iuAM!+;1LSl zow0vHJx7ITH1vzsVSd3Da|DfJm1Ef3B}p`4ovU5ayP~x|8e83=sv)Bo`3p>fnk9jo2pj0& z#TG;39CvLh+=~#LmEY|#Y~gu;WOmLA-g^~Xzqh7vu#w|r$=rTh0Q>IFQM6v7A_?v{ zjL9^4G{y4`^ck?#>;sX#gtHRj-piyU71>fAUIc?_VS9IH)gAzWj|6wM!^guHdJf&H z&TWw5{sdYFxpBUNvAI0N?B8MBwU3Rt5?q?zwTp1uqQq@vdv|8J-Qfso|4F(*KJiYA zcWQIrJSaAj{i;s7ak;l8+c_yd$@%0U^V=SK;d+CX_3a&l<9v;h{Ynh#nM`gdt?)b= z?^tggJ}*6Tk&(vTDeYb6_h5%VqqLJ96ilf7iF;s~6X!+w{yCl0tGm)uUU7>qkWyM5iIL$tdN1G~#Hc{5*JW{v;gf&2K+$CWdlMZH3 zdyJDH>_(4ZY1T*wBO(|vBrU0MXGv-$(+pfS{3e)?-_vGhM88}(cK2F%6>xjbPfhH5 z5wtAqMn0{)7d6~54y*-qwbgh3Y%T}qU2%oJxsAJ-2q8jr z(S34xCltgN)c`oQh8 zd%AvCUBt5}q7mKj@6xQYkrCo31BRa<8R-X48URxtLft9pRE$VxkhZ#0<~0p(0dezW zTIaSs#MR$P6^BZ-7VuHpISuA=L91x_ve$6=P?l*iLU_jazM8+SLiEkL+={wVdS@Y% z#F|DNw+?A~pXJe6$bhc0v9^I5PrxQsBrjbr-iYsKxo1b2ptcB1bc zYgf>8xg)p48hE6gCZvRG0at9IKwGULhadASgl_QZwmuPiMqs;_7+ANti8#P!7GFXK zOv|DHKlhb+8wT6@xulF7}^g=Icn)0OJaIw zOznHd0@g26PmlFMqKTa`_^icZ@T?&j04c!+kD_`ih4D*=h#@-~N)aSP^Qp)$PesK8 z*O(1eJok0lSEoi9OErzqfyA2^?N3SZE(j%#LsPGuLd!VsL-;bw!Oue#x=cPu!XHAe z40r+#cW;9Sxzz?F7)Kn~#Jr5I`rhMr+aU*-2G#`q$MyE4H<{4p1J4K_WQfU@z_?l@ z8q}Ff8-La?k9LM|$1hMXb`*BXkrEp@V!*k-8>ZqLjHhzey5K{3b0pRW zWOUTxyX&&J1qp?hVNl`B=d;}xSMkZt$1s_{h(T=rtT&3MvOV&FU`n)E{F6Hk$gT=A zgF4U@1EJ`FZC3e7>=#q93lvd0F6XdApT)e|EA`n->kD$m{(3=)w`4%U9tj&EL&8~vQMRYb(Bl@upN~%4{U(WQ#?(~laVb8D5<#7%TTer)YrK5B8Dsrdqc*EYxRx+ z=F3DabB|i}Fi$V1dZS=^n?MWtf%J+M%u0?uY*c~cZV-VBXxcY5Di`-|Cd`HFtOyYb zy4|Re#EPlep?0Cbo(s=bVtF-Fm>DMf6i`l1(M3Pc7|KM?&eU#v6zmHm$m3xCq%4M$ zdt^by#XmzuVUL1JQd(rlB^|gr_ngbF+KKy;I&79P8sp_NoT}aG6o?#73JR1gN~u>F zM5Ac$>%b0EDNKry7&>-`=}kSE=IZ98wpIxbGFTVlN4D<~rHgDs%k(mHylTiS#gFgB zg$6fYsf=Lda#^ z?BeW#q?dvi6|pyK(Ai=)rb3AcpW$4`xM88PwK222)-hAd3bP!5xbvSS#3JOWDW=>0 zfklPkK*v1Ac+mvRbI@XT5nZvTkR(G;9J?T4106umikV`XC*!1K@`nBDXg%&oS&~_z zp~_S&d#dPREOi6lkC{`K*Co9(1}r%`q2QB=fWi#1)qXK_RS*)A3~eq9a%u<*N}x^X zkHgSKEb1U=)I5zHW)_@BclU)t_Q?cB+M7qXgn0}_8Y9YktB~~s{BbQD6B2gKly;lj z8gz#9)i8%Wip<9FX&X(SJB~~iZGD+ornr}%^ot+#W11C$iaklYyHIRy4;xc;%)SgO z>8%r2K;^C@qZ&G`I;~hIUKfHZaG4u;45!`ooop`5(PHF}jo~yEqR>p<8^$O0-un@8(z0KELl_M%Q_xa-S{SS-1R^*nVq74N6i#$ zGd#BWiKiAi;wq6{OTP%v!Y%1m?EL+RzDd~ZwK;o@tJBFS!zEM`4PB8UwqSvZI$emk zmbvr}lnW=1`I!MKcifk@P_IEjOu8h=RH0&8{seNhu(*#-yh`8Na!6g0SL{%eJ9)tT z)%*l{-%PoEENXIxkZB)EdZ3}WE{C+Dj`ot!IleB|N@*p*Cvz`7yqT?f1aXvG;*i?~ zm^ts6?D#Pnn{ezqUe|c69+n!5B$agW0B3juw5kI3S40ai=R`5S!ywPxi=K8py;)?n z8FE>^;dDX@R2!{yzHb1Z+EP2i7RoOfG2dKUYU%! z*J&rR2v*UJ5)ew*tr}UcYOE_C59FJZ$&J-%&A_WtZygHNkUE~Hf{|{2Iyl|@!lO&X zRgE(Mk2c7n=uUpnEN|HI0@I_6B0j80$*(99ccN+1P7rl+eRW0mz*0^9G3HMWk-s{hl!yZYxpJaV04Dj_>y3i*6(w&69nTH0lwcAQxbOAfQC;F>1Q^s zy6{9Pkk1`ftqtgNqKK&{deELoddoe&_m(`9ro=#(&(Rf6>48AAJJg(9m+z@72#c=Q z=dw8Y)SQY{oa1Bwttw@v*=MwXfV-0@+ojs3^C%mbtWZC3?3r zTL)5PgEwBtn|ZqAtH~uRpW%OeNuVw1d3>?k&l=C^^&O4z-iG*5r@#M3z-Fg^ zAeTAej?lxaZsp#V@&w#$$|r|rs4K^g9Pd|Qb3G)QWvQ$LluU9r+FaGrm_&g|;|roE zZ%!!)=_eTJCn7_+$K98Sd^V^rru2KnmsC&FxeMRZ!jUPP4r6K-syJH=-B4jjM_jRA z^}XP@|5o8sFJDS?dab{ouom#Qxo?I4OE_MTUM{~ew+KcT+#iof?oVRx2WG;30G+;_ ze3DP<&j*-KC-rwD40#6G^*5VUj=tLw!~wjPP(J;Xy%0}r)J!zXGnkx|ggYo&*eU1* zl34#TqUO`+X?Jkg<>bN1vif}%Z5qr!+acZ#Jb3V%h1iSwwoSN;yEQJ2CT9MqR>1ak za#BEpF=UH6>RE@y0g7XW z&+~oQ9~O0G!q`Nya2xyd4*AQXs|Ns#NX*pqL_AS&ONti*L0nb8hi zsMF2mYFna0hf)GAwqUE1sM#q>uA4JJdeE9{Tf|=TmoYKxL?1<*za;8jwq;edl4EsQ zE_~3NSGl`n3C%=kfKT$tRDCCz}N}@JkECE+cPGu*)l7$bf-M-Ya%xbbS`yj=N?T+Y7Tz^bT|t2 zo4X`_O=y+wI$`#`@cxxdYfzH|rsQ8(9?;bQn6i7K=8}ai+dHk2|2$0VH_F(a_kOkd zO}r3i5B(nMO4a9U{Dz}J(=!s_%}+alXAyWb!@PD+fTH;&*fg7}!CT6a+9PQrS#LyJ zTWaj7YVevL=o|BM9K$;y1niO9fAT5b%PY4!K<{{m)lrL{RdLvVcLbEOI8=-;CdXjb zzz_?OB%Kn}Ds?xHW!www_=@%A6I}T@Vsm=38RQ@}#qz6-AZSt~UTEgMEE47feL^J1 zMgn$Viq|$@HRjAT@xnrH5Zs2t$w`lo)^Y!QbA}&>UwWZtl2HP?o97Na}ITK$3Imdw9=6z3!ju_Lw z7-}K>I~@JgPUNaFeWN)2lH+Frp^!40lTaGf+ zohat=h&Kr?<)>ZWhFQ7!Y`b4Lu_OIq#37_ub@9ur>xmjZ2}P& zHQrc_GAhp&>FU4!VxE$PV*W}JSOUC?(cde5DIf`64c*@%n_28Ur(BX1nF6mKucz<2`CfY=|J$8?JwNpBfjMqnu3u)h_>i=SQ85C=R!R}@eUCvg*7~8 zoZ<`-tDjynbQh z!Cyzv@RYK8Jvrr=Q#ZskD zrczlc+?-TaNazG>Hx{U;t`hl~x+*mj6-pZu#UV}Rtg1^6SGo2)PmnZq+@doMSCWZ2 zxdh+H=LJ+^`DIB23fC=UNhBCB@wJcXyvc@NYt8D5B;ybHTWI{9Wj~Ka9zD+LKm&~n0@c5RzO#P6<(yiM45vouEhzU$v#@{n-ylVO$w z+vP|!`0g=e0b*wWPnObLgnG);d#k>pzmCxKCtm<2US#5_joPMdLb6Gh9_4YX6lKuL zup+CIOVHL%mus7wT=C_VBZhtP>bQ5gEGWu})6N~b23joP~q+SV6m->wz zQ({N1?!6@)25el4QP3z2u`E=&x3aZq@^EEp+2rO-)ws^UPSyOHiJ7XAoiWSQV!F!B zx^;H99bP#54Jwy*qRPFMyKyW1u(|D>Jg>CumwQzxs2z*PtE=mnj9QZGG6KrG^b0Z_ z{||TDENbKeZL(|F8AmheG|5Gin*2}vW`%#I!e|lm5x0tp6M=g*wadI{= zv^MzfT!S6@WLn zfreZvAML}$Om-&w>}BQz4M4tqd_V-37804z*0X&vo1Y8f#`HCod6>BHpdt~E{l{d9 ze=hR+_cFSMhLIR6qa<;{5_8a3pQnYF8kfqex424c<#ze+OAI`1cCBMQ2-sg8e}v?_^rKJ}E7 zM6d1GJMf*TopQL=qPbxbHUSy7=-d~lMLB5e52@m|x6z))IuY8{tPI}=T1!?UJ#or7 zbrJky=xq=zeYykNdFdL^XFQxShJYUr=r*qL;TaEF&mFoM>M;Y9?T%V-s1X`@LZQrK zCBJh!`GAdy#mb{~y(4S6VF$+9^Y7A~Xq$=^9xMQW2L=ED`~N5D?mst0*u>hz%)t3y zo0Fmrt*>p8@+EuhU`EPTN1>F?N&zgfAz_-BOo;+a(`rFfFov8tkEmJQmXu|T&xCZm zeFnUxVgc&$>N=F4jAGCvxFrK!3Yj8Up@~<1d0u<{zU;E3v-8nEqB!$*GijVDEwVoC z_x1z0%JNwg8V4>PG6H13cL&hA8;%F*EjX}a@#=+F z3UoW+2_$CnHyuuHbRx;|GYPY_YR>-v@HMy(#*~E{g&#u9n0;@c?C`A_o4sNWqrhD? zR0%WpVXxWRm($CX1A8IrxNpSXp8c%*dz!VcR%^d9%$=bZ&u=<97>LS;JJbedcy zVxO?ySrGz#+R(jXrWuHs<~j6F6f+X2Apb;NlT7?1pz-s<4E+P{yq-$5h~7U~tCga*MJ=kQ>2Y1L)97c09oaBDvw%9M+QGJ_ z(UrxHd}!n|#x<5mvFAfGkjjYa*5doP1Io4C?fs5)OzMb=EC<8Xth zn*BOq4nh6F<`0<(M$y5qx$R|1+WTTgp<~}xU%GGW{>W3o%1H1Qo=}r#Euvt{yGD*h zn?oAZL#gqFwRELkL|9EXRYPG4)g@ZNKuEM3ZaCFV3#;H4G!^5brg}t%y+WrOt?AN& z>_)DvncEhfIaOAEnYUOHY0a53sqV&&)IG+8f>WUMCn&WxAN}mMzXQLmJ60N8x7e+0 zsPgS5FeH>H>UBUksTJ3zFR&xCEs9ZQD~DfF3d`HOiPC;TF02m5kFP*GLk6IKqsCIy zrfU069=_&n`-wj5RXa8wm8eeC27=Qg})2aWwE^Q_FeZpWqcgLu}l z4H>CiI~xABjOXUQoFO z+%dClag%<;(8|LaE1QbeA+__~D950v#E~c&8IdlaH)dm`mGC4tG$V4wP`PuQ+ZVJV zrf4BalVg-8JnJ$MTV*pf72j$TVm>85D>(qLUAY6hG<~!OyR>K27b5`XTr7cERY)#4 zpvRrR)B2p|cs3)IZCIhf^sPI9d-Vg`@n*Ijg@enoUP`l1_1Qp~gEZXf>D6=Oo+Mko zBPHA}rWAC_a8S7(-OvjCQBA8EFIb~oG?KD$6fj5|XX**Dw-PSxjpGPS6Wk-TVYWs) zTDW^KxLh2Q#K`C@INxr$Vm>)R?b~95+`Z;jPQdt#0xC_uadV!yij`oO&XvQwA`dA` zmropr0VB|HZbrbFD_1H6CN*jt|H>QB04f}lULLmZSXRO$M4(p}hzjJO?)l<$s&nC9 zubcrvSv0GcL2DqAo)YHtM@wi1qH&xlN7~OhRLI6G4(?lI#Dd?M=FpNJ`$ov7DK^13 zpEhT!+T%R9IXnO4E=iabKFQ{c_RTZA-tb{a}&nj6m*jz+}vii=3<|muL{KkWYPOqQjGol?d_#)o`vUWr@7w#5K z6Qy+z(0U|xzSEn{Y3<~OTB%>r`*77kMgR{t=^M=e-loc@_M9vB zHtRca^D4zFsr&}27b>rBj_?%ZD|k@ALAmd7c_RDZ0iwGHb`TbphAigOqy@!r12#u` zSJUcVq(L-!1(o`ULaKyf0CeNdBr~mVt*sU(Z1*?1<#ax+I#*CfADKK8BwgKLnZnHa zV4g^j6>1-)^xb%2MIx@iGC+G!3rDz=1H@Ik(pVgOw$#1af$DN9LomA)*JznYlC(e) z_?ymawT&0zIt=Y;TwZ`^(yXvL;g^Q_mDz5D%#gcv9%sPpt^;+f%t8OI2zT>?9p)ZK zNovD_KV1FZHxz+4yi7YDni0^{WyjHLxMKYjg1VwTP2+e4ulBSlGN@4aKC7h9o&7iykW-rOU&CcFt|(xzL8vrSV9C+~iAk$R15SX8Tc*Bs008 zvg5bs1L{)-~ryHPz#<+Whz0 zz@8u}JbyWA9ul|HI657koxC!4?^uT?i^Y8=lP{RmNfheWrc?@%QgKftqVa@gO#;~1 zWDI6pio2J}Cp2WatpbW$Vv7gLJiE+Hw=XS}nI2F(m+1x1WyvqOBLzU|rG()){WVBx zENTEUcLv~62TTO8DF^L)X#w%VhQEhm2sOg!UCR2dj@P3M%yRlB2bgZ7ThqCEh*ogF z*D`1p)Oi8zMtu(BvvS^xB$|~AH56o(Sj@6dhgRq`GDgO<4$^E+LTc&5vSNA3)LR=Wz@e$pKAk9t8Wy z;|f^rOTS=WN3_B2V)z<5C?i8SbsUik+sZyB#tEJqeT;$W9(EE6%G@hOU7UBME=*~U zFElS*MwGU~Xm{JE1zk;@*U`HDwOOM-GLhahfOa0g}02HcKDiDdFCr z;Vhp2zMpN$8JF8j2{vSs7@OMaV5qruWDD16c2`Mx87?)S$^CJ#Th+NaV*dtQ{;PKH z3Zv^7y*6Ec;0{F(3+wWpdxbZORxpk2@@MTOkj@jAl>JTW6W<-oE0}ufT)&6$?n6G| zoTeeH2=E3>w+Qfxj!sI9zSLKFVyehyrbBtGJI-qX_yzz?I<+#^EdH!mc+2wOY+N02 zLwLe+KWZu~p#?gV(3ZBC7gRN5cg)FRIbhiIqbvqJJ$gRQvYeJootE*!$n&|%2l9!w z-n;bygj#Ufmf(EexeyiE!Q+)?-9qr;73sJq+72rxE)asMVWYn|S}e zv!zuD6vaC^9cqs=^Tp*_tR2pH*6c#MQIxoSOZ?6?``#Mzeb|M`!&6rGfw<}OS_}J& z{eE*GeRbUPNu$EQ`LW1V^a7$g605aCS02?FXCy>;%$^}-E#x&f7T7QAYQ+}z3d1@r zHIf_}$7tQO0bh!(8XtpxMN>s=C7D^P04hr<0ltz4$C!p+G$T-~#k&G^x-n_zn^J7r z5K-Sc$J1PUM$e0El_?^pf&h1|p5#^T-ABX@(`k15e$ZYzQMJt-!bWom>qL10+bIVn zpMEimsW<9|ZZ)uNDBGE;q%le+Vbi3f(BTN#jJ& zlNp5V41Ru!pE^h2JfEX3wP6eui7{LdA5oKS6r{^OpcL zK$f-*iTlBRkENZuCoQHcgR2tmLHeNBnI+8vFnqYXFNl&wg~_L3Kc$R5z#sjCexN{- zgID3SBG85@zv2&)J?xL6_W{pL`6F>e`FXadWBnqN$D6BPOkCv>KCY>J!ED>xZG)nq zwb}=N%m<|QbPv_*inp=}w}EC=vUGhu)?0eBXB_zh&%4;aU%Ey@L~FEvra@4k0RUM3 ze_gsn93AZ(|20gnJms_@{L{bxc||UBNh;e1S?tZ}8evWz!b;NYqItg09#9M^10~|1 zEH>22myCetHiz4E9$R_V$5&)&S~2E8?o` zt}M_EbaX~#0mT&T58n?g^iVvh3g`Eb{@R=b)`&8fqG@{?@C){ zV-vlKn+iuAyA}vSwiH((RlLO|pQzWvOi5}k8J95;8i>Jj$r0jL;io_M4f_DgFED?R zw#6>)q%^gfP(cYp)?fq7HFiq2id1T9mN{#1mefyTfYvH?$qt~_%D%6EjQJL%1DZza zU8m@sgPh5rc!jJ|3tF(Ct?}m>v8r8-6?T;gn88I+gjT_9Wm%Q0E|pCh>ACW0E!LZ> zGfU_5Z4P`kxP_2HBu~Ait!^se%3DwZ_Hg6I!q=|ogM~Y}U8b8EN7aUVnyTH_Q@1!3 zG4JZqrRU3z$S|5V!})3&}s+!YIrNNcFjZ!&4$-XEX~{+7-bCAn=C$))u9jZLi1K5Wuj<;Qp!Jx9{y zeByk-%u{%fPfHL;mM}mZBRBWJ8cYU%B)MipiR#1DELu|Lp82I>p)<>-<_)6oi6Ycy z0nhO>uJ;S!V{Dj5h(YRupC!65m?4{_1lm2-lo&kbzdy4k$jP5&FkQOuKIRu zDv_%5&@~dH;7-MDbflT!Vym}>4blaUmd)_q-D2tHqWfTn5HsywbQRSGFFzC?k?Stx z;MEw89+sgl)+wvIjeYNeG0Ppg#1}UGoDs}JS=3%yQxpVFFSj!$##&g7I zt$56=c8~Q}R<0oPj!5N*cmMPoQ{~=?_#U+0Qj;!Dqk9JBQ0Uox$L51AkVNSvAr5tK z8n2zi4Azzx+IQ#$&5DKXCLuIF=!}x%QvpvttADpCZ)l zuOgHLozhHykk9soXZzazXwU1?T4)zCLS$LZ9d!t3Bg9!z248UPDDaFA6|q$adMnd; z&5XT$!H9XS5ZHLV2mD%&E6|wtx^&dOW2;^qQjb53*WUt^>6DBMt3OKxn>7h^?m^hP z0Y0lmkO5oa=@3byosQ#Y9epCx$?Ngfc8H_8c7*IQF|z%H{`Yc)UKl)M{!^|p{Oy`d>WWyl3!>4-Av2dH_ViEbs;T&o z($$ywkJ2SnQCIcfN>|;=66{au0!>k`WnMy}wbaGeRpTV>8?jtTUO@q`@3K9$yXDoC z!(Lj?R6z|#EmH$AMDdAngEMoLNjXF~1t-&I)gx1f#lEM_$!}nF>-Ufp7hj^>gj4{P{R^vM&`fp{zM7GD;S+ zt#dX%rORl@^3+?~s;*+CqFW^(;2)*yOv(Tv!qwwE+oC0}uG-H`QauMfATF`|sZSS!1rb<`^e> z3~9z0DLKX~tnOFka*hjny^=}{lOCke8g{lbmafBwxq(y0$pohrAzS5~DCldsAeAIi zW!+8I-nzHAQF^4!yJ#Vr*<#`(A2EfCDY9Mz_Z~2Dm&etELj8dM% zr4=R2Q{3JA?o*6eL0$|b^v&-X!y{_M$n*pTh|f3Ep~Tz)tHiWY?kM#iLMim2z=*JW zaY6m=+I>jwihT%4B-s7Pq5Ie;$?P|Lw*Pv>t2w$>=lqTl<09KzHeAU>1*fod*rnWL zIiF?=I3dr_^INbyqUPP{c-#;+g3;9`aFu3HGKyF%e-HXRREVAjbiK}@3ZGI5)6U>~ zV$~+JM8BA^Uhzh7tbwZ|W1)*iCULgp{1>{wZ}9o5H;__2lAlCRxOCH31^4vIwgodw z>xHw1*I8Y*{M#3}J<&x7&EhT84(g~B|1|2QuaYK#e`C21r}noiS3Y|ig31B()y5I1 zS`C-~U=&>oyNecm5?Efp&%OOs=WAFj#>SPi>63{T17PLdLO->))m;J?-f-+?Wb^lB zf2=Hrv@ClvNJ);8liP29n+m)yxAY$L2$Kz7rz<`g5e? zohCU#%M_Ip?pjNBvLmKPi$RwP9ixa5G^yg+DvPAHu%G^C_ifZo+0F6x#G)J?Z_#MW z$;l_TaIi*~`5rW&wNcJ1%zvByv5gz@&@FnnrFaG~u zYD>|@*4e_wQmY?=!=)Z1wwX6UUqb=S7qN>iF%m%t2SOK9<$U$pb)D&SeVgOQ^9K4O zy#fi86Izl4KxDPFXF7-3dmw;I^taHC z*pG0I$|4OYpxM2FHhuuWZuZK*d`U5NZIY|Jb_fg9QKeI~4<$kF`fB)JV?i2_Q)pb% zoUMkY63=&RATczW&zdTYkkz7@hE#*aQrgR3r5$w!W}Fzx;M~WJ%<>A=Rf-vLhkUVc z#)i{6%XG=CCYa0hBM3}dRl)Az#-$X`oHlKQlk>fQ*bEL#)PngsxLjtMr$tof+Zsz{ zHLhskW!u*b7{++1c*ZlR?k4ME90%3{Wd??x87k18VJxRN%a22kGGB>G=}7X;-K|^duSSc z%s&DQvVadz;OFe^V95IpvG1?yolYz+m&b6Y~N5 z98H7s@yk94%m#rx7Q&#z0fXSV5i=x_I}k%vPG>RV9Fr8U<)2lg2UU{pT(hnR`1}VZ z!et8tpTFu7-25M0Tvrx#KM8%}3aE zj6i%5yWYh*(8)T3bGx`iRM zi?~Xnk#An5S9N2ON}zgzzbV3Nc>KYzc!N}UTlT*g))ACy)9YNMb7AqrFd^5tABHjI zG$oZp7yD!JU0X`EC%gsx%6Ts=!d+@a0r>~L&jn;t>CB+?h*sa`;!zWow&CP1y*DS)z9;JJiF zX7*&pKGO+{p*8>PT;uy^GNHI3(qU@5W)v1I5T8$Br2tpP3&}(aX!0G`eieVC8su3^ zuH_yivFNnnIQxUwAQ!e{5}+pYS(~7n_6H#+KBe+e^AW4|1lu*r*lgFV?N9D zA1Eea{anEso=fRwg|^-#4J# zC@(}uM)W%gTMraduSYs7HH46+NiZ5PB%RV zpD9CTK;Ndf5}|{gr4uY|9yQhI-q>U@p0<@CGLiXehK{z>m#jh`wpp-@bqp@@D5y@F zCLVx{Shdk&YCmJB!70x=in|39P{3*mQ@Ems$dVInYP)Dxc>&0j8KuAP=>__@#>L$> zLyRm$`=_O34AwgczJlPOxD#Ki+^Mng%(K`;h>Zv=t)v%6VLketX;ir9xFd%MY5qO4 zGDSTZa@)JP1sCB5W(3t^rZ;4&)C6fk7Tc%I6>7gvXsAUnd> z`4lpv`8NgmbYDvg1XRFT1h^Bss-0Pc03_)=*~+)*h+IL+#06V!_()&VIC!!UkPg8h z9+zoP6{f!b!`Z+PaWlpG=VPz>*|z^v#UWv9WM^Y^rT>*_ z6f$S4gI2a7+~M2{RfJzbsM|vhnZBUR93T@VCzO^#;AP=jLg^>2_XrwBI>d&Q^9lR~ z>i75dqM_^$62w%bu=nq4=qFW8R$RF4M|G@79kL*%VH&A%G@c#+uw1?lvE zeI!WpRXUn`zNaji5y zWmojjsACx)C~n$U%ULKWlHI&~3I->-&`Y2~b{cPnt*4dY_Q}<)$fs1`Du{c;V!m7} zm8`}C^jffeZT(msZ3LN?J068whP1B-tlD`4oi$qzLDje&Wf39yhQ}DtxJ#+6C981C zLaB14w%>8Kcmi1akm35#{MQ;$yP+>`r)YT>ib< z5a|Xg+({067eZHDIAl!FmufBBfJI^RJUBIK?Llak?UZ;LF6nvHDg#!q2d1bYv+O9s zv4+Kv8Y};EuxcZ@X8oxqdsGkLWtxp18Q^Ag(=Q`VXd^#Jn%1gPC$`^7lmna7H=;r> z=g>+L)o1*rE=FfMsxCte^5Pdhvcu_;Z86z;$dMu@7!+^hq0;hZ12wS2xbUKn@9L2&l@BrET{MW-KW+he zVtdUqDH-#3{8cX~U|!($Es;d)^xJMPOm7|et(B-L%%Uy@L(FFz|HDpoX{)&*@aMM6 ze=++%nR7_kI*S`Pnadd1|FAhR5|c4L(?w+*Wrb5QIVg#X!wY z+kHc&c^L`C*$lr?Aq4Ih;17j8X=D(d6I@eMGqY_E)91_2LzKUfDo~`9f#ilMlh_#^ ztWcyW(#oJwDbkuieMlqQ<>3B(Sg-iE(f^`o5PZI<;q1LNfvO<=(44! z2Gv_%@Si3ZkD zhO0xrz--j5L-g0tMOOzR_%FMifev#DW`&mjc^uloD4$kHzexa_h~||}Fz<-)r;(A? zF{2>F#^aT25;>B`<+x-MWVZ4;PI=>bm=(bFm!bP0XP+>KLR979_F!!CksU%sm(FGroLnKSR!$Uf0d<6@K5|!2E2s=4RPo0p^2)_-po~u@Zc`kb=WS zzjRX^Bym#@9Z3Gbr~$i+pjI#4O<4I#kDHI}r*qHwPJq;6rCQGZlG4^qT?GjLyZ33- zrX6P_8h^z%tA3AvG!hWtvqFPnLlGouvOx){JKD={9J$Q*ps}KG*2S1aF>RmhNXxEo zn{N#c&g@*tV!2$sLTG=)|vC2tw~>wJVA&84$j;-}_dOFhTbook+nB$hjY#LDtLjWqL3kY_N6u3~;Fz zjO_KP=8EJ9$(@hlG1}ZY0;nK&5aDonutBO0ZX6#J$4t{GKv#t&uQxrKF0!gkHPPwi zpZDL!<21Yk=tH%VN(qmn0Z1rP048;~0Z6Ti1U4{c#LX~To-X0-@O$i(v9Q5` zT3=#y8dggau*jxTP$@dxUPLyBk!hKgGaV+(3e?6ItG#oN=cxTbn@r%W8bz={`b1>0 z-hb?J@eTeR>tuu!P_IQOFa!y)1K|A@s6%hiVMA_A8bWW_*HG4)^rMsOR_|M*bQ&OW zui$0#=zU|IMW;FyDGZMAyI z6#Ye-kQq!F!X7{yvsbw8a>tw%W`mEgJ}ZXW5sHI1iNduUI+2afe(271=J_5*?2SD+ zfazU(oo|D)w!ryN#)59}O$k)1vQS0X64C~@e%|%j844rFY_2ELX$9{E*S3^uuGd>7 ze1T@JE?`9H+U)a{L1n%cuo}$CYsYv)BlrfH>=g;w8Etk0o87;B!+oWXtv4*yA|=qZ zE6*YS`&5BJhmsMg$cp{CH<7l?Hk3G*?272aA8o~+wOggA`s&mRTFyhF9J?yD|GKxD zM(Ezg?anqi(Q{g&+DScgqoi@lq2``wq0)$LaqXS}hc#Qu_Mv&}Hn}_2y{?h0NTd-w zOr-HW%(*K6Rp;#4AMjM%aCoPeGTvPo;T?AP>*HVBrqMx8Ubupxy1`&2W0sY1ci*16 zTO5v&bJ-jcyTm)shLi%`to_Wqz5LamJ)6DLd4S<;&9+h8p61xFIQ&Z2<%ge+ihjuP ztUV89CP6|(4&L0*&dPpG>|=9CfgKs!U8g2v{$t@o>DRCK{5PKqJD+WWYA6q%){kY% zBXA9}p6ij*=byZ}*)X}04>;oovGO|zt6e$RY+q5!A>Yu(((QeM^WMKobO|?*YJ5C! zoaxMtJOgP%-#NV+XwR|Q8=ZPl?IuWWmC}UI+!ubT&rJs3SVZ4h4Bx%xIf(Ck7}t7H z_Y_Qz8YoY!a9-7+oy+~c3;kP{27CvG%Lj(l`f77Did0Sd+b0$DGsg|5U#hMql2Q#@ zhg-BIbVv%(Hkjv&L~l4*CabAYCp;8HmfZYm3*xT@A#sfPzKTU4m9Ja;3wVo!{@ExO z$qZ*X>a^dctsmo+u-C`n1jvs{ybBaKGGjfuC_Ve-Dc75v*h&PM3XkZD?Kd5k1BI4- z4Uk5vmq%pA1GD>-7=M^%1M%tsiW;Emsd76SR~QYL_T`!jbvljE6SuGkjc0K~VFjv4 zy1Q9~mY0WFcR$cIO(w^$J)yzVKdSOp>TY=B~uAoCM|_Rl4J%L8C8p9hR0)h!91v8POj{JjO=8~ z$&(>6-Cjq9`jQg$xyvD7IXPuHS#7h*JIai0`|JKg%ytJ=!K}e){~;^gaoi35!dl@X zcN&p5Ve>4{w9LvRe$s`xRD-z!+R$>#3kz&S)o=u6V=sSBV>dv=;W=R6BB1Hcpa;&N z3#Kb*$M4sF-}Xebg17$F}DE@=JYOzmb-f-Iva9_1$aPPC0Qw#9UFLZamMKPTluePTSXC?@L_2IB)VI+7Xl) zV&VcIK#!GI;GGF4K8e{7P*jCA3?+L#$P6hZ5sp0qGKl3$R4#^&Q6@@n^qY_;|Lq@& zwR%Kl(A})!w^qj0^-%I$b{lH{e2^6B+d5!JI6F z>_Pl)_7lum;z|gYZwXXu1EstpiNzvTPazVAQk<$53y|P3AAp;F5=o2~wsx)D_{+OE znKC&EKVFH8V2=&?W4nR-yQ29p>2D<+r{&G9`~Z7OCN_g1*$VLQSm(VYT&P>_PIIZK z&^@5_&sp^vp`1D3eNi!dP7aLd0j@sd{QidzVh;o|w9N3*R{WU@7Mvu-;n525nsyR2 z5DGCffd4HIP`+FYXIV6v;e|}E#Tq0Q0^((Ae!FpdMlMVSyI8?-f)eSP%$A@OO)!Fe z(EOBV1V>YKSb|HLOEjjDCu631a35-ltjft?*zPUrtb9KK)fiE%ZV=OM=Bp{mPQBP`kQ5Hz8YjGwV4T&O740hRRZ0s zJmlYJy`>wakEjeQZXc0AJU9d}joU4C=^T?6_iq&#zF`-b>e{E}R*%38y`8oI4;Z$Z zTmv{xmQ3O1kPLUFUOE6VQah&aXCNpB)me`4H z5%Xv|Z+#>EUhqzL42$ht(e z=#_|OlTvjN*W)6|%vE@{Nt~2GhANh8dIQ{p zz{x>+I_-S%K_Ms6-w=%Ju>0PM$Jz?9(A>_3_AA?dA0Vs$Bom^6MXUkymKxryi0H8* zM8@9AZJkHO9|E%pY{RH;N39vWht~3~H#6dgl0u)Nw1jon37ufQhpB5q%Xdb7e z%*)-V=nU>50fAICFtoi_4%C7K1SSYmBuO3T^|XSW!)66dW{Fze0p&7Rtrg@}I}Q?o zURQ@)xYf;iLm?R4zENsZ_jEXzKz zgU$Z+ES~~Rb zEbv|vSMMvaAC09ymB4#x0iU`s%RM3ulsP`+67@~k@~L^NkNx(DIMEz}>!Z-OXKj9_ z3A#G>y1&x~X58Fhb}o=rFH5Fw=$YHneFUWaPi5njspEk~MaxsSRwYQ&H)axO!`mt{ zLg{40e5JV@-sK3 zXkcsh|IFv8TG=E0=n+~^42cwDBqalLgsFbd6>|BzatJVM@yiuL&|!Y^*v5_#LaIul z$|zuqxuBppQW<=LzcA9AK0!^z)oF%if+aG34HFM?@AaSCdRZ1F-(2&j9ByhAVoOO; zrc+zP9^S`X$6FPApU?B#K;rv#cv!hr1D4o7CUgvggx6w!$h_UVK-2Mfk=<)Y1nqho z@aS?6gjzvGp(p{I`z4i$7d9z_k<_wp_7Tsr@3)9ugL@`;y0-;L+qS(GA3o887^v0t z?){H{5>}E7skjSNNa<_CkYm;=c_xw+axf=}lpg5$WqH?3 zlCOqUvkTfpO4m!?40hH?_QT*v`wt8<{Y0<%>1981b?%>_z>4OyA}pkdpp(_Cjr8F- z&?rJ@k`&dvq^so5o-OE)$h41)Y&6!_ntBAiq?Kd~%DLzAcS79F6)%d6K80!fizU2AwloNGO(81NK-% zql{3s6|{Zoez=|^lVxs-Z(>(5rF`yQ>5?YJj6_bbmWFPg?sryI38}0h-Mi>6r!5_mjg7Xv?swZ!| z#5XPm7WDQvZQV=UAPMOky2Hn}R@9pSW5V+M`+-OnUy-sL#U@6!w?^H}jE(B_jc?)W z!ygb*lYsprf$)Fz3|VqlQymJdv2*r;Wj;Rh{x~y9j1-lYCyK2r!^J|_ixtvx6@wD~ zWLf$?{-{?3*>*4RWzoPL9OFThw1-aO0qt{#APTw){kY6tw zyPUNTQe~lixJFVmqYqHiJAu(Y|I&<-gcY^~qfl#0EYq}j9GrfEY;iPfg zHVtn$eYC7HZjRMQ498*oAOq+(*!v_magM4}ARmT^GDv7pF?PV7HY%r;nw(NBpneBX zH*0Eqg%Hl@p&DNeeRF?=w?X%13go|!u?Q!GTQbr}F5ksPlygU9oaA4a&oo;|%oUy=EiFmcjs@u8uNo~)Q6CyDB5v`=NJt6uS7EUlIvhP!73D+z=f&fJbvT zbSFX@vrd*~0$Y_es%;2(-LVRSx9+CS40X(((OoVG)6t6t{v3$V;|U zFT*9GTzjl;dhykFx*wk5odG(V9&Nb~jX$p@Nzc34HRp}YG)ic!;IzK;M_=q*hH%&2 z|Iwm_&K&z~8GpJB&k)5#wVk2Eh>PlUtWBKoh0ppS6nwiHJ1@k~_8g;s#uC*;5f%8G ziUu#wddB{&NJT|f;%CjUF<_XPC^>P2{D8e^&PyuKxulmHhFz3&$0Nake|qdRnGdJ)(pHZYeG+E8T)l>M$Y9(_(Fz#60e3A?-6^< z)Ojqs()7+4_|PDtUS01bd$cXU<|L?vl6DYGUW7pj7y`roiG;e>UcsC;3p~!Rdj$13 z&m?>PU1}L*UEA#9H;Z_LQ_z0qej+8Z`S29RJ$O}iM3@x;a12S24qPr)KAscR&YMkX zX!##DZ?K%`m=m0s{dqb!N3p{vog$>&63$@{{e6o%G`P-M?EvJV{B^m<2fAom;x~kP z!%>mhP9Ag&+q5Nm+$(MkVI`(`d5(H}_^ImOUB`!#2X6Q2TQSDXH{nFeCpZaIdq#>LtEP}%t{vPC>k~Q4QU0ZwD^)?=+K3cXz@LLr9h!)FK^)2J$e>5yI zL{Eddf8>JNk6idqsRRGFToARkGjRSt)I#+CRtr@m8lnj%tNKQ`HqcFhG^^xsNpYCw zJv;gz;+WWhdGJf7Hj#jam%!DYvOkHNV%NekdG%bOwTT->Hgu0PSEQvXY{- z7`zy16cdX(MF2f?*@R?#g+E3wv@R@>UZ5Zhb!#K~?i}FZNrvL6@E^=RN~UECdj!%7g+W9H7Lba+@1_Y7tWAdpSu*k!puF!B>Liga8#OCo?rK0c4GN;t0Tyi zlzLH?g3{2xonqIYm-j9F_!*-PQaRWbPCymxey$%;yao^paM`n_jSYE+#dAI(Wg0w= zIvG@z%hFcCr@HqIvf!VYnnwmyIioTV%*yI(oaw69V+V{&xc>TLddK8^O%|K_q$O}@ z_4}T_!dPrSSIT7RL8HU%ugC+JoQv^iILwbq=GLNE87fQ2CahCDRvqfnS#0{fvz2tf zCMc?bqH$2%FXVX;1^NRm{pH1S0??W&n_CMmfwa7_U)y8Ym+I4ZWt%D_3?-XGMueOG z;ke#Zo}N4iA<|uAGm}*M$H*?#bpfuXHQtgQdXm3Ps-81MM6l3SfLsni2jk|RIl$Jm zNmAT3Ou#GYs5b0TT#NW!Op=iZc@2)JX%eZR`2f(vE15;nF?kno=p&hn_aUrGkjj>Op5xE$7~_eh?4q7It2$CY!0A(t<<&=k&tGc<#$g+}hs>xS-FL_itiw(l@M z2RTuluVsd+(;DDMqz@R8YymxQ@fMwfwj(Llwfc<*(iJA!b{I<`Mc;0QC;Vp663&p; z>IQaI=I90;Sp8n;_|nrXwG&l4FoZP@MJlJNhVI-U{pjJl@L-1SvLP#XpmILYXt%!T zsfI04R0%m|An6~YDgM0r@yVOF=v8~^$je171R6f^L0{ip24%_LQE9w@s;!@SPUky! zxFAN*`{su=YTm6I3%BQN92pjJ`R)6n19_?7w28WF)vj)i6e1Rvd zVVJtZ7ayUg<~LU^J=fN^y4hEoLK>~0JBTS-LVmg)q|tVGiP|tq3ZT&*!T?8P%TMIR z`_j(P8+D;c9l)DVoeKg2MSi#HpDw{P;h;MV5DWtp76;a+^vZ~+t=*9~K z7dum=T%_3pvi#B6d$@UVK8pfRaNudRh;<7-;HuKSk~Dd$g!SFC2X^oT51RHl0AuSKqe!z!OPq{IU6J!NOD`EQwpCC+}qt?0y3|zqoQA%9B+ZG)`qY>0F zY*K-|o|)8c92#FS8elItzUbdjVLu{5o{Y)ds`J%{IKigKaKkXaoY7{SvL3iGDMb!f z=HTG%fNX!gk7H0 zRRnpU`Pl0Df=8=`NGn-w%v}PUOsYgb3hRpsZoZXvYs_bh01)p0)C;Z@@AMv>J|tf6 zz%cOxc*|eBU7C-7V&`NHFBEFLyBDawL));67ZIeXOY2ed1?HVHnqFb#lY-nb0l-mg zk)7C}tzEI8bs47Olm0N)m*wx~;#)%A(ySjk3sPHUpUD}T+A0q5Y{Q5@i7TK4rWsuD zAWED&Exyt!D5WV^v|k&Kij@t1Lpn#1QwrAvA29wQ9@O>xpW2okfH?CH*^h68b=-=?R z0U}913T~ zgve}2uDMv_ilT$jQma_OR42o$-;e|M3A?Rra&Xrz0-_^)=PN^Buht*14(!X)n~e)k z+oRh?y-Wpc2ksnaZaZ2bU73-4YjD`*(mb}1EKogOhd2%F^03C$=tc~&*Mt%E;SF^R zGSy}rDiS9R!F`~mQ3GX|eG`x`gILB3^nTpxKkJtvm#+P|!)%!~sjXtH*H_ASNI?N^ z?tH8?~ecpZc(32^Wc9M?tBM4q7sk2Q}Jc$?$XBFva9L{gcf;^`;0M8G=0 ztPi+cAhX>xyv)$p@J#Phm_r`@MmuV`W4rwy2L}XUhp`h#zkb1!{Uo;jhaSfNQUZ{EdzK{5#3>fb(22(~Q`oGLT3C!HOEAiS zkun*WDk{orC(EmHsG^}!6shu;+r~RGUj~fV?&M#TQ$WKyY5blu!{g{Z(@w$Pc+i;)% zz{0)RNwximO_l1t+gZl_sJ@5xtJ^!kyWR~1?~X6{Cd=?WAN<~Tt6Eay_=esYyuJm8 z`#SNQrkgs+0k<1%VzLE|Rn!H!Emp%AI}knGiEtb%7_ZnEBT^67^57|7h#cG)G0FLB zVVpk(l5wSQh|AJnKzVSA9g$}Wd4wiUp`RkA;-TF5Gghn2Pio0iE<5A|I)Mt0Og~(4 zRPF(E1f`CzpZ8Y;=nRw^75=UiEY>oK=omtMPgO?Ox%?iK8A_dU2PjtaNCC}LS)G*z ztwu1(5&=OCQk_J<@h=O|5@d^b&mfQ{C;+KutCF>4Q8f6@nHeQ=z)eKyRGqQ5-Y76& z4M1<>!x%p$jF_eq|6-mbtI_y9nK86P!Tw}>u~uATF2%^Qf{YRV04I|1me}9Fv4tE< z43-f>l$KZAq+G}+iKAnDc-iWl5$r~lG}afBRjI>+ z)sF04XUykN3n=Nd+8+vlkSVS#s4UqeEx5JiD0MT%lUi@Oycpw2CKe4XC=(}5%g@Hq z#t9=$=&uc8*~f?|3|%4v&lhGIy^^L(L02waada{E8-zOQGRTunQ=n3%hOMj)D_=C5Js9RlIPU-@mN#f@Y!MVNVe zF;0DyHsqmy>dO(C0i7nT zqf#_@?uJi`Mk7Os;R0A>GP<(YUG9ttqjHTB*kocqB;#1yNS>2bR@e4>f^0Jk|D078 zg~r2)G7eHNq^nfvkp1|E1(Loj$a0syIK-0{k)X-asFt%1yNoRoaq!VFCuJG?_Wi2f z&DoF&72B^2_kR?c^-aUr|Niye;EtizL^l6AI5*P6->cdxd^+3p5jE-(eEDcb@w|F| zOpp=9J*R#!%d=Kevv0k6!Q;hybn=DZPt*|0lwynGvYAWka2305k-{)Ve10h#Q~Xw7!_dk+Uni$4ysKS3*Pg$ zeB8-eW{^>+e^wgcx3BK!JRphMo1JG~lgkYfDmI^{PnZVrBoeqRrX;~A-{F}op^LsX za;^&YP82S(VW^i0YIdlPaL)sI|Bc8d!_bt&d_2~qz2}=DBf}91$~0XK*2c}yj2nTRwY;{C^7RtW1z8XMfr+X5+B11A zMv+kD8+B6dx;}-g*%$s47$I&P9Qb<^<5*sd4V;bn2DO(>YJF|!mD7Hz7fvIh>h5GU zmmO*Ydla~IeE~1U)NRJm$R$}k+~ES=fkB5@2v&b3-Vd~{p7&I~k$jw}qClzYj=$mh zn!ed-e=D~Ok1rMbAe-n5UT^GP+#nf8ag{2s`kCD4LZ>0z1$yogMN{7vY#WD%nO)N0 za?oxF{oAx_;@`-<9d2Ak2`J?R!b*T*xFH%-yH^ycEKJCjG@)pv4Or z1cmr5@tX*!3MCFP4mA#eo>HGrJ$|et1fNOY*Rpe}P*v@OZV5miHhx#Hl_tHSSIe+Y zAASesGyPL_s42K!WHk`2x3(FD`=6{d`P7M_?JMFOX#k0s;8!E2bT`Q4E3%b~D857m zNZFV`kUGd@$Jzi$W}l^I31 zJr6Q!<%bK5KeTPSiHM5kD^6g3E5YHaB;i)|A)+*~5+>3rbha^R6G=;O19S`(P$>PSM9Z_XyKLUUX^+7~ zRoRU%G>JdtwSrfXvZ^Ix1yI_eTwikusXgSp?16Cx6x{B1{8lLW^7cHUTf#nHE-s!3 z@YN9FM!{i4!^`Ru;>F(-xx%*9l(W!6LOiYzOEL)+uN7a)dXt9iVyjkIBhN|qOLuB| zTpc%PUaVL^1{2bu+g6}r42m0WZR|u6QT{-tmL-`*Z4v_rxAYfT>0rUa9>c;OaV4ie z{8zXpw}0{r_0m3tGgG^szu&AT%}=78#cN;`XYDsUjnyezQvG+F&G)0a{xwznneF)p zq{rB3*JySr2gq~5P0oz(KZX64TX;#U%v+V;X5No__lhz*%#_Ou3yy9!9sj163^{kl z4?a{Z-&ri*AwTb7-tICMp4JzhexB%9_gJk2T^lj^23@-2@VEoF-|h#vpO3%RPd^>I zD!%j6Zt8*l7bLgwKvg;O_5w&Y-2#2S4fy4!zw(K|bb~tS0Y+f5!);<% z=C~(#*avwyM0wb&sS==iI0&W^;d7mjke2SR>jL|xLISo(O{{`4 zSDvoY4%S@yix*(&5L@04Y{|-77QkM0v=fvbIlRc7sd|5_(fDh+G}v8sabKkoollvd zqYSe#BgY^=Z{42CcK@Wm+P>ZO%EKMP4W7w?K=6MWI2WP*nRJT4%Y1Wfe5Lyq%V^8OaM0X?P$jb%Li z#2ZFFE7M1_ac8YJEp3T1UzAqfbIBIm3V(&gQlmOtbs+hPs>3cXjVjX0y7tPoF8Agw z6-YPsR%j|Ww*+`Gf01L=68C78{O|?atZ5gl|0XSw&kkiraCnPWRRu= z^$(a+q)G1lfe7avg?W>S>Ly6{CK1EsitOEfgWARPm2CeG29H#H5yNh#2s#DPxQ7UK zAYkDAm_f!QgEW6}WX9b~9-X7VW41-bWFzBc3LZidvEZJ-R2Pm36x`Rp+ofR6rjy)9 zSdxz%5(tS>{)!A5B6tx3SR$FXVO`BIv=k1E0^yJxXf&&WV~bg^@?eFH8{_kyiY~-4 zER5S%RNs+$M>p@Fm`+v~Nca@w&bEx87U9-Ab0pMwQj;y^Wx(=+;M$i_I zE*1=4iee(zF+8Tkc_ybu1`6NG-&r0xMZAHT7Ubj$d?Q}Zj?Lw}doUlzfg)`tH7;&5 z?c1$)kK|HJESlVAKZ37`vrQaX7PZI~%&7DP00RT9-X2dVk>sfaQM@&r$U48x*GKK zh0$(f+Q-!NS{&3(tQG*IEoP%Q>@l4vmbjBJ?-@4L`AyLB*VKashYYp#nR5rt2SkQE zR*absF_Te6CoLjq;%Bq0;@ekOB#hk;nPPPa%3IcZ8?~&^6Jo&SG2?E1*>Q%gVtPnm zP=9VEA7O4LErNnfmDA+-;H@*a3$%~Q4^MRrwF0hHPmU%Wh$i=8u>&)(n5@nZ3Y(`e z^t>)6?9O6x3u)`m&@){sfLVYu0bI^UTr3!3mn-tTKGvq2fes8~(W=Vm01#2GfFaWf z7TR7$Bd8^eEOWM|yzvv!oLX?9Azk8VsyNoFf!_saZ0Miv)wOW@L%B^dBXh~om5T$L zKla8VM|X{<6j{&jEyosF&z*M){jM+c)1#vvEc^bq>Q*yXje)_Pu8}9$9VB$#!PpE{ zf#c{xMGicmerf__9I?>>Bm>+}ON2p@*R0dEdaNUFuh{3MlbmrzS!S(u?Bj58hu{jP z8xfTIPe3XD*yH>$MSR0|PJ@ln$jh!O4olB*j|P@rL2J056>DD=lW)O$fP(9=MfEw*e5@usVdWXJl?Hqql0v`7TTNcguo zJ!0dLXV!O;zELFItyvD3)hnCmt1V|(x@r>%i=9o&IN_z-V*ulxWew#|-K=1pw7E2} zR#VVhHFLL{12{{eftNXI!;tZRgJY|$V&wkYz-yfmt;qg?|5&?~bT6*8Y|P$F05 zDo^`hjmr2pdLK(TOMq}rn)dB+ zeL1owiF=hn{4qqoclHM46f*oSprSBSqy1{vgzGl?u7&3nKVMebuYP|(h#o`kP zy;Ztk^bNs^*4rl+hN&<-ZDP;m{J}y;B08GGGn~bKmQilq`xvu z`%JL?IL!n=g=^3vUyQ%NNj79&$LP(D9uP^h=p9f61@cUjPj?N}Pwz?=r>CAAq}ITE zm+4{Z?n4cXzZLDuFyGrek~G~*@}92MJ_h;lJ$-qIZ@^TefL>WA8VvWQcPvvak9k+B zPiy=XS(8}xs@5E*$uep#PNdkycqT{G3+XC<(i_d0&ujX)oAL9mCWCKv*TJH_OTHpx zOR4^8>n*X$d*4r;Av9l$e;V^(LarrBIn(u>blEFv0FWy(q{vl}iY!C6wIf!K>H?%x zauSPq-MI96mu;r5o4Z9=*n)7AD3@=jy*oILZbQs=*2fS#isHWuO7Yv0PgGOr!S%K$ zy}M>{(ps}aS$k}n6ryCv*|^BZjsiO7Gm#1~zN78pI`JA`imS#Veka@Hv|l`tiR+>>;ly*g!TE%- zfU$dW3+HI{1@8L482jcROPX!pY1_7K+vc=w+qP}noVIP-wlQtHU*CJ)i#Xr?oXM3CSn*a<2F($)ISL(5^wyj30`U?p%F@elH<6sQ zm<=D46uWRZ1>V?Xhgo^*wyH8yx23KhLqR)%L9zna*VBPX(H)fyYZNt4TkJw-_U{_7I9isKM*P24WfwF$d zZuv@M;_3m5#{6s^dEPz|H@g z81sK81tmm8MA%rE9sUj9T%0^(izR|Q(qqWw((XJ@TueX%!R}(etQm$QPGS8P$ZSa^ zYR>+nSGQNsO657=fwN}0h}-%I3}`Q8x0@&G1dIn0pD?}H8kf5L@3ZVc{oKi~G^LFaR>i!-2m)KB9@DmMt~9xfQfRQi zRJUA-`J`NEJm$R{)#hA5bF-<@pge)4DcWRnTrnkDc-DB|ytjA0u&`e~S-zXD zIz>|FCGNatF2p{YAQN!>$fQ)6MJnYP_s1&17V{ciLVCBBUt^uuWvzKCL!Yk2B0J=) zb?C3M<3v+N5wAB->~Peb1D!n8z1 zT7M{s&VVCeTGCoV86F53T#Hc%v%qHsy~>#n4daE%c0jSkrtbUtjry$hgw8cj!AFyk zj&6dAE}P1GOl2Nd8NEh4`|zf+fbK#gHW*dW6o(ahDT-(zA5naxdv?A(^F){v&Y~^< zmlRQ8G4>Ij6J}Blvd>@K;S|+itFeZC19(Kkbaoo=5JWpfcf-ODum+y%SEYR}qZ^`V zDuySfjaxPJ)l<}ym-yWtOq4d??<<=wHF_!G0Lf<#=*FsW2f!xcY>|LGP#>s=GyOo4 z1QE~xIfQyjDW-=DTBZv*v$mqdMkQDQTBL^} zg4OT}rf15iv`BZ#f+-O0X8@z(zc@AmrNQFTf7MTB*;j)#P;M}x95mvzM@8#sgzT~J zAmuz#SB04xn-6t1Itr|_1w#EKB=ug9zNVX%cSda{1i{`|NZtGRaUj$tZ&;TM6iH%K z9p@+bmMS<<7L$?}^X4g^6Qm_3mT^u_Ltb{eLUr}48&jozPOjB)d^ko^k1s?%mk+SW z2Bz&8JL0a!*@0W|-=2rQxfs0o-=T-!AVw0Nq$JY&|+z<5?OxRt(UvUVo>mO*Lt`Y9Q1g{Y8M!@g~ z6qY@*H&w?aD2|NO#(SWtjjiP8@^$o7Eji4nATdRBdIWGibD-rd|Ys} zgFG8Ssaxjy^|&_LCPZH@bEnXt9~^x|$#a*?973O2PdfnpV5;kw&RQ7P5_(e@8q#FX z?%%A2#iue}xm}G94xOopBzQ;s3HBf%!b)KNf;*3<-XFmBhQ_~XbZdESJg(0sisv69z zmy&Gu(fh!r%7;Cf-d=nR#|ispK$9x&JPvAIF57Cy;)9ZRe4Ye^kj?^?l0%a;%trw; zv(QvO8%_5&5DyTlUO~Mr8HBQd5++v-$OWJbTx8?mHq;(Ju1ycw@y!c_+$@XgZ<_*+ zbH|;sS1yO6i!%-f-rvOY9Dp6^*C_rSpjWlw0ut40I#Wl-KhVq**p#S`_X;W9<|XPz zZ46sE7I8@V5Di*cEU+fVgc+1%dYQs-hE&^-hEN^@r-`KgIrIsqa0m8lo`5`nTP&vB zsZ8@8Hf3qFC(!{c_3W0Dnw=uRoH52xv>kCBcSi|J%Jfy$7#ztH5=oJmw86KmPYp)P zn;3w%e>}$)d^OPz*fEFUpF$ZZ2OhW=1y<}hqNv=&Y@%f~aTU}^Roi}t+M}!#wb4#> zC}5K|zkjblDONtEvnV2+_fP4}QkmM+R~uzLOuU+XV(fOMJJTL1>uy1%kXf>qrmBTh zRai*MjC;!F=CVOL0(y4g^NAEc-miN9IU0cL!3Of$;v~4iFk20pIyLxa;LU_N6_rLM zdS_6Nwc1GlsaWSNm0`cH)M~zbFdmvMVW(se1=^S)y%HcE)Mgexkb1f5r}Oj|9?=Fa zp7W{x)w1An4+5GKjQ86B$AutZi}(e^O7GHnAHD~V)EJ^z&=71z;4y~~B_I643ET@j zSA*pXA8_p5Ohe#6$!d!y$R}Hz*09USs72$B4SYw~lJKYCJHKM%ty~>wR={)B=Zt8d zm1m}ieBfT4Ijqy^hmh5e(5W=wyLrSX`xOZLtquEq?HC<$)k*j8Ie78bqo& z|3WFzqR(SJ9cYr1fJ$CI#+^fC6i-YoQZoVSa&|emAgQzVj_nB(ae881V8Et&9}8u} zEqA&j@V6#xi+Csn^ZIWo#zV_1mn~7U*}c?xcF}fCkZ$g2OK{75ZAHO1;@i=mJO{gk z#_oiorD~Qo4}{o1g4$I5A~sKmAgz;CT6<61d#M$jSJiv?)l9nAj04vUp1NX~J4I1D z1=2gi?p|QF`yE=JJYIq62?adHk-HHtfdw#>b2f5~0*n&+A#tr$2JrN4i5k`mxvQ*ViAI?F0SO@Ha8e#4=%|} za%>@fMeq4`<=M8o#@660n|zU7E9qe4@TGJ^C)1Xuu} zs_iOct8nf@$MwT;51985*e10N^6S@B{nC#nP7iQTjVxhZ8>vkPRtt`y2lj48wQP7am3G$ zt{I#};Ewfo%RDxD)vyEbFbT7LVnPE*d4_1#TfwPF`rUc-UI|{?55A#Nn*hgpd?XuZ z-9rm?ej?z9o&Fr*Mv-oiIb4ou;*{G_#&y{h*?8S8HAO?%a|ujhH&7YEXxjKbm-r#3 z{iBROIQA7O-xxT8Y}wy{339uoVN+*ND4W=&vb)_y*v-bVr__0q9)p2&I(g82j_ji<0}!(Q*C2g#~ZbU zI$C3mY(*g zRjyl)Hj8C&?!RtfBZAfg29Nwxft6?_gh?oM-eD2Jh22ls;HRTnWQ{HK1hUx;LS1VsB{doz3>v)K*QbF2owkvPh{MCl@Ljoom)~YDB!%HZj9lklDg8 zy%`C;gPw0xo=4}bZ!f25PYy8ARe%Z^KC2`wmzO|V%TaV#e!vvswp=?Z(ol}H)TlR8 zrbH$-FEim#m(Ol8BJG)lhc7dqt{)DRx{U%?LrSr-Sjlod z3)fBGe-{F&S8T4bp?|5CMj+ZrV#NWFblhgnMX#gJ2=wBxOgFB}DIX~w>#4>xLUsxr zB_fP7#>hbXs7Ldfu3hB3#}-QSG@({4qK%4obncui&2m{XS7%zzz^1HhLHDoNz+feU@crQ_8~0iupd4LBdzqMpOrua^nl8D_F4C z{0n+^6()RG9#agyKzQ9A;CF&p^}r1>sQJ|Z#URf(HNhvdD`|J|H7KF$uI^T#({o&d zcI6C#pSyuLRJV=>QPjvtPlzz4xA<=3h}SX_mKXn;o)ya1CW5g*Z1|oz_rczXS<5xw zjV-o3q7^yBJ~WTPV%j3d0PaFzx7o>O}VeveIAj}%|(G_s+_DDS@pHJPO ztN}+saA*03INYEogf(+Qj}vqPg6(JA4^nqc^PH&QW?s<^oY9IcYfrNttjM;^x~k06 zbuqCMVd~1u!UiYr(8_y-8sv_Q^JL`cO$)QX%YC}z`kOup5S_m(@#J9midZ`Zx^5wq z_Y@J|F}4C`f=NXldWnmj1dHbU(M~7C-aT#zy(Nm`u4IX1RA&5Pt7mY?}c`De58ALlS>TN~4V>{hh@n=e)U*dVGSRgV(| zR5EG<_yz0`H$%Db2i`w3@K z;$-%wP~v?irMq!viOabV%FD)ca%DjhNkVdPyXHCbBiM57b+YOCnEL(oljeZlhR`RP zt`tCXLN!%CR6A5hR?AYnSyDk3G83Ty1}X_yQ|ZJEh;Rs7rn=}ikT;f>r$_6zOf$W0 z54b0AI*3;Bitf=hy@f&DF}kGz*-^PE;cqNRh0?H>q*H|~xt%`+0AL`U<+Z{@kz%T( zs8U-3>g`Uw{&-CEg?f<$2`px%s|^_zGnqb9kNk+rT{v!(mS=KEw_g~&JT|uOZr;pT zp?uZ9kCMF-Gq*@jRB6*Y1m?tow#G>Z1%ndpTPNC$jU_2LHOv$ph6>@8r$y{MlZ%``uv2Y-n8kb5EGcR%E7UD!v!?N`= z6kDJA#d)m?1-x&Fm~EhG>ng?t-0a4F=Yr!Q)dOH&@hq>;NNdJGN}QEVvs$}`NHVl#kPQFfV) zY43+w(Nl#&F0aUf->WoN)95Rc_EN#nL6Eb=y7b$`DT0}_PgGb~RxwsLhT&}hx;U4D zGv3&*3uVaTKhDyjwPbF$-7f{hx{y}I{u0hX}dKwT$p!v?#` z&vT^dYt&(=phRLH6$F5w*y_{it9hG(KP+2QqZt*LLZ6VV@{yg52) zXTurby4-$pGe_Q_bd)R zT#{;@<0W8ZDDM{X?M9Amz)RRe(NKFy?9jZpBa7R#2jfE>tuXE)5x<`ifI4U6an*r# zzz^F1zEFG6OVW>+eZmVI%h6n5a+%>Bo=QMu18^VxdVvW((MEy;jB5{l;xgmeZaZcb z^c62rnH>(hs7ZJuTEse)Ea43qZ+==)9pUtINl?U9E1io>4X;!Ui$ZF=oUcfwj1PvN%1RB}md z%`65?F}DqFt&sF$P;Uo7+xeA~@^N>H(KasLV?=}!c&M4*WC>^V_FHbArFkRWn$+Dl zW3ZavH81vVl(++k<-%OTTa(dR(N@(!wF+=Te1oIGU$LZFBV8qvRp~GCa(w4*U%$w> zsXyi`;!(XgwAL_wwH}`~-^?DR^0D=wTP~%ZYl2uj_}G>3QdfK2Yxx6T{tnyScO@#5 zO9}NFOIpj7uqJ@9bru6_zc{0~;?~I>#Y6izQ2-6Re%#XI&?D^CxDRle=h^g5phx!T zz!n4(4T*Ouw&Ggqc}DqfMT@dr3GhGGSN!l^kzCbGMnjeWF3*lD5^|Kj8+zDw(a#7_ z&9_J~_Hof@wyf$q*0r$h%LDAY#@^ zmsy$KTn!%Z22c5TFub=D<%`qjesg2sJQ^vr#m;@ZnXnv>l{w%Q=6Y!0-5DvFnAY`n!e)`*^dLBH6HzdL}$dq5_L)ZzNn0SMI9?e#~tiV^MWxIGvS*mKKw{X&Q!V+l_9dOMU?Ze9N?>b)*pc#m+gW2^6I-l6cI4i)6TKx6{3N7@!(} z0>lRsIt2}>3ya`disbL9ubu&}Nz8281JfDf*9SC}VkzUTg>qwh9`qY51oVGDg3PlH&>|f|t_O?s6jr#2PVSYZ*`6Mm zx1^r26$9OdC{`jkptpwhah>wwMsE$b-zu5TK;mY*jJNo3q7<)K3^XbV<>Vf6pw&O8 zbOHiCdKxkDFuM` zEr+~fl8jE0VG{;;h--d$Z?xK$u{l4FoJu~{*SiXM?ioa?eLd)wb0*pNBo2Cpg+15F zdhye5kD%5arZfb)cm?b5nGoy+#lRPq=8wT<#^=<3|BnSgr>}zN(~n-NKJ@MBKx-P7Q z*c43>uB3AK0t_?jne(wy*foAh$~a!@lb<@*XC1SeZ&s--sw+oVoL9ifwN^)9f{|K^ zo{TCW#|srt+e3fJ4)hcja0nn5D0ktmAY}w$c!G^KXOJ4UOBXV9{JUpGc~b;J#cXbM zPCb}Qm0?NFRgh;ckU(R-iMZTR?_r>3a&gVpaF(`Q9Z3jcdfOuq1g8fS^{YP&7=FkD zq~bo*g%okUEMqktcZ!r{zyd4QoFcO7kKPc!7Sx(mP{LXi3Zpa?GqF;5P?#B_FRyF` z@#s|oOK^?{WAd!<%dAy{-nM5;dNHLRatu|O=I*XeQ)+aEtHtlMKPbJN%%HPDq9Bj% zBa_^tIz>REy%|6=429twi1lUDWfC+-*^&s`>+U8)^WgZANRZ8_2DFHbMJ7dp&Ark_ zAkl1GQUDi%732qj*rk~lF!E)IR_YkLcE1kTNm3RJ+_jv9z&iGP0Up+1EK@buGT)Da zOLChnM|p9n(Sb{&gSQJ!jpodp&1AbS-FF{{B&=o1Fy?FBrm4kAusS9&IsqL0?GKRK zu(*cwi!CUNF$N%AkcAwf1{w=jIa+q{tgX7-9jy+*$bdmAb_H-$4qUox_Sh>wrb+89@24_Rr-{J>l>K&t*-Y&%-Q~*6obr)P*f{iMKUwmf6>UI|6EYjJJ44tHi zztFgCCSDY+Lxg`rT6hAlmPs3&sV{=pCQ%kEf!D{(_TIUx;nP*$*U}*js+RSwAnJ|s zl7iVmjnqctTe#&nDysIo`mj0FY9*Y~=BP9JYwzhLqZjRJ5R42EJ7Z47OshyF1^*ex zKsgdD+d(*fCLe(ddLq*Q6h`Np`D3qIJ^TU8Q9I4~tcnHHUTyGhOwET5tu3hSTI4ar zeEuwEg$?sgBoOl?Nuj!ahd>azhT3w=3jg&A+7WmF{2|HDCKtR@3*B>H{}~AKk@)Ug zxA$#=@I9t2pnS0?dl65+;XvPE)Oq#&KlHyaUfMEgP=Ech{i%`vN70RcMUa0hl2>U! zc_|Go@iBQ`Z%rK|Cd9!65yRt#Oo=AkG;*^LKuAD`v-kn>))QwMT_zNb1>nP>oC#@K zD_0^i;LGK+;?vL+Mf)vj;OV}XS2dM9Dqjw)zpZI}Dp?eNGd*9KKw$Oe2JcK~aXB9Q zewiLmrnjNxd>xLAgq6v84ag9@^~&hx!L_}N$}~CkOMLH##%?JIe4Cshv4NZt6ARe1 zOM<5qWu`!YNo8cBLT%AN?>RxFW;(_1BHFZwBbP`)JBAahU{24BX%*SUpCc1(CXJOa ziDXE*waT94#A`)4L_#xUj2Jt_4~ej%8MdNBaT10`+JCU;a2(m? zOW29HWfRWGEC>fEzHBlF{`E>_-;qJ1-y5sc($o4TDCgtumh1RJ5HApy-ZP*?TWC$2 zZf8<6ChhPBQ2feLoHU?nK0#&1<<6>TwcX)33VfhhE;A`oq@2qKgk1asEq^+q)N-hx|Nokp~s19Rd zJhfjRY@E7YC^i^XZ3P3C0fh5Q{Kt5afFiyW9ojx?9Uga@ zre+{t+V%K2VKP*|4oKBt)}oaORf*e^CLC)qaWCK*ceB6T`f* z9!_MPbGRx{!@kujnYiI0=vwrY7H2=(we=8wPxjSiNJY`s=t4X24CUJ?75mWM84Mdm zOZvf^yO)89Hlf`U$QE@0`oWj^mjkIbp(M&XY=5CB+Hk)1ATHr>!kPl#us!G7(3St{ zXmtv%7hD;Rl7t0!&Y-eVg0H*3`F@+;=oKw%`3co~TO!RhXgTq-fTNjVYW8TzzPY?awL~@U6c(9^Ak13Y*B}KCPm5u59yZFbGiYD zHJdrumTd%;S*b+F*+xlg!Vgs;wc9YF!Yo%&%R0it16@EZs{wITceHNaTeg;|w23C` zU`G7_4g||lBbjG*-#9*zjB7|zk@<#SJxJM6npVSdzVIO}JR6Tb9xy{@uAht1+s-e! z(#8T1Q4nOMFaGutIgOB5CA~no(SGgU#8O3V`c6jV1C~^zHe$yn~~Q9EL70n#J8-q z5W~I7S??GmT4xh+l;W5tzQMxTRE?vF@t3b4zjzBL=0}x_qn@&-8&2mYKC46B7)3SP znYld>8e7KVi~=8Vo%*Ix1kJuw$qQo^sxE@=P}Sk$VsE5FgG2@R-<@F*F8|--=H{V~ zHVkKxz~zaN^nE9Lfi}M@A6XJr7BCa5j|^z4IEILG)XkD-`*e_Frcu#4jxA?&{vVtxzv#P^X?%LYIHSTBed{d8zT{LGFR#PCn zn{O{Xz5uSbc^H>gCB#f(sg4~)@9-MrMaR1O3Z=QGEKFBU`T*c9v(Hg!X0oG!CXH+^ z4*oURd7lkZ%2_Q_G0lT<-);-Zbt8P4&$H>_Olax}sguGGzfW;QL28Kn;I2DoCvRHd znN6g57&@Oe%Lb0}Yao-5msi~u@8HDW6~(yLqK9g!^Bh_xD09Dmv77BwK9`LtmsieK zPF7PcS57{mDYkc`fZfZcN@jH15ggyGsyKJ)80J-WF4Ydb#N<+3T3LV8=omIpdi3bn z)?4|hu6J)&+tylMuqp2tt!OIoWCP>zkoN?XnwNoCY`F#vKI4nO{qbl^CQpqMl{zyK zFDVvonO#|oJX|?bF{9_#N6t$%`i+^suJoDUp`#!D#3om`TC9->AsGxXA1 zkPhP=?ADjD`neTY_*K%b_BCb;u6z2E#qb%f@7egYJ0NGL@WeT<+a6PQ#N4X`dB@ZI z-Mk`sRjL{&@Fgc~0!=m9?VfAz*9$4O8uK2%S2tlWbG&58ja-2^nPL=o=Ly(FxGM7CQ6!Xd=WF%@{0k|s64O~e!Apw2Eys&WfGx_4ju-5Ght%zsjOYF( zsG}TrWU~G1{yLk{2P_t+&rs8D2ddXf;5F#YmK*H-yWf6C>eJ9cCUe?#_D?ehPU4+C z)7=g@uO6Uop4|>SFSsnA9Wa!gYlE6UUir3z9_<2mGgk80K|_bu%$2bZ#^n@Z<4!@e{+MtcQRQMKd zP95NA9?{89JZ_x$(s2VvF7p|zDq~iL4pL@ZR5)XT(Eb7Dckfy%jC!psFADe(Td->Lsal?sZ5)j z(Hgil?>Rs-vQD1ogRGgkg%q2RC^HO8sO~$`PE?o95tH{_;d>lDZ2D?2d(S{nP}X{(7csx$ zw+-^v;c1GX&4l}gJegl|&{oOF>d5b1F*(RwvO~#MwZO3u}lLbUZ>-r&b-6Izp)z&>_h*;_0-F(_aI>);#pUNWwA}w@JB73x-{bPJbov@I2C3 z1B)(9%OA;m)NB*zrnZf%8I!qlZcAT?OA}vXXUA@Z_X0X1_<-e45a$VZ*~pA%{eh7Z zh-d6t_k~jlbcz?&Nw5mN;jceI81Ea@g(K3_xnxcTKX@-`1_9l{%Vn`UeTnep;Tcqs zg)yMkSH`Z!Szgr1wlPpTZ!Bxwm2Dj-#O6m=wH^MQYxXQtA>iULUJq|lx+)n6f+Fgo zkzLj4CgN@EOpr|1X^@GM6|!^NqygZczd5a1hjgCTMz*6%#u80iIlM^qh@Q2$%! zvbZ_vId(8{xGC2d=p;6SYVUA8*3#Cnu}uRsGKD^L1>TOZsHPbwl{vLH>>2qBvr%GGfRPFSTAy zzlgxUw@l`Xjdm{YVI^Kh5tyF?yr}5+=B`ziJAWV~D1!sN1Xs2LcwXEp$5%*ZRc7#R z!Lk`}UT8jXgUR4czp4A{8Flvy6^M-+@|l>&cz~v5&mn|8{oM@oU#IE)IF!#vy{IoR7b&{*mpmHApdgVZ%m}4n?!zVwA>Q^X6HG#77*WbI4+# zQ-0hd@i<-8(s}ZfkT@0sKC(UhJTdkB^X)c#GT)Yomm#p0Q#?>>0d4D@)TEim6O^Ny zAl2$1jxFMLpPD8!_|?32Q(!Ciea?)nvH&aPyPVMx*bC;Ihifr2Lv}b4Gk#RpGi|$X zmHQbGF`CxZGv1QbOa`sfwXM_W5meQSF%EXx;MFL*8Zgz7y-lE6mVM3$t;^Z{k7m#- zx}t5oW{#grrH7m}A%B@8|2F2gE(ccNX{iQS0=2RRT0*sg_B~?SSp%#r6SVQ-9liNY zJ+82>;H?5^I-^!AQeODsTu z*6W6ttO2{v?Dc|5^9?WI?3QN2(Jg+B$t(x9Mv2ihuNm4*6{tZ*geKuDXKY`of#B64P84xlKrN@p%-d@S<~p-bP8k3bP~fG|C3%E z59G`c|C3yt4|JYSWZDh82v2C*?K~;#Ryr$d&h{kgYbK59DT~3h^H+5bzzSMl6P}hX z=!$CZqw?UBW!R-E{Dv>P<@9Nbqv-d~ke<_NOm8S-v77px5;#C$GbF# z(0zbAZrXb8z49<#HS9>tfzbaTnOBrBgL z2nfY44-rf}_b%^5E3LXtugDTD216X=9JY`pKA$B~3Toc&5>s+XP~H>$ch3MS8A%tg1m&5r zct-tmg!MJ$L#>a)@u_x^>Gaq><!fwlWxg04AM+oZfE8A9_n zBMVydf^Ng(QE|N;q`4bZv!#F8y7qBOpcyx6-GkoZufWE#W$rxcv04XQvrF%??CLtp z=rWMJCY-P}kKV>xmvzOwPQ##p%$re}Hyde!KEpPoiwYOloooJZhlO%e2F2zq^j ze|h2pJoR&csrh#P+AyRU%xQ(X~x<7SjMC4oi_W+v+9A@%F{-&sHx zFmHj;<0@KNbdFuE{O9##E0IC~bf;}yN*?~lM~HJNHddGW&yFM%Jl1;WkiDr7oQw}c zhx4fh>$HVNpOTU*H3ih478zwLiq+eKAe_}>Z)nI;xt#4K^LW-frSrK-*JrI)AL_xz zsE2F>7!lXHR^8f9D;_&;-E;vXZoELfu3mJ>Qv;JpQ#0e+V@eJ6u0uz!GB=$#+}FS} zRl92j{?{5syc(7*BAG#bu;e&@)*eSN71KbQgcWuCW6?S3!n z-9vBWa&@|m(CiF*VLLLtc7XbZAHm^%R4u>l`zQXDv7R-B?LrfHA(EVZHw*frkDiNF zfIZauj6XGv5!Qkv%;o5ubKUI`Mc;i4$B2JXOahpstDNRzonhEvP;{JJ#9@l|8gcrf z#CoMqKeD%Y^dwKZwwL`)yDkCqx=GLDekt3&d9e7`w4J+}nxz9*m3R7J-zyd>;yJNA zNZphCH^i5?)B-MMdCZ_lI!V%1Estdce$q8D zP`f0o2xf(=!k>{<(eO3x_*es25L1W0yE8_%b5?^hj$ygFgg!Z9N#7X?4`}dWJ$*4= z@r(~X7vnqf-Cu|@3%Vu2Z&Z!qzRBkgD`w$epxXK0{#UaI8*v>EEoL2Gte3Mp`CD%t zi>2R*KKVUjGw0U}P;X!lf4&I1%5(Et9%9d~-+F=$Qr+>qnRm(=$w<(;lN!6s)2XP)0G=ZHl9*q8AERFlaPlsT*X+)39P04xt)$ zzC90k5)kQf+aQOXL{sd87>2Av$&6Y?mZ@BVppA5Np(PAPKCpRUbr6VrWPJU; zTte7aeSrOh=OWVPmhufPk`H+S`2KWJ9;Kv6dMI>atTYqG^Pb@0GzD{Hi9E$rua++V#4U0j z$6^fH(xVfBNlBVbDM(}X_$gN-JRMoGQx+}g{yQb(_cz}^u}fE++Kll()?whF{~w9x ze}OOmE%6-vUrvwm@I0E5EnC&d@_zyVBMda-m2Z&Xfh~~4{ehe0btjvx)=4(B7i^YH zcRm5S-$z5u0ELl!{rJY&9XpoWt)k(wJzcIio;TCEK5y^;y8gm+fPAAz8IagiAm3E6 z19QdLGIYwFV=lxHZHU69&oE@3IVC6r!H9%JOiQRECZZBhr>N}SR8yO%u8};Qusy4B zuG-5;Y0lrslyw#rG+J(yag`NRrPPjt*KuHlfe7z3$FhvJm@DI%i%jV=C@s3Vu#rE>d+V!j%m;jSuPK80mnc>EOvM{2fpWC2W&2_4NxSE##eA#lBp{{%Ooi z1Ev}SjGUgW;n#LI!l4ttEsC%6HDIBsm@H!%$cH}A~KtXA18zg`G(@hJ)GLBE_9FUPx+!EXM=cCfW>-?@K$Gnw zDQw2^JKMX{=gg6z`@4Xi@WT<;D_~he%MlJm%TebWA9{>J&ze+fP)16DnmgO)^P7fG zASt7yN=J;>33C^U9Gr1GW&8T1RE2^peh384a#Rh~*DtfO$bSf76PCd$zt#p&5Al(+ zfzcegdq?>4U&*s@J8?+R6f25QBUy{;+4GJ|3*3ep$&J>NT+8cKed||e7G_fr8Q2?W z{2ppF!p+y>OI|WKOK88q$X*;_WSosh&(6{WbyV!dnVUx_l$cQT;KU-TyOK6wPy8Vs zpRgv?Ny^8}T|oFRzeCQPGGXv`@nA(qPdIpnAgwK?;r_JYQF!45RjGrlP;MmH?Kej; zoz35;4xpUY?~1rzEi*s@q->w9D9CnYYgh{@Rjxd6%(i-C$lHggblsCdL9>$|LWSK4 z7eK*6KLFfTs7vl5yG@E{xsBnU=r>la1Dh#F7md3*BS<`o+Ag+`^dq9A-Q!`sZg}M% z0+?;srRfUika}gU36sadWA<3Zi8hsXool@ic0A_j!!eQlfRi5U<%tV-sA-*aDQ>=l zgT4{Feh3xhZa)LMh&4CoRN^{$J2FVUb(TXs(qJqf83FP5xc5Ai_b42xw#Fmq-rD)T z8A(olXl?QH#l&xYAFa+`6U79Ho^IBJ=ZjYi85#3119pd8o~O&h4BZu@$^*aB%7D6( zK{5jpxxsMNgf-@1w?VEQKk{e+8L{4t`#q%8^-gbfKzi{QeScULv-93$VBx%c)bo;6i-C z9SKt7r+ww5^-@IG&94e_RxEFaw4`QPxNs(y{FVEgWO+X*MY|^wTqaso7O!O;Bt#BU zjk@mS5iamL)*S3r}p?I+EL5ku~b@AGO;WD9p zkMdmYcgNx)z3wRE8zug9FU52}$#fstbfJzGe_|`S2n&*SqB=mzifY_SXxA#)5e%Bn zN|Ac9i>-5utBhfg@loxCn~#D?cI#nLUD?nGUhoS#>@7s+KBV~zvi1I-V)jeYj=&3_ zd(Yx;Z|Nt;zsg_!9>@xH5y*h+@50xn3PNnc;g!>pbAEjwWwO2!d5ktH9 z7~5ThodON7P~&~iO5}#3Bhcl@OjMri5?nY6tiF4N8G>-fm;XUVh1w-LPyOMhEdG4{ zSBYz9C;cBc3_6*AUH?T=F`nds4d90d*<}l(F8DF46foNaTGceCmOc%g0wsa6e7Utl z#qAZsNY$f$U`g!sy3eV32l5-#(j$dO=ofUw$kahnk!YuT9iF$-9yQdlShCJG>mii= z639R(NW8=k9Vd;neu=JV#Hx|x6f1#kQt(CF<|I_eHnsM9^{$c9h z(GC5%Xf&5Fi=-g%=adcKxT}y6#FsGuXNOso2stLjLZC9#6iJxqjphQYKC|2HKkWA} zfky{LZ*|zs-L>5vzu8(6Evsf!gnhc|_I`KYdET!6dO0c81yGu!m+Q5{{+-ey(mLnhz0z(OJT2B?aNrc6Jun-CLt3~e?M``IzrER{>3?%W6iYT9 z%L)D6CJfdJAWwfo;<;W}fUXsP)Ezo*EBFA@%>E>>Yz^4cDaMc*nMF+qP}nwr$(l zv2ELSvST~hv6DCF%$e_bm+#j zrt36<4%eqWn`v-w1ewFi5c!C-vi!axZ-e9S$IT&`=&YZVYSI;k zngboAn>|#z8~t2NT3*u3vx&hU^=}Mq*Bg^Tvj>lN^i&zWcLH<(!67>0JgQg%i@lB9cPA%M2LKPFE|EdfBv z{SMJ1Ua>ewpNpbt!e};eOz3tbv8iAxX~r!1afKl&vC|v;8OSALJr%NQlmQe%3;$%> z5N{MjNOy%JPK9^aQrws~7J}1453ZC8xugrDq>I4#1WXYI>V;40iL0~}?LuOdV)l?z zWOJ3esmU9gamF5jW6%((>~9pJOauk)x)YLH!ih-t7+ygS1>>|=NKaF|j0ZMg4p$=% z)I#i1!imZXQBZ+)H|WCy^dfixN`xXz9ZEqkIKNc){1S&VhRz2M!!+H#Xih&Zl@{ht zt_PlI2xzM+JVSCyN$SGCj90g}n+I=`>g`er?NU?Z)NFiQlv4$X6t7^>H77 zvi6MWkE;yJMhWMYcb^d1ayQVU5Ckq)h#62o+69LXyrF~miawU|?>?!w{%Xeo&gGdv$u&JMELk)UKx~t!y|BeuK!yM`1KYMy+P(R(o z{|kihaQ@F?pp;3c4Q1q!-itJB5fAu3VB$g)#LV@J9ZgN#iVGtWNDG`W@yzh7$}P)7 z{i%V}ZvGf+x0;O3gFs+w$fgrk{!PHpz)-BzYYoOPzx3A{0D7n>8VVy9{>;Pg+MuZ8p+i)q&JR+$d?e z^%oLlef8Bwz=lN8A?|8GGd%w>p)0hz7&jC;NBv>W8K-sHXT&^{IukP;7`aS zpk+WFEmV#%RrQCUnw0ZvP>vnYUq5Or@=8q__l6BH+Y;iC))XSmw!k<0lgI40oKPb@ zY*)!$Iz%))6Xx61>(I9HdjXll$Wb}19fRZME0Sq&fcL$~K&woRTHH zp<>^kl$-3XDP&4EnO{W|;0)KFXwLjX`*&FT>i`%8_%pdL|1-JI^#2ZP|51DPuk7;F z>7RQK`bb_3-{G31p{C@9yg24>hwLU>Eb@@#IZ|8vVF~||da*O#>Z2{p;ppoR=r0s_8IU2kDo)Lq2H;pq=?__}MNjBg|VWiC8;$S}x!sS%)V zYbb-yYp24&q|7Mo)4oW3QLR$FxjWX9sIrHMiMHR#hTeK1s`XpGL9;oqrC8kd}+}N6B;SKN;O!qWq1k& zT_DpdKh%~*2$jBQF%%I>^m+E?ZIouOJ2MZSuryEsFo-MQ4dwF$CRG1P+y5(w>VwQfq& zEx4hC4Ko#$UK4&yIcLaql-zovWz#v#?J_EUN$=V`#x?HKk%^(QOF~}9YIUn2JPju6 z>2t|l%Id6A6;5v?r|z<2+psC~>;XLsDXCJPy`;vrv|6^ZfDT=DdP|x0S5bT97P@LZ zQl~O^BnHaKEg~GhyW4{GLy1Fcw6e6m@-Q-O8M{9e(EGRAQN^6Rs=R_iNR7Ub2#m{h zapzQ562`N0^tV_`pE&yrXyx*fb#G`neYwqN=M11#5R1Ob)j3iBRZrbOQ3HyJN+w#{PxkZpYsWE*IASlZoOoiV+EMMIyq^y0^dvR-sJ>i$*VusR zUvNX3HSTF`_T+qe1!G6->^Pv z2_F+DWI64P0p1n9yksBVGoG)~p^j&i1qwlq_zgvP8Vj=rAa}Txr#9--a$nFP7F~hL z>1+I8(*O#O5qF1joI@02Df*=n$R8RxNYW)8jDWB9Dby@IV)`ZWpr* z7`6LhUqgENe>Y(|`#1b8OwX%>=7XXC<#UXmVY@8%49RF&yHof1#3~^BEfudYm4|-# zxB>Etk9(K?tGh#dqQjj_8>JV_S^SL?d#@UC?{nsa;AV%YJFWqou#3(I;qHrQA&W08 z*RB6vR{VxeXvR-eH+S@}`eBFzXht~HLG2in5o(-QGz+6~;3%nIz#HJx-?GY?Jxu%A zwV%xF{2@M3ZdA!ibjUHL<4LB_gYA00y~+C`H6aZ+4{u{)uDA0GJLiblQ$sdILw5dY z&n09&rOw?3sC>>P4Odsk(-yOqMO{TIyeF26#6=P|rm_R~Z=<4L$bM5e)Y+mSne|>TKBVuZZ zw`B)Jlf70YiXcWIroOaM@0C;gcx3i+58_dMG!q)6^j4YF$C@>+^_2uuA?6yLHnT{n zWnE;NT$I$S>gwyKVcgx97;shWRaH*6q!#sAAJmS+VI+Ea2Sg)>E`e^% zFxah}O(sOznoC`&sx+!DTPCT#QJKaFmLZ344;v0xoU#rI4>z?)o!4kunHOiSTPkcS zDzUUkRksY%NJVXzG0QAx5cCEP1mVyqyDsr8Gd&he|9$+*N)sBPiY><4V8e(q3B4>< zv;0#dv|dNTJsZEh(nU?bsfrHcPOawFgqfDy;uD2M2oYpYyhB&MA$6XZ)kB4>);c+Y zI!o@r*rCwalxoV(Tx<2kU9)llo!DNfQK4{>zo9a!X!Sr*jTJ@-u1?xpVqxv3T2`@6 zlRGqnxJ<9cwvoIwgURB5m~PvG0cN}Q*8oEC&!kPWh1)uf4T-I)o4CACGnTHLaaluW zMR9eePPVx1f-`2O2%*YgP6DwZdx=`Q{T~K+1f|!q5&7nGw_%QBH;9 zttR(hhKGCw7_y-zlqJiGIK6fh6vE9c3PWSpYF$af!{-iJhRf7gGuhW`+nmdVb1HG? z%)+}YVkbWM5qF9RP>~m#Sh3=w*VFY~!=Mxh#Y6C0%7})iB6vJCJgU}D6K@3Yj^YAd`k*{mMg<6=ZnsGV zjvU+}Sjm6Dmz}jJ;0}j&fg{_x)__9H!*L>UIF8p(1!cNn9DPEF>(eE^#D>U%)4%6s zm0R-yaZT?L(T9r<@1sR@ji{T{seeX%V4g-|&duKehZKBfMsUwP#Eajg_KjL&De8H6 zrFh;D#m{TVn^oY;YZNr5OqQx8q+I@uDW7_mQvAUkTR^T36-a_M>KiC*u_?wWZA}=a z>QDYI?0Y(@z0d9vD8^0phh*B#&3~#if9nd=HSNibZGM^$>&cI0q4%)$!Xsf%+aU?S zk%dsCcK*c^AnBgLtka-{klt?bMV8ofp>~wFJU2@usxd%_&Zbr^7HgONddcn?H z1i(uh-|mC_cyuW=438Q(n*5czBm9X?n#2EQr4AJ8gmGEX1IM74& zK_v2d7;CTQg+x9qSuf0@Lj|_m2L?Bd2?N;t&# zA}anFFCm|9H{l0B@!EfoboQS}3OSO=ekf$bC*+G3;}HDbaY@zNmEa z{VCYZ_44a}-HHQe*7vNaR`5d5cRub0t4V>2I@<7R?%ib}G?An-Yw}Wu_ptR+OUJa2U)KWMkRo>JF}I zd=A#00(=%Dwb$ZW?ba!%tK-ZwYAh?5>r1K)lu&x~@b94M%F?9Rm&RzbA=Dvh!9|#Db4;DQwYHp?0UEnTYT2uC`*)Y1*Z>%dY6Z zHXxhYS1FH6CN-Osxl8f2m_9Md*Z5d*@6@$7=&1x1TS#bZqma>si6nZpw<_387n`(e zDoeDy`=v&rJE)>Nw-2ZI)A*{q3-nQQU&nm4HR z&Em|moorB-sxo5bab~F2O8TN-B{$5QI*J|%6`uZpiBw}%yL_KIarem#GNfJ6$|h&G zY`Gw)Fj3oyXc)J(_yNsRy3Lr3+j5~e_0W2j)-EE61y{%VLZ7xly}NKn6LIE_LP0)V zi%YKI=+BB}36GYo(OveSs8FA&kBFRK^_g~Eem?PbNu>q`DX`qPEHZ1ahgHFr(;zfU z(WTi+ov9M2+?3GjqRJMhXYRufX(jl_;>JD~p#8v~8&5#@M}4+7oPF&M*00wacC!$t z4twAUwcN8UY?hfm5XJN%9__OpgnXfF&|Q9j^wQ$GWsu+W4>X84l5~mKcqB(4j_hX% zVBQ!0#Hxa+`wU^grWE>5?o$yo#71?c5j;W$W z`BYE7f^ZHw`yT*)aE8QlK8YX-WS?F|YEV1)4!{|7Bzy-xS`f=hX^+?`kJ+%ori9H8 za)%_j{l)PO(aNa_F4)6DfL5&fXCV=JzZ;^p#zZ5q#tx3)71D$qzG1zF7}ja!KroJ> zDy8XMC`1b;+i@fr>5{N-Ld!?=bx%G-sY~#!ScIen4MX>rx~5-q2hL5>h`opCHKh&3C<%S0Yy%oPF;b!=K>@ZlWK2K}L&O7jAprJci!W)Nc;Fl?@Gh zA4P`VTh(uny2>2TT%p?2q29eNLwum)enl_uCc?;lKwtSlLlSh^Vp`w{$mj@Bdho1M zlz&fr^oPC46?{SF%++z{8|cD+AM><#BE4}v1((=U+Phlh>~j+a(?}=M)6fs%3CU;= z;@Zj7OGL_u6n_cr%djr@>P837CMb#lm0R>Q$T`sM@mwuhYbvZSdguFqjsm@EAXs6& zil?M#lLu8z?N*sRKKwU-gfD)?H2w$2F#mVj;6IXZ{*yw>{6iZI)q9m{xnw_6BX1&x z3I2yRn2e~YD7jG-S|kfhJT2V`IIN2FOAE3Ado39zE0t!wkG~bP#2Y5w)!#tBKNQsJ z3jkWn7a-(W^1Qi#9GR48>j%hk@3((KJCpKmeD8Vu5os;u9aw>3kPKPNe~cc=2}5t$ z;d{(p>4?>$NDG(~1qFt}{lLK7RD;#WkwAmi^HdK9OT_@j>fcraj9Rg_oKT*HHpCdj z-?tBQ7m$foh5`cT##>cfrN~2JVyMW(q*a(|om4K1ZF9D?m``0jYr7LOkt!s*X7FE6 zXh<`T-Nn1|!wqSYZxy;atdc5~>&8=xLTqW0(=9~QQcTRzE#RBxHr z8lL?l!*4UyKe`~tXiX9_>r)zv`N?(}W+g1rydpy-ez&nZgnXTsJMk_C2VK=t|{Ba!uB=Aj65$gB3kZ z4vMNw=R)0szk-H9i)nL4{|qKnwj*_dg5*XM1>YpaL37KtxlLpKWUzV^RdQohYif6e znR=(n7VB}fO*T2J1;=ElOhm`o40$;8=$#|pj9n?A(~m8JdDLN^mCMhCjXJ_{Ig*R* zn$HzBNPhGeNLM+2r;Eg(DQ;%(c+5b)3hi4AuEL!njAKg4HjH)8cH8PQ=o_KrHy?GW z^}5Vf0?b%d;vdE?K@r#6hZ31BsiJe-xpk@m3r@mPbpJL&!?FCRo3MB>Ht~IgID=n! zrb+j@H4N?E&v&ax*eJ2%12*J(Z6$Djs~tch#r2WBI3_(r-Q(5U{C#+TN3(yQ5&(pJ z)goNT-(9B}6>&#Ek7z5_O09S&re8UlKpy+%aft94EFUpOVTFt7=aD=yhvY!$cM`Wm zt%dnmFnE)4o%> zZVln*bz;m5V$3W3@GcQ-f1tc$wE8Q_uOUe(HO>vY&ydG*X2-5Z{soX?vB}RVtu26B z3l`2HfjnwAMuMAsRof8Hr%8Ss#Rk}}G@qNqn;hiryx{EKs4o84 z-P^LcRX!MxZ)A+OGA}!uTi^G_e~N*l?l>YiYcR%yu$Q$7zg(f^UZW?C!$F=={DPlo zpCAdie}L@bMnGm$n9!GMTcX@;`eP*P%`NpIjz8kfIO5HIlh2dPI3o7ljFb*2y!51R zxwR$veAfR@m-0LFh|dJ(a-`o|Xz);mg5eD0O5fYNyb)Xd;Jd(f+@M0QsRhC%Y(suDRYo7~f+Jk1P9@WS z-_3p#1qpEZ8IfD~fw=#LMkr@!X=3!Rn_7yZl-!a$^4GO<3C;*4J9OELFC#sFPI_5{ zq#->q{wdJ#Y6TNBQ;xHy4Hxx;UEAI-bXIC+1!-;cE%W_v2dfX;4Q=}&VKknT?Ifq( z(X-dD`vWon)N>MK1_l5a72u>hMiQawaElBx=qb!PXl+FF*zCFHZWglW%|5?6cP)Nu z2<&XQ5Av2z_vt53*?_VX$&+QcfPqkI@Z>bEr%)S@mYs%c7EW2F9@^hK_C9R6NOKiQ zRzR<>`Z?7?lQlP+S1wqx?mM>b;|ISbWV5Ea%!a);U5Nm#IKZ`1Kc{S4a4IpJJCPF? zoW1HVn^YI7)Ws_OEE67vQ+k+)^#7yn#h=Ohiu4-nt#vlO}5}P zD|tP1j0s{_jpSdnzKt(Xj!RYw&{=ar*)j&~NKZ|;BAG;|qmK{-WPE1^L?E$S>_g8u zM*7a)OJ@&yd~Ns=0U>>ZOQVe&vDK+2fjayQ9dIzy%EJPaGsGSMNZV_*;c-CU6?*2v zteA(^4{Vs2_G_oV0o<}$;Fu%>^g-XH52MSO{s|srAD{+|H3fjWOztLupjYvV+oYYq z2L)6McT6d$ArUvSa0?}tQ%pr>_?hbaS;6ZTx{e84OxmyZ0mV@ZJZ2Q|%u8QdK-}3} zClXc@bS4SrqaO4e$F<1UeFw5ZYW`zpp4>#}BGWrkHl?Q^Tf;SGH!x;LP-|ng5!oXB z+$R+Ki4giXeLI)*p%j99$UU-1QCtV2yfG7UZ^2m5))WaNL3u~tTnn2$j*Hy-dD_fp z)?0MRyUodxmqM8&gfi77#N=W2&rXnvf;w7aO;qoHOBi_hEHDiHIl*>6FX{hoARH_#Jc^2F{^{WD{=>nmSK0WdgSXaKx7SRIg-Q>d zH6ZOF^an6B|DOilF`mD{B+yGu(O4wq;x5L8u3pZ4=Z?qbMc((<(=PxI?oz@24BE2v zltvB|3+{4#-B>e}Y^B!{d^{&eRORf^g1}N_ZkoDAi#3++9_zK~OcUMoJOp?%P|u%S z&9l>z#;R2<(KkF_-S-AZC43(Z+PO0Fcn$?7tC?heM`LFVd={IO*OFFwrkMNckqQI4 zvr3nm2b3zr*12{BzxODLQcWvJX=Lio#MRYD#pSWID$$_#7^rYSmiqk7Br z8RAdTNXN!*q7atPhU*N^PML|v9<4N@kstpqBSkCv(**EwYLdig%YZc#G8bV?6`BqT z$V*gI2sf(IN>oB}f)zN5hU*nZI*CyWX_kdrn*?c5b7=QksR7%QxjO(7W~92IooHa9>bnPc0Z*ZUdQIGS-nO#6 zz#wC8@jk2VpO~GC7om+J2<-6ljONSGYmk`nQwbYP-)6&&&Nh;&X=BRkTb(ZAoMWTA z$e?&MaUe|3mo6x-IjBVUN#eRFJ<{ZR-x`Kq@2C4!h1ftNPB)x=sMQBpUX|EBbVc;h zoNS9+gnVFZ68&Dd^y1ncrvnaYO|y+p5{^H?(PvMiL8hb+=|3+>R2O*5OVfS}0^l#X2!Bo9&2wg5szf zb95MJJsqC}&JJAfxlMR-1&a{-$}tJr&31z1rBiU(t$vEqGRZ|?ZU=BhvUJgPE6Zp! z=o81d(;G8&`yGz~^%>5{*ApYHThGgkrwwMT8^wIBR*xot8`gU8;Zt=V#Jpxqo9`eA44a@Z4jaMsnQu z4!hnKa)aU;4fB--8L{Q}MEOz#lc|zi0h5?n6 zs5xg3BB3M+g3vG6Tm%|eEV6(K4_|s_#YvJ8!Gt8t+TnT?S4icC%R_z6fynI`%XN#b zMyvAz_d?co>wYuEj!}Y?Aad=+bhCZ)e%*c3Jzneg{et9AIE74WMjtJS2!%0Jmp)=k zUEiKKv<#itmO8M(t!w5KG%W+`P8Oua9kr*!N||NCs=`WTO`N5|%ED@e-I5xdI^>Di z3i?)JHX}-jH5_SU>1iXVZ#6zgqqTfR(!8Arv_WHG zY3U=8nQD3(bz}kPK=7qPqKAQk)C*OlYOJ%OoTVK%jcHn4#=3l-Nv#?q8WgYX?9ob@ z#X5|3LL5N1denp_5`A0or-9rXAK%Pint9udPg5>?!Ff6tIs8a04a8Gw1k&Sq+Oi|t ziY2wUy)QO9R)Hj+a=h5=#-z5pL<2~yLo$o$(y>q@4W@j<(d1Y!e~2r7M;i|n-b$S% zAm6)4+m&1x#MNaR!omb`F@VbfFvccnwBSBLfLAhhI0 zz^tfjqhp7`NmFcIU=TaC{loe!nb-~d&nXr=}*=w8-4LEv?OGSgRB6C2P@i|HZnQyfdDG|nnG8Z zR<-FO{kTC7g-i+#P;SV#9v)(%U+Be*g^!>OYjF>uJ^A_1-+Y4RQh3bA*F#73>f2Fn zJ@j2vUu@{MpZ9GOI><9b7xP)4ZaS}URtYX<&>ffK+XL^j?0zOYQ_d)LrEK01UZmtYJR zQw-9m7e56>uh8w1Vvfz6I^ix0_Te|ywZMJVsqq*wod>ZRPh$Rb2b2+9{3*ThI8vF% z{%ReRroYLU8HVHeK?C-!`U*wr<55ScB0F-wsn=^$8JZh*OLo*j<55?(`$!iL?2SU4 z+I<7ov&Szy0*@<#=|vmkkw0q-p?ApzzT$HvgdgPb*KKtA*mMW!N!L{D*Yl`3X7Y+V zMD=@vB-v?rzy9DpZ^)wg@3^wL(~Ymcp;O?pqMtIf{GA(Vftd%yA%@>YdUJcA2=Eo< zI&-poKm$zd224!C9mf`N!d*|G z^MoiuZ-}|t1NwlUOTBBJ_con6JPIbjpfVO<2SoEQ%?#fpztJWEV_vgV?eP+&nfSxA7d>N)=Mktj?fST z@|o}GyMi3NB5m8Nv3CMljPt;=T?mpwKApgTG`bSg#s=3X@vaIEBe5Tk@VLPHcfkES z6w+7$2msLiLx}z-G9>F_Z7twv=JF4~{qJzAIBC1ckId65VPvGp63oi)&T*8|BJaol z8xc7^vdUVL$c4k9^cvp_J7yH+oa{ktt~MSpPS~d^1y0|*K`qU;;!4Fkeg%@oqDc0w(Zn7P-q&jNPN#F7Y;O`AayW>%6C7W#Oxyl6dmB~} zaH`Msc0f=2S0R5tQ8ZjyCtJr>f0CLq?WhA3QCN8++^-2f!005j&>`$^oXAwGovXP9?x9eU!2a*cuhqRjQd7y?=l7d|M+XfjXz?yETa^)Rp?1(Ql_Iu;?p65nGKIY9d{ zO2?2NOk}cN&ryi%7;u*;&{b#3GJlp?1zL?)kfTj=&MimE&_fU>k+U7w>#e2}(#*%% ze{E1vu`h#l@MN4)I-Nw=XLLT2DP7$mvW|q>En58nouq2W{C@Liu2sUZwwP0ThQ~%B zP70d{89l9fqeU>wQK2am3<0l);~A`I-laWWRqsdP1tjZjX%)C538BDfPSpG4XLLyj zRMD7j)CPsLA*^Yax1gihRneJll@YK(LL1L2M+|gJWVG-g`CuL5S;MkN zp`5<63_mCPl}{$elFdErX;h=b_U$b8oIl$wQq^Ib+EX-N9yl(6Tb3&nU>!its#E?U z?6f^D*6Oy8HjvNi4es=i@F54BS@@1!kXTOu-Y9$*8#L#4U6MPb(gQGHxc&nVVE8iq z88To-e7xH@7ys-!PrLzaM$HYOVQUa=j&GiCYh7=%(Fnjaa@W-K zX{1I_L0#e{lA`k2+I`59ghA+S6lo;hFt9}p1yYf!*hp?=2$W~3z!~O>=azWCo+aTa;%${!iMKS%pDQzdZ9xNJS$?sj|>J|mIIg; z`Z4$-KQjR=b+(e!8F|-a=-ojATXM0fTbLwkKJdq6!5&%kY;a?>u@Y&)LtP@Qn@-ZJ z*9A;%)!&ehvHahl=iFxTsMMaU41E$spb5F3ARh;HA~ElX2HqmUJ)+PX%#u6Iq1OB* z(-tu-<}rKBGvJ!eHWHe6V~WtDvC<==VUoTSo_0%Y1oar6(0HX&0Xjgh3Hp8oyU&@H z^wj-8MO;y6Am})a^k;J*2o&^Ka*<%IjG#Dm<>4 zm4|JSEgM&w5bKSXL$>v4w2yzy8P7^(adERo;KLZ>-A~-%mp8vAxNPjaQHIO<* z;K!w%edYW8yhG#MVr5xr{AV_DMH zGv;ZTEV0E0gDmMk#0!W;bl@_DS=bk#JSXY97SNtVR9) zAmE^j$&yf!_>@qU;gQtmZyP)3HG~thqYa%6-%iA^%FPi!aN&s;n2-Y4%pKMf>u zxghdEdSLQVbYS2<6#jGvqDXoW`glF(qcVW#Yqh+#u)C<6misLLK#{Ee8=vgIpSV8S zloU3PMz?$)s2G6H-*KCp?)i3um_GJ@BMr`iX?f$CLNu{PP(gw6eFT^0m6-v zvH=?Xc-s=*H+5`I-O%3JNs_pRX?sRU+RL$xdHn}hR(QEJidivdzNjxO^B^KN(_XHv znMrXG^X58sG?7JTPhBjA$WV*&Pl`58e3mpxL49oXZHc;MUyXSWWf#{ayzM+$B~_L= zczJTqA}lCmV;!?at~%GW2K~{}{3g1bbC?p=nGsQGwEU3iA|hq!Un2r>FOKkMdtckG|}oba!5QDOZ@m-IUnJq zM+^cDA?bd?3A|Y+oZ04-u8~IeT-TA9G^6kJgOppR(81BkIOj5cIv%J(De)Qq!FB97 z7jSA`sH_4)xw*Y|@;?a*=$uSsjYW;7iK!nAAp(@#i)Td-q2g9eT3d_1;;$Dh&umI1 z^0-+#U&%YYIz7fwu-I&?Hpea??@OOhzciNxl#*n98o4%4<}$rKdGm( zl}Z+a2||EoeDsiKD#{bWcu-+tp;Vh2SBNCR%)`czru)KgtCHd=+&PxyNnaP=&Dc8z zO+0G@!BFBAp2L8o_uN{w3UfIVwv2ii*=S;m5G(Bk7px)P$TW#!7E(F{Dpd$IM}o{^ z5%NTcQxR>L?hUe!4v5u_37MfkkMrKv4KXS(o)BfP8!`Rd$eWGlK)Y~ zUBq6NyjDV$-A|4vrQr^;yCp2q+Z5@(x=IKRu{+QR;4n*mz~LSZr`EIG^ROmT-WV09 ztG#Np2jw-{>vZoQc>e3t{Lwd{YTZ~TMw2&^g6c|Oy~lV-e_IgZHzI|qJJPGZ7BMOF zF(-&ci0T`xM*V@#wdB|yqIOGx#HWC#28nDeHGO8zR!aSW%-8rA)7N(21?syZ+8wwT zUi|@(lFiPNkr%C18^z*CW`^@BhtVwEXFQzty8jHpWWia)5T{&r%OZ0|K5H$&n{wlv zVxY{t!gydhw@6Whelt_CLYhqpW!+O{!Fw+^S3Ek-a$RF$a0%*I>ArN|0vL)?wp3|Y z?8NqNp{!vmdgKqG4_YhN@qA3Sv7OWciu@Q`hDxwb0uG;(ro-}4C&fyQrlasL%TiDA z^RX*6VU`}Ujx);ajgkNfMqW>+);GnGijsURuWhdjVi68+t%LK$a&S?RpbB;m&05

*4d)II>eM}wY#>z^VOU7-EcMq?khP<*6)0(;*4!pUw!<;syJ1JGaq3j7v z4u9jK-9~eEd684`H~Qju;_5P>VurZ^Fv<3$vc4P=(cxKRM_a+*_S~y8O{KO1r`e>-Gr#v$V<%$ri@llGY|elwL`4gs|rX zzdc7<-!9BSl=-j@v~iNo5_ z1g;$YTXBbEt}kyQUG(eec6Dlp^6QVbcW2a%;>*$O!6xB>#}aA=Wk?f^E1*jD<0-uD%m{b$V|HvRut&M8GgHfoEj8~8La8ETc z=Yfg~>)swbsmrYQ!f2>oHnUMtaCHq&raXR`Sw#airCx={27IRal7TWrCcifBR^d*9DzNd^m`z zGZjMHhdr`c;KxH!)}T`f*}!n#RmMW{+y|Rd_D9|eU3c~rW`8Te&94>~uD#Zzp*@)b zYM4>fnPW!>#xz1RIULRicTdEy*cLIQD5u}0(-yo!LFc>$FV???geBveEkMNR=1K?p zercw4-Q>6_J;dYI`S`eM3R|&}-p`!#KDKHq+n|x2E@NghH6^35cCsrsqo5$q3rNbX z?m~@OO(t^AM{g*@mL~&0k(o&JuD|vCYr^8yIUq$+|I|5PRblth41R6qEg!^{@Ep?G zpr;H>NnY1=7r*NW4H*;iFA64FGEa7bw)hQx&%pc6Xqr8eY2@b^TB|V_$lU>@cJ*i= z5Nm#A^D&S!5@SgHdDk7>e7m@X*3r`qg}0}nUr#i-)2#-ht$S5HJTg1E z`F1-ccC!nuC%kobJZ&S(EW%s9*C*8FZCUk+g;JE)oJG1Xi4e*;X3AwLv8Zpb&}F}B z2xQEpHI=3}0V+G?J_2&T6H-4Q1a8@oBfmu{s16Np`P2z{%2KgqisiI03Un<^;3O@n zW(6YSi_D5omk}sPy0YTsHoU5>ZU8Kh&CK@-xSDaG(6;igbl3w-tk4`Z)Hv>+B;aZ~tRsKUj*)a_iX)Zd5$jZZ znjviEy+d{1)X{TI=D(z(Sx!0nqd#Yt6zOLcC#&)f;f{%;S@_2KuOD^XO zqpn;|?L?zujO*E1$r5Xf&fsZ9!*ojjAAu%SilGVp9emnGnVTBUSc78DftKF$L-_Mb zYd(mZpyGi0Fop5}d(1`NXb#LWIU~%l=2c%$p9S=8fgY>{BGxJA zsTPl;2d}qyDR43pVK5QJ)_N_D92UnI9Oslso#m&;f7xm{D9ll)PbncLZG?x4|Fm&JQN{fHktqPNhm9PasDc(@AnL zs*dwk?b_cew4-Gmx~vh_j-Z5*CB`2Y3)AcUR3a!|h>L}u68f{{F7@Pu-We9O);&N6=LC+0%ybl=P7)W+@e@}t@h;N*ky(}k z7mji#;LzhOUX=^=Ep=%1K=o(N&ARr_U3(S1Ta#~KAuG!R4RDa1@ z60NIiL}+@@dqEp&XA-Y#Sj)&6&0=e0dVhO-fbJVrM1U=UOdpAk(m->fJ%%V&7nMBi zh&D8lvGGge{}mii!QwzDt%%k^;skTxeVx721AnJAQD&Sqr=?qolwHA-6r9hG;jw1P zYV1sjnVFE#7fMZ~o_zp&N}NV%>bAC!xqF30R9J!PK#fri!rJk7xEY+T81Ij164&2m zdbBTv1IbVc8U;>W86`G|&je(%QO1^z=?n!S>RHKgF~ukI9$$ zc)3xaa8W;@UEf+c#a}D?u#Dmw-^5s@9j_jLC-{UHJ(dCiCQpw*5gffu`!rou)X+*lj$=ZM(DQ@)NjDq;ZED%r)Nvi zeVmUtd)tvRa)!iJ!&+x|%+W*a{$2e0+R45(|49dMLi(RM^M84S|C;Sndso9&!}-=m zWt?Q>9wf3za>mLGoe~@q+GrZ;8VgDZF~qk3SI0>W$T4;Ua}86ol3tuswbHV&sVaio z(N7Vzbjg?5DB{Jux^@2$h&y?aD-(<3)9iISZh-C#ig$Y2Yd);?qe=naAPGL!ad&)`4m zK;chjzaA$+OFt6Fs}WrKw<);R{;c+H4};fRW}s2~xE&yOboKQw3~yIo7}}>i@C&JK zqP@sK>xcV#oZT<^C<+L*Pj``lO5ZNjKG?1q7H_cuH(>KVdxCCnxq)Yr4}XGQA7Wgy z_`%S8lB|QDnv>#}^K$WEfr#|+eo+_kn31NDvJCNb(F%qd%%B*!$DGB26$+`i((65N z8R(0ri%?q}{lCjs>@x7vroAKbnDa2zKE(5-B%Mn=?A6M`Q)QTZ)ub+8w5a#h>9U@! z)glCEl-H|ZO9^c#xb{;!YG@p#u@$!SC7UTY?NY`q7PD`iv$@RTKOq?1G;uDb8){;g;IH09dA!g{zW- z9lV&RT$EF0u|$QdwwcvQ?P*goHR1!_O}Ybc-?1=L46?sOk#%m@6ED<%OtOcV2T{{{ zhkU}yv4(s`7|-jbD+H$T#h<{c(^0jj?tgQ@D+h7w_78WQh)#{YFl@*FMZ(}4Zi?3E z8V|EV^d&Wdr9s?IymjiD2Egcc7apK9{y?OGzSu$_z;#z06F1Tw0osngg*}!iBV#*e zRPLhM>xh1yBRuf&#yza0S3clF2N;oeHDuFPO&$Rl^jj zjrT2Uc?Fc0qQcp-2nM9c;B|p7;aU0McoC;TlH^jVLu%@CKOxU@!V*$P@ekjwGSjq_ zvF(A_6cmgOXVo$`H!>hHDHmn#)ZOmA9%Mi0ewYItG!Qr{(=UtPR@_&VUOWA zuBcKX$yv>230+~?I>MD1UvwQN>er^ysW0L<*3L6_14T$unqrwGY;p#0TO_-;eS_<( zOF$!?p0JQj1B!V+wV~rFKPlkP_~jKv>f!D`0>C4%D!{9Gi|;Pi5;7P3`9M8nX3r1s zmn;p298W;eG#)Q=@^@9EoX@;ynQM_fd>DY2Yr1JN<%ce!IuG$+v1RfcGvu8ahw&*Y zq<5nvc}&+jv^`4(Q1m=IEJR!Za$JHQns%h6y)ya#VeB27Gl8~l?e27JCwFYywr$(C zjXUYsw$rg~+w9o3owuJlb*i4TKkRy|=1*9)=3H})agFjm#{3fxu{ostKO#`Hz3ymA ze1NOWDW;DIm>QB`^@Kj|K=eTO9)miKHn1^vVUeQvTsZbiqk2q3?CLlUJ2Zl>{y%V_ zO1($bg?Zk1=R}02ff^D6{Hcdu-l*BnQ19UBE-2@xTG~wR!8>h0kC?nEwp2Rz{8JpC z<|Ls5bbWC{cTod8QFe|oC#)gMq$FIa!lYJ8Z2`_MzRn~7S`pd{bF@FZ?^!`_o$K10T0#?V2|siwdTsUP?8_&9iAVmiOaFN5Z!+hveWmR<#chH` z|7kz!qSy@4jOTET_=Tre*FP%SZ zkOLBar6q4vu7i=729RLP5`&x|kG-4#>LatHGMyY2l9Yoy8whVx#O)V<2wmq=Y;=nZP`Z7=o*f}0cz$2Q3 z6VD=~L&Y+36cz%%mj|JJd2DLalDnW%2cJr=DEXyNfJa}D#Vd!SCltpUm~DgX{WsAg zfHy?=!m_c>e6}xV2=K(@wd#CgICxt#*;=iNw?uY%!h{mqORO>%*+|64k-A-B8g;ZhGVc8 zP$atp-XM$R+!EGTFufD!57+8N-1DF<^qY1+8JO6Os%U?0WnhIJX4@CWyYnBN9Y9D9 zHYUTy`|H4c))hv&Awd7<#2Hr+i`o587sUTh?MVM${wn_u(NfvP$ksS6GKblikbooNPu4i8lYNvMFNGz68Ry`1-`O)W5F!pV->-z0bnrf?FQnZ za05}2ZPzb;}?&lOeBby+uK$cBC!ydWT~N$ z5r(6FsH_7sogaMv+%Z%pe7h$LFdI4tB}7L3Ap~S?o;l9h$hROf3>15!NXoEJ@n5@v z#J>SP!sbP(#nqasV{XwBZ7P0d?3YheoT8fp1R@2-u*)8Nq|6?nNm)ER+|0BXvC<2g z=@7?>N^UY#R6cezT1!z%MqzM=k*9QJ1fP-C1i8IOV^-6TMvpC9;Qgpmhoutzm zi|Bxlco7wP$@`_Q(Y}<)nIjeO6oWqt+3(VlqJ}qE4K{?tvJ>SAMeSB8P7TaX@$}2* zkpt5AP4R<+K+4p#WK~tVdBRoDDW|n~OY|@jWQ54NWR)_BM<^${A;fuJ@_htOX|cUm znncIY7}AxcXa=}u5@r<)u(eWi`P`I9k@OU3*i54ErK=Kvk6EM(HbU9*T;?Q}lLPL= z40__7V90Zurz$?TXCpTDZ7VjT&A!=hZ0y--Mf_j?WY;Jp^_rZtrtguKXA*L}4s?_l zDx|rElhhTf_F0X#B7T-?bY)IdmF&zq^G^esoT+NehU_FV&cc_Ep~=WqsZxf?B8XR4 zF2rEz>h5dNEKEeG?9)4y*qT|S&&gRE&co3-cb#v6q_G)a3?lfNd*6f{Ouk}r32GNg z`FUfe(g%uKrQ7{>vbx_5=L+|4(89`tjfH;9?TpnfuUQ#8HIq`X53|cO9Yd1!N=k>i z4iv?Nmw^sF9!dO2#VmP6XwZ$K5~4}va#QzVUq*^vAswRR`wsxv1%7qGxX2&{UPC3A zzvLFp(PGF@HklZ`c1X1bD4H12y>c3LFi1jnn^1~2C3BKfe~n01rM3mT$-%*P*=X1+ zC@=L0X&CrTus8_Af?O37c zGeY?--TWGEB1?7|FSk5j2)TNCS5Dr9Xvs=@DoG*F<-|Z@nirNB;T{p|EhODBB}>D` z#f*g+7U$1e>RSYh|Eih!DNl6jK3AIA^)3L@Lfw$-Ey5b0u=Z@!qHRNEw-K*w3%UyD)vP-3o8BaLYqV=efQJzl+(f!=%5}uX~0B*UTW;ax87=$tO z{fyl|N@rN*>ob0@tIHeU!NJ`4AW{)8Dh+F0SNLu@*joc0{j34-`76hlFx}?sq|HDj z-k2RymFk`SfJ;1|pB>wbvBR^Ahj_<0SihRj`k(O3&(RiNvs-qliFaDC5?M`KDeupD z?ydbwYfiD+EpPP2lc-$vKr)3X3BW(6754~ttl?L&9pe+^bn&tWpq%WMjhB~)FAl3^ zS*yKRiqnO;Icqw=>EQy;Lwn3E7p6;-V?;qme(iw>O;mXbzmxdLs{7=&zrc0X*q;XV zkb8a!sDBeT9gts)%wYD?lPu{o0=FGdd-h4bdMSDGW?phRVtX8uxjcdyJBMgIQvW*q z{(H-Za*O1==X}(!UJ1Wl2hL-F_c7EtIqvhYGPqo4)|>;jDu!;9sS!yQ52Bi{@cvIP z*7VL}hZ%;|MS?99Y6A(VCo~xijU&VsYPaEtnA5y;33^`@wL{6P_|| z91z8f+6+#`D<+`f%{8#Wdl1r2wXYF0J`YHCEr@ruUSdC=Qw@YD3*tCD!ubV0Qq(us zoFN>xi3VI9$0$O%B>p$$MXVq;sfMpL7S7Xy!K?IKU1lKovSHj}@`g9N8*~+aV$$$S z`$a;q76^a;2L$#Iz!bRp4+8sw@Z$&De`y6yre-$(3>);q_IA!LPOio-_D=t+BUGtd zE90nQ`N2=h49o%r0wAHrdaKRSA}K74g4%xkB%MZ_j5Co`vB?1E0+cwGkdtk>>eif} z>9L+wt5wd|IPxP}ZJP90E`0@Wt}WfYFZ*rN+RvQYg&LY6&mvn*bAIMLcOG-j+~>5I ze|=5qSN}Ze(-u@A%qIYdkPllqqV7Xqr4Ad_kXBLT zvgW2Ouh#M#QzjlU05Nj8hLvAePAGHdmLQfi+S349Zt`7q4OASy8tlksNl0is#W>Yo z0{7%#jxIse{sZ%*P6v6hH6_FB-V#yT3R+CIvaVW-*{V|)uvKw3V1bXRs19H1R<@`! zT2j7o1@-uir))h=ih2!=ooNvpa4%h$eBW{5pu=tBjU# z=?WaSjOJ^lT~ylLT~m@?x%QzGn(j+@@6kMs!dx^T*v0+o0F0hcZiKUk%G-sqBc8Wv zltCO+1H7h8nrduP_Ms)jeM19yEC!%Kh_f2fGGzbvgK94!HA+2>!MhL@-3}vK>^>Bl z{CEkBJf(-$5VMEckl({tXe+#t!jSVz8x9<`hu#qVO;7{|=}qcQeUQ3JXM}#a2V9TR zE!UR9t@VdkpS|h_e2@AqL?@-g`ZMi6`0!&?;b|jdX|b+kq(xW?HT!sGk+qXoko!n& zWM||rCuUmX%oyW%>6J$Vc$0=TFa(VS2PYpRr?Zot_}%>QvOwbza56Bf)>LB3bNSW| zAyZ2ibvRORrLttvpSF&3qmz(>5zgDHF8{)%BPTVW*|GOk(JbIoJLd9-n>QHmo0KfN zow)4M9zk3I`--V#+3y$7_KleK2_mQvXE5J!SyTTzyr zDnNQU+>8-^vN25Su1=&S=Uv_B`RxeuV!q1|RY{8RJ0ppQmAT0b@{1gkL(2IDwU1FN zWS*tgQq}{(-K1B2z@q&l#ZzY+p}S#NZMIEjTR6Nji8_O)UWh$EP?~pnLE2R~ezef` z@}2ah5M#Je8$RvZ;njTnc(0V)`*ZA1H21=kAx-%TvHy`+_bn>*C40#y&fUH9aXffm9DEJ$#iDFkRz_0V z641CpEMC0*b6U;Ow^Uf!)MQA2 zTnb*{%0EU;+=HVLto1=UEDqm4Y?a~fNDkNWh+jyE-CN5r%}oJO!`U($yV}Fkkzo_$ zIZnAfQ{R+s&98^$@^!^i@~N2obEd#8(Y&c#7p7;cNz%d?0ku(%ULg?1r~phtz_S3_ zbAcX?V6a4 z#Zxmy_>@JTDuHX1v1{N_`*`NI%vS?ln52M@sUroCZTJ6o%lqkO!^!*a$)tey--#6e zw^xc;n%bEBKV8z(1N9K_?dxrlG6hPCLm0P%972+*3nD>65+8;WK@v#@9f6TJMWVTR zF}SHI(RHS(t?g}LUGZ=u@+ShEicsQQx9(}ytMRFtH>dQo=2H2)%6B_`?Be3e2A0C} z)LmF`=ISHtV1IPd z2iV`;YujA=H9!BDc>=w$UH;Dg(LF)djnNy7jJKzbaDOB5BNqGyQ~nwJhC`bm-j}95 z_xJUECOL>lLLJW#Km5%N3&P9|!|;G09{laiFT9+??BAYj(*sCQC?KY|;VMG<)H}8o z8~=1vHIEe_r7omORy5ojr6u%gZwZY`e~X8b57+K;Hfdo3yk z#t9RYJeutb51&UDI=YI;TTmw4Q-UMsR-3taktn?d^x`<{r-WH=RaRJvuFR8Y^W_!q zpS64FOwFR#1=qq-d-+K0s1&#bW64ulHf>ydlA`HiD65*M<~W- z>nw?VnsD#m_5p5FMR~X5Z;nFwZtl*T6r!rZRY{G1t?+i`tC&OFEL;ojpQU z)MJLw&;|f+()@!$E|!#OqU7=`ao~bRzr|fXD(){jqxIWPAcje2SSm>;%|2Qu)&7Ww ztijwOoc6F|C*3YN(^juM>4(hl%qd`hGa@PobsIiXZt1p&EAvIjieR5f!5g&LP^2m(rFwNkail*YkZX90fKkE$ELxdM zb0T6hz(y5`?W&MQ7YhyPiu}PF2_;jyr7y&6CMz$2d}ovNDE)n3vm)(b`x|XQ>aJ9z ziLy4Mch5kD3;H3+ndt}KHOh^bTdFAYKlSYl#UwfaTBX^M71!xJ85M^7G$>#GtbjNU zH?=NN)aqXJt?HxRbco3RYjbT0Y0C>x4V^?G?D~hM2$JQj|(gK;Xqy#KV@GhW2^*m+4vW)xdQRF3FS#h>Q_L7L!vuK&ebSrXFQ|!oXox{ z1WCQVoSUZR=tjW3L-(#C7~4LG5_vwX_N*xPUx5}&0UklQr1-`B8%GtK;Oly+Z=|HI zS(aDnJ^fvc2iD3cwrJwnql%|!<6+PsZ-$PepQB5BZ@S$GrtgSqhU zw?nY9XoCN=7$i`O_n~gub8SswDUt{l(|L?Ppd<2QukNRi)REtZYmNVUn#Xwb+mJ-R z>iy{zGxyBJ%qQ^Ec91Ao7vIt#Q`@pRY|o!iv`-o;t=392_gR+L`;;U#E%gjH!_^DUOBj-HuR6aY*KZdaBYHFud#_CeTV^m zhylMOpC}=RKoV~>Mb1Al)qJ(N<%(hBZrJWC)&Im{fEVj&fzgr9PnzV4EEp;;87i^{ z%YEQJnCMKLj$M!U56%<_`RTbWW^1DN9zJY~Q>$ZoRX09th+0qXiDl+4z=}l?L081I6n9BibC{|IE4eAO12Tu&;yR*>0t2HF-LqR(LFP&nLB zP4s=pXlR8!1XD5->K`t_PiCRe?v`Mkan+qTE^-?#%P(65s}`b9TktIi z#7n8fL+BZq!B;uBfBD{YgPwkPa%!4Xoi3^^DtINV)vdH_(}!w+nlRC5nqy(Ba-P_u zyUsOnlgi1qrm!es8*)54Qam?<=2je-AvDNv>N>%TMsBS1md#BgasSAnAscG;P7R68 z2_Bg&gHWj(XEQ?nG0S^qlY3^vTNLUc`RFluMOl$e>;CM5%&>yY@B;0y0`2gE^{|3< z$DGy$LB+`@4l`xc21=_IO0Il5hg-94xO)eii8~?_6Di%1D1JKx`6i*a) z!)ZWTZwR~896Ta6x{bd!9?lMV0zv0djpMn$*GRk2P$nORbeZVKURGC^cWgN{VWb|@ zzvPc8>95?KpgV&is5nMJ=oCSTf6))I6P}? zd{Xy%R`-%2JfCIG_cm?Ii1~C(IGM6nTNo$&X7-rni;QC?4;;vl|1DgOAf-dH7T zoa>{m0Q|tg%{0LSMLP`?q|rkTOGq+ctb`0C!(fPli>%l7YGE1LFXH|R7N_cHt&?== z8xfJ&YOMoV6tVLKoo?qdn};SwZt5#^>`{h_&B!Wb_uo*{Mg8hYl@8_0gv3 zP8``y!`~iyM&-E_hssgBsa$>S#`GhQ`&5|pBQg2bpz+@uk-ug3TuBVj_|oaVW+J%m z^!xl(cMC&!!^t1B@5$)h_ZwyJ1&E-9C$}f+ct8r)GdWOmQa#(GfXWwT)!tc*t* zHmLI!TI3svg88gS3|+v91dJ6)GRA5=5pFgQBmY8XQ#TEp;yKUx3MOHJ5+*IDmp5LH zT1~U%+TSf?G+tz^0)3Q70q#^mlAMn^c_M`-=FiHwoz@Az#l>^U9#^bYJTs>eF9&d1 zV6jP-r)Q9Uz{@TL@wc-!#C<1}6%>0+j> zZTLtxt0))ITaIj?6(e9uj$}%gfQD#KJt3;|)g@*eaSEABO>kwzjcbr$Q≺Oj-ou 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�n!*0J0>%R|K5w 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

GZtCPt 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 Dzn}fB diff --git a/src/main/resources/functions_grel.ttl b/src/main/resources/functions_grel.ttl index 23dedb56..67ac0a15 100644 --- a/src/main/resources/functions_grel.ttl +++ b/src/main/resources/functions_grel.ttl @@ -27,7 +27,7 @@ grel:dataset dcterms:title "GREL Fno Descriptions"@en ; dcterms:description "The FnO descriptions of the GREL functions" ; dcterms:contributor ; - dcterms:modified "2020-01-20"^^xsd:date ; + dcterms:modified "2021-08-04"^^xsd:date ; cc:license ; dcterms:issued "2016-12-15"^^xsd:date ; dcterms:rights "Copyright © Ghent University – imec – IDLab"@en ; @@ -53,6 +53,18 @@ grel:prob_array_join fno:name "The array join problem"^^xsd:string ; dcterms:description "Joining an array into a string."^^xsd:string . +#GET +# https://docs.openrefine.org/manual/grelfunctions#geta-n-from-n-to-optional + +grel:array_get + a fno:Function ; + fno:name "get" ; + dcterms:description "get" ; + fno:expects ( grel:param_a grel:p_int_i_from grel:p_int_i_opt_to ) ; + fno:returns ( grel:output_array ) . + +#JOIN + grel:array_join a fno:Function ; fno:name "join" ; @@ -84,6 +96,61 @@ grel:stringOut fno:predicate grel:stringOutput ; fno:type xsd:string . +#LENGTH + +grel:array_length + a fno:Function ; + fno:name "length" ; + dcterms:description "length" ; + fno:expects ( grel:param_a ) ; + fno:returns ( grel:output_number ) . + +#SLICE +# https://docs.openrefine.org/manual/grelfunctions#slicea-n-from-n-to-optional + +grel:array_slice + a fno:Function ; + fno:name "slice" ; + dcterms:description "slice" ; + fno:expects ( grel:param_a grel:p_int_i_from grel:p_int_i_opt_to ) ; + fno:returns ( grel:output_number ) . + +#REVERSE + +grel:array_reverse + a fno:Function ; + fno:name "reverse" ; + dcterms:description "reverse" ; + fno:expects ( grel:param_a ) ; + fno:returns ( grel:output_array ) . + +#SORT + +grel:array_sort + a fno:Function ; + fno:name "sort" ; + dcterms:description "sort" ; + fno:expects ( grel:param_a ) ; + fno:returns ( grel:output_array ) . + +#SUM + +grel:array_sum + a fno:Function ; + fno:name "sum" ; + dcterms:description "sum" ; + fno:expects ( grel:param_a ) ; + fno:returns ( grel:output_number ) . + +#UNIQUES + +grel:array_uniques + a fno:Function ; + fno:name "uniques" ; + dcterms:description "uniques" ; + fno:expects ( grel:param_a ) ; + fno:returns ( grel:output_array ) . + grel:prob_bool a fno:Problem ; fno:name "The bool problem"^^xsd:string ; @@ -195,16 +262,122 @@ grel:param_false rdfs:label "eFalse" ; fno:predicate grel:any_false ; fno:type xsd:any ; - fno:required "true"^^xsd:boolean . - + fno:required "false"^^xsd:boolean . grel:output_any - a fno:Parameter ; - #fno:name "" ; - #rdfs:label "" ; - fno:predicate grel:any_output ; - fno:type rdf:object; - fno:required "true"^^xsd:boolean . + a fno:Output ; + fno:name "any" ; + rdfs:label "any" ; + fno:predicate grel:o_any ; + fno:type xsd:any . + +#grel:controls_forEachIndex +# a fno:Function ; +# fno:name "forEachIndex" ; +# dcterms:description "forEachIndex" ; +# fno:expects ( grel:param_a grel:uri_index grel:uri_value grel:param_any_e ) ; +# fno:returns ( grel:output_array ) . + +#grel:uri_value +# a fno:Parameter ; +# fno:name "v" ; +# rdfs:label "v" ; +# fno:predicate grel:param_value ; +# fno:type xsd:string ; +# fno:required "true"^^xsd:boolean . + +#grel:uri_index +# a fno:Parameter ; +# fno:name "i" ; +# rdfs:label "i" ; +# fno:predicate grel:p_int_index ; +# fno:type xsd:string ; +# fno:required "true"^^xsd:boolean . + +#grel:controls_forNonBlank +# a fno:Function ; +# fno:name "forNonBlank" ; +# dcterms:description "forNonBlank" ; +# fno:expects ( grel:param_any_e grel:uri_value grel:param_false grel:param_true ) ; +# fno:returns ( grel:output_any ) . + +#grel:controls_forRange +# a fno:Function ; +# fno:name "forRange" ; +# dcterms:description "forRange" ; +# fno:expects ( grel:p_int_i_from grel:inti_i_to grel:param_int_i_step grel:uri_value grel:param_any_e ) ; +# fno:returns ( grel:output_array ) . + +#grel:param_int_i_step +# a fno:Parameter ; +# fno:name "step" ; +# rdfs:label "step" ; +# fno:predicate grel:string_step ; +# fno:type xsd:int ; +# fno:required "true"^^xsd:boolean . + +#grel:controls_filter +# a fno:Function ; +# fno:name "filter" ; +# dcterms:description "filter" ; +# fno:expects ( grel:param_a grel:uri_value grel:param_any_e ) ; +# fno:returns ( grel:output_array ) . + +#grel:controls_forEach +# a fno:Function ; +# fno:name "forEach" ; +# dcterms:description "forEach" ; +# fno:expects ( grel:param_a grel:uri_value grel:param_any_e ) ; +# fno:returns ( grel:output_array ) . + +#grel:controls_with +# a fno:Function ; +# fno:name "with" ; +# dcterms:description "with" ; +# fno:expects ( grel:param_any_e grel:uri_value grel:param_any_e ) ; +# fno:returns ( grel:output_any ) . + +#grel:controls_isBlank +# a fno:Function ; +# fno:name "isBlank" ; +# dcterms:description "isBlank" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . + +#grel:controls_isError +# a fno:Function ; +# fno:name "isError" ; +# dcterms:description "isError" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . + +#grel:controls_isNonBlank +# a fno:Function ; +# fno:name "isNonBlank" ; +# dcterms:description "isNonBlank" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . + +#grel:controls_isNotNull +# a fno:Function ; +# fno:name "isNotNull" ; +# dcterms:description "isNotNull" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . + +#grel:controls_isNull +# a fno:Function ; +# fno:name "isNull" ; +# dcterms:description "isNull" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . + +#grel:controls_isNumeric +# a fno:Function ; +# fno:name "isNumeric" ; +# dcterms:description "isNumeric" ; +# fno:expects ( grel:param_any_e ) ; +# fno:returns ( grel:output_bool ) . grel:prob_string a fno:Problem ; @@ -239,9 +412,16 @@ grel:output_number fno:name "number" ; rdfs:label "number" ; fno:predicate grel:o_number ; - fno:type xsd:number . + fno:type xsd:integer . + +#TOSTRING -#TODO toStringValue +grel:string_toString + a fno:Function ; + fno:name "toString" ; + dcterms:description "toString" ; + fno:expects ( grel:param_any_e ) ; + fno:returns ( grel:stringOut ) . #STARTSWITH @@ -296,12 +476,16 @@ grel:string_contains fno:expects ( grel:valueParam grel:param_string_sub ) ; fno:returns ( grel:output_bool ) . -#TODO indexOf +grel:prob_indexOf + a fno:Problem ; + fno:name "The indexOf problem"^^xsd:string ; + dcterms:description "The index of the first occurence within a string."^^xsd:string . grel:string_indexOf a fno:Function ; fno:name "indexOf" ; dcterms:description "indexOf" ; + fno:solves grel:prob_indexOf ; fno:expects ( grel:valueParam grel:param_string_sub ) ; fno:returns ( grel:output_number ) . @@ -344,7 +528,7 @@ grel:toUpperCase fno:expects ( grel:valueParam ) ; fno:returns ( grel:stringOut ) . -#TODO toTitleCase +#TOTITLECASE grel:string_toTitlecase a fno:Function ; @@ -366,14 +550,14 @@ grel:string_trim #TODO strip sameAs trim -#grel:valueParamtrip +#grel:string_strip # a fno:Function ; # fno:name "strip" ; # dcterms:description "strip" ; # fno:expects ( grel:valueParam ) ; # fno:returns ( grel:stringOut ) . -#TODO chomp +#CHOMP grel:string_chomp a fno:Function ; @@ -410,12 +594,12 @@ grel:p_int_i_opt_to fno:name "to" ; rdfs:label "to" ; fno:predicate grel:param_int_i_opt_to ; - fno:type xsd:string ; + fno:type xsd:int ; fno:required "false"^^xsd:boolean . # TODO slice sameAs substring -#grel:valueParamlice +#grel:string_slice # a fno:Function ; # fno:name "slice" ; # dcterms:description "slice" ; @@ -431,16 +615,22 @@ grel:p_int_i_opt_to # fno:expects ( grel:valueParam grel:p_int_i_from grel:p_int_i_opt_to ) ; # fno:returns ( grel:stringOut ) . -# TODO lastIndexOf +#LASTINDEXOF -#grel:string_lastIndexOf -# a fno:Function ; -# fno:name "lastIndexOf" ; -# dcterms:description "lastIndexOf" ; -# fno:expects ( grel:valueParam grel:param_string_sub ) ; -# fno:returns ( grel:output_number ) . +grel:prob_lastIndexOf + a fno:Problem ; + fno:name "The lastIndexOf problem"^^xsd:string ; + dcterms:description "Retrieving the last index of an occurrence in a string."^^xsd:string . + +grel:string_lastIndexOf + a fno:Function ; + fno:name "lastIndexOf" ; + dcterms:description "lastIndexOf" ; + fno:solves grel:prob_lastIndexOf ; + fno:expects ( grel:valueParam grel:param_string_sub ) ; + fno:returns ( grel:output_number ) . -# TODO replace +#REPLACE grel:prob_replace a fno:Problem ; @@ -448,13 +638,13 @@ grel:prob_replace dcterms:description "Replacing each non-overlapping occurrence of a regular expression pattern with a replacement string. Regular expession matching may involve modifier flags."^^xsd:string . -#grel:string_replace -# a fno:Function ; -# fno:name "replace" ; -# dcterms:description "replace" ; -# fno:solves grel:prob_replace ; -# fno:expects ( grel:valueParam grel:param_find grel:param_replace ) ; -# fno:returns ( grel:stringOut ) . +grel:string_replace + a fno:Function ; + fno:name "replace" ; + dcterms:description "replace" ; + fno:solves grel:prob_replace ; + fno:expects ( grel:valueParam grel:param_find grel:param_replace ) ; + fno:returns ( grel:stringOut ) . grel:param_find a fno:Parameter ; @@ -472,16 +662,16 @@ grel:param_replace fno:type xsd:string ; fno:required "true"^^xsd:boolean . -#TODO replaceChars +#REPLACECHARS -#grel:string_replaceChars -# a fno:Function ; -# fno:name "replaceChars" ; -# dcterms:description "replaceChars" ; -# fno:expects ( grel:valueParam grel:param_find grel:param_replace ) ; -# fno:returns ( grel:stringOut ) . +grel:string_replaceChars + a fno:Function ; + fno:name "replaceChars" ; + dcterms:description "replaceChars" ; + fno:expects ( grel:valueParam grel:param_find grel:param_replace ) ; + fno:returns ( grel:stringOut ) . -#TODO match +#MATCH grel:prob_regex a fno:Problem ; @@ -489,12 +679,12 @@ grel:prob_regex dcterms:description "Returning true if a string (?arg1) matches the regular expression supplied as a pattern (?arg2) as influenced by the value of flags (?arg3), otherwise returns false."^^xsd:string . -#grel:string_match -# a fno:Function ; -# fno:name "match" ; -# dcterms:description "match" ; -# fno:expects ( grel:valueParam grel:param_regex ) ; -# fno:returns ( grel:output_array ) . +grel:string_match + a fno:Function ; + fno:name "match" ; + dcterms:description "match" ; + fno:expects ( grel:valueParam grel:param_regex ) ; + fno:returns ( grel:output_array ) . grel:output_array a fno:Output ; @@ -503,7 +693,6 @@ grel:output_array fno:predicate grel:o_array ; fno:type rdf:List . - grel:param_regex a fno:Parameter ; fno:name "p" ; @@ -521,14 +710,14 @@ grel:param_regex # fno:expects ( grel:valueParam grel:param_regex ) ; # fno:returns ( grel:output_array ) . -#TODO toNumber +#TONUMBER -#grel:string_toNumber -# a fno:Function ; -# fno:name "toNumber" ; -# dcterms:description "toNumber" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_number ) . +grel:string_toNumber + a fno:Function ; + fno:name "toNumber" ; + dcterms:description "toNumber" ; + fno:expects ( grel:param_any_e ) ; + fno:returns ( grel:output_number ) . grel:param_any_e a fno:Parameter ; @@ -547,14 +736,15 @@ grel:string_split fno:expects ( grel:valueParam grel:param_string_sep ) ; fno:returns ( grel:output_array ) . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#splitbylengthsstring-s-number-n1-number-n2- +#SPLITBYLENGTHS +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#splitbylengthsstring-s-number-n1-number-n2- -#grel:string_splitByLengths -# a fno:Function ; -# fno:name "splitByLengths" ; -# dcterms:description "splitByLengths" ; -# fno:expects ( grel:valueParam grel:param_int_i grel:param_int_i2 grel:param_int_rep_i ) ; -# fno:returns ( grel:output_array ) . +grel:string_splitByLengths + a fno:Function ; + fno:name "splitByLengths" ; + dcterms:description "splitByLengths" ; + fno:expects ( grel:valueParam grel:param_int_i grel:param_int_i2 grel:param_int_rep_i ) ; + fno:returns ( grel:output_array ) . grel:param_int_i a fno:Parameter ; @@ -580,14 +770,15 @@ grel:param_int_rep_i fno:type xsd:string ; fno:required "true"^^xsd:boolean . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#smartsplitstring-s-optional-string-sep +#SMARTSPLIT +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#smartsplitstring-s-optional-string-sep -#grel:valueParammartSplit -# a fno:Function ; -# fno:name "smartSplit" ; -# dcterms:description "smartSplit" ; -# fno:expects ( grel:valueParam grel:param_opt_sep ) ; -# fno:returns ( grel:output_array ) . +grel:string_smartSplit + a fno:Function ; + fno:name "smartSplit" ; + dcterms:description "smartSplit" ; + fno:expects ( grel:valueParam grel:param_opt_sep ) ; + fno:returns ( grel:output_array ) . grel:param_opt_sep a fno:Parameter ; @@ -597,23 +788,25 @@ grel:param_opt_sep fno:type xsd:string ; fno:required "true"^^xsd:boolean . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#splitbychartypes +#SPLITBYCHARTYPE +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#splitbychartypes -#grel:valueParamplitByCharType -# a fno:Function ; -# fno:name "splitByCharType" ; -# dcterms:description "splitByCharType" ; -# fno:expects ( grel:valueParam ) ; -# fno:returns ( grel:output_array ) . +grel:string_splitByCharType + a fno:Function ; + fno:name "splitByCharType" ; + dcterms:description "splitByCharType" ; + fno:expects ( grel:valueParam ) ; + fno:returns ( grel:output_array ) . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#partitionstring-s-string-or-regex-frag-optional-boolean-omitfragment +#PARTITION +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#partitionstring-s-string-or-regex-frag-optional-boolean-omitfragment -#grel:string_partition -# a fno:Function ; -# fno:name "partition" ; -# dcterms:description "partition" ; -# fno:expects ( grel:valueParam grel:param_fragment grel:param_bool_opt_b ) ; -# fno:returns ( grel:output_array ) . +grel:string_partition + a fno:Function ; + fno:name "partition" ; + dcterms:description "partition" ; + fno:expects ( grel:valueParam grel:param_fragment grel:param_bool_opt_b ) ; + fno:returns ( grel:output_array ) . grel:param_fragment a fno:Parameter ; @@ -631,23 +824,25 @@ grel:param_bool_opt_b fno:type xsd:boolean ; fno:required "false"^^xsd:boolean . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#rpartitionstring-s-string-or-regex-frag-optional-boolean-omitfragment +#RPARTITION +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#rpartitionstring-s-string-or-regex-frag-optional-boolean-omitfragment -#grel:string_rpartition -# a fno:Function ; -# fno:name "rpartition" ; -# dcterms:description "rpartition" ; -# fno:expects ( grel:valueParam grel:param_fragment grel:param_bool_opt_b ) ; -# fno:returns ( grel:output_array ) . +grel:string_rpartition + a fno:Function ; + fno:name "rpartition" ; + dcterms:description "rpartition" ; + fno:expects ( grel:valueParam grel:param_fragment grel:param_bool_opt_b ) ; + fno:returns ( grel:output_array ) . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#diffo1-o2-optional-string-timeunit +#DIFF +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#diffo1-o2-optional-string-timeunit -#grel:string_diff -# a fno:Function ; -# fno:name "diff" ; -# dcterms:description "diff" ; -# fno:expects ( grel:valueParam grel:valueParam2 ) ; -# fno:returns ( grel:stringOut ) . +grel:string_diff + a fno:Function ; + fno:name "diff" ; + dcterms:description "diff" ; + fno:expects ( grel:valueParam grel:valueParam2 ) ; + fno:returns ( grel:stringOut ) . grel:valueParam2 a fno:Parameter ; @@ -681,16 +876,15 @@ grel:modeParam fno:predicate grel:modeParameter ; fno:required "true"^^xsd:boolean . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#unescapestring-s-string-mode - -#grel:string_unescape -# a fno:Function ; -# fno:name "unescape" ; -# dcterms:description "unescape" ; -# fno:expects ( grel:valueParam grel:modeParam ) ; -# fno:returns ( grel:stringOut ) . +#UNESCAPE +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#unescapestring-s-string-mode -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#md5string-s +grel:string_unescape + a fno:Function ; + fno:name "unescape" ; + dcterms:description "unescape" ; + fno:expects ( grel:valueParam grel:modeParam ) ; + fno:returns ( grel:stringOut ) . grel:prob_crypto a fno:Problem ; @@ -702,60 +896,60 @@ grel:prob_md5 fno:name "The md5 problem"^^xsd:string ; dcterms:description "Calculating the md5 checksum."^^xsd:string . -#grel:string_md5 -# a fno:Function ; -# fno:name "md5" ; -# dcterms:description "md5" ; -# fno:solves grel:prob_md5 ; -# fno:expects ( grel:valueParam ) ; -# fno:returns ( grel:stringOut ) . - -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#sha1string-s +grel:string_md5 + a fno:Function ; + fno:name "md5" ; + dcterms:description "md5" ; + fno:solves grel:prob_md5 ; + fno:expects ( grel:valueParam ) ; + fno:returns ( grel:stringOut ) . grel:prob_sha1 a fno:Problem ; fno:name "The sha1 problem"^^xsd:string ; dcterms:description "Calculating the SHA1 checksum."^^xsd:string . -#grel:string_sha1 -# a fno:Function ; -# fno:name "sha1" ; -# dcterms:description "sha1" ; -# fno:solves grel:prob_sha1 ; -# fno:expects ( grel:valueParam ) ; -# fno:returns ( grel:stringOut ) . +grel:string_sha1 + a fno:Function ; + fno:name "sha1" ; + dcterms:description "sha1" ; + fno:solves grel:prob_sha1 ; + fno:expects ( grel:valueParam ) ; + fno:returns ( grel:stringOut ) . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#phoneticstring-s-string-encoding +#PHONETIC +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#phoneticstring-s-string-encoding -#grel:string_phonetic -# a fno:Function ; -# fno:name "phonetic" ; -# dcterms:description "phonetic" ; -# fno:expects ( grel:valueParam grel:valueParamtring_encoding ) ; -# fno:returns ( grel:stringOut ) . +grel:string_phonetic + a fno:Function ; + fno:name "phonetic" ; + dcterms:description "phonetic" ; + fno:expects ( grel:valueParam grel:param_string_encoding ) ; + fno:returns ( grel:stringOut ) . -grel:valueParamtring_encoding +grel:param_string_encoding a fno:Parameter ; fno:name "encoding" ; rdfs:label "encoding" ; - fno:predicate grel:p_encoding ; + fno:predicate grel:p_string_encoding ; fno:type xsd:string ; fno:required "true"^^xsd:boolean . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#reinterpretstring-s-string-encoder +#REINTERPRET +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#reinterpretstring-s-string-encoder -#grel:string_reinterpret -# a fno:Function ; -# fno:name "reinterpret" ; -# dcterms:description "reinterpret" ; -# fno:expects ( grel:valueParam grel:valueParamtring_encoder ) ; -# fno:returns ( grel:stringOut ) . +grel:string_reinterpret + a fno:Function ; + fno:name "reinterpret" ; + dcterms:description "reinterpret" ; + fno:expects ( grel:valueParam grel:param_string_encoder ) ; + fno:returns ( grel:stringOut ) . -grel:valueParamtring_encoder +grel:param_string_encoder a fno:Parameter ; fno:name "encoder" ; rdfs:label "encoder" ; - fno:predicate grel:p_encoder ; + fno:predicate grel:p_string_encoder ; fno:type xsd:string ; fno:required "true"^^xsd:boolean . @@ -786,14 +980,15 @@ grel:valueParamtring_encoder # fno:expects ( grel:valueParam grel:param_int_i ) ; # fno:returns ( grel:output_array ) . -#TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#unicodestring-s +#UNICODE +# https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#unicodestring-s -#grel:string_unicode -# a fno:Function ; -# fno:name "unicode" ; -# dcterms:description "unicode" ; -# fno:expects ( grel:valueParam ) ; -# fno:returns ( grel:output_array ) . +grel:string_unicode + a fno:Function ; + fno:name "unicode" ; + dcterms:description "unicode" ; + fno:expects ( grel:valueParam ) ; + fno:returns ( grel:output_array ) . #TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#unicodetypestring-s @@ -815,20 +1010,20 @@ grel:valueParamtring_encoder #TODO https://github.com/OpenRefine/OpenRefine/wiki/GREL-String-Functions#mqlkeyunquotestring-key -grel:string_mqlKeyUnquote - a fno:Function ; - fno:name "mqlKeyUnquote" ; - dcterms:description "mqlKeyUnquote" ; - fno:expects ( grel:valueParamtring_key ) ; - fno:returns ( grel:stringOut ) . - -grel:valueParamtring_key - a fno:Parameter ; - fno:name "key" ; - rdfs:label "key" ; - fno:predicate grel:p_key ; - fno:type xsd:string ; - fno:required "true"^^xsd:boolean . +# grel:string_mqlKeyUnquote +# a fno:Function ; +# fno:name "mqlKeyUnquote" ; +# dcterms:description "mqlKeyUnquote" ; +# fno:expects ( grel:valueParamtring_key ) ; +# fno:returns ( grel:stringOut ) . + +# grel:valueParamtring_key +# a fno:Parameter ; +# fno:name "key" ; +# rdfs:label "key" ; +# fno:predicate grel:p_key ; +# fno:type xsd:string ; +# fno:required "true"^^xsd:boolean . grel:prob_date a fno:Problem ; @@ -870,42 +1065,135 @@ grel:prob_year fno:name "The year problem"^^xsd:string ; dcterms:description "Extracting the year from a date/time literal."^^xsd:string . -#grel:date_datePart -# a fno:Function ; -# fno:name "datePart" ; -# dcterms:description "datePart" ; -# fno:expects ( grel:date_d grel:string_unit ) ; -# fno:returns ( grel:output_any ) . - -#grel:date_d -# a fno:Parameter ; -# fno:name "d" ; -# rdfs:label "d" ; -# fno:predicate grel:param_d ; -# fno:type xsd:date ; -# fno:required "true"^^xsd:boolean . - -#grel:string_unit -# a fno:Parameter ; -# fno:name "unit" ; -# rdfs:label "unit" ; -# fno:predicate grel:param_unit ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . - grel:prob_now a fno:Problem ; fno:name "The now problem"^^xsd:string ; dcterms:description "Getting the current date and time."^^xsd:string . -#grel:date_now +#NOW + +grel:date_now + a fno:Function ; + fno:name "now" ; + dcterms:description "now" ; + fno:expects ( ) ; + fno:returns ( grel:output_datetime ) . + +grel:output_datetime + a fno:Output ; + fno:name "datetime" ; + rdfs:label "datetime" ; + fno:predicate grel:o_datetime ; + fno:type xsd:dateTime . + +#TODATE + +grel:date_toDate + a fno:Function ; + fno:name "toDate" ; + dcterms:description "toDate" ; + fno:expects ( grel:valueParam grel:param_string_pattern ) ; + fno:returns ( grel:output_date ) . + +grel:param_string_pattern + a fno:Parameter ; + fno:name "pattern" ; + rdfs:label "pattern" ; + fno:predicate grel:p_string_pattern ; + fno:type xsd:string ; + fno:required "true"^^xsd:boolean . + +grel:output_date + a fno:Output ; + fno:name "date" ; + rdfs:label "date" ; + fno:predicate grel:o_date ; + fno:type xsd:date . + +#TOSTRING +#TODO grel:date_toString sameAs grel:date_toDate + +# grel:date_toString # a fno:Function ; -# fno:name "now" ; -# dcterms:description "now" ; -# fno:expects ( ) ; -# fno:returns ( grel:output_datetime ) . +# fno:name "toString" ; +# dcterms:description "toString" ; +# fno:expects ( grel:valueParam grel:param_string_pattern ) ; +# fno:returns ( grel:output_date ) . -#TODO output_datetime +#DIFF + +grel:date_diff + a fno:Function ; + fno:name "diff" ; + dcterms:description "diff" ; + fno:expects ( grel:param_datetime_d grel:param_datetime_d2 grel:param_string_timeunit ) ; + fno:returns ( grel:stringOut ) . + +grel:param_datetime_d + a fno:Parameter ; + fno:name "d" ; + rdfs:label "d" ; + fno:predicate grel:p_datetime_d ; + fno:type xsd:dateTime ; + fno:required "true"^^xsd:boolean . + +grel:param_datetime_d2 + a fno:Parameter ; + fno:name "d2" ; + rdfs:label "d2" ; + fno:predicate grel:p_datetime_d2 ; + fno:type xsd:dateTime ; + fno:required "true"^^xsd:boolean . + +grel:param_string_timeunit + a fno:Parameter ; + fno:name "timeUnit" ; + rdfs:label "timeUnit" ; + fno:predicate grel:p_string_timeunit ; + fno:type xsd:string ; + fno:required "true"^^xsd:boolean . + +#INC + +grel:date_inc + a fno:Function ; + fno:name "inc" ; + dcterms:description "inc" ; + fno:expects ( grel:param_date_d grel:param_dec_n grel:param_string_unit ) ; + fno:returns ( grel:output_date ) . + +grel:param_date_d + a fno:Parameter ; + fno:name "d" ; + rdfs:label "d" ; + fno:predicate grel:p_date_d ; + fno:type xsd:date ; + fno:required "true"^^xsd:boolean . + +grel:param_dec_n + a fno:Parameter ; + fno:name "d" ; + rdfs:label "d" ; + fno:predicate grel:p_dec_n ; + fno:type xsd:decimal ; + fno:required "true"^^xsd:boolean . + +grel:param_string_unit + a fno:Parameter ; + fno:name "unit" ; + rdfs:label "unit" ; + fno:predicate grel:p_string_unit ; + fno:type xsd:string ; + fno:required "true"^^xsd:boolean . + +#DATEPART + +grel:date_datePart + a fno:Function ; + fno:name "datePart" ; + dcterms:description "datePart" ; + fno:expects ( grel:param_date_d grel:param_string_unit ) ; + fno:returns ( grel:output_any ) . grel:prob_mathematical a fno:Problem ; @@ -918,58 +1206,34 @@ grel:prob_floor dcterms:description "Returning the largest (closest to positive infinity) number with no fractional part that is not greater than the given value."^^xsd:string . -#grel:math_floor -# a fno:Function ; -# fno:name "floor" ; -# dcterms:description "floor" ; -# fno:solves grel:prob_floor ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . +#FLOOR -#grel:dec_n -# a fno:Parameter ; -# fno:name "d" ; -# rdfs:label "d" ; -# fno:predicate grel:param_n ; -# fno:type xsd:decimal ; -# fno:required "true"^^xsd:boolean . +grel:math_floor + a fno:Function ; + fno:name "floor" ; + dcterms:description "floor" ; + fno:solves grel:prob_floor ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . -# +# # skos:broader grel:math_floor . -grel:prob_max - a fno:Problem ; - fno:name "The max problem"^^xsd:string ; - dcterms:description "Returning the largest value of the input."^^xsd:string . - -#grel:math_max -# a fno:Function ; -# fno:name "max" ; -# dcterms:description "max" ; -# fno:solves grel:prob_max ; -# fno:expects ( grel:dec_n grel:dec_n2 ) ; -# fno:returns ( grel:output_number ) . - -#grel:dec_n2 -# a fno:Parameter ; -# fno:name "d2" ; -# rdfs:label "d2" ; -# fno:predicate grel:param_n2 ; -# fno:type xsd:decimal ; -# fno:required "true"^^xsd:boolean . +grel:prob_ceil + a fno:Problem ; + fno:name "The ceil problem"^^xsd:string ; + dcterms:description + "Returning the smallest (closest to negative infinity) number with no fractional part that is not less than the value of arg."^^xsd:string . -grel:prob_min - a fno:Problem ; - fno:name "The min problem"^^xsd:string ; - dcterms:description "Returning the smallest value of the input."^^xsd:string . +#CEIL -#grel:math_min -# a fno:Function ; -# fno:name "min" ; -# dcterms:description "min" ; -# fno:solves grel:prob_min ; -# fno:expects ( grel:dec_n grel:dec_n2 ) ; -# fno:returns ( grel:output_number ) . +grel:math_ceil + a fno:Function ; + fno:name "ceil" ; + dcterms:description "ceil" ; + fno:solves grel:prob_ceil ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . grel:prob_round a fno:Problem ; @@ -977,192 +1241,165 @@ grel:prob_round dcterms:description "Returning the number with no fractional part that is closest to the argument. If there are two such numbers, then the one that is closest to positive infinity is returned."^^xsd:string . -#grel:math_round -# a fno:Function ; -# fno:name "round" ; -# dcterms:description "round" ; -# fno:solves grel:prob_round ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . +#ROUND + +grel:math_round + a fno:Function ; + fno:name "round" ; + dcterms:description "round" ; + fno:solves grel:prob_round ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . # # skos:broader grel:math_round . -grel:prob_ceil - a fno:Problem ; - fno:name "The ceil problem"^^xsd:string ; - dcterms:description - "Returning the smallest (closest to negative infinity) number with no fractional part that is not less than the value of arg."^^xsd:string . - -#grel:math_ceil -# a fno:Function ; -# fno:name "ceil" ; -# dcterms:description "ceil" ; -# fno:solves grel:prob_ceil ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . - -grel:prob_coalesce +grel:prob_min a fno:Problem ; - fno:name "The coalesce problem"^^xsd:string ; - dcterms:description "Returning the first bound argument."^^xsd:string . - -#grel:other_coalesce -# a fno:Function ; -# fno:name "coalesce" ; -# dcterms:description "coalesce" ; -# fno:solves grel:prob_coalesce ; -# fno:expects ( grel:any_rep_e ) ; -# fno:returns ( grel:output_any ) . - -# HERE - -#grel:param_b2 -# a fno:Parameter ; -# fno:name "b2" ; -# rdfs:label "b2" ; -# fno:predicate grel:bool_b2 ; -# fno:type xsd:boolean ; -# fno:required "true"^^xsd:boolean . - -#grel:bool_rep_b -# a fno:Parameter ; -# fno:name "b3" ; -# rdfs:label "b3" ; -# fno:predicate grel:param_rep_b ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . - -#grel:date_d2 -# a fno:Parameter ; -# fno:name "d2" ; -# rdfs:label "d2" ; -# fno:predicate grel:param_d2 ; -# fno:type xsd:date ; -# fno:required "true"^^xsd:boolean . - -#grel:dec_n_exp -# a fno:Parameter ; -# fno:name "e" ; -# rdfs:label "e" ; -# fno:predicate grel:p_any_exp ; -# fno:type xsd:decimal ; -# fno:required "true"^^xsd:boolean . - -#grel:string_field -# a fno:Parameter ; -# fno:name "field" ; -# rdfs:label "field" ; -# fno:predicate grel:param_field ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . - -#grel:string_format -# a fno:Parameter ; -# fno:name "format" ; -# rdfs:label "format" ; -# fno:predicate grel:param_format ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . - -#grel:string_rep_format -# a fno:Parameter ; -# fno:name "format1" ; -# rdfs:label "format1" ; -# fno:predicate grel:param_rep_format ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . + fno:name "The min problem"^^xsd:string ; + dcterms:description "Returning the smallest value of the input."^^xsd:string . -#grel:uri_index -# a fno:Parameter ; -# fno:name "i" ; -# rdfs:label "i" ; -# fno:predicate grel:p_int_index ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . +#MIN -#grel:any_rep_e -# a fno:Parameter ; -# fno:name "o1" ; -# rdfs:label "o1" ; -# fno:predicate grel:param_rep_e ; -# fno:type xsd:any ; -# fno:required "true"^^xsd:boolean . +grel:math_min + a fno:Function ; + fno:name "min" ; + dcterms:description "min" ; + fno:solves grel:prob_min ; + fno:expects ( grel:param_dec_n grel:param_dec_n2 ) ; + fno:returns ( grel:output_number ) . -#grel:bool_opt_omit -# a fno:Parameter ; -# fno:name "omitFragment" ; -# rdfs:label "omitFragment" ; -# fno:predicate grel:param_omit ; -# fno:type xsd:string ; -# fno:required "false"^^xsd:boolean . +grel:param_dec_n2 + a fno:Parameter ; + fno:name "d2" ; + rdfs:label "d2" ; + fno:predicate grel:param_n2 ; + fno:type xsd:decimal ; + fno:required "true"^^xsd:boolean . -#grel:param_int_i_step -# a fno:Parameter ; -# fno:name "step" ; -# rdfs:label "step" ; -# fno:predicate grel:string_step ; -# fno:type xsd:int ; -# fno:required "true"^^xsd:boolean . +grel:prob_max + a fno:Problem ; + fno:name "The max problem"^^xsd:string ; + dcterms:description "Returning the largest value of the input."^^xsd:string . -#grel:string_time_unit -# a fno:Parameter ; -# fno:name "timeUnit" ; -# rdfs:label "timeUnit" ; -# fno:predicate grel:param_time_unit ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . +#MAX -#grel:param_int_i_to -# a fno:Parameter ; -# fno:name "to" ; -# rdfs:label "to" ; -# fno:predicate grel:param_to ; -# fno:type xsd:int ; -# fno:required "true"^^xsd:boolean . +grel:math_max + a fno:Function ; + fno:name "max" ; + dcterms:description "max" ; + fno:solves grel:prob_max ; + fno:expects ( grel:param_dec_n grel:param_dec_n2 ) ; + fno:returns ( grel:output_number ) . -#grel:uri_value -# a fno:Parameter ; -# fno:name "v" ; -# rdfs:label "v" ; -# fno:predicate grel:param_value ; -# fno:type xsd:string ; -# fno:required "true"^^xsd:boolean . +#MOD -#grel:controls_forEachIndex -# a fno:Function ; -# fno:name "forEachIndex" ; -# dcterms:description "forEachIndex" ; -# fno:expects ( grel:param_a grel:uri_index grel:uri_value grel:param_any_e ) ; -# fno:returns ( grel:output_array ) . +grel:math_mod + a fno:Function ; + fno:name "mod" ; + dcterms:description "mod" ; + fno:expects ( grel:param_int_i grel:param_int_i2 ) ; + fno:returns ( grel:output_number ) . -#grel:controls_forNonBlank -# a fno:Function ; -# fno:name "forNonBlank" ; -# dcterms:description "forNonBlank" ; -# fno:expects ( grel:param_any_e grel:uri_value grel:param_false grel:param_true ) ; -# fno:returns ( grel:output_any ) . +grel:prob_coalesce + a fno:Problem ; + fno:name "The coalesce problem"^^xsd:string ; + dcterms:description "Returning the first bound argument."^^xsd:string . -#grel:date_toDate -# a fno:Function ; -# fno:name "toDate" ; -# dcterms:description "toDate" ; -# fno:expects ( grel:param_any_e grel:string_rep_format ) ; -# fno:returns ( grel:output_date ) . +#LN + +grel:math_ln + a fno:Function ; + fno:name "ln" ; + dcterms:description "ln" ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . + +#LOG + +grel:math_log + a fno:Function ; + fno:name "log" ; + dcterms:description "log" ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . + +#EXP + +grel:math_exp + a fno:Function ; + fno:name "exp" ; + dcterms:description "exp" ; + fno:expects ( grel:param_dec_n ) ; + fno:returns ( grel:output_number ) . + +#POW + +grel:math_pow + a fno:Function ; + fno:name "pow" ; + dcterms:description "pow" ; + fno:expects ( grel:param_dec_n grel:param_dec_n_exp ) ; + fno:returns ( grel:output_number ) . + +grel:param_dec_n_exp + a fno:Parameter ; + fno:name "e" ; + rdfs:label "e" ; + fno:predicate grel:p_any_exp ; + fno:type xsd:decimal ; + fno:required "true"^^xsd:boolean . -#grel:array_sum +#grel:math_sum # a fno:Function ; # fno:name "sum" ; # dcterms:description "sum" ; -# fno:expects ( ) ; +# fno:expects ( grel:param_a ) ; # fno:returns ( grel:output_number ) . -#grel:controls_forRange -# a fno:Function ; -# fno:name "forRange" ; -# dcterms:description "forRange" ; -# fno:expects ( grel:p_int_i_from grel:inti_i_to grel:param_int_i_step grel:uri_value grel:param_any_e ) ; -# fno:returns ( grel:output_array ) . +#TYPE + +grel:other_type + a fno:Function ; + fno:name "type" ; + dcterms:description "type" ; + fno:expects ( grel:param_any_e ) ; + fno:returns ( grel:stringOut ) . + +#HASFIELD + +grel:other_hasField + a fno:Function ; + fno:name "hasField" ; + dcterms:description "hasField" ; + fno:expects ( grel:param_any_e grel:param_string_field ) ; + fno:returns ( grel:output_bool ) . + +grel:param_string_field + a fno:Parameter ; + fno:name "field" ; + rdfs:label "field" ; + fno:predicate grel:p_string_field ; + fno:type xsd:string ; + fno:required "true"^^xsd:boolean . + +#COALESCE + +grel:other_coalesce + a fno:Function ; + fno:name "coalesce" ; + dcterms:description "coalesce" ; + fno:solves grel:prob_coalesce ; + fno:expects ( grel:param_any_rep_e ) ; + fno:returns ( grel:output_any ) . + +grel:param_any_rep_e + a fno:Parameter ; + fno:name "objects" ; + rdfs:label "objects" ; + fno:predicate grel:p_any_rep_e ; + fno:type xsd:any ; + fno:required "true"^^xsd:boolean . #grel:other_facetCount # a fno:Function ; @@ -1178,98 +1415,13 @@ grel:prob_coalesce # fno:expects ( ) ; # fno:returns ( grel:output_array ) . -#grel:controls_filter -# a fno:Function ; -# fno:name "filter" ; -# dcterms:description "filter" ; -# fno:expects ( grel:param_a grel:uri_value grel:param_any_e ) ; -# fno:returns ( grel:output_array ) . - -#grel:controls_forEach -# a fno:Function ; -# fno:name "forEach" ; -# dcterms:description "forEach" ; -# fno:expects ( grel:param_a grel:uri_value grel:param_any_e ) ; -# fno:returns ( grel:output_array ) . - -#grel:controls_with -# a fno:Function ; -# fno:name "with" ; -# dcterms:description "with" ; -# fno:expects ( grel:param_any_e grel:uri_value grel:param_any_e ) ; -# fno:returns ( grel:output_any ) . - -#grel:date_diff -# a fno:Function ; -# fno:name "diff" ; -# dcterms:description "diff" ; -# fno:expects ( grel:date_d grel:date_d2 grel:string_time_unit ) ; -# fno:returns ( grel:output_number ) . - -#grel:array_get -# a fno:Function ; -# fno:name "get" ; -# dcterms:description "get" ; -# fno:expects ( grel:param_a grel:p_int_i_from grel:p_int_i_opt_to ) ; -# fno:returns ( grel:output_array ) . - -#grel:array_slice -# a fno:Function ; -# fno:name "slice" ; -# dcterms:description "slice" ; -# fno:expects ( grel:param_a grel:p_int_i_from grel:p_int_i_opt_to ) ; -# fno:returns ( grel:output_number ) . - - -#grel:date_inc -# a fno:Function ; -# fno:name "inc" ; -# dcterms:description "inc" ; -# fno:expects ( grel:date_d grel:dec_n grel:string_unit ) ; -# fno:returns ( grel:output_date ) . - -#grel:date_toDate -# a fno:Function ; -# fno:name "toDate" ; -# dcterms:description "toDate" ; -# fno:expects ( ) ; -# fno:returns ( grel:output_date ) . - -#grel:math_mod -# a fno:Function ; -# fno:name "mod" ; -# dcterms:description "mod" ; -# fno:expects ( grel:param_int_i grel:param_int_i2 ) ; -# fno:returns ( grel:output_number ) . - -#grel:math_pow -# a fno:Function ; -# fno:name "pow" ; -# dcterms:description "pow" ; -# fno:expects ( grel:dec_n grel:dec_n_exp ) ; -# fno:returns ( grel:output_number ) . - #grel:other_get # a fno:Function ; # fno:name "get" ; # dcterms:description "get" ; -# fno:expects ( grel:param_any_e grel:string_field ) ; +# fno:expects ( grel:param_any_e grel:param_string_field ) ; # fno:returns ( grel:output_any ) . -#grel:date_toString -# a fno:Function ; -# fno:name "toString" ; -# dcterms:description "toString" ; -# fno:expects ( grel:date_d grel:string_format ) ; -# fno:returns ( grel:stringOut ) . - -#grel:other_hasField -# a fno:Function ; -# fno:name "hasField" ; -# dcterms:description "hasField" ; -# fno:expects ( grel:param_any_e grel:string_field ) ; -# fno:returns ( grel:output_bool ) . - #grel:other_htmlAttr # a fno:Function ; # fno:name "htmlAttr" ; @@ -1284,104 +1436,6 @@ grel:prob_coalesce # fno:expects ( ) ; # fno:returns ( grel:output_element ) . -#grel:array_length -# a fno:Function ; -# fno:name "length" ; -# dcterms:description "length" ; -# fno:expects ( grel:param_a ) ; -# fno:returns ( grel:output_number ) . - -#grel:array_reverse -# a fno:Function ; -# fno:name "reverse" ; -# dcterms:description "reverse" ; -# fno:expects ( grel:param_a ) ; -# fno:returns ( grel:output_array ) . - -#grel:math_sum -# a fno:Function ; -# fno:name "sum" ; -# dcterms:description "sum" ; -# fno:expects ( grel:param_a ) ; -# fno:returns ( grel:output_number ) . - -#grel:array_uniques -# a fno:Function ; -# fno:name "uniques" ; -# dcterms:description "uniques" ; -# fno:expects ( grel:param_a ) ; -# fno:returns ( grel:output_array ) . - -#grel:array_sort -# a fno:Function ; -# fno:name "sort" ; -# dcterms:description "sort" ; -# fno:expects ( grel:param_a ) ; -# fno:returns ( grel:output_array ) . - -#grel:math_exp -# a fno:Function ; -# fno:name "exp" ; -# dcterms:description "exp" ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . - -#grel:math_ln -# a fno:Function ; -# fno:name "ln" ; -# dcterms:description "ln" ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . - -#grel:math_log -# a fno:Function ; -# fno:name "log" ; -# dcterms:description "log" ; -# fno:expects ( grel:dec_n ) ; -# fno:returns ( grel:output_number ) . - -#grel:controls_isBlank -# a fno:Function ; -# fno:name "isBlank" ; -# dcterms:description "isBlank" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - -#grel:controls_isError -# a fno:Function ; -# fno:name "isError" ; -# dcterms:description "isError" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - -#grel:controls_isNonBlank -# a fno:Function ; -# fno:name "isNonBlank" ; -# dcterms:description "isNonBlank" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - -#grel:controls_isNotNull -# a fno:Function ; -# fno:name "isNotNull" ; -# dcterms:description "isNotNull" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - -#grel:controls_isNull -# a fno:Function ; -# fno:name "isNull" ; -# dcterms:description "isNull" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - -#grel:controls_isNumeric -# a fno:Function ; -# fno:name "isNumeric" ; -# dcterms:description "isNumeric" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:output_bool ) . - #grel:other_htmlText # a fno:Function ; # fno:name "htmlText" ; @@ -1410,13 +1464,6 @@ grel:prob_coalesce # fno:expects ( ) ; # fno:returns ( grel:stringOut ) . -#grel:other_type -# a fno:Function ; -# fno:name "type" ; -# dcterms:description "type" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:stringOut ) . - #grel:other_parseHtml # a fno:Function ; # fno:name "parseHtml" ; @@ -1438,10 +1485,44 @@ grel:prob_coalesce # fno:expects ( grel:param_any_e ) ; # fno:returns ( grel:stringOut ) . -#grel:string_toString -# a fno:Function ; -# fno:name "toString" ; -# dcterms:description "toString" ; -# fno:expects ( grel:param_any_e ) ; -# fno:returns ( grel:stringOut ) . +# HERE +#grel:param_b2 +# a fno:Parameter ; +# fno:name "b2" ; +# rdfs:label "b2" ; +# fno:predicate grel:bool_b2 ; +# fno:type xsd:boolean ; +# fno:required "true"^^xsd:boolean . + +#grel:bool_rep_b +# a fno:Parameter ; +# fno:name "b3" ; +# rdfs:label "b3" ; +# fno:predicate grel:param_rep_b ; +# fno:type xsd:string ; +# fno:required "true"^^xsd:boolean . + +#grel:string_format +# a fno:Parameter ; +# fno:name "format" ; +# rdfs:label "format" ; +# fno:predicate grel:param_format ; +# fno:type xsd:string ; +# fno:required "true"^^xsd:boolean . + +#grel:bool_opt_omit +# a fno:Parameter ; +# fno:name "omitFragment" ; +# rdfs:label "omitFragment" ; +# fno:predicate grel:param_omit ; +# fno:type xsd:string ; +# fno:required "false"^^xsd:boolean . + +#grel:param_int_i_to +# a fno:Parameter ; +# fno:name "to" ; +# rdfs:label "to" ; +# fno:predicate grel:param_to ; +# fno:type xsd:int ; +# fno:required "true"^^xsd:boolean . diff --git a/src/main/resources/functions_idlab.ttl b/src/main/resources/functions_idlab.ttl deleted file mode 100644 index c28d299a..00000000 --- a/src/main/resources/functions_idlab.ttl +++ /dev/null @@ -1,210 +0,0 @@ -@prefix cc: . -@prefix dcterms: . -@prefix fno: . -@prefix foaf: . -@prefix grel: . -@prefix rdf: . -@prefix rdfs: . -@prefix void: . -@prefix xsd: . -@prefix idlab-fn: . -grel:void - a void:DatasetDescription ; - dcterms:title "A VoID Description of the GREL Fno Descriptions Dataset" ; - dcterms:creator ; - foaf:primaryTopic grel:dataset ; -. - - - rdf:type foaf:Person ; - foaf:mbox "mailto:Ben.DeMeester@UGent.be" ; - foaf:name "Ben De Meester"@en . - -grel:dataset - a void:Dataset ; - foaf:homepage ; - foaf:homepage ; - dcterms:title "FnO descriptions for IDLab functions"@en ; - dcterms:description "The FnO descriptions of the IDLab functions" ; - dcterms:contributor ; - dcterms:modified "2020-06-16"^^xsd:date ; - cc:license ; - dcterms:issued "2016-12-15"^^xsd:date ; - dcterms:rights "Copyright © Ghent University – imec – IDLab"@en ; - dcterms:subject ; - dcterms:subject ; - void:feature ; - void:exampleResource grel:boolean_and ; - void:vocabulary . - -# Contents: -# - Parameters (per java) param_{var} with predicate p_{type}_{var} -# - Outputs (per java) output_{type} with predicate o_{type} -# - Problems (per java) prob_{var} -# - Functions (per java) - - - -grel:prob_ucase - a fno:Problem ; - fno:name "The ucase problem"^^xsd:string ; - dcterms:description "Converting a string to upper case characters."^^xsd:string . - - - -idlab-fn:toUpperCaseURL - a fno:Function ; - fno:name "toUppercaseURL" ; - rdfs:label "toUppercaseURL" ; - dcterms:description "Returns an uppercase, valid url." ; - fno:solves grel:prob_ucase ; - fno:expects ( idlab-fn:_str ) ; - fno:returns ( idlab-fn:_stringOut ) . - - -idlab-fn:trueCondition - a fno:Function ; - fno:name "True condition" ; - rdfs:label "True condition" ; - dcterms:description "Returns the value if the given boolean is true, else null" ; - fno:expects ( idlab-fn:_strBoolean idlab-fn:_str ) ; - fno:returns ( idlab-fn:_stringOut ) . - -idlab-fn:equal - a fno:Function ; - fno:name "equal" ; - rdfs:label "equal" ; - dcterms:description "Returns true if strings are equal." ; - fno:expects ( grel:valueParam grel:valueParam2 ) ; - fno:returns ( grel:stringOut ) . - -idlab-fn:notEqual - a fno:Function ; - fno:name "not equal" ; - rdfs:label "not equal" ; - dcterms:description "Returns true if strings are not equal." ; - fno:expects ( grel:valueParam grel:valueParam2 ) ; - fno:returns ( grel:stringOut ) . - -idlab-fn:stringContainsOtherString - a fno:Function ; - fno:name "stringContainsOtherString" ; - rdfs:label "stringContainsOtherString" ; - dcterms:description "Returns true if a string is found in a delimited string." ; - fno:expects ( idlab-fn:_str idlab-fn:_otherStr idlab-fn:_delimiter ) ; - fno:returns ( idlab-fn:_stringOut ) . - - - -idlab-fn:random - a fno:Function ; - fno:name "random" ; - rdfs:label "random" ; - dcterms:description "Returns a random uuid." ; - fno:expects ( ) ; - fno:returns ( idlab-fn:_stringOut ) . - -idlab-fn:_path - a fno:Parameter ; - fno:name "input path" ; - rdfs:label "input path" ; - fno:type xsd:string ; - fno:predicate idlab-fn:path . - -idlab-fn:_str - a fno:Parameter ; - fno:name "input string" ; - rdfs:label "input string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:str . - -idlab-fn:_strBoolean - a fno:Parameter ; - fno:name "boolean encoded as string" ; - rdfs:label "boolean encoded as string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:strBoolean . - -idlab-fn:_endpoint - a fno:Parameter ; - fno:name "endpoint url string" ; - rdfs:label "endpoint url string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:endpoint . - -idlab-fn:_otherStr - a fno:Parameter ; - fno:name "other input string" ; - rdfs:label "other input string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:otherStr . - -idlab-fn:_expectedStr - a fno:Parameter ; - fno:name "expected input string" ; - rdfs:label "expected input string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:expectedStr . - -idlab-fn:_result - a fno:Parameter ; - fno:name "result string" ; - rdfs:label "result string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:result . - -idlab-fn:_list - a fno:Parameter ; - fno:name "list" ; - rdfs:label "list" ; - fno:type rdf:List ; - fno:predicate idlab-fn:list . - -idlab-fn:_listOut - a fno:Parameter ; - fno:name "output list" ; - rdfs:label "output list" ; - fno:type rdf:List ; - fno:predicate idlab-fn:listOut . - -idlab-fn:_delimiter - a fno:Parameter ; - fno:name "delimiter" ; - rdfs:label "delimiter" ; - fno:type xsd:string ; - fno:predicate idlab-fn:delimiter . - -idlab-fn:_test - a fno:Parameter ; - fno:name "test" ; - rdfs:label "test" ; - fno:type xsd:double ; - fno:predicate idlab-fn:p_test . - -idlab-fn:_from - a fno:Parameter ; - fno:name "from" ; - rdfs:label "from" ; - fno:type xsd:double ; - fno:predicate idlab-fn:p_from . - -idlab-fn:_to - a fno:Parameter ; - fno:name "to" ; - rdfs:label "to" ; - fno:type xsd:double ; - fno:predicate idlab-fn:p_to . - -idlab-fn:_stringOut - a fno:Output ; - fno:name "output string" ; - rdfs:label "output string" ; - fno:type xsd:string ; - fno:predicate idlab-fn:stringOut . - -idlab-fn:_boolOut - a fno:Output ; - fno:name "output boolean" ; - rdfs:label "output boolean" ; - fno:type xsd:boolean ; - fno:predicate idlab-fn:o_boolOut . diff --git a/src/main/resources/grel_java_mapping.ttl b/src/main/resources/grel_java_mapping.ttl deleted file mode 100644 index ba3c6341..00000000 --- a/src/main/resources/grel_java_mapping.ttl +++ /dev/null @@ -1,322 +0,0 @@ -@prefix cc: . -@prefix dcterms: . -@prefix doap: . -@prefix fno: . -@prefix fnoi: . -@prefix fnom: . -@prefix foaf: . -@prefix grel: . -@prefix grelm: . -@prefix rdf: . -@prefix rdfs: . -@prefix void: . -@prefix xsd: . - -grelm:void - a void:DatasetDescription ; - dcterms:title "A VoID Description of the GREL Fno JAVA Mapping Descriptions Dataset" ; - dcterms:creator ; - foaf:primaryTopic grelm:dataset ; -. - - - rdf:type foaf:Person ; - foaf:mbox "mailto:Ben.DeMeester@UGent.be" ; - foaf:name "Ben De Meester"@en . - -grelm:dataset - a void:Dataset ; - foaf:homepage ; - foaf:homepage ; - dcterms:title "GREL Fno JAVA Mapping Descriptions"@en ; - dcterms:description "The FnO JAVA mapping descriptions of the GREL functions" ; - dcterms:contributor ; - dcterms:modified "2020-01-21"^^xsd:date ; - cc:license ; - dcterms:issued "2020-01-21"^^xsd:date ; - dcterms:rights "Copyright © Ghent University – imec – IDLab"@en ; - dcterms:subject ; - dcterms:subject ; - void:feature ; - void:exampleResource grelm:boolean_and ; - void:vocabulary , , - . - -# Contents: -# - Parameters (per java) param_{var} with predicate p_{type}_{var} -# - Outputs (per java) output_{type} with predicate o_{type} -# - Problems (per java) prob_{var} -# - Functions (per java) - -grelm:javaArray - a fnoi:JavaClass ; - doap:download-page "GrelFunctions.jar" ; - fnoi:class-name "io.fno.grel.ArrayFunctions" . - -#CONCAT - -grelm:getMapping - a fno:Mapping ; - fno:function grel:array_get ; - fno:implementation grelm:javaArray ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "get" ] ; -. - -#CONCAT - -grelm:joinMapping - a fno:Mapping ; - fno:function grel:array_join ; - fno:implementation grelm:javaArray ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "join" ] ; -. - -grelm:javaBoolean - a fnoi:JavaClass ; - doap:download-page "GrelFunctions.jar" ; - fnoi:class-name "io.fno.grel.BooleanFunctions" . - -#AND - -grelm:andMapping - a fno:Mapping ; - fno:function grel:boolean_and ; - fno:implementation grelm:javaBoolean ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "and" ] ; -. - -#OR - -grelm:orMapping - a fno:Mapping ; - fno:function grel:boolean_or ; - fno:implementation grelm:javaBoolean ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "or" ] ; -. - -#NOT - -grelm:notMapping - a fno:Mapping ; - fno:function grel:boolean_not ; - fno:implementation grelm:javaBoolean ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "not" ] ; -. - -#XOR - -grelm:xorMapping - a fno:Mapping ; - fno:function grel:boolean_xor ; - fno:implementation grelm:javaBoolean ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "xor" ] ; -. - -grelm:javaControls - a fnoi:JavaClass ; - doap:download-page "GrelFunctions.jar" ; - fnoi:class-name "io.fno.grel.ControlsFunctions" . - -#IFTHENELSE - -grelm:ifthenelseMapping - a fno:Mapping ; - fno:function grel:controls_if ; - fno:implementation grelm:javaControls ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "ifThenElse" ] ; -. - -grelm:javaString - a fnoi:JavaClass ; - doap:download-page "GrelFunctions.jar" ; - fnoi:class-name "io.fno.grel.StringFunctions" . - -#STRING_LENGTH - -grelm:lengthMapping - a fno:Mapping ; - fno:function grel:string_length ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "length" ] ; -. - -#STARTSWITH - -grelm:startsWithMapping - a fno:Mapping ; - fno:function grel:string_startsWith ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "startsWith" ] ; -. - -#ENDSWITH - -grelm:endsWithMapping - a fno:Mapping ; - fno:function grel:string_endsWith ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "endsWith" ] ; -. - -#CONTAINS - -grelm:containsMapping - a fno:Mapping ; - fno:function grel:string_contains ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "contains" ] ; -. - -#TOLOWERCASE - -grelm:lowercaseMapping - a fno:Mapping ; - fno:function grel:toLowerCase ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "toLowercase" ] ; -. - -#TOUPPERCASE - -grelm:uppercaseMapping - a fno:Mapping ; - fno:function grel:toUpperCase ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "toUppercase" ] ; -. - -#TRIM - -grelm:trimMapping - a fno:Mapping ; - fno:function grel:string_trim ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "trim" ] ; -. - -#CHOMP - -grelm:trimMapping - a fno:Mapping ; - fno:function grel:string_chomp ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "chomp" ] ; -. - -#SUBSTRING - -grelm:substringMapping - a fno:Mapping ; - fno:function grel:string_substring ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "substring" ] ; -. - -#SPLIT - -grelm:splitMapping - a fno:Mapping ; - fno:function grel:string_split ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "split" ] ; -. - -#ESCAPE - -grelm:escapeMapping - a fno:Mapping ; - fno:function grel:escape ; - fno:implementation grelm:javaString ; -# TODO if not clear - fno:parameterMapping [ ] ; -# TODO if not clear - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "escape" ] ; -. - diff --git a/src/main/resources/idlab_java_mapping.ttl b/src/main/resources/idlab_java_mapping.ttl deleted file mode 100644 index ceb6343e..00000000 --- a/src/main/resources/idlab_java_mapping.ttl +++ /dev/null @@ -1,125 +0,0 @@ -@prefix cc: . -@prefix dcterms: . -@prefix doap: . -@prefix fno: . -@prefix fnoi: . -@prefix fnom: . -@prefix foaf: . -@prefix grel: . -@prefix grelm: . -@prefix rdf: . -@prefix rdfs: . -@prefix void: . -@prefix xsd: . -@prefix idlab-fn: . -grelm:void - a void:DatasetDescription ; - dcterms:title "A VoID Description of the IDLab Fno Java Mapping Descriptions Dataset" ; - dcterms:creator ; - foaf:primaryTopic grelm:dataset ; -. - - - rdf:type foaf:Person ; - foaf:mbox "mailto:Ben.DeMeester@UGent.be" ; - foaf:name "Ben De Meester"@en . - -grelm:dataset - a void:Dataset ; - foaf:homepage ; - foaf:homepage ; - dcterms:title "IDLab Fno Java Mapping Descriptions"@en ; - dcterms:description "The FnO Java mapping descriptions of the IDLab functions" ; - dcterms:contributor ; - dcterms:modified "2020-06-16"^^xsd:date ; - cc:license ; - dcterms:issued "2020-06-16"^^xsd:date ; - dcterms:rights "Copyright © Ghent University – imec – IDLab"@en ; - dcterms:subject ; - dcterms:subject ; - void:feature ; - void:exampleResource grelm:boolean_and ; - void:vocabulary , , - . - -# Contents: -# - Parameters (per java) param_{var} with predicate p_{type}_{var} -# - Outputs (per java) output_{type} with predicate o_{type} -# - Problems (per java) prob_{var} -# - Functions (per java) - -################################ -#### IMPLEMENTATIONS -################################ -grelm:IDLabFunctions - a fnoi:JavaClass ; - doap:download-page "IDLabFunctions.jar" ; - fnoi:class-name "io.fno.idlab.IDLabFunctions" . - -################################ -#### MAPPINGS -################################ - -#UPPERCASERURL -grelm:uppercaseURLMapping - a fno:Mapping ; - fno:function idlab-fn:toUpperCaseURL; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "toUpperCaseURL" ] ; -. - -grelm:trueConditionMapping - a fno:Mapping ; - fno:function idlab-fn:trueCondition; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "trueCondition" ] ; -. - - -grelm:equalMapping - a fno:Mapping ; - fno:function idlab-fn:equal; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "equal" ] ; -. - - -grelm:notEqualMapping - a fno:Mapping ; - fno:function idlab-fn:notEqual; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "notEqual" ] ; -. - -grelm:stringContainsOtherStringMapping - a fno:Mapping ; - fno:function idlab-fn:stringContainsOtherString; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "stringContainsOtherString" ] ; -. - -grelm:randomMapping - a fno:Mapping ; - fno:function idlab-fn:random; - fno:implementation grelm:IDLabFunctions ; - fno:parameterMapping [ ] ; - fno:returnMapping [ ] ; - fno:methodMapping [ a fnom:StringMethodMapping ; - fnom:method-name "random" ] ; -. - diff --git a/src/main/scala/io/rml/framework/Main.scala b/src/main/scala/io/rml/framework/Main.scala index 3f719d37..08d248aa 100644 --- a/src/main/scala/io/rml/framework/Main.scala +++ b/src/main/scala/io/rml/framework/Main.scala @@ -26,7 +26,7 @@ package io.rml.framework **/ -import io.rml.framework.api.{FnOEnvironment, RMLEnvironment} +import io.rml.framework.api.RMLEnvironment import io.rml.framework.core.extractors.{JoinConfigMapCache, NodeCache} import io.rml.framework.core.internal.Logging import io.rml.framework.core.item.{EmptyItem, Item, JoinedItem} @@ -37,9 +37,9 @@ import io.rml.framework.engine._ import io.rml.framework.engine.composers.StreamJoinComposer import io.rml.framework.engine.statement.StatementEngine import io.rml.framework.flink.connector.kafka.{RMLPartitioner, UniversalKafkaConnectorFactory} -import io.rml.framework.flink.function.{FnOEnvironmentLoader, FnOEnvironmentStreamLoader, RichItemIdentityFunction, RichStreamItemIdentityFunction} import io.rml.framework.flink.sink.{RichMQTTSink, TargetSinkFactory} import io.rml.framework.flink.source.{FileDataSet, Source} +import io.rml.framework.flink.util.FunctionsFlinkUtil import org.apache.flink.api.common.eventtime.{SerializableTimestampAssigner, WatermarkStrategy} import org.apache.flink.api.common.serialization.{SimpleStringEncoder, SimpleStringSchema} import org.apache.flink.api.scala._ @@ -94,17 +94,12 @@ object Main extends Logging { // Triple maps are also organized in categories (does it contain streams, does it contain joins, ... ) val formattedMapping = Util.readMappingFile(config.mappingFilePath) - - // Default function config - // TODO: support adding variable function related files using CLI arguments - FnOEnvironment.loadDefaultConfiguration() - FnOEnvironment.intializeFunctionLoader() - - // set up execution environments, Flink needs these to know how to operate (local, cluster mode, ...) implicit val env = ExecutionEnvironment.getExecutionEnvironment implicit val senv = StreamExecutionEnvironment.getExecutionEnvironment + // TODO: check FunctionUtils.scala + FunctionsFlinkUtil.putFunctionFilesInFlinkCache(env.getJavaEnv, senv.getJavaEnv, config.functionDescriptionLocations.get: _*) if (config.checkpointInterval.isDefined) { senv.enableCheckpointing(config.checkpointInterval.get, CheckpointingMode.AT_LEAST_ONCE); // This is what Kafka supports ATM, see https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/connectors/guarantees.html @@ -269,13 +264,11 @@ object Main extends Logging { ).nonEmpty } else true // if there are no join conditions all items can pass // filter out all empty items (some iterators can emit empty items) - }).filter(iterItems => { - iterItems.nonEmpty - }) - - + }) + .filter(iterItems => { + iterItems.nonEmpty + }) - val parentTriplesMap = NodeCache.getTriplesMap(tm.parentTriplesMap).get; val parentDataStreamTimestamped = Source(parentTriplesMap.logicalSource).asInstanceOf[io.rml.framework.flink.source.Stream] .stream @@ -361,17 +354,6 @@ object Main extends Logging { } }) - val preProcessingFunction = - if (FnOEnvironment.getFunctionLoader.isDefined) { - val functionLoaderOption = FnOEnvironment.getFunctionLoader - val jarSources = functionLoaderOption.get.getSources - val classNames = functionLoaderOption.get.getClassNames - new FnOEnvironmentStreamLoader(jarSources, classNames) - } else { - logInfo("FunctionLoader in RMLEnvironment is NOT DEFINED") - new RichStreamItemIdentityFunction() - } - // Create sinks for every logical target val logicalTargetId2Sinks = TargetSinkFactory.createStreamSinksFromLogicalTargetCache() @@ -384,7 +366,6 @@ object Main extends Logging { val dataStream = source.stream // this will generate a stream of items // process every item by a processor with a loaded engine - .map(preProcessingFunction) .map(new StdStreamProcessor(engine)) .name("Execute mapping statements on items") @@ -610,17 +591,6 @@ object Main extends Logging { } }) - val preProcessingFunction = - if (FnOEnvironment.getFunctionLoader.isDefined) { - val functionLoaderOption = FnOEnvironment.getFunctionLoader - val jarSources = functionLoaderOption.get.getSources - val classNames = functionLoaderOption.get.getClassNames - new FnOEnvironmentLoader(jarSources, classNames) - } else { - logInfo("FunctionLoader in RMLEnvironment is NOT DEFINED") - new RichItemIdentityFunction() - } - // This is the collection of all data streams that are created by the current mapping val processedDataSets: immutable.Iterable[DataSet[String]] = sourceEngineMap.map(entry => { @@ -630,7 +600,6 @@ object Main extends Logging { source.dataset // this will generate a dataset of items // process every item by a processor with a loaded engine - .map(preProcessingFunction) .map(new StdStaticProcessor(engine)) .name("Execute mapping statements on items") .map(outputStringToLogicalTargetIDs => { @@ -672,17 +641,16 @@ object Main extends Logging { // filter out all items that do not contain the childs join condition .filter(item => { - if (tm.joinCondition.isDefined) { + if (tm.joinCondition.isDefined) { val child_attributes = tm.joinCondition.get.child - child_attributes.flatMap( lit => item.refer(lit.value)).nonEmpty } else true // if there are no join conditions all items can pass - - // filter out all empty items (some iterators can emit empty items) - }).filter(item => { - !item.isInstanceOf[EmptyItem] - }) + }) + // filter out all empty items (some iterators can emit empty items) + .filter(item => { + !item.isInstanceOf[EmptyItem] + }) val parentTriplesMap = NodeCache.getTriplesMap(tm.parentTriplesMap).get; diff --git a/src/main/scala/io/rml/framework/api/FnOEnvironment.scala b/src/main/scala/io/rml/framework/api/FnOEnvironment.scala deleted file mode 100644 index 26409ac7..00000000 --- a/src/main/scala/io/rml/framework/api/FnOEnvironment.scala +++ /dev/null @@ -1,94 +0,0 @@ -package io.rml.framework.api - -import io.rml.framework.core.function.FunctionLoader -import io.rml.framework.core.internal.Logging -import io.rml.framework.core.util.Util - -import scala.collection.mutable -import scala.reflect.io.Path - -object FnOEnvironment extends Logging{ - private val functionDescriptionFilePaths : mutable.MutableList[Path] = mutable.MutableList() - private val functionMappingFilePaths : mutable.MutableList[Path] = mutable.MutableList() - private var functionLoader : Option[FunctionLoader] = None - val loadedClassesMap : scala.collection.mutable.Map[String, Class[_]] = scala.collection.mutable.Map() - - def getFunctionDescriptionFilePaths() = { - this.functionDescriptionFilePaths.toList - } - def addFunctionDescriptionFilePath(path : Path) : Unit = { - this.functionDescriptionFilePaths += path - } - - def getFunctionMappingFilePaths() = { - this.functionMappingFilePaths.toList - } - def addFunctionMappingFilePaths(path : Path): Unit = { - this.functionMappingFilePaths += path - } - - def intializeFunctionLoader() = { - this.functionLoader = FunctionLoader.apply(getFunctionDescriptionFilePaths(), getFunctionMappingFilePaths()) - this.functionLoader - } - def getFunctionLoader: Option[FunctionLoader] = { - this.functionLoader - } - - /** - * Default FnO Configuration. - * Function descriptions: - * - functions_grel.ttl - * - functions_idlab.ttl - * Function mappings - * - grel_java_mapping.ttl - * - idlab_java_mapping.ttl - * - * RMLStreamer will look for these files in directory where the RMLStreamer is executed from. - * Note: make sure to add jars with custom functions to Flink's `/lib` directory. - */ - def loadDefaultConfiguration() = { - - val defaultFunctionDescriptionFilePaths = List( - "./functions_grel.ttl", - "./functions_idlab.ttl" - ) - - val defaultFunctionMappingFilePaths = List( - "./grel_java_mapping.ttl", - "./idlab_java_mapping.ttl" - ) - - // adding default function description file paths to the RMLEnvironment - defaultFunctionDescriptionFilePaths.foreach(strPath=> { - try - { - val file = Util.getFile(strPath); - if (file.exists()) { - val p = Path.string2path(file.getAbsolutePath) - FnOEnvironment.addFunctionDescriptionFilePath(p) - } else { - logWarning(s"Can't add function description file to RMLEnvironment ( $strPath ). This will result in errors when using functions!"); - } - } - catch { - case e : Exception => logWarning(s"Can't add function description file to RMLEnvironment ( $strPath ). This will result in errors when using functions! Exception: ${e.getMessage}") - } - }) - - // adding default function description file paths to the RMLEnvironment - defaultFunctionMappingFilePaths.foreach(strPath=> { - try { - val file = Util.getFile(strPath); - if (file.exists()) { - val p = Path.string2path(file.getAbsolutePath) - FnOEnvironment.addFunctionMappingFilePaths(p) - } else { - logWarning(s"Can't add function mapping file to RMLEnvironment ( $strPath ). This will result in errors when using functions!"); - } - }catch { - case e : Exception => logWarning(s"Can't add function mapping file to RMLEnvironment ( $strPath ). This will result in errors when using functions! Exception: ${e.getMessage}") - } - }) - } -} diff --git a/src/main/scala/io/rml/framework/core/function/FunctionLoader.scala b/src/main/scala/io/rml/framework/core/function/FunctionLoader.scala deleted file mode 100644 index affa8df8..00000000 --- a/src/main/scala/io/rml/framework/core/function/FunctionLoader.scala +++ /dev/null @@ -1,140 +0,0 @@ -package io.rml.framework.core.function - -import io.rml.framework.api.{FnOEnvironment, RMLEnvironment} -import io.rml.framework.core.function.model.{Function, FunctionMetaData, Parameter} -import io.rml.framework.core.function.std.StdFunctionLoader -import io.rml.framework.core.internal.Logging -import io.rml.framework.core.model.Uri -import io.rml.framework.core.model.rdf.{RDFGraph, RDFNode} -import io.rml.framework.core.util.Turtle - -import java.io.{File, IOException} -import scala.collection.mutable.{Map => MutableMap} -import scala.reflect.io.Path - -abstract class FunctionLoader extends Logging { - /** - * Map Function Uri to FunctionMetaData object - */ - protected val functionMap: MutableMap[Uri, FunctionMetaData] = MutableMap() - - def getSources: List[String] = { - functionMap.values.map(_.source).toList.distinct - } - def getClassNames : List[String] = { - functionMap.values.map(_.className).toList.distinct - } - /** - * Creates and returns a [[Function]] for [[FunctionMetaData]] given function [[Uri]], if the function uri is present. - * - * @param uri: function uri - * @return function (if successful) - */ - def createFunction(uri: Uri): Option[Function] = { - logDebug(s"createFunction: ${uri.value}") - - val optFunctionMetaData = functionMap.get(uri) - - if (optFunctionMetaData.isDefined) { - val functionMetaData = optFunctionMetaData.get - logDebug(s"Creating function: $uri, ${functionMetaData.toString}" ) - Some(Function(functionMetaData.identifier, functionMetaData)) - } else { - // when the function uri is not present in the function map, complain. - val availableFunctionURIs = functionMap.keys.map(u=>u.toString) - throw new IOException(s"The function with URI ${uri.value} can not be found.\n" + - s"The available function URIs are: " + availableFunctionURIs) - } - } - - /** - * The given `functionMappingFile` should be a Turtle-file containing the function mappings. These mappings will be parsed and - * the FunctionLoader's functionMap is updated accordingly. - * - * @param functionMappingFile - * @return - */ - def parseFunctionMapping(functionMappingFile: File): FunctionLoader = { - val graph = RDFGraph.fromFile(functionMappingFile, RMLEnvironment.getGeneratorBaseIRI(),Turtle) - parseFunctionMapping(graph) - this - } - - /** - * The given `graph` should contain the function mappings. These mappings will be parsed and - * the FunctionLoader's functionMap is updated accordingly. - * - * @param graph [[RDFGraph]] representing a function mapping - * @return [[FunctionLoader]] - */ - def parseFunctionMapping(graph: RDFGraph): FunctionLoader - - /** - * Parse [[Parameter]] from the given [[RDFNode]] which represents the parameter - * - * @param rdfNode [[RDFNode]] containing the mapping information of the parameter - * @param pos [[Int]] integer position of the parameter - * @return - */ - def parseParameter(rdfNode: RDFNode, pos: Int): Parameter - -} - - -object FunctionLoader extends Logging{ - private var singletonFunctionLoader : Option[FunctionLoader] = None - - /** - * Private helper method for reading in the function descriptions as an RDFGraph. - * @param filePath - * @return RDFGraph containing the function descriptions. - */ - private def readFunctionDescriptionsFromFile(filePath : String): RDFGraph = { - logDebug(s"FunctionLoader is reading function descriptions from : ${filePath}") - RDFGraph.fromFile(new File(filePath), RMLEnvironment.getGeneratorBaseIRI(), Turtle) - } - - /** - * Construction of the (singleton) FunctionLoader instance. - * @return FunctionLoader - */ - def apply(functionDescriptionPaths : List[Path] = FnOEnvironment.getFunctionDescriptionFilePaths(), - functionMappingPaths : List[Path] = FnOEnvironment.getFunctionMappingFilePaths() - ): Option[FunctionLoader] = { - if(singletonFunctionLoader.isEmpty) { - - // The functionDescriptionsGraph is populated by iterating over the filepaths of the function description files. - // These function description files are obtained from the RMLEnvironment. - val fdit =functionDescriptionPaths.map(_.path).iterator - // construct the initial functionDescriptionTriplesGraph using the first functiondescription filepath - val functionDescriptionsGraph : Option[RDFGraph] = - if(fdit.hasNext) - Some(readFunctionDescriptionsFromFile(fdit.next())) - else - None - - // If more function description filepaths are specified, they will be read in. - // The resulting triples will be added to the functionDescriptionsGraph - while (fdit.hasNext) { - val fdescGraph = readFunctionDescriptionsFromFile(fdit.next()) - functionDescriptionsGraph.get.addTriples(fdescGraph.listTriples) - } - - // construct functionLoader - if(functionDescriptionsGraph.isDefined) { - singletonFunctionLoader = Some(StdFunctionLoader(functionDescriptionsGraph.get)) - // now parse the mappings - functionMappingPaths.foreach(fmp => { - singletonFunctionLoader.get.parseFunctionMapping(new File(fmp.path)) - }) - - } else { - logWarning("No function graph found. Continuing without loading functions.") - None - } - } - singletonFunctionLoader - } -} - - diff --git a/src/main/scala/io/rml/framework/core/function/FunctionUtils.scala b/src/main/scala/io/rml/framework/core/function/FunctionUtils.scala index 26b59e91..20ed53a9 100644 --- a/src/main/scala/io/rml/framework/core/function/FunctionUtils.scala +++ b/src/main/scala/io/rml/framework/core/function/FunctionUtils.scala @@ -1,51 +1,15 @@ package io.rml.framework.core.function -import io.rml.framework.api.RMLEnvironment import io.rml.framework.core.function.model.Parameter import io.rml.framework.core.internal.Logging import io.rml.framework.core.model.{Entity, Literal, Uri} import io.rml.framework.core.vocabulary.{RDFVoc, XsdVoc} import io.rml.framework.shared.RMLException -import java.io.File -import java.net.MalformedURLException import java.time.Instant -import scala.reflect.internal.util.ScalaClassLoader.URLClassLoader object FunctionUtils extends Logging { - - /** * - * TODO: IMPLEMENT THIS THE SCALA WAY SINCE TYPE ERASURE WILL CAUSE PROBLEM WITH REFLECTIONS IN SCALA - * - */ - /** - * See [[http://stackoverflow.com/questions/3216780/problem-reloading-a-jar-using-urlclassloader?lq=1]] - * for problems relating to unclosed dirty jar file handle if there ever was a need to reload the jar file - * at runtime. - * - * See [[http://stackoverflow.com/questions/8867766/forName()scala-dynamic-object-class-loading]] - * for loading in scala object using reflection - * - * See [[https://medium.com/@giposse/scala-reflection-d835832ed13a]] for a better scala reflection tutorial? - * - * @param jarFile - * @param className - * @return - */ - def loadClassFromJar(jarFile: File, className: String): Class[_] = { - logDebug(s"Loading $className from jar file $jarFile") - try { - val classloader = new URLClassLoader(List(jarFile.toURI.toURL), RMLEnvironment.getClass.getClassLoader) - logDebug(s"Class loader ${classloader.getParent}") - Class.forName(className, true, classloader) - } catch { - case e@(_: MalformedURLException | _: ClassNotFoundException) => - logError(e.getMessage) - throw e - } - } - def typeCastDataType(output: Entity, dataType: Option[Uri]): Option[Entity] = { if(dataType.isDefined){ val typeClass = getTypeClass(dataType.get) diff --git a/src/main/scala/io/rml/framework/core/function/model/DynamicFunction.scala b/src/main/scala/io/rml/framework/core/function/model/DynamicFunction.scala index ec8d3f32..e69de29b 100644 --- a/src/main/scala/io/rml/framework/core/function/model/DynamicFunction.scala +++ b/src/main/scala/io/rml/framework/core/function/model/DynamicFunction.scala @@ -1,156 +0,0 @@ -package io.rml.framework.core.function.model - -import io.rml.framework.api.FnOEnvironment -import io.rml.framework.core.function.{FunctionUtils, ReflectionUtils} -import io.rml.framework.core.model.rdf.SerializableRDFQuad -import io.rml.framework.core.model.{Entity, Literal, Uri} - -import java.io.{File, IOException, ObjectInputStream, ObjectOutputStream} -import java.lang.reflect.Method - -import java.io.{File, IOException, ObjectInputStream, ObjectOutputStream} -import java.lang.reflect.Method - - -/** - * A dynamic function is loaded from an external jar at-runtime. - * - * @param identifier [[String]] used to identify this DynamicFunction - * @param metaData contains information required for loading, initializing the function - */ -case class DynamicFunction(identifier: String, metaData: FunctionMetaData) extends Function { - - @transient - private var optMethod: Option[Method] = None - - @throws(classOf[IOException]) - private def writeObject(out: ObjectOutputStream): Unit = { - out.defaultWriteObject() - } - - /** - * There are two ways in which the method can be loaded: - * 1. From the FnOEnvironment. This means that the class was by Flink's UserCodeClassLoader was able to retrieve - * the class from an external jar (located in FLINK_HOME/lib) - * 2. From a jar that is bundled with the RMLStreamer. - * @return - */ - private def loadMethod() : Option[Method] = { - val optClass = FnOEnvironment.loadedClassesMap.get(metaData.className) - if (optClass.isDefined) { - logDebug(s"The class ${metaData.className} was found in the external jars. Will try to load the function ${metaData.methodName}") - optMethod = ReflectionUtils.searchByMethodNameAndParameterTypes(optClass.get, metaData.methodName, metaData.inputParam.map(_.paramType): _*) - } else { - logInfo(s"Could not find ${metaData.className} for this function in the FnOEnvironment" + - s" (i.e. the class could not be found in an external jar)." + - s"If the specified source (${metaData.source}) is included in the RML Streamer's resources, " + - s"and the class (${metaData.className}) can be found, " + - s"then ${metaData.methodName} will be loaded from there.") - val jarFile = getClass.getClassLoader.getResource(metaData.source).getFile - val classOfMethod = FunctionUtils.loadClassFromJar(new File(jarFile), metaData.className) - optMethod = ReflectionUtils.searchByMethodNameAndParameterTypes(classOfMethod, metaData.methodName, metaData.inputParam.map(_.paramType): _*) - } - optMethod - } - - override def execute(paramTriples: List[SerializableRDFQuad]): Option[Iterable[Entity]] = { - // if a group (key: uri) results in a list with 1 element, extract that single element - // otherwise, when a group has a list with more than 1 element, keep it as a list - val argResourcesGroupedByUri = paramTriples.groupBy(_.predicate).map { - pair => { - pair._2.length match { - case 0 => pair._1.uri -> None - case 1 => pair._1.uri -> pair._2.head - case _ => pair._1.uri -> pair._2.toList - } - } - } - - val argObjectsGroupedByUri = argResourcesGroupedByUri.map { - pair => { - if (pair._2.isInstanceOf[Iterable[SerializableRDFQuad]]) { - pair._1 -> pair._2.asInstanceOf[Iterable[SerializableRDFQuad]].map(x => x.`object`.value.value) - } else { - pair._1 -> pair._2.asInstanceOf[SerializableRDFQuad].`object`.value.value - } - - } - } - - val orderedArgValues = metaData - .inputParam - .sortBy(_.position).flatMap(ip => { - - if (argObjectsGroupedByUri.contains(ip.paramUri)) - argObjectsGroupedByUri.get(ip.paramUri) - else - Some(null) - - }) - - if (orderedArgValues.size == metaData.inputParam.size) { - - val method = loadMethod.getOrElse(throw new Exception("No method was initialized.")) - val castParameterValues: Array[AnyRef] = ReflectionUtils.castUsingMethodParameterTypes(method, orderedArgValues) - - try { - val output = method.invoke(null, castParameterValues: _*) - val result = metaData.outputParam - .flatMap(elem => elem.getValue(output)) - .map (elem => { - Literal(elem.toString) - }) - Some(result) - } catch { - case e: Throwable => { - logError(s"The following exception occurred when invoking the method ${method.getName}: ${e.getMessage}." + - s"\nThe result will be set to None.", e) - None - } - } - } - else None - - - } - - - - - @throws(classOf[IOException]) - @throws(classOf[ClassNotFoundException]) - private def readObject(in: ObjectInputStream): Unit = { - in.defaultReadObject() - optMethod = None - - } - - override def execute(arguments: Map[Uri, String]): Option[Iterable[Entity]] = { - val inputParams = metaData.inputParam - // casted to List[AnyRef] since method.invoke(...) only accepts reference type but not primitive type of Scala - val paramsOrdered = arguments.groupBy(_._1.value).map(_._2.asInstanceOf[AnyRef]).toList - - val outputParams = metaData.outputParam - - if (paramsOrdered.size == inputParams.size) { - val method = optMethod.get - val castedParameterValues = ReflectionUtils.castUsingMethodParameterTypes(method, paramsOrdered) - val output = method.invoke(null, castedParameterValues: _*) - - if (output != null) { - val result = outputParams.flatMap(elem => elem.getValue(output)) map (elem => Literal(elem.toString)) - Some(result) - } else - None - } else { - //TODO: complain about inputparams size != params ordered - logError(s"Not all input parameters for ${metaData.methodName} could be bound...") - None - } - } - - - override def getMethod: Option[Method] = { - optMethod - } -} diff --git a/src/main/scala/io/rml/framework/core/function/model/Function.scala b/src/main/scala/io/rml/framework/core/function/model/Function.scala index d86de34a..3290ff3b 100644 --- a/src/main/scala/io/rml/framework/core/function/model/Function.scala +++ b/src/main/scala/io/rml/framework/core/function/model/Function.scala @@ -1,30 +1,46 @@ package io.rml.framework.core.function.model +import be.ugent.idlab.knows.functions.agent.{Agent, Arguments} import io.rml.framework.core.internal.Logging import io.rml.framework.core.model.rdf.SerializableRDFQuad -import io.rml.framework.core.model.{Entity, Node, Uri} +import io.rml.framework.core.model.{Entity, Literal, Node} -import java.lang.reflect.Method abstract class Function extends Node with Logging{ - - - def name: Uri = Uri(identifier) - - def getMethod: Option[Method] - - - def execute(paramTriples: List[SerializableRDFQuad]): Option[Iterable[Entity]] - - @deprecated("Please use execute(paramTriples: List[FlinkRDFQuad]) instead") - def execute(argumentsMap: Map[Uri, String]): Option[Iterable[Entity]] - - + def execute(identifier: String, paramTriples: List[SerializableRDFQuad]): Option[Iterable[Entity]] } object Function extends Logging{ - def apply(identifier:String, functionMetaData: FunctionMetaData): Function={ - logDebug("Companion: Function - apply(identifier, functionMetaData)") - DynamicFunction(identifier, functionMetaData) + def execute(identifier: String, paramTriples: List[SerializableRDFQuad], agent: Agent): Option[Iterable[Entity]] = { + // if a group (key: uri) results in a list with 1 element, extract that single element + // otherwise, when a group has a list with more than 1 element, keep it as a list + val argResourcesGroupedByUri = paramTriples.groupBy(_.predicate).map { + pair => { + pair._2.length match { + case 0 => pair._1.uri -> None + case 1 => pair._1.uri -> pair._2.head + case _ => pair._1.uri -> pair._2 + } + } + } + + try { + // create Arguments + val arguments: Arguments = new Arguments(); + argResourcesGroupedByUri.foreach(argPair => { + val parameterName: String = argPair._1.toString; + val parameterValue: String = argPair._2.asInstanceOf[SerializableRDFQuad].`object`.value.value + arguments.add(parameterName, parameterValue) + }) + // execute the funtion using the function agent + val result = agent.execute(identifier, arguments) + Some(List(Literal(result.toString))) + } catch { + case e: Throwable => { + logError(s"The following exception occurred when invoking function ${identifier}: ${e.getMessage}." + + s"\nThe result will be set to None.", e) + None + } + } } } diff --git a/src/main/scala/io/rml/framework/core/function/model/FunctionMetaData.scala b/src/main/scala/io/rml/framework/core/function/model/FunctionMetaData.scala index 344d805c..e69de29b 100644 --- a/src/main/scala/io/rml/framework/core/function/model/FunctionMetaData.scala +++ b/src/main/scala/io/rml/framework/core/function/model/FunctionMetaData.scala @@ -1,20 +0,0 @@ -package io.rml.framework.core.function.model - -/** - * Contains metadata of a function that can be called by an RML Mapping. - * - * @param source string path of the source - * @param className class name containing the [[Function]] - * @param methodName method name of the [[Function]] - * @param inputParam [[List]] of input parameters for the [[Function]] - * @param outputParam [[List]] of expected output parameters from the [[Function]] - */ -case class FunctionMetaData(source: String, className: String, methodName: String, inputParam: List[Parameter], outputParam: List[Parameter]) extends { - - /** - * Used as an id for each inheriting objects for debugging ( maybe equivalence checking? e.g. in TermMap and TripleMap). - * - * @return - */ - def identifier: String = s"($source, $className, $methodName, $inputParam, $outputParam)" -} diff --git a/src/main/scala/io/rml/framework/core/function/model/std/StdRandomFunction.scala b/src/main/scala/io/rml/framework/core/function/model/std/StdRandomFunction.scala deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/scala/io/rml/framework/core/function/std/StdFunctionLoader.scala b/src/main/scala/io/rml/framework/core/function/std/StdFunctionLoader.scala deleted file mode 100644 index c0d45595..00000000 --- a/src/main/scala/io/rml/framework/core/function/std/StdFunctionLoader.scala +++ /dev/null @@ -1,95 +0,0 @@ -package io.rml.framework.core.function.std - -import io.rml.framework.core.function.model.{FunctionMetaData, Parameter} -import io.rml.framework.core.function.{FunctionLoader, FunctionUtils} -import io.rml.framework.core.model.rdf.{RDFGraph, RDFNode, RDFResource} -import io.rml.framework.core.model.{Literal, Uri} -import io.rml.framework.core.util.Util -import io.rml.framework.core.vocabulary.{DOAPVoc, FunVoc} -import io.rml.framework.shared.{FnOException, RMLException} - - -case class StdFunctionLoader private (functionDescriptionTriplesGraph : RDFGraph) extends FunctionLoader { - - override def parseFunctionMapping(graph: RDFGraph): FunctionLoader = { - logDebug("parsing functions the new way (i.e. using StdFunctionLoader)") - - val fnoFunctionProperty = Uri(FunVoc.FnO.Property.FNO_FUNCTION) - - // subject resources with fno:function property - // these resources have type fnoi:Mapping - val mappings = graph.filterProperties(fnoFunctionProperty) - if(mappings.isEmpty) - throw new RMLException("No function mappings found...") - - val functionDescriptionResources = this.functionDescriptionTriplesGraph.filterResources(Uri(FunVoc.FnO.Class.FNO_FUNCTION)) - logDebug(s"${functionDescriptionResources.length} functionDescriptionResources present") - logDebug(s"The current function description graph contains ${mappings.length} mappings") - for (map <- mappings) { - logDebug(s"Processing mapping: ${map.uri}") - try { - val functionUri = map.listProperties(FunVoc.FnO.Property.FNO_FUNCTION).head.asInstanceOf[RDFResource].uri - - val methodMappingResource = map.listProperties(FunVoc.FnO.Property.FNO_METHOD_MAPPING).head.asInstanceOf[RDFResource] - val methodNode = methodMappingResource.listProperties(FunVoc.FnOMapping.Property.FNOM_METHOD_NAME).head.asInstanceOf[Literal] - val methodName = methodNode.value - val implementationResource = map.listProperties(FunVoc.FnO.Property.FNO_IMPLEMENTATION).head.asInstanceOf[RDFResource] - - val className = Util.getLiteral(implementationResource.listProperties(FunVoc.FnoImplementation.Property.FNOI_CLASS_NAME).head) - val downloadPage = Util.getLiteral(implementationResource.listProperties(DOAPVoc.Property.DOAP_DOWNLOAD_PAGE).head) - logDebug(s"Found map with methodname: ${methodName}, className: ${className}, downloadPage: ${downloadPage}") - - // Get function description resource that corresponds with the current functionUri - // If not present, throw appropriate exception - val functionDescriptionResourceOption = functionDescriptionResources.find(fd => fd.uri == functionUri) - if(functionDescriptionResourceOption.isEmpty) - throw new FnOException(s"No function description resource found with uri: ${functionUri}") - - - // extraction of input parameters - val expectsResource = functionDescriptionResourceOption.get.listProperties(FunVoc.FnO.Property.FNO_EXPECTS).headOption - val inputParameterResources = expectsResource.get.asInstanceOf[RDFResource].getList.asInstanceOf[List[RDFResource]] - val inputParamList = parseParameterResources(inputParameterResources) - - // extraction of output parameters - val returnsResource = functionDescriptionResourceOption.get.listProperties(FunVoc.FnO.Property.FNO_RETURNS).headOption - val outputParameterResources = returnsResource.get.asInstanceOf[RDFResource].getList.asInstanceOf[List[RDFResource]] - val outputParamList = parseParameterResources(outputParameterResources) - - // construct function meta data object and store it in the functionMap - val functionMetaData = FunctionMetaData(downloadPage.get.value, className.get.value, methodName, inputParamList, outputParamList) - this.functionMap.put(functionUri, functionMetaData) - - }catch { - case e@(_: RMLException | _: FnOException) => - logError(e.getMessage) - } - } - this - } - - - def parseParameterResources(parameterResources : List[RDFResource]) : List[Parameter] = { - parameterResources.zipWithIndex.map{ - case (paramResource, paramIndex) => - parseParameter(paramResource, paramIndex) - } - } - - override def parseParameter(inputNode: RDFNode, pos: Int): Parameter = { - val inputResource = inputNode.asInstanceOf[RDFResource] - val paramType = inputResource.listProperties(FunVoc.FnO.Property.FNO_TYPE).headOption - val paramUri = inputResource.listProperties(FunVoc.FnO.Property.FNO_PREDICATE).headOption - - - if(paramType.isEmpty) - throw new FnOException(s"Parameter Type not defined for parameter resource: ${inputResource.uri}") - - if(paramUri.isEmpty) - throw new FnOException(s"Parameter Uri not defined for parameter resource: ${inputResource.uri}") - - val paramTypeResource = paramType.get.asInstanceOf[RDFResource] - val typeClass = FunctionUtils.getTypeClass(paramTypeResource.uri) - Parameter(typeClass, Uri(paramUri.get.identifier), pos) - } -} diff --git a/src/main/scala/io/rml/framework/core/util/ParameterUtil.scala b/src/main/scala/io/rml/framework/core/util/ParameterUtil.scala index c2538f2b..4e4f2e18 100644 --- a/src/main/scala/io/rml/framework/core/util/ParameterUtil.scala +++ b/src/main/scala/io/rml/framework/core/util/ParameterUtil.scala @@ -43,7 +43,8 @@ object ParameterUtil { partitionId: Option[Int] = None, socket: Option[String] = None, outputSink: OutputSinkOption = OutputSinkOption.File, - autoWatermarkInterval: Long = 50L + autoWatermarkInterval: Long = 50L, + functionDescriptionLocations: Option[Seq[String]] = None ) { override def toString: String = { val resultStr: String = @@ -60,7 +61,8 @@ object ParameterUtil { s"Kafka topic: ${topic.getOrElse("/")}\n" + s"Kafka topic partition id: ${partitionId.getOrElse("/")}\n" + s"Output TCP socket: ${socket.getOrElse("/")}\n" + - s"Discard output: ${outputSink.equals(OutputSinkOption.None)}" + s"Function description locations: ${functionDescriptionLocations}\n" + + s"Discard output: ${outputSink.equals(OutputSinkOption.None)}" resultStr } } @@ -122,12 +124,19 @@ object ParameterUtil { .text("If given, Flink's checkpointing is enabled with the given interval. " + "If not given, checkpointing is enabled when writing to a file (this is required to use the flink StreamingFileSink). " + "Otherwise, checkpointing is disabled.") + opt[Long]("auto-watermark-interval").valueName("