From 9698ac950ee1cf6f4dbcc6b28765121e2a36bb37 Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Sun, 9 Aug 2026 17:59:37 +0200 Subject: [PATCH 01/14] glossary and backend --- documentation/cookbook_old.qmd | 1144 ------------------------ documentation/glossary.qmd | 86 ++ documentation/key_concepts/backend.qmd | 140 +++ index.qmd | 4 +- 4 files changed, 228 insertions(+), 1146 deletions(-) delete mode 100644 documentation/cookbook_old.qmd create mode 100644 documentation/glossary.qmd create mode 100644 documentation/key_concepts/backend.qmd diff --git a/documentation/cookbook_old.qmd b/documentation/cookbook_old.qmd deleted file mode 100644 index 8cacff5..0000000 --- a/documentation/cookbook_old.qmd +++ /dev/null @@ -1,1144 +0,0 @@ ---- -title: "openEO Cookbook" -toc: true -toc-depth: 3 ---- - -This is the openEO cookbook that you can refer to to get a first idea on how to solve problems with openEO in the three client languages Python, R and JavaScript. It describes how to implement simple use cases in a pragmatic way. - -Please refer to the getting started guides for [JavaScript](../javascript/index.qmd), [Python](../python/index.qmd) and [R](../r/index.qmd) if you have never worked with one of the openEO client libraries before. This guide requires you to have a basic idea of how to establish a connection to a back-end and how to explore that back-end. - -::: {.callout-tip} -## References - -* [openEO processes documentation](../processes.qmd) -* [openEO Hub](https://hub.openeo.org) to discover back-ends with available data and processes -* [openEO Web Editor](https://editor.openeo.org) to visually build and execute processing workflows -_____________________ -* [Python client documentation](https://open-eo.github.io/openeo-python-client/index.html) -* [JavaScript client documentation](https://open-eo.github.io/openeo-js-client/latest/index.html) -* [R client documentation](https://open-eo.github.io/openeo-r-client/index.html) -::: - -## Chapter 1 - -In this chapter, we want to explore the different output formats that are possible with openEO. For that, we load and filter a collection (a datacube) of satellite data and calculate the temporal mean of that data. Different steps (e.g. a linear scaling) are done to prepare for the data to be output in one of the formats: Raster or text data. - -Throughout this guide, code examples for all three client languages are given. Select your preferred language with the code switcher on the right-hand side to set all examples to that language. - -### Connecting to a back-end - -Click the link below to see how to connect to a back-end (via OpenID Connect). You can call the connection object `con` as it is done in all following code, to avoid confusion throughout the rest of the tutorials. - -::: {.panel-tabset} - -## Python - -[Getting started: Authentication](../python/#openid-connect-authentication) - -## R - -[Getting started: Authentication](../r/#openid-connect-authentication) - -## JavaScript - -[Getting started: Authentication](../javascript/#openid-connect-authentication) - -::: - -In R and JavaScript it is very useful to assign a graph-building helper object to a variable, to easily access all openEO processes and add them to the process graph that you will be building. These objects will be used throughout this guide. In Python, it also helps to import a helper object, even though we'll need it less often. - -::: {.panel-tabset} - -## Python - -```python -# import ProcessBuilder functions -from openeo.processes import ProcessBuilder -``` - -**Note:** Many functions in _child processes_ (see below), are instances of this `ProcessBuilder` import. - -## R - -```r -# assign the graph-building helper object to "p" for easy access to all openEO processes, see > ?processes() -p <- processes() -``` - -**Note:** In all R code, `p` is used to select openEO processes. - -## JavaScript - -```js -// assign the graph-building helper object to "builder" for easy access to all openEO processes -var builder = await con.buildProcess(); -``` - -**Note:** In all JavaScript code, `builder` is used to select openEO processes. - -::: - -### Input: `load_collection` - -Before loading a collection, we need to find out the exact name of a collection we want to use (back-end-specific, see references [at the top](#openeo-cookbook)). We assign the spatial and temporal extent to variables, so that we can re-use them on other collections we might want to load. Let's look for a Sentinel 2 (preprocessed level 2A preferably) collection and load the green, red and a near-infrared band (bands 3, 4 and 8). - -::: {.callout-tip} -## Collection and Band Names - -The names of collections and bands differ between back-ends. So always check the collection description for the correct names. The differences might be subtle, e.g. `B8` vs. `B08`. -::: - -We'll name our collection very explicitly `cube_s2_b348` as to not get confused later on. - -::: {.panel-tabset} - -## Python - -```python -# make dictionary, containing bounding box -urk = {"west": 5.5661, "south": 52.6457, "east": 5.7298, "north": 52.7335} -# make list, containing the temporal interval -t = ["2021-04-26", "2021-04-30"] - -# load first datacube -cube_s2_b348 = con.load_collection( - "COPERNICUS/S2_SR", - spatial_extent = urk, - temporal_extent = t, - bands = ["B3", "B4", "B8"] -) -``` - -## R - -```r -# create variables for loading collection -urk <- list(west = 5.5661, south = 52.6457, east = 5.7298, north = 52.7335) - -t <- c("2021-04-26", "2021-04-30") - -# load first datacube -cube_s2_b348 <- p$load_collection( - id = "COPERNICUS/S2_SR", - spatial_extent = urk, - temporal_extent = t, - bands=c("B3", "B4", "B8") -) -``` - -## JavaScript - -```js -// make spatial and temporal extent -let urk = {"west": 5.5661, "south": 52.6457, "east": 5.7298, "north": 52.7335}; - -let t = ["2021-04-26", "2021-04-30"]; - -// load first cube -var cube_s2_b348 = builder.load_collection( - "COPERNICUS/S2_SR", - urk, - t, - ["B3", "B4", "B8"] -); -``` - -**Note:** JavaScript doesn't use parameter names (like Python and R), so the parameters need to be in the order that they are defined in the [openEO processes documentation](../processes.qmd). - -::: - -### Filter Bands: `filter_bands` - -To go through the desired output formats, we'll need one collection with three bands, and one collection with only one band. Here we use `filter_bands`, when of course we could also just define a separate collection via `load_collection`. As our input datacube already has the required three bands, we filter it for a single band to create an additional datacube with the same spatial and temporal extent, but with only one band (band 8). - -We'll name this one `cube_s2_b8` to distinguish it from the original `cube_s2_b348`. - -::: {.panel-tabset} - -## Python - -```python -# filter for band 8 -cube_s2_b8 = cube_s2_b348.filter_bands(bands = ["B8"]) -``` - -## R - -```r -# filter for band 8 -cube_s2_b8 <- p$filter_bands(data = cube_s2_b348, bands = c("B8")) -``` - -## JavaScript - -```js -// filter for band 8 -var cube_s2_b8 = builder.filter_bands(cube_s2_b348, ["B08"]) -``` - -::: - -### Temporal Mean: `reduce_dimension` - -As we don't want to download the raw collection of satellite data, we need to reduce that data somehow. That means, we want to get rid of one dimension. Let's say we calculate a `mean` over all timesteps, and then drop the temporal dimension (as it's empty then anyway, see explanation in the [datacube guide](../datacubes.qmd#reduce)). This can be done via `reduce_dimension()`. The function requires a reducer, in our case a `mean` process, and the dimension over which to reduce, given as a string (`"t"`). - -::: {.callout-tip} -## Child Processes - -Here, we need to define a child process: A function that is called by (or passed to) another function, and then works on a subset of the datacube (somewhat similar to the concept of callbacks in JavaScript). In this case: We want `reduce_dimension` to use the `mean` function to average all timesteps of each pixel. Not any function can be used like this, it must be defined by openEO, of course. - -All clients have more or less different specifics when defining a child process. As you can observe directly below, one way to define one is to define the function directly inside the parent process. - -For a more clean way to define a child process, see the chapter below. -::: - -::: {.panel-tabset} - -## Python - -```python -# reduce all timesteps -# mean_time() is a shortcut function -cube_s2_b8_red = cube_s2_b8.mean_time() - -# alternatively, 'reduce_dimension' can be used -cube_s2_b8_red = cube_s2_b8.reduce_dimension(dimension="t", reducer="mean") - -# additionally, reduce second collection -cube_s2_b348_red = cube_s2_b348.mean_time() -``` - -**Note:** In python, the child process can be a string. - -## R - -```r -# reduce dimension, first collection -cube_s2_b8_red <- p$reduce_dimension(data = cube_s2_b8, reducer = function(data, context) { p$mean(data) }, dimension = "t") - -# reduce, second collection -cube_s2_b348_red <- p$reduce_dimension(data = cube_s2_b348, reducer = function(data, context) { p$mean(data) }, dimension = "t") -``` - -**Note:** In R, we can select a child process from the `p` helper object. - -## JavaScript - -```js -// reduce dimension -var cube_s2_b8_red = builder.reduce_dimension(cube_s2_b8, (data, _, child) => child.mean(data), "t"); - -// second collection -var cube_s2_b348_red = builder.reduce_dimension(cube_s2_b348, (data, _, child) => child.mean(data), "t"); -``` - -**Note:** In JavaScript, arrow functions can be used as child processes. - -::: - -### Scale All Pixels Linearly: `apply`, `linear_scale_range` - -To create a PNG output, we need to scale the satellite data we have down to the 8bit range of a PNG image. For this, the scale range of our imagery has to be known. For Sentinel 2 over urban and agricultural areas, we can use `6000` as a maximum. - -We'll use the process `linear_scale_range`. It takes a number and the four borders of the intervals as input. Because it works on a number and not a datacube as all processes discussed so far, we need to nest the process into an `apply`, once again defining a child process. `apply` applies a unary process to all pixels of a datacube. - -This time we'll also define our child processes externally, as to not get confused in too much code nesting. - -::: {.panel-tabset} - -## Python - -```python -# define child process, use ProcessBuilder -def scale_function(x: ProcessBuilder): - return x.linear_scale_range(0, 6000, 0, 255) - -# apply scale_function to all pixels -cube_s2_b348_red_lin = cube_s2_b348_red.apply(scale_function) -``` - -**Resource:** Refer to the [Python client documentation](https://open-eo.github.io/openeo-python-client/processes.html#processes-with-child-callbacks) to learn more about child processes in Python. - -## R - -```r -# define child process -scale_function <- function(x, context) { - p$linear_scale_range(x, inputMin = 0, inputMax = 6000, outputMin = 0, outputMax = 255) -} - -# apply scale range to all pixels -cube_s2_b348_red_lin <- p$apply(data = cube_s2_b348_red, process = scale_function) -``` - -## JavaScript - -```js -// define child process (long way) -var scale_function = function(x, context) { - return this.linear_scale_range(x, 0, 6000, 0, 255) -} - -// we could also use an arrow function here to abbreviate -// var scale_function = (x, context, child) => child.linear_scale_range(x, 0, 6000, 0, 255) - -// apply child process to all pixels -var cube_s2_b348_red_lin = builder.apply(cube_s2_b348_red, scale_function); -``` - -**Note:** Given the two ways of defining a child process above, we can see that in the long way, the builder is available as `this`, while in arrow functions, it has to be passed as the last argument (here called `child`). - -::: - -![A part of our original image is displayed here, to observe the effect of applying a linear scale: Original (thus unscaled) imagery is seen on the left, and scaled values on the right.](../cookbook/urk_scaling.jpg){fig-alt="A comparison between an unscaled and a scaled raster is shown. Unscaled values are much larger, sclaed values much closer together and all below 255."} - -### Spatial Aggregation: `aggregate_spatial` - -To look at text output formats we first need to "de-spatialize" our data. Or put another way: If we're interested in e.g. timeseries of various geometries, text output might be very interesting for us. - -To aggregate over certain geometries, we use the process `aggregate_spatial`. It takes valid GeoJSON as input. We can pass a GeoJSON `FeatureCollection` in Python and JavaScript, but we need to introduce two packages in R, `sf` and `geojsonsf`, to convert the `FeatureCollection` `string` to a `simple feature collection`. - -::: {.panel-tabset} - -## Python - -```python -# polygons as (geojson) dict -polygons = { "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.636715888977051, 52.6807532675943 ], [ 5.629441738128662, 52.68157281641395 ], [ 5.633561611175536, 52.67787822078012 ], [ 5.636715888977051, 52.6807532675943 ] ] ] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.622982978820801, 52.68595649102906 ], [ 5.6201934814453125, 52.68429152697491 ], [ 5.628776550292969, 52.683719180920846 ], [ 5.622982978820801, 52.68595649102906 ] ] ] } } ]} - -# aggregate spatial -cube_s2_b8_agg = cube_s2_b8.aggregate_spatial(geometries = polygons, reducer = "mean") - -# alternatively, the python client has a shortcut function for this special case -# cube_s2_b8_agg = cube_s2_b8.polygonal_mean_timeseries(polygon = polygons) -``` - -## R - -```r -# load sf and geojsonsf -library(sf) -library(geojsonsf) - -# create string containing the geojson FeatureCollection -polygons_string <- '{ "type": "FeatureCollection", "features": [ { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.636715888977051, 52.6807532675943 ], [ 5.629441738128662, 52.68157281641395 ], [ 5.633561611175536, 52.67787822078012 ], [ 5.636715888977051, 52.6807532675943 ] ] ] } }, { "type": "Feature", "properties": {}, "geometry": { "type": "Polygon", "coordinates": [ [ [ 5.622982978820801, 52.68595649102906 ], [ 5.6201934814453125, 52.68429152697491 ], [ 5.628776550292969, 52.683719180920846 ], [ 5.622982978820801, 52.68595649102906 ] ] ] } } ]}' -# convert to sf object -polygons <- geojson_sf(polygons_string) - -# add any attribute as a workaround, empty simple features are not accepted -polygons$anAttribute <- c(4,5) - -# aggregate spatially -cube_s2_b8_agg <- p$aggregate_spatial(data = cube_s2_b8, reducer = function(data, context) { p$mean(data) }, geometries = polygons) -``` - -**Note:** At the time of writing this, empty simple features are not accepted and produce an error. To work around this issue, simply add a random attribute to the `sf` object. Above we are assigning the (randomly chosen) values `4` and `5` to the two polygons in the collection. - -## JavaScript - -```js -// define polygons as geojson -var polygons = { - "type": "FeatureCollection", - "features": [ - { - "type": "Feature", - "properties": {}, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - 5.636715888977051, - 52.6807532675943 - ], - [ - 5.629441738128662, - 52.68157281641395 - ], - [ - 5.633561611175536, - 52.67787822078012 - ], - [ - 5.636715888977051, - 52.6807532675943 - ] - ] - ] - } - }, - { - "type": "Feature", - "properties": {}, - "geometry": { - "type": "Polygon", - "coordinates": [ - [ - [ - 5.622982978820801, - 52.68595649102906 - ], - [ - 5.6201934814453125, - 52.68429152697491 - ], - [ - 5.628776550292969, - 52.683719180920846 - ], - [ - 5.622982978820801, - 52.68595649102906 - ] - ] - ] - } - } - ] -} - -// aggregate spatial -var cube_s2_b8_agg = builder.aggregate_spatial(cube_s2_b8, polygons, (data, _, child) => child.mean(data)) -``` - -::: - -### Output: `save_result` - -To get a result, we first need to create a `save_result` node, in which we state the desired output format and potential parameters, both dependent on the back-end you are connected to. The output formats and their parameters can e.g. be explored via the Web Editor along with available processes and collections. - -We then proceed to send that job to the back-end, _without executing it_. Refer to the getting started guides on how to process results as batch or synchronous jobs. The way it is stated here allows us to log in to the Web Editor and look at, change, and execute the job from there. - -#### Raster Formats: GTiff, NetCDF - -In the example, GeoTiff files are produced. Refer to the back-end for the available formats, options, and their correct naming. Check the [PNG section](#raster-formats-png) for passing options. - -Different from the creation of a PNG image, the raster format doesn't need scaling and the original datacube can be downloaded as is. However, we need to be careful with the dimensionality of the datacube: How a 4+ - dimensional datacube is handled when converted to a raster format is back-end dependent. That is why we [made sure](#temporal-mean-reduce-dimension) that our cube would only contain one additional dimension, apart from the spatial `x` and `y`. - -::: {.panel-tabset} - -## Python - -```python -# save using save_result, give format as string -res = cube_s2_b8_red.save_result(format = "GTiff") - -# send job to back-end, do not execute -job = res.create_job(title = "temporal_mean_as_GTiff_py") -``` - -## R - -```r -# use list_file_formats() to be able to choose from a list -formats <- list_file_formats() - -# save using save_result, give format via list -res <- p$save_result(data = cube_s2_b8_red, format = formats$output$GTiff) - -# send job to back-end -job <- create_job(graph = res, title = "temporal_mean_as_GTiff_r") -``` - -## JavaScript - -```js -// save using save_result, give fomat as string -result = builder.save_result(cube_s2_b8_red, "GTiff"); - -// send job to back-end, but don't execute yet; set title -var job = await con.createJob(result, "temporal_mean_as_GTiff_js"); -``` - -::: - -#### Raster Formats: PNG - -For a PNG output, we'll use the datacube with the bands 3, 4 and 8 (green, red and near-infrared) that we've been working on simultaneously with the datacube used above. As we have scaled the data down to 8bit using a [linear scale](#scale-all-pixels-linearly-apply-linear-scale-range), nothing stands in the way of downloading the data as PNG. - -We want to produce a false-color composite highlighting the vegetation in red (as seen below the code). For that, we want to assign the infrared band (`B8`) to the red channel, the red band (`B4`) to the green channel and the green band (`B3`) to the blue channel. Some back-ends may offer to pass along this desired band order as it is shown below. Check with the back-end for available options. - -::: {.callout-tip} -## Note - -If no options can be passed, handling of the bands for PNG output is internal and should be documented by the back-end. You might also be able to tell how this is done by how your PNG looks: As explained in the [datacube guide](../datacubes.qmd#dimensions), the order of the `bands` dimension is defined when the values are loaded or altered (in our example: `filter_bands`). As we filter bands in the order `"B3", "B4", "B8"` vegetation might be highlighted in blue, given that the back-end uses the input order for the RGB channels. - -**The example below uses the `PNG` file format as defined by the Google Earth Engine back-end so the parameters `red`, `green` and `blue` may not be available on another back-end.** Make sure to check the file format documentation for your back-end. -::: - -::: {.panel-tabset} - -## Python - -```python -# save result cube as PNG -res = cube_s2_b348_red_lin.save_result(format = "PNG", options = { - "red": "B8", - "green": "B4", - "blue": "B3" - }) - -# send job to back-end -job = res.create_job(title = "temporal_mean_as_PNG_py") -``` - -In python, options are passed as a dictionary - -## R - -```r -# use list_file_formats() to be able to choose from a list -formats <- list_file_formats() - -# save result as PNG -res <- p$save_result(data = cube_s2_b348_red_lin, format = formats$output$PNG, - options = list(red="B8", green="B4", blue="B3")) - -# send job to back-end -job <- create_job(graph = res, title = "temporal_mean_as_PNG_r") -``` - -In R, options are passed as a list. - -## JavaScript - -```js -// save result as PNG -result = builder.save_result(cube_s2_b348_red_lin, "PNG", { - red: "B8", - green: "B4", - blue: "B3" -}); - -// send job to back-end -var job = await con.createJob(result, "temporal_mean_as_PNG_js"); -``` - -In JavaScript, options are passed as objects. - -::: - -![Image above: Example PNG output with the vegetation highlighted in red.](../cookbook/urk.jpg){fig-alt="Example PNG: false color composite highlighting vegetation in red."} - -#### Text Formats: JSON, CSV - -We can now save the timeseries in the [aggregated](#spatial-aggregation-aggregate-spatial) datacube as e.g. JSON. - -::: {.panel-tabset} - -## Python - -```python -# save result cube as JSON -res = cube_s2_b8_agg.save_result(format = "JSON") - -# send job to back-end -job = res.create_job(title = "timeseries_as_JSON_py") -``` - -## R - -```r -# use list_file_formats() to be able to choose from a list -formats <- list_file_formats() - -# save result as JSON -res <- p$save_result(data = cube_s2_b8_agg, format = formats$output$JSON) - -# send job to back-end -job <- create_job(graph = res, title = "timeseries_as_JSON_r") -``` - -**Note:** Because the R client rounds coordinates to four digits, slightly different results are received in comparison to the other clients. - -## JavaScript - -```js -// save as CSV -result = builder.save_result(cube_s2_b8_agg, "JSON"); - -// send job to back-end -var job = await con.createJob(result, "timeseries_as_JSON_js"); -``` - -::: - -### Output: Process as JSON - -In some cases we want to export the JSON representation of a process we created. If you followed one of the examples above, then your end node is called `res`. If not, replace that with whatever you called your process end node. - -::: {.panel-tabset} - -## Python - -```python -process = res.to_json() - -# if needed, write JSON to file, e.g.: -with open("./process.json", "w") as tfile: - tfile.write(process) -``` - -## R - -```r -# convert process to JSON -process_json <- toJSON(as(res, "Process")) - -# if needed, write JSON to file, e.g.: -cat(process_json, file = "./process.json") -``` - -## JavaScript - -```js -// set last node as result = true so it is recognized as the result node -res.result = true - -process = JSON.stringify(builder.toJSON()) - -// if needed, write JSON to file, e.g.: -var fs = require('fs'); -fs.writeFileSync("./process.json", process); -``` - -**Note:** The code to store a file only works with NodeJS. Browsers can't write files to disk. - -::: - -## Chapter 2 - -In this second part of the cookbook, things are a bit less linear. We'll explore bandmath, masking and `apply_*` functionality, only that these steps are less interconnected than in the first chapter. - -As usual we'll load a collection to work with (Sentinel 2, bands `2`, `4`, `8` and `SCL`). Let's call it `cube_s2`. We pre-select a time frame of which we know it only contains one Sentinel 2 scene, so that we're not bothered with multiple timesteps (the collection still contains a time dimension, but with only one timestep in it, so that it can be ignored). The extent has been chosen to provide results that are suitable to show the effect of the processes used, while being considerably small and thus fast to compute. If you want to minimize processing time you are of course free to use much smaller AOIs. - -To be able to download and look at the results, refer to the [output section of chapter 1](#raster-formats-gtiff-netcdf). Most of the images in this tutorial were all downloaded as GTiff and plotted with R. - -::: {.panel-tabset} - -## Python - -```python -pellworm = {"west": 8.5464, "south": 54.4473, "east": 9.0724, "north": 54.5685} -t = ["2021-03-05", "2021-03-05"] - -cube_s2 = con.load_collection( - "SENTINEL2_L2A_SENTINELHUB", - spatial_extent = pellworm, - temporal_extent = t, - bands = ["B02", "B04", "B08", "SCL"] -) -``` - -## R - -```r -pellworm <- list(west = 8.5464, south = 54.4473, east = 9.0724, north = 54.5685) -t <- c("2021-03-05", "2021-03-05") - -cube_s2 <- p$load_collection( - id = "SENTINEL2_L2A_SENTINELHUB", - spatial_extent = pellworm, - temporal_extent = t, - bands=c("B02", "B04", "B08", "SCL") -) -``` - -## JavaScript - -```js -let pellworm = {"west": 8.5464, "south": 54.4473, "east": 9.0724, "north": 54.5685}; -let t = ["2021-03-05", "2021-03-05"]; - -var cube_s2 = builder.load_collection( - "SENTINEL2_L2A_SENTINELHUB", - pellworm, - t, - ["B02", "B04", "B08", "SCL"] -); -``` - -::: - -![This is a false color image of our area of interest for this chapter. The bands 4, 8 and 2 have been assigned to the RGB channels without any further processing. The surrounding area of the island Pellworm is shown at low tide.](../cookbook/pellworm_248.jpg){fig-alt="The AOI around Pellworm is shown as a false color RGB. RGB = red, nir and blue"} - -### Bandmath -Bandmath refers to computations that involve multiple bands, like indices (Normalized Difference Vegetation Index, Normalized Burn Ratio etc.). - -In openEO, this goes along with using for example `reduce_dimension` over the `bands` dimension. In this process, a new pixel value is calculated from the values of different bands using a given formula (the actual bandmath), to then eliminate the `bands` dimension alltogether. If e.g. a cube contains a `red` and a `nir` band in its `bands` dimension and we reduce said dimension with a formula for the NDVI, that cube afterwards contains NDVI values, but no `bands` dimension anymore. - -In the following we'll observe a thorough explanation of how to calculate an NDVI. That section covers different ways (depending on the client) to set up such a process in openEO. Afterwards, we'll see how an EVI is computed in a quicker, less thorough example. - -#### Example 1: NDVI - -As mentioned above, bandmath is about reducing the `bands` dimension with a child process (a formula) that gives us the desired output. In [chapter one](#chapter-1), we already saw different ways of defining a child process: a) We learned how to use a simple `mean` to [reduce the time dimension](../cookbook/#temporal-mean-reduce-dimension), and b) we saw how to access and use the openEO defined `linear_scale_range` function [to scale all pixels linearly](../cookbook/#scale-all-pixels-linearly-apply-linear-scale-range). - -In this chapter, we'll reiterate these techniques and discuss some subtleties and alternatives. It is up to you to choose one that works best. Special to the NDVI is, given that it is _the_ most common use case, that openEO has predefined processes that cover the math for us and only need to be given the correct input. There even is a function `ndvi` that masks all details and only takes a datacube and the bandnames as input. Further down we'll dig into what this `ndvi` process actually masks, how we can reproduce that manually, and thus how we could formulate other bandmath functions, apart from an NDVI. - -By using the openEO defined **`ndvi` function**, calculating an NDVI becomes pretty straightforward. The process can detect the red and near-infrared band based on metadata and doesn't need bandname input (but band names can be passed to calculate other normalized differences). Also, by supplying the optional parameter `target_band` we can decide if we want to get a reduced cube with NDVI values and no `bands` dimension as result, or if we want to append the new NDVI band to the existing bands of our input cube. If we choose the latter, we only need to supply a name for that new NDVI band. - -::: {.panel-tabset} - -## Python - -```python -cube_s2_ndvi = cube_s2.ndvi() - -# or name bands explicitly + append the result band to the existing cube -# cube_s2_ndvi_bands = cube_s2.ndvi(nir = "B08", red = "B04", target_band = "NDVI") -``` - -## R - -```r -cube_s2_ndvi <- p$ndvi(cube_s2) - -# or name bands explicitly + append the result band to the existing cube -# cube_s2_nvdi_bands <- p$ndvi(data = cube_s2, nir = "B08", red = "B04", target_band = "NDVI") -``` - -## JavaScript - -```js -cube_s2_ndvi = builder.ndvi(cube_s2) - -// or name bands explicitly + append the result band to the existing cube -// cube_s2_ndvi_bands = builder.ndvi(cube_s2, "B08", "B04", "NDVI") -``` - -::: - -For the purpose of understanding, we'll stick with our NDVI example to explore different ways of defining bandmath in openEO. That gives you the knowledge to define other processes, not just NDVIs. The first method is available in all clients: **Defining a function** and passing it to a process, e.g. `reduce_dimension`. If available, other possibilities are discussed afterwards. - -::: {.callout-tip} -## Important: Check Band Indices and Bandnames! - -Be careful when handling the names or array indices of bands. While names differ across back-ends, indices can be mixed up easily when some other band is deleted from the input collection. Python and JavaScript have 0-based indices, R indices are 1-based. So double check which bands you're actually using. -::: - -::: {.panel-tabset} - -## Python - -```python -# necessary imports -from openeo.processes import array_element, normalized_difference - -# define an NDVI function -def ndvi_function(data): - B04 = array_element(data, index = 1) # array_element takes either an index .. - B08 = array_element(data, label = "B08") # or a label - - # ndvi = (B08 - B04) / (B08 + B04) # implement NDVI as formula .. - ndvi = normalized_difference(B08, B04) # or use the openEO "normalized_difference" process - - return ndvi - -# supply the defined function to a reduce_dimension process, set dimension = "bands" -cube_s2_ndvi = cube_s2.reduce_dimension(reducer = ndvi_function, dimension = "bands") -``` - -What we see above: -* access specific bands inside the child process: `array_element` (supply data and index/label) -* call openEO defined functions inside the child process by importing it: `from openeo.processes import normalized_difference` -* write math as formula inside the child process: `ndvi = (B08 - B04) / (B08 + B04)` - -The python client also holds a second possibility to do the above. It has a **function `band`** that does `array_element` and `reduce_dimension(dimension = "bands")` for us. When using it, we can type out the NDVI formula right in the script (since `.band` reduced the cube for us). - -```python -B04 = cube_s2.band("B04") -B08 = cube_s2.band("B08") - -cube_s2_ndvi = (B08 - B04) / (B08 + B04) # type math formula -``` - -## R - -```r -# define an NDVI function -ndvi_function <- function(data, context) { - B04 <- data[2] # we can supply an index (1-based in R) .. - B08 <- data["B08"] # or a label - - # ndvi <- (B08 - B04) / (B08 + B04) # implement NDVI as formula .. - ndvi <- p$normalized_difference(B08, B04) # or use the openEO "normalized_difference" process - # ndvi <- p$normalized_difference(data[2], data[3]) # or shorten all in one line - - return(ndvi) -} - -# supply the defined function to a reduce_dimension process, set dimension = "bands" -cube_s2_ndvi <- p$reduce_dimension(data = cube_s2, reducer = ndvi_function, dimension = "bands") -``` - -What we see above: -* access specific bands inside the child process by using array subset: `data[index]` or `data["bandname"]` -* call openEO defined functions inside the child process by calling it via the `p` processes environment: `p$normalized_difference` -* write math as formulas inside the child process: `ndvi <- (B08 - B04) / (B08 + B04)` - -In R, there are no other ways to define a child process than through defining a function as seen above. - -## JavaScript - -```js -// define NDVI function -var ndvi_function = function(data, context) { - B04 = data[1] // use array operator to extract bands - B08 = data["B08"] // or supply label - - ndvi = this.normalized_difference(B08, B04) // use "this" to access openEO processes inside this function - - // ndvi = this.normalized_difference(data["B08"], data["B04"]) // or shorten it all into one line - - return ndvi -} - -// supply the defined function to a reduce_dimension process, set dimension = "bands" -cube_s2_ndvi = builder.reduce_dimension(cube_s2, ndvi_function, "bands") -``` - -What we see above: -* access specific bands inside the child process by using array subset: `data[index]` or `data["bandname"]` -* call openEO defined functions inside the child process by calling it via `this` - -We note that JavaScript doesn't support just typing out math functions as R and Python do. But the JS client has another, even simpler way of defining quick bandmath: **using `new Formula`**. - -```js -// using "New Formula()", both $index and $label are valid as seen here, $1 refers to B04 -cube_s2_ndvi = builder.reduce_dimension(cube_s2, new Formula("($B08 - $1) / ($B08 + $1)"), "bands") -``` - -We see that using `new Formula("")` is much faster than defining a whole child process. We use `$` to access bands (works with `$indices` or `$bandnames`). If we want to use openEO defined processes, there's also the **arrow function** to still be able to do that in-line. - -```js -// using an arrow function to call openeo process "normalized_difference" -cube_s2_ndvi = builder.reduce_dimension(cube_s2, (data, _, child) => child.normalized_difference(data[2], data[1]), "bands") -``` - -In an arrow function, we can use array subsets again. - -To sum up: Although `new Formula` is probably the most straightforward way of calculating an NDVI, it is up to you to decide on a method that suits your use-case. - -::: - -![A correctly calculated NDVI would look as displayed here (scaled linearly).](../cookbook/pellworm_ndvi.jpg){fig-alt="NDVI image of the AOI"} - -#### Example 2: EVI - -The formula for the Enhanced Vegetation Index is a bit more complicated than the NDVI one and contains constants. But we also don't necessarily need an openEO defined function and can concentrate on implementing a more complex formula. Here's the most efficient way to do this, per client. - -::: {.panel-tabset} - -## Python - -```python -# extract and reduce all bands via "band" -B02 = cube_s2.band("B02") -B04 = cube_s2.band("B04") -B08 = cube_s2.band("B08") - -# write formula -cube_s2_evi = (2.5 * (B08 - B04)) / ((B08 + 6.0 * B04 - 7.5 * B02) + 1.0) -``` - -## R - -```r -# in R, there's no shorter way to define bandmath -evi_ <- function(x, context) { - b2 <- x[1] - b4 <- x[2] - b8 <- x[3] - return((2.5 * (b8 - b4)) / ((b8 + 6 * b4 - 7.5 * b2) + 1)) -} - -# reduce_dimension bands with the defined formula -cube_s2_evi <- p$reduce_dimension(data = cube_s2, reducer = evi_, dimension = "bands") -``` - -## JavaScript - -```js -// "new Formula" is the quickest way to provide a bandmath formula -cube_s2_evi = builder.reduce_dimension(cube_s2, new Formula("(2.5 * ($B08 - $B04)) / (($B08 + 6 * $B04 - 7.5 * $B02) + 1)"), "bands") -``` - -::: - -### Masks: `mask` - -Masking generally refers to excluding (or replacing) specific areas from an image. This is usually done by providing a boolean mask that detemines which pixels to replace with a no-data value, and which to leave as they are. In the following we will consider two cases: a) Creating a mask from classification classes and b) creating a mask by thresholding an image. - -#### Mask Out Specific Values - -In some cases we want to mask our data with other data. A common example is to mask out clouds, which optical satellites can not see through. Some Sentinel 2 collections provide the `SCL` classification band (see the table of classes [at the bottom here](https://sentinels.copernicus.eu/web/sentinel/technical-guides/sentinel-2-msi/level-2a/algorithm)), providing a representation coded into land cover classes. In this classification, vegetation is coded as `4` and non-vegetation as `5`, while e.g. clouds are coded as `8` to `10`. - -In the following, we're building a mask using some logical operations as a child process while reducing the dimension `bands`. As explained at [Example 1: NDVI](#example-1-ndvi) this is done to be left with a cube that has no dimension `bands`. In R and JavaScript, we write a function `filter_` that turns the values of the `SCL` band into `0`s (for (non-) vegetation) and `1`s (for all others), and ignores all other bands. During `mask`, all `1`s (i.e. `TRUE`) pixels will be replaced, and as we don't define a replacement they will simply be set to `null`. In Python, in-line logical operations can be used. - -::: {.panel-tabset} - -## Python - -```python -# get classification band -SCL = cube_s2.band("SCL") - -# we want to mask all other values, so NOT (4 OR 5) -cube_s2_mask = ~ ((SCL == 4) | (SCL == 5)) - -# masking -cube_s2_masked = cube_s2.mask(cube_s2_mask) -``` - -## R - -```r -# define filter function to create mask -filter_function <- function(data, context) { - vegetation <- p$eq(data["SCL"], 4) # vegetation is 4 - non_vegetation <- p$eq(data["SCL"], 5) # non-vegetation is 5 - # we want to mask all other values, so NOT (4 OR 5) - return(p$not(p$or(vegetation, non_vegetation))) -} - -# create mask by reducing bands with our defined formula -cube_s2_mask <- p$reduce_dimension(data = cube_s2, reducer = filter_function, dimension = "bands") - -# mask the NDVI data -cube_s2_masked <- p$mask(cube_s2, cube_s2_mask) -``` - -## JavaScript - -```js -// filter classification layer -var filter_function = function(data, context) { - vegetation = this.eq(data["SCL"], 4) // vegetation is 4 - non_vegetation = this.eq(data["SCL"], 5) // non-vegetation is 5 - // we want to mask all other values, so NOT (4 OR 5) - return this.not(this.or(vegetation, non_vegetation)) -} - -// create mask by reducing bands -cube_s2_mask = builder.reduce_dimension(cube_s2, filter_function, "bands") - -// mask -cube_s2_masked = builder.mask(cube_s2, cube_s2_mask) -``` - -::: - -As with all functionality there are differences between back-ends. If this first example "Mask Out Specific Values" doesn't work for you, that could be because we are trying to apply a mask (a cube with dimensions `x`, `y`, `t`) to the input data (a cube with dimensions `x`, `y`, `t`, `bands`) and thus, cubes with different dimensionality. If you encounter such a problem, try applying the first mask to the NDVI cube (with dimensions `x`, `y`, `t`) as it is shown in the second example "Thresholds". - -#### Thresholds - -In this scenario we want an image that contains all NDVI values above 0.3, and holds no-data values otherwise. This could be useful to have a look at the vegetation in the area, without being distracted by all other NDVI values. For this example we reuse the NDVI cube `cube_s2_ndvi` that was calculated in the [NDVI bandmath-example](#example-1-ndvi), thus for this to work you must include said code into your script. - -If you look closely, you'll notice that this time we're not using `reduce_dimension` to construct our masking cube (in contrast to [Mask out Specific Values](#mask-out-specific-values)). In R and JavaScript we use `apply` instead, and in the python client no `.band()` is necessary anymore. This is because when we were masking using specific values of the band `SCL`, we were using the `cube_s2` (with the bands `B02`, `B04`, `B08` and `SCL`) as input. We then reduced the `bands` dimension by writing and passing the function `filter_`, which returned a cube that had no `bands` dimension anymore but `1`s and `0`s according to what we wanted to mask. - -Here, we are making a mask out of the `cube_s2_ndvi`, a cube that had its `band` dimension already reduced when the NDVI was calculated. To turn its values into `1`s and `0`s, we only need to `apply` a threshold function. For this we utilize the openEO defined function `lt` ("less than"). As usual the clients expose different ways of getting to that function, one of which is shown below. - -::: {.panel-tabset} - -## Python - -```python -# create mask that is TRUE for NDVI < 0.3 -ndvi_threshold = cube_s2_ndvi < 0.3 - -# apply mask to NDVI -cube_s2_ndvi_masked = cube_s2_ndvi.mask(ndvi_threshold) -``` - -## R - -```r -threshold_ <- function(data, context) { - # create mask that is TRUE for NDVI < 0.3 - threshold <- p$lt(data[1], 0.3) - return(threshold) -} - -# apply the threshold to the NDVI cube -ndvi_threshold <- p$apply(data = cube_s2_ndvi, process = threshold_) - -# mask the NDVI cube with the calculated mask -cube_s2_ndvi_masked <- p$mask(cube_s2_ndvi, ndvi_threshold) -``` - -## JavaScript - -```js -// create mask that is TRUE for NDVI < 0.3 via an arrow function -ndvi_threshold = builder.apply(cube_s2_ndvi, (data, _, child) => child.lt(data[0], 0.3)) - -// apply mask to NDVI cube -cube_s2_ndvi_masked = builder.mask(cube_s2_ndvi, ndvi_threshold) -``` - -::: - -![Applying the above described threshold to the NDVI yields this result. Water and artificial surfaces are mostly masked from the image.](../cookbook/pellworm_threshold.jpg){fig-alt="The NDVI with a threshold of 0.3 applied"} - -### Pixel Operations: `apply` -As we remember from the [datacube guide](../datacubes.qmd#apply), unary processes take only the pixel itself into account when calculating new pixel values. We can implement that with the `apply` function and a child process that is in charge of modifying the pixel values. In our first example, that will be the square root. The openEO function is called `sqrt`. In the following we'll see how to pass it to the `apply` process. - -::: {.panel-tabset} - -## Python - -```python -# pass unary child process as string -cube_s2_sqrt = cube_s2.apply("sqrt") -``` - -## R - -```r -# pass unary child process as a function, call "sqrt" from openEO processes "p" -cube_s2_sqrt <- p$apply(cube_s2, function(x, context) { return(sqrt(x)) }) -``` - -## JavaScript - -```js -// pass unary child process via arrow function -var cube_s2_sqrt = builder.apply(cube_s2, (data, _, child) => child.sqrt(data)) -``` - -::: - -Let's say we're not looking at optical but SAR imagery. Depending on the collection held by the back-end, this data could already be log-scaled. In case it isn't, we may want to transform our data from intensity values to db. This formula is a bit more complicated: 10 * log10(x). So we'll need a multiplication (by 10) and a `log` process (to the `base` 10). - -Prior to applying the following code, we must load a collection containing SAR intensity data (e.g. Sentinel 1 GRD product). - -::: {.panel-tabset} - -## Python - -```python -# import the defined openEO process -from openeo.processes import log - -# define a child process -def log_(x): - return 10 * log(x, 10) - -# supply that function to the "apply" call -cube_s1_log10 = cube_s1.apply(log_) -``` - -## R - -```r -# call multiply, log functions from "p" -cube_s1_log10 <- p$apply(cube_s1, function(x, context) {p$multiply(10, p$log(x, 10))}) -``` - -## JavaScript - -```js -// use openEO "log", "multiply" via arrow function -cube_s1_log10 = builder.apply(cube_s1, (data, _, child) => child.multiply(10, child.log(data, 10))) -``` - -::: - -![Here we see the effect of transforming intensity data to db: Both parts of the image are linearly scaled, but only the lower part has been log-transformed. It makes the interpretation much easier because image pixels take on less 'extreme' values.](../cookbook/pellworm_s1.jpg){fig-alt="The AOI image is split into two parts: The upper part depicts SAR data with some very bright and many very dark pixels, the lower part is more balanced."} - -### Image Kernels: `apply_kernel` - -The process `apply_kernel` takes an array of weights that is used as a moving window to calculate new pixel values. This is often used to smooth or sharped the image (e.g. Gaussian blur or highpass filter, respectively). Here, we show two Sobel edge detection kernels (both vertical and horizontal) and a highpass filter. - -We'll only consider band 8 to shorten computation time. - -::: {.panel-tabset} - -## Python - -```python -cube_s2_b8 = cube_s2.filter_bands(["B08"]) -``` - -## R - -```r -cube_s2_b8 <- p$filter_bands(cube_s2, c("B08")) -``` - -## JavaScript - -```js -cube_s2_b8 = builder.filter_bands(cube_s2, ["B08"]) -``` - -::: - -Throughout all clients we can define the kernel as an array of arrays, of which the inner arrays represent lines (`x`) and the outer arrays columns (`y`). This means that by adding a line break after each inner array, a true representation of the kernel can be created (see `highpass` in Python or JavaScript tab). - -The parameters `factor` and `border` are not needed here and are left out to fall back to default. `factor` (default `1`) is multiplied with each pixel after the focal operation, while `border` (default `0`) defines how overlaps between the kernel and the image borders are handled (should pixel values be mirrored, replicated or simply set to 0?, see [`apply_kernel`](../processes.qmd#apply_kernel)). - -::: {.panel-tabset} - -## Python - -```python -# we can pass a kernel as an array of arrays -sobel_vertical = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]] # e.g. 3x3 edge detection -sobel_horizontal = [[1, 0, -1], [2, 0, -2], [1, 0, -1]] - -highpass = [ # or 5x5 highpass filter - [-1, -1, -1, -1, -1], - [-1, -1, -1, -1, -1], - [-1, -1, 24, -1, -1], - [-1, -1, -1, -1, -1], - [-1, -1, -1, -1, -1] -] - -# apply to cube -cube_s2_highpass = cube_s2_b8.apply_kernel(highpass) -``` - -## R - -```r -# we can pass a kernel as an array of arrays -sobel_vertical <- matrix(c(1, 2, 1, 0, 0, 0, -1, -2, -1), nrow = 3, byrow = TRUE) -sobel_horizontal <- matrix(c(1, 2, 1, 0, 0, 0, -1, -2, -1), nrow = 3) # e.g. 3x3 edge detection - -highpass_vector <- c(rep(-1, 12), 24, rep(-1, 12)) -highpass <- matrix(highpass_vector, nrow = 5) # or 5x5 highpass filter - -# apply to cube -cube_s2_b8_highpass <- p$apply_kernel(data = cube_s2_b8, kernel = highpass) -``` - -## JavaScript - -```js -// we can pass a kernel as an array of arrays -let sobel_vertical = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]] // e.g. 3x3 edge detection -let sobel_horizontal = [[1, 0, -1], [2, 0, -2], [1, 0, -1]] - -let highpass = [ // or 5x5 highpass filter - [-1, -1, -1, -1, -1], - [-1, -1, -1, -1, -1], - [-1, -1, 24, -1, -1], - [-1, -1, -1, -1, -1], - [-1, -1, -1, -1, -1] -] - -// apply to cube -var cube_s2_highpass = builder.apply_kernel(cube_s2_b8, highpass) -``` - -::: - -![Above a combined edge detection RGB can be seen. Sobel 3x3 vertical and horizontal edge detections are displayed as red and green, and a 5x5 highpass filter is displayed as blue. For this, all kernels in the code block above were applied and the sucessive cubes were merged afterwards.](../cookbook/pellworm_kernels.jpg){fig-alt="A combined edge detection RGB. Sobel vertical and horizontal are displayed as red and green, a 5x5 highpass filter is displayed as blue."} - - -## Endnote - -You have **feedback or** noticed an **error**? Feel free to open an issue in the [github repository](https://github.com/Open-EO/openeo.org) or use the [other communication channels](https://openeo.org/contact.html) diff --git a/documentation/glossary.qmd b/documentation/glossary.qmd new file mode 100644 index 0000000..7b0a6a2 --- /dev/null +++ b/documentation/glossary.qmd @@ -0,0 +1,86 @@ +--- +title: "Glossary" +aliases: + - glossary.html +--- + + +The following glossary provides an introduction to the key technical terms commonly used when working with the openEO API. + +## General terms + +- **EO**: Earth Observation +- **API**: Application Programming Interface ([wikipedia](https://en.wikipedia.org/wiki/Application_programming_interface){target="_blank"}), + a (standardized) communication protocol, for example between a client application and back-end service +- **client**: Software tool, framework or environment that an end-user directly interacts with. + For example: a Jupyter notebook, a Python script/application, an RStudio session, a JavaScript based web app, etc. +- **(cloud) back-end**: server; computer infrastructure (one or more physical computers or virtual machines) used for storing EO data and processing it +- **big Earth observation cloud back-end**: server infrastructure where industry and researchers analyse large amounts of EO data + +## Processes + +A **process** is an operation that performs a specific task on a set of parameters and returns a result. An example is computing a statistical operation, such as mean or median, on selected EO data. A process is similar to a function or method in programming languages. + +A **pre-defined process** is a process provided by the *back-end*, +typically [one of the processes centrally defined by openeo.org](https://processes.openeo.org/){target="_blank"}. + +A **user-defined process** is a process defined by the *user*. +It can directly be part of another process graph or be stored as custom process on a back-end. +Internally it is a *process graph* with optional additional metadata. + +A **process graph** chains specific process calls from the set of pre-defined and user-defined processes together. A process graph itself is a (user-defined) process again. Similarly to scripts in the context of programming, process graphs organize and automate the execution of one or more processes that could alternatively be executed individually. + +Process graphs can be parameterized by using placeholders (parameters) instead of actual values in various places of the process graph. This turns them into so-called user-defined processes that can reused in a flexible way in other process graphs. It also simplifies sharing and reusing openEO workflows across users. + + +## EO data (Collections) + +In the Earth Observation domain, different terms are used to describe EO data(sets). Within openEO, a **granule** (sometimes also called *item* or *asset* in the specification) typically refers to a limited area and a single overpass leading to a very short observation period (seconds) or a temporal aggregation of such data (e.g. for 16-day MODIS composites). A **collection** is a sequence of granules sharing the same product specification. It typically corresponds to the series of products derived from data acquired by a sensor on board of a satellite and having the same mode of operation. + +The [CEOS OpenSearch Best Practice Document v1.2](http://ceos.org/ourwork/workinggroups/wgiss/access/opensearch/) lists the following synonyms used by other organizations: + +- **granule**: dataset (ESA, ISO 19115), granule (NASA), product (ESA, CNES), scene (JAXA) +- **collection**: dataset series (ESA, ISO 19115), collection (CNES, NASA), dataset (JAXA), product (JAXA) + +In openEO, a back-end offers a set of collections to be processed. All collections can be requested using a client and are described using the [STAC (SpatioTemporal Asset Catalog) metadata specification](https://github.com/radiantearth/stac-spec) as STAC collections. A user can load (a subset of) a collection using a special process, which returns a (spatial) datacube. All further processing is then applied to the datacube on the back-end. + +## Spatial datacubes + +A spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions. +In the EO domain, it is common to be implicit about the temporal dimension and just refer to them as spatial datacubes in short. +Special cases are raster and [vector datacubes](https://r-spatial.org/r/2022/09/12/vdc.html){target="_blank"}. +Learn more about datacubes in the [datacube documentation](https://openeo.org/documentation/1.0/datacubes.html){target="_blank"}. + +## Vector data + +In general, **vector data** represent specific things (also called "features") in a space, e.g. on the surface of the Earth. It comprises of individual points stored as coordinate pairs that indicate a physical location in the world. These points can be joined, in a particular order, to form lines or joined into closed areas to form polygons. + +A **coordinate** represents a specific point in space. + +A **feature** is a thing that usually has a geometry (e.g. the outline of an agricultural field, a forest or an urban area) and it may have additional properties assigned (e.g. a name, a color or a population). +In rare cases features may not have a geometry, which is often referred to as an "empty geometry". + +**Geometries** consist of one or more coordinates that may be connected and then form a specific type of geometry, e.g. two points can be connected to a straight line and four straight lines can be connected to rectangle. + +Commonly used types of geometries are: +- Point +- LineString (connected straight line pieces) +- Polygon (connected straight line pieces forming a closed ring, possibly with holes - for example a triangle or rectangle) + +Further more, these base geometries can be grouped to form, for example, so-called "multi-point" or "multi-polygon" geometries. It's important to note that these multi-geometries act as single entities with regard to their associated properties. + +Features and geometries are specified by the OGC in the [Simple Feature Access specification](https://www.ogc.org/standards/sfa) (and ISO 19125). See the specification for more details. + +## User-defined function (UDF) + +The abbreviation **UDF** stands for **user-defined function**. With this concept, users are able to upload custom code and have it executed e.g. for every pixel of a scene, or applied to a particular dimension or set of dimensions, allowing custom server-side calculations. + +## Data Processing modes + +Processes can run in three different ways: + +1. Results can be pre-computed by creating a ***batch job***. They are submitted to the back-end's processing system, but will remain inactive until explicitly put into the processing queue. They will run only once and store results after execution. Results can be downloaded. Batch jobs are typically time consuming and user interaction is not possible although log files are generated for them. This is the only mode that allows to get an estimate about time, volume and costs beforehand. + +2. Processes can also be executed **on-demand** (i.e. synchronously). Results are delivered with the request itself and no job is created. Only lightweight computations, for example previews, should be executed using this approach as timeouts are to be expected for [long-polling HTTP requests](https://www.pubnub.com/blog/http-long-polling/){target="_blank"}. + +3. The third way of data processing in openEO is **client-side processing**. The client-side processing functionality allows to test and use openEO with its processes locally, i.e. without any connection to an openEO back-end. It relies on the projects [openeo-pg-parser-networkx](https://github.com/Open-EO/openeo-pg-parser-networkx){target='_blank'}, which provides an openEO process graph parsing tool, and [openeo-processes-dask](https://github.com/Open-EO/openeo-processes-dask){target='_blank'}, which provides an Xarray and Dask implementation of most openEO processes. \ No newline at end of file diff --git a/documentation/key_concepts/backend.qmd b/documentation/key_concepts/backend.qmd new file mode 100644 index 0000000..f2979a0 --- /dev/null +++ b/documentation/key_concepts/backend.qmd @@ -0,0 +1,140 @@ +--- +title: "openEO Backends" +--- + +An **openEO backend** is a server-side implementation of the openEO API. It exposes Earth Observation data, processing capabilities, authentication, and execution infrastructure through a standard interface so that the client-side workflow can run against different providers with minimal changes. + +In practice, a backend is the system that receives your process graph, validates it, executes it near the data, and returns results or job metadata. This is what makes openEO workflow interoperable. + +## What a backend provides + +Most openEO backends provide some or all of the following: + +* **Collection discovery** so users can inspect available datasets and metadata. +* **Process discovery** so users can see which predefined processes are supported. +* **Data processing** through synchronous requests for smaller jobs and batch jobs for larger workloads with the available set of processes in the sepecific backend. +* **Result export** in one or more output formats such as GeoTIFF, NetCDF, or PNG. +* **Optional advanced features** such as user-defined functions (UDFs), user-defined processes (UDPs), file storage, etc. + +## What differs between backends + +Backends all speak the same API, but they do not all offer the same data, performance characteristics, or optional features. Typical differences include: + +* **Available collections**: each provider exposes its own data holdings and curated products. +* **Process support**: a backend may support the core process set plus additional processes or specific profiles. +* **Execution modes**: some support only batch jobs, while others also support synchronous processing. +* **Formats and runtimes**: support for export formats, UDF runtimes, or web services can vary. +* **Access conditions**: authentication, quotas, billing, and free-tier options differ per provider. + +For users, this means that openEO offers a common way of working, while backend choice determines which data and capabilities are actually available for a given workflow. + +## Discover available backends + +Backend availability evolves over time. Always use the hub as the current source of truth for supported services and their exact capabilities. + + +The authoritative live overview of publicly indexed openEO services is the [openEO Hub](https://hub.openeo.org/). The hub crawls backend metadata and lets you compare services based on what they expose. + + +openEO Hub is especially useful when you want to answer practical questions such as: + +* Which backends support **basic functionality**, **synchronous processing**, or **batch processing**? +* Which backends expose a specific **collection** or **process**? +* Which services support certain **input formats**, **output formats**, or **UDF runtimes**? +* Which providers offer **file storage**, **additional web services**, **UDPs**, or **cost estimation**? +* Which backends have a **free plan** or meet other operational constraints? + +You can explore the live catalogue directly here: + +```{=html} + +``` + +If the embedded view does not load in your browser, open the hub directly at [https://hub.openeo.org/](https://hub.openeo.org/). + +::: {.callout-note} +## Note + +The hub data shown in the embedded view is updated on each crawl, which may take a few days. For the most up-to-date information, always check the hub directly. +::: + +## Choosing a backend + +When selecting a backend for your work, start with these checks: + +1. Does it provide the **collections** you need? +2. Does it support the **processes** and **execution mode** your workflow requires? +3. Does it offer the right **export formats**, **authentication model**, and **quota or billing model**? +4. Does it support advanced features you rely on, such as **UDFs**, **web services**, or **federated access**? + +For a hands-on example of connecting to a backend and exploring its capabilities, see the [Setup](../setup.qmd) and [Cookbook](../cookbook.qmd) sections. + +## For backend providers + +If you want to offer your own service through openEO, do not start by writing everything from scratch. A good first step is to review the existing implementations and check whether one already matches your technology stack or operational model. + +In practice, there are two common paths: + +* **Reuse an existing driver** when one already suits your stack. In that case, your main work is usually data ingestion, process support, deployment, and operations. +* **Implement a new driver** when no existing backend architecture fits your environment. If you take this route, follow the openEO API and software development guidance closely from the start. + +### Reuse before building + +Before implementing a new backend, review the [Open-EO GitHub organization](https://github.com/Open-EO) for existing drivers and reusable components. Reusing an existing implementation is usually the fastest path to a production-capable service. + +If you are implementing in Python, shared components such as [Python Driver Commons](https://github.com/Open-EO/openeo-python-driver) can reduce the amount of infrastructure code you need to maintain yourself. + +If your preferred technology does not yet have an existing driver, you can also bootstrap an implementation from the [openEO API specification](https://api.openeo.org/) using OpenAPI-based tooling such as [OpenAPI Generator](https://github.com/OpenAPITools/openapi-generator). + +### Concepts to understand first + +Before you expose endpoints, make sure the conceptual model is clear. At minimum, a backend implementer should be familiar with: + +* the [openEO glossary](../glossary.qmd), +* the overall architecture of openEO, +* the concepts behind processes and process graphs, +* the [openEO API specification](https://api.openeo.org/), and +* the [API and Processes profiles](https://openeo.org/documentation/1.0/developers/profiles/). + +It is also worth reviewing cross-cutting API concerns such as authentication, error handling, and CORS behavior early in the design process. + +### Implement in iterations + +An incremental implementation strategy is recommended. A backend does not need to support every openEO feature in its first release. + +Start with the discovery and capability surfaces that allow client libraries to understand what your service provides. In practice, that means implementing the **Capabilities**, **EO Data Discovery**, and **Process Discovery** building blocks first, and then adding **Batch Job Management** or **synchronous data processing** depending on your execution model. + +Your capabilities document can already communicate which endpoints and features are supported, so partial but well-described implementations are perfectly valid during early iterations. + +### Useful first iteration + +A practical minimal first iteration is to implement: + +* `GET /.well-known/openeo` +* `GET /` +* `GET /file_formats` +* `GET /collections` +* `GET /collections/{collection_id}` +* `GET /processes` +* `POST /result` +* `GET /credentials/basic` when authentication is required + +With those pieces in place, client libraries can already discover capabilities, inspect data and process support, and execute simple workflows. Additional microservices can then be added progressively. + +### What to add next + +After the initial discovery and processing endpoints are working, the next additions typically include: + +* broader process support, +* batch job lifecycle improvements, +* richer authentication and authorization models, +* advanced exports or secondary service types, +* UDF or UDP support, and +* compliance and interoperability testing. + +The core principle is to ship a backend that is explicit about what it supports, then expand capabilities in manageable increments instead of trying to implement the entire ecosystem at once. diff --git a/index.qmd b/index.qmd index 56264ca..6817996 100644 --- a/index.qmd +++ b/index.qmd @@ -249,11 +249,11 @@ Train and apply machine-learning classifiers directly in your EO workflow to cre

Find an openEO service and start working with Earth observation data.

→ Open the Hub
- +
📖

Concepts & Glossary

Understand datacubes, processes, UDFs, and the openEO data model before writing any code.

-
→ docs_light.html
+
Glossary
🔧
From 32b58b88a695b426c424e4fa225e781e8abc9f09 Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Sun, 9 Aug 2026 18:39:11 +0200 Subject: [PATCH 02/14] key concepts openeo --- _quarto.yml | 6 +- documentation/key_concepts/backend.qmd | 4 + documentation/key_concepts/datacube.qmd | 191 ++++++++++++++++ .../key_concepts/images/backend-overview.png | Bin 0 -> 33781 bytes .../key_concepts/images/backend-services.png | Bin 0 -> 31202 bytes .../images/datacube-overview-timeseries.png | Bin 0 -> 82520 bytes .../images/datacube-process-filter.png | Bin 0 -> 92745 bytes .../images/datacube-vector-example.png | Bin 0 -> 40064 bytes .../images/processes-overview.png | Bin 0 -> 31202 bytes .../key_concepts/images/processes-udf.svg | 1 + documentation/key_concepts/processes.qmd | 203 ++++++++++++++++++ 11 files changed, 402 insertions(+), 3 deletions(-) create mode 100644 documentation/key_concepts/datacube.qmd create mode 100644 documentation/key_concepts/images/backend-overview.png create mode 100644 documentation/key_concepts/images/backend-services.png create mode 100644 documentation/key_concepts/images/datacube-overview-timeseries.png create mode 100644 documentation/key_concepts/images/datacube-process-filter.png create mode 100644 documentation/key_concepts/images/datacube-vector-example.png create mode 100644 documentation/key_concepts/images/processes-overview.png create mode 100644 documentation/key_concepts/images/processes-udf.svg create mode 100644 documentation/key_concepts/processes.qmd diff --git a/_quarto.yml b/_quarto.yml index 9c60622..25afb2e 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -84,11 +84,11 @@ website: - section: KEY CONCEPTS href: documentation/keyconcepts.qmd contents: - - href: 404-not-found.qmd + - href: documentation/key_concepts/backend.qmd text: Backends - - href: documentation/keyconcepts/openeo_api.qmd + - href: documentation/key_concepts/datacube.qmd text: Datacube - - href: documentation/keyconcepts/processes.qmd + - href: documentation/key_concepts/processes.qmd text: Processes - section: SETUP href: documentation/setup.qmd diff --git a/documentation/key_concepts/backend.qmd b/documentation/key_concepts/backend.qmd index f2979a0..e9532e3 100644 --- a/documentation/key_concepts/backend.qmd +++ b/documentation/key_concepts/backend.qmd @@ -6,6 +6,8 @@ An **openEO backend** is a server-side implementation of the openEO API. It expo In practice, a backend is the system that receives your process graph, validates it, executes it near the data, and returns results or job metadata. This is what makes openEO workflow interoperable. +![openEO backend overview](images/backend-overview.png) + ## What a backend provides Most openEO backends provide some or all of the following: @@ -57,6 +59,8 @@ You can explore the live catalogue directly here: If the embedded view does not load in your browser, open the hub directly at [https://hub.openeo.org/](https://hub.openeo.org/). +![Backend service discovery example](images/backend-services.png) + ::: {.callout-note} ## Note diff --git a/documentation/key_concepts/datacube.qmd b/documentation/key_concepts/datacube.qmd new file mode 100644 index 0000000..a4bb91b --- /dev/null +++ b/documentation/key_concepts/datacube.qmd @@ -0,0 +1,191 @@ +--- +title: "openEO Datacubes" +--- + +An **openEO datacube** is the main way Earth Observation data is represented in openEO. In simple terms, it is a structured multi-dimensional array with metadata that describes what each axis means. + +That sounds technical, but the idea is straightforward: instead of thinking in separate image files, dates, and bands, you work with one consistent data object that can be filtered, transformed, combined, and analyzed. + +As described in the [Glossary](../glossary.qmd), a spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions. In openEO, datacubes can represent both raster and vector-oriented Earth Observation data. + +## What is a datacube? + +A datacube is a way of organizing data along multiple dimensions. + +For Earth Observation, the most common dimensions are: + +* **x** and **y** for space, +* **t** for time, and +* **bands** for spectral channels such as red, green, blue, or near-infrared. + +So instead of treating satellite data as a folder full of individual scenes, openEO lets you work with one coherent structure that answers questions like: + +* what happened at this location, +* when it happened, +* in which band it was observed, and +* how that value changes when processes are applied. + + +In practice, a single value in the cube is identified by its position along these dimensions. For example, one pixel value may correspond to: + +* one x coordinate, +* one y coordinate, +* one timestamp, and +* one spectral band. + +![Example raster datacube dimensions](images/datacube-overview-timeseries.png) + +## Raster and vector datacubes + +The most common openEO datacubes are: + +* **Raster datacubes**: usually built from gridded imagery such as Sentinel or Landsat products. These typically have at least the spatial dimensions `x` and `y`, and often also `t` and `bands`. +* **Vector datacubes**: built around geometries such as points, lines, or polygons, often combined with time and attributes. + +For most users, the raster case is the one they encounter first. But vector datacubes are equally important when you want to work with field boundaries, administrative regions, sampling points, or spatial aggregates. + +![Vector datacube example](images/datacube-vector-example.png) + +## Dimensions and metadata + +A datacube is more than a block of numbers. Each dimension carries meaning. + +Typical dimension properties include: + +* **name**, +* **type**, +* **labels**, +* **resolution**, +* **reference system**, and +* **units**. + +Here is a simplified example of a raster datacube structure: + +| Dimension | Type | Example labels | Meaning | +| --- | --- | --- | --- | +| `x` | spatial | `466380`, `466580`, `466780` | horizontal position | +| `y` | spatial | `7167130`, `7166930`, `7166730` | vertical position | +| `bands` | bands | `blue`, `green`, `red`, `nir` | spectral channels | +| `t` | temporal | `2020-10-01`, `2020-10-13`, `2020-10-25` | observation dates | + +Dimension labels are usually numeric or textual. Temporal labels are typically encoded as date or datetime strings, while geometry labels may be represented by geometries or geometry identifiers. + +Dimensions with a natural order, such as spatial and temporal axes, are normally ordered. Dimensions without a natural order, such as bands, keep the order defined by metadata or by user operations. + +Values inside the cube are usually scalar values such as numbers, booleans, or strings. Their meaning comes from the surrounding dimensions and metadata. + +## Why datacubes matter in openEO + +Datacubes are central to openEO because they give users one common way to work with many kinds of Earth Observation data. + +This matters for several reasons: + +* **Consistency**: different collections can be accessed through a similar model. +* **Subsetting**: users can request only the area, time range, and bands they need. +* **Scalability**: processing happens close to the data on the backend. +* **Interoperability**: the same workflow idea can often be reused across backends. +* **Reproducibility**: the cube and the operations on it are described explicitly in the process graph. + +For cloud platforms, datacubes also help hide file-level complexity. Users do not have to manually stitch tiles, sort scenes, or reorganize raw assets before starting analysis. + +In many workflows, values are sampled either as: + +* **area samples**, such as raster cells or polygon-based measurements, or +* **point samples**, where each value refers to a specific location. + +## Resolution and reference systems + +Each dimension has a notion of spacing or granularity. + +For example: + +* spatial resolution describes pixel spacing, +* temporal resolution describes the interval between observations, and +* spectral resolution relates to the spacing or meaning of bands. + +For spatial raster dimensions, the coordinate reference system (CRS) is also crucial. It defines how pixel coordinates relate to real-world locations. + +If data from different coordinate reference systems must be combined, some form of resampling or reprojection is often needed. This is useful, but it can also be computationally expensive and may introduce small changes to the data. + + +## How users build datacubes in openEO + +For most users, a datacube starts when they load data from a collection. + +Common entry points include: + +* loading an EO collection, +* loading STAC-based data, +* loading vector data or geometries, +* constructing a cube from a reusable process, or +* building a cube from a process graph representation in a client library. + +In practice, many workflows begin with `load_collection`, optionally combined with spatial, temporal, and band constraints from the start. + +For Python users, the common pattern looks conceptually like this: + +```python +cube = connection.load_collection( + "SENTINEL2_L2A", + spatial_extent={"west": 5.0, "south": 51.2, "east": 5.1, "north": 51.3}, + temporal_extent=["2024-01-01", "2024-03-01"], + bands=["red", "nir"] +) +``` + +The important idea is that creating or modifying a datacube usually does **not** execute the processing immediately. Instead, you are building a process graph that describes what should happen once the job is run. + +## Working with datacubes + +Datacubes become useful when processes are applied to them. The main patterns are: + +| Operation type | What it does | Typical processes | +| --- | --- | --- | +| Filter | Keeps only the part of the cube you need | `filter_temporal`, `filter_bbox`, `filter_spatial`, `filter_bands` | +| Apply | Computes new values while keeping the cube structure | `apply`, `apply_dimension`, `apply_kernel`, `apply_neighborhood` | +| Resample | Changes the layout or resolution of a dimension | `resample_spatial`, `resample_cube_spatial`, `resample_cube_temporal` | +| Reduce | Collapses a dimension into summary values | `reduce_dimension`, `reduce_spatial` | +| Aggregate | Groups values and summarizes them by time or geometry | `aggregate_temporal`, `aggregate_temporal_period`, `aggregate_spatial` | +| Reshape | Changes cube structure without necessarily changing meaning | `merge_cubes`, `rename_dimension`, `rename_labels`, `add_dimension`, `drop_dimension` | + +If you want the full process-centered explanation, see the [Processes](processes.qmd) page. For more practical workflow examples, see [openEO Cube Operations](../cube_operations.qmd). + +![Datacube filter process behavior](images/datacube-process-filter.png) + +## Datacubes, backends, and advanced use + +Datacubes are exposed through openEO backends, but backend support is not identical. + +Differences may include: + +* which collections can be loaded into datacubes, +* which dimensions and metadata are available, +* which processes can be applied, +* which file formats can be exported, and +* which advanced capabilities such as UDFs or STAC loading are supported. + +This means the datacube model is shared, but the exact data and capabilities depend on the backend you choose. For more on that, see [Backends](backend.qmd). + +For advanced users, datacubes are also important inside user-defined functions (UDFs). In Python-based UDF tooling, a datacube is commonly represented in an xarray-like structure together with dimension definitions and coordinates. + +You do not need to understand the internal implementation to use openEO effectively, but this is useful context if you are writing custom server-side logic. It explains why dimensions, labels, and metadata are treated so carefully: they are part of the contract between the openEO process graph and the runtime that executes it. + +## For newcomers + +If you are just starting, the easiest way to think about a datacube is this: + +1. Start with a data collection. +2. Turn it into a datacube by loading only the area, dates, and bands you need. +3. Apply openEO processes to that cube. +4. Export or visualize the result. + +You do not need to master all the technical details of dimensions and metadata before using openEO productively. But understanding the datacube idea will make the rest of the documentation much easier to follow. + +## What to do next + +Depending on what you want to learn next, a useful follow-up is: + +* read [Processes](processes.qmd) to understand the operations that act on datacubes, +* go to [openEO Cube Operations](../cube_operations.qmd) for workflow-oriented examples, +* read [Backends](backend.qmd) to understand where data and capability differences come from, or +* return to the [Glossary](../glossary.qmd) for key terminology. diff --git a/documentation/key_concepts/images/backend-overview.png b/documentation/key_concepts/images/backend-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4fb677814b8cdca83e88906007998d9c196d87 GIT binary patch literal 33781 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�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 literal 0 HcmV?d00001 diff --git a/documentation/key_concepts/images/backend-services.png b/documentation/key_concepts/images/backend-services.png new file mode 100644 index 0000000000000000000000000000000000000000..c3584a616a9bd80cccbd54ac0426235a88dfd0ab GIT binary patch literal 31202 zcma(3Wl&vR&^3w@++BkQcXtTx?(Xiv-7UDgySux)hTy^739bouk>~yHTjzX#PVHTl zB4qE`bI$G_qeu5jxPqKG0_(4fHISVQv$fPi?EONt1p zxUZdeBRFFmw6k~Vzg6;Sy;C=@Sj9@)zIxiotE!-51O$nSSaOLeDpIGBI4ZERqU#6Y z6_hKI5PkNO5G)idT)^u)4p;bslCQ|iwI4T(g{w!+P#(g-UP~DntA@4J{Fu%Ab!sYy z&+B38JbiV!`EnSRhv)Woito`0c)yb(B7+NlyhVs4zCl9=5`Dat+()5gWM*Dbe3x;5y=X081aHn*lUDG8QJU5Hgdm43 zLOzwvld2`FP+8s$-keHwe>XCPz{A1RnkG~qH#rkdeP5)eTu`>SpeOZa!(2{bXn2@6 z4aKfViRtL)pi)lJoPjD@UGku`Yn~{{2a~}CTTT(8C3`BF|A1PQ!|H^d!DYo3vXHnY zO?*!Zyo%VR*4`(T%}*~>Q~p>E_@Z(OK^Af1 z`yz!(Nj|CtJz!5}F+wcj)g^JBN?ue&IUle87SNKtDE`=!JYc{yUUP=f{}_-}M8)c~ zUVqoxeA6v5xjUrXi1srgp}`gcFr0f$>(A>E>aCr86k!gwkD}4k+z4RwRlN{nQ1$GJ16E<+nckaQ>Qt|IT}d#c4TK%KLUjWUx^4Z9J4LoG>?? z(?mcB%7PNOEbaoWZhPTfuOQTvzN1Y20$>}$wu$xx#?{?n_!$~1QvaFBoZiksD9_79 z^W#}d0L!0@`M0Aere7cfTntym)vP36`C|Oi>8w`57NNWM?j>%5^50*x|Ssl}%cJ(U`9{>4JUW8iNmZaY1hx*x_Aiz`0%>&Z8 z;#iQ`up6)@6Q$>8wV2bmrUIW3t3v<$s4E-pO0y$S74Mt9`J+xCb?!ZAk@mZpCX|$6 zyS;rpH`&C+tte;VG|jR(9cnuU@V3n{%d3HOpI^!!Ue>5Eg(ovVZ5+iE|8(V(xG{vG zNq`WkmF^^JoX&QBlw(c@>8i;&?WebcHj zqv!5=lepJo2rq=nLZM9VThqaV14c>+TIXZM;-ICtC2EvS7k-Mo0h{QlR0*e0=@L&j zxtpsD_$$iK%~>r}^XwGpqtE{TeEBC<`(Z=RoyK4atO$eq&fJtPKlSrY@e#J0UP+X+ z@7Hr3I2I^gw%5E_Lt9hDOG6!$4;S&(sy<4E-mEMJoMW)2+s|5-TaCEahf`Bil9D#2 z#UAVw&`5VVI~*jIw3i(pMJmtme^ZO)d+3Lk$d@lFq-w__GGKsy<$WE z8gCt*=Wcz(L}5|4r)8ZW1v!$-g~Y!b1Tm8v@VDz;!)2im=P?nOmncpobCTfuFo?k7 ze)E1D%)JT;AXG*Bn>O ztUqjTxjFD6wzUxX_~q$IHxP5rdf5&UfW;G_xh|hSl3??ics1lzQe&305OXZ)R2Pt> z*3KA@vH=*mr$uL>c#akLiI!uk3~HVGusJ2!AAfY1@ZlUV8WLt&kxC^$N(~52r4L1no4I5eT`p?zEcg1pao)A8-=L=v4PrDeEBa)41w+ z)~^J|pUINS2L(r%s2rxFy4y zM*l_w$@-Mi^8WM`p8C(UF_#CBo+`SZwA;%YfKgI!=d9}C`-{)0sTC;tZ)9TQ6a7pMP&#eZA)2Ydf7AO;Nof8+4~ zAp-x4!~cf}eBktd2Hg0RxEmb0Uc7X5ddZucBmD)^4JUBl|6o11Ilc2dtB740R_Ab? z-C&6!=JkM%V%=r0{GEG8X6$15&vAhhJ@-yrT0ffehyxuj*E8WKEzO(7rb#(gDlnFLxZjYb8X7dEBd$7MASv z+8b_{v}vwKbiFSPJfMi(Hr+pON|80%^F_$Vtw{ryfa7thN%Zv4T6=f@G)nLqJBsfX z<2TBGJtXb-J4n;-{jnACv-5Oo58G*)vF}}TZT21i-%${G#IFW@DCSvA!sc=G`){{c z#*lw@BN^b-Dv|i#+U&jessg~ovs~ADvwUBgK7k?Lo`{6u-MEwm)IJ7wa-P@OKe@eK z`CO&2%+hilB;h)IfnVDR%SHY@2O~g2!S`ql@S|XXeA@NTOP|e7)=pw@We!LdGBN(cLyR1C*oi zJGcG*)Ovi)-kqSq`b?hRACybLem-7Vqs3{r{)TH;MonKsOXXoOljY~+@cZ?um9xjG zeLsQhs;9Fsuj%t1uklEba*2wbo9<#76I>X)hZJEP&*f9I{89JgrU!`_Z$Q}P*@j^D zH*w|Culql*&1ZAm`XS_Tlb&xTbNg^fGrVW{kUD;vg!$*}i}Kg=4t|-wk955rUc^pc zSG9P#gNB3@qT zjLv-cCb9IrxlAMwW|)nJZmX+#{&0%gU-ba)!Ihr-yLoq4m5fX_60^BRXLa>Qz1M8c zADq};zjrKCQ)^wBFiw0q6fe=W&c|B!hUVtX$;oBej0K|DUrLy?E5|?CoZYT)I4+A9 zxGPqdGeg$Ky8Wr2og+$0YNANtE7*Kqa8*@tQy8vRn#wy%&F$gQVYFCnR+O+9)}F5K z=|Rh{^;(;K;Jd5K+@Z|+k%^7tMn;f)I;`<<;8d~-N)EyF!?0SZA`NrT83p4!QE}$x z>QrUzeRC_zj#W+j`{mxCJ#6f^4%SSWtrp-6=+eeAGh2UUf&TPX3(MxdccJKFkLY8K zU9IeR`Gdo<2@d7Rd9w}mRkSluAd28mK^DYqW$j~+*)+S0c$*Kc*Bhs_>A{Q5B6bl% z7ol}gvGlLJ@n5ZvhkPT05I~@M?+z_D9AxvjdY|rZYd{TL8vY4_3RB-~AMP_+EPWjw zE}QIYe&%k`pe;ux>YWt@3=R%C665IfWhq*1Tt0Ti6C>2==N~*3V*J(I%!&#I{8uMeUfY9uD8ja7hXMk$QnwB;7&RZBF;= zC3&ue8bJULHI4S!TJt#?iArX&)Y~s8b=q}a=xyYjPHY}-*G}vUVqq)58?f*HxY33l zOH-|<`fQ!A#VEbh=faBsPV|#J<|Qonr&45eC@uyl|rkdiH@e%(emU};tV$l{LbRxoK0?%L7}xO z%hmm7K5n5{cU>XpBj=EtMw0C%;In4M zVWUP3L-f76%{}>`Ts+Es(`ht$utFG!vv~6CIZ9rIW;^uHeCBeEvP8|D{+M-(r>Bqj zs0#cAiS>x`sk8g7wQD1Y#_@yC@jzwUCGK?l;H*RJFFCon6jbAJ{FgPD6=%Qa)%S>z zs-GZFIYk+ol8Rh(>PuUcWa8(Av>;^QU!5IHGkl;+!ESbx$X2Z8G&!94!Gv6|{W@}| z&Gzd3y*4i|)~4)hkv*+V0q#b?eOebe_phLVF?Q~yu#{GKwG0xHq1>Pov#FBDH{0Qk zF|#dx|0c%F10&VNP|Cw%l%gDwGLKROQD}e95+`(=g1fE;A7F#*l3;oe_AV|yM(J<` zvl>r`B}y`7o|gR#29VP~#`4eV2wV_pdmQfqc%6rN62aB)xn` zphU)(2bsNmbqhb}0!;s3-8M;yGKGSlpt>-OtVLZ`c|u9+(^>o=gwq zI%tTirY&3qe^2fz8CJsqM|n=o4)C3w!CYmrB{Y4MP`T1%cCVh$cFe%^=9(J5j+UPK zYvJoxJ;(8cc#>QsgGxSqcxfb9jR{7ILG&OiUpvBfzZRSO74P z7|ZB^EGXB8rZI`OwzxW7y7pFI7~e*3`Ms|J8QSVZU$2MW?Fzlb8|)QaQR2}wSt7qg zb^U6gyw><3dd_Y+20ym~TjZPIacr?V?$Fv`qE>@<BCe(fhCA$~k;j$a zn=!M9k~7RC2)sLIGqg=@dAW3KzzC1U)oWPHb3ac$ffeb|jP1z4tPR<3DNl*sZ?STB zm_>~KP&=f~*sWLkf4l*cDWNw{NYxjFAEToGOjFk{pw$+67^`S)_}f)T%?yUpO=q8c z?sCXWkb|ZxcDw8m7^K#} zYFPPEuZ>aygO+lHP4XRAWtBoR#CCkWDhz7de6AB2GAQufFmGW^fWjlx=UW^p(lU#? z(t|7_nClK7NgIY?Y)xw8JO z!xGcEN=ix%yLW!OM`uNSScotE5Clt#Q7--WR8vL^pFfzhm7*P;YzODTdI74~CFa7f zI7olQWMy?VF~E>URE;%LfB51bjHh8!_6X|smsM1-L(`2&qkE%=wKG!q_W9{*VBb?8 ztkA-~fPA4h4#b*xGdf*B%Q##-gFMYzd;ve31tCD5vQ+atvmIjw^qnCbeEiPFjOw8L zoD(H7`flfO!uKaXAAAHhl)xFSnbgI_tI6*>nQ2{4`3&Kk!(e9+O3uP%>%WQ5)@jem%E%o%3*&%R&Lla1a%&Zj4;@+z6T z`p?x>>GX%2%(4nUuJLj~KMW_lxagd}o{?tI%@9Aeq;C!PP;BXvmdXg^Y9_l!_g5@e zsKetEGstC67egf0PH8h3?xuyCd%74J=pKWJ!oKExa_(SKbgB;XCFxE@nn9#j((3q3 z;_ot$?M9xyWtvLI#)B1vlMVsLo-r??7DMny2qZ*QTieZSf7M+E$e+PQMl!s#+GcuG zI5%M;(oXxGZCbnz>*Z%804WM+DPxq%+<+J5o7VnPbKg>BLl-q(AX*JjsC*>sFY9nq z=RjEhy-Bq{sKgiuP??hHSn<3UU{XV-<#gzeOG%0S2Ip}4{e$&vYGbaNk9r4{e}*jX z^2R66ciY+U0OwN+ufB|U77O#s#@5i;;Km@5$?zz|bD-f& zM6ftOdY?z8w^q@UljkrkYC)Noep}v3yRpJbSVHYB)GVm|%5seoRgM%1Zg1P9Q?|^U zQL}>xQ_2thKsDd8pBFAFJij-_n_hLoLA56b-#)^ooadRDGGq;E6l{XYK_u(?MF<); z{1ri1q=EKX#qQ^N`?Q>$nv^c&;G4;(D7Zn!&qmilOaqK|p^KlzWb`QQrPBf70z5wW zt_w1r+n|CQU4sMtK$NA8%e3V;&uAl%yD3a#7tkXWl~jYRtU1Dp79=`k5NiVkUCb#E z&*~VFN1#aAK>h}Jq2JI+MgEwpG=Wl1eeLTn=3{6#3BM6&ZMhs;h@seRmH&K(eDnhX zyBJ`aDkv_r4-I5E>{?i;J%L!5#G{{GanHn*WiMv4@a2)~Hscx`mzx*QuVeVFz zA|l-G+^GG@n*a)>DA0FDG$IO*_qVci0#b}mb*Uo1*GPStg4z7Zhiny6YIi_NT0Jrs zB$!qOAMR(!YC9q%8z)cWn*U(Yfoeo3AE_wTtdI|ALa7*0TE{vRqU#Rst|!?ZY{lgx zn@MI`LF#)JqhY(SDf{c%Xl(7{;BpRJ-_vkoWLRM3v{kYO0AJV-v~V^XBsJ=T2vt$> zS{gCf*Iil~5qoG=NzJ?;shY)K3|lJuth~W@RFj(0zLG0Iz*UaPZ=WXim+zg*#P28^ z`%n{m#r{MCg^g7z+`v^mVUSx6Ib!%h0jI^5&P0FM+B~IFguSYP)WKD)?&1TIgU10O zvW=jWkm#A{z*$G9Hb_bu?MlordU^(IL-j>Qp81}728Y{(ooPcqw3=bVShS9#2Dz((q_5r94cvB6u2B6KR+|eS* zq=iZnBnI$!OWkfkQC6EyUeASuFx2luFz?PQS;s@oia$X>P2jf%sQ|cB=(hdc|OEuQARr6~1-#v^$Oi%wZ zH5gvSJTx0cg|FaPAYdu6d-{E(0@W+AkNI7?q{X$7j}PJ8vv2!CQhqGxXle&%-UZZz zwTau`S}kYIIl6fOGMu?#YYdTj0^)7nY@HO1)t{6LfaLEir2Wul+|*cA6F-Cf4!VI7 zw_-IG-2k>743fnSV72+eeuZTt&C5NgEjFgo5=3icskGq=L>W(Upp;EX7)6YwJ%|CP zfk8Ezjk3=-!fDbJ{Yw=JU9!g2b;MdHJO;(gV>>blBoch#7Jbb9l>236?i5p+pCSFf zR2C@ijdY_QW?NSY7ghCd_s{CNZB$mE6w5MNND%S;ET*>I-|QhGQLvrc?157+_~JkP zEbRF#Z|O;Z>gH~49t$g^TW4S#oI<#JGc+t-W)aUCj?kb1{sDuq2?jt(JwK-eD=l%9 zFJaS3W3#qUZ6^M^sIJ|HsYuCQX@E?%t&|uWy$f7_P=>G~^6K*BvQ)~DbRc4sFP=e z?QJEp$xOyE&p4RmQ30_4SUj=AETuU`QI~i2>L-$Okt;Tcnd>Q*OrZopRn=x<-kw35 z_*x<9lO+tqa#ClpR)?5?ch7g?A{BQ7n+yXV*uHtbduX_rS&b%I-eH3{NQk7GdXaMCQuG| zVjL#o_u8QM;p@Z3FHn|h8~C@(ZbF|-K$t?*Rc*&2zP2>`M78U4=5kH}3H68!Tjk4a zU=_yI&&*@Dd@?+|H^+hCgNbP_&%4O&m zql2J-d%i*Bg*#A$Bga3P31YO=zv3?CyR&J!>tCkeH9`C-OM_!af2?Q4X#lwu^hqBSCUlbtyzxngg z_--p7IBl$kH$I{4MUo*L=W!8_BXu+aQMt=9W9-=$_PcIwzVqsml0m<8fcQ5UBCd=C z2WJz3WWt_Z4+tD~b7`z%goQ$FpjF{#lOV8MBDhTKDUy%u%EM?5r+aH+G{*D!bIZgo z&lG+T9y8=3BfiYSFDh4{2=+J@4qb3RIB)uNY+!oenH=Z*_c@Xe39`C&>q||cdslKh zme#;Cx>XJ8Q<_$trXA`tb*j1XURb@NvD-BmHY|J~!G(YPC#dNwcFLI=YP&$Tj_sdMXsWj8VG%C_ zO8%X35Mm-{5o!HP86R7Q77_vWI&v5zP`bOYX$xq0fbMoz$F(dXyLb-%4AwZVZi91K zR#T&EJ1oUTFh{b?tD%!)JW3y_Y$~`O`9zCP{vOaHAaC-hM!;m@GqQOt2zphx>H9OE zgm5iTG?f~iurw!HDUO(cUcMh7t`mty*0MlO9W$URSiD$+Dbj!;uUJ`6CD>)RR1$8H zTn9YGY*vq?5tLJ3B9KPlYmSFm;u?Ai{_Wb@^eSYKR3Ia?#gv|Wxu&tc1x)WiG|fhw zzgCnXCmSIz_A+_RSBh|FKu2qV12n3_9H??(43qEClgdQVb1Pav*N1do2sLVAa(Vc? zhcP!GSG0*M5kUovbal~D;>S|eDtTfzVf#pq!Os%AZsxLf<2D2>ZMTUQ$G42~?U*4B z8_mX&>We)(`l@tBNz3beFoY^y+%MXy(Dg@~mIIsR zj5N+s@xM^Ti~}#kUJ#Ul8YiHm_GI(LtgAdjQl+)NAN2Xp-hr$DI(8KjP0QZrov`;>Sc0^#f1=BlfJ0$qAlr|LO3{W)h5mZ)g#U3Dhpd5tMu4P3Ac^*kb+D!H@JY6lw8W^hr zucy97mmV_uS)eo;dE)cA>dwZ}(Ww;S$Mk-$PZ&#}Te?Eg=90x60UtN?Fh9S@ z#NJiGL-{|;02@m)-C4o*l-Xg*nGz5utydZU^H>|bRRDU6Gj?~rYOP|bFt(`P8;nGP zbz;$&!njTX{kRwV?mLx+Wt`seiB6S_e>B?bWQJ!eE>}F(m#Kqq`a)lo_Q@gEA(~7f z?v4K+Vujb1aD)$so5poMo0+O}Z=PKx)9^6#JaI(C1z3$17MpPQG`L?wHE>l@kcw*M zx}86v!wDsO7)#vR1GoUKnWd&sF;~TTez5dAe`s6+)O|{8FDbQ_Cad5K6>0EakjIOh zqea1kki^?Qy0gNuDPu0?LEl-gHn=u3*-GHWpbbsFR_a&lbu`J|w=3H2lHBF>(_Vkw zg{gQW7Ur!C+}|1^sZ*`Z1{XH@9v07tdi^>=HLg351zWmk(uMFb>R}SLLV=zBNsipq z!YJiJPkou53JypS*0vi|gr}KldHL5g@?cuzZlxuxk`hYv!o;j|zZog~aX~d$xb2F? z*$LbhjJ4Hk&Q+Qde@D$zQRHN6DSyyOFovG0RM-hP%HfUOh5B$HeAjEc;OHK|U2XPC zt$5i$y8*RILoV5j-0jz@zab8LdJ(b{KLY-)u^z@yp;CsIZ^Xr+S2Uy=s6fhB*O^dU z885U;yFC&Nliz2+v-g3in&Rah{b<$-IlNJk*Xdejig_mnU}uUl3!DV32$EDn5?;m+ za4<9TQnJ1dS~x~gtO~qV*<6d}$ZCo+|N4N@{mD;NH(?7So*hQT4`}VYk7J_EyAOhG z2fK|I6(ObN6Mnl~Yn)Pp@H^{m@j@(J3CH6fS7N?XkcS#IgaD_4-h-jT}F}ls) zkX3Cr@d!RAyV!qPYCpf&ps*gsUbX_z6NU#}D=9riR5g>{jIzo%+aQ}{2+hBez1^|KCdB+O?e(faU~!{`IGwZ!HDg8P=y_= z)K5CbzVzv4ChiW#y0>~wf6vH3GU*VlGY&_cC!wIZ~jz%W6SUqKXxiA5O%zkxOwiVxbRi<=n8}ghIF<8+E&2CzCj463j-*m zQc)1Tt@c+KdXs^_u)m-!omX&X^fv6C@$S3rPT21&D~0I!Q@wem?ke0-=?v-IQW`Us?ITgWJ6!tytWp4& zuZ@p`r{_b(nq+_}=*i;Ab;-&C-x%EfpTI9aPInjM1mZ!>cK}!F?|w*=wrk5FErmgjBzkhUJetG<4)6paY== z6Wb3?A}#Uz3~1sJhkL8f%y>i81h7s45HYZ};Q^mEh?7eHXST9-#K}Xgol890)9`xt zed={vz+Tj_Pw;lQMh7e65eDd_RoK5A)rW%V=A^_OL;p*pa3RJ_{bRfiQZ`!vXS($z z0~kQa?LoH=J9eF;Q3$C!Jwvv^)U$A^{@-W$4)A>N}6=>%EF|!wR24jL&S;N4PPhr&3>Wh~tx(mFRwJ<%;&H0QJ zIg@}20c6WJwJW(`I2w9A4DYH^&>Fh!GSfK6?uHT{nq_an+8yLB@f3P_TnX#xa5VkB zZRDbydI+?rtd;&QXZLv$9>ed0DO*9~+7Pn`^&p8&{0M#K49~)cq;Ar3C*r0GZpY{6 z@#g3R~HJAWW&L9K_yD#>BG353QYof$Bp<^2=2ouC0lP z+n&yGPHgqS6mr6uJT~dynyX7L{HRV5WEdTxuW=#jE;d)5@>kZS={1$~d&z`s58xrv z@>Bqt_-3Z!JGGm@Uu1P6-4qmtSKsZUuDS?`K}EBu1c1ri;wpK6h;Nd0-@HV7w=gzl z0!E$$HQPifw}O%5^^m1Xwgs(T;_pYrkGlK34HPX35A;yJ%hSc>;%heOR7sPw%kLOr z`%fJ(dSvv!01tm`21z_>Y$FC35+V2+{}p;n)Lx~JcUDbNQ8}Q=6P_Wc*7W~sL#c`> zaz%wis1<{65x);qXe$Sp>*j-L@#IggqFN|z>jY2KdSJDNz=iVuto<+slj#gwRL$7E zQ3F^&&Ea#{wYJh;jctw&Yi#qN!CN4dCr+b8kGl^It)^ZT<>kw}$}xv%Zn;Ez! zKpT*N&21l~rdktvMzT$8#APS}qSaK!rmsE1SsU<4KCKQ9er2!?;z!fXjY~To_+Drw zYVS6H0T~$`yBTnS+R7+XK$qW1$7%lH1aw{tjfM#kqMQN+im`tTUp8rcu(E=3`_IH` zxbcWR>=rNrFw5I0X%P_yk>*G%|8sR!S+iZwwo01Nb@^F1r?AkNgI>N?j^E=Z0@!4G zZ$$->zjf*zkaSqcvf3@wnSQL&D!m1m1*rFF zChR6ai$d3$ctF`Mvcd>pqAde)P;hnV9iMCe9SODdM8qD~U4o~34=jTcp(&dsw*KPq z$xyMlxYEf`F5k)qA6}pc{bI7%yA>{#!X1^I5yvT<0IsdUjDDrjoFBU}$01jmk@BgP zblF_BwzJu#R0PzYS5>{2Fn<7Ulb%Nv1ZISvCf42{8fh1*3jSc)*7`N=!}~?BWf&)Z zpih`t0F~Y9Ut55)9DKbl_mm!6<^?jW$zRBD%{qg^NLiCOm+;A{F9hfC$LyDHBK<5L zG2Ox2Ww-!P<^L6mpkUBl8_E9$mEP6w+py-U-_s?Wa%E6MZ((gigdmi>)tYZ;t(Mul z`wj+HN8Gjz9{NV?&CjlguJ+1Ot@JLxrvh6mwvD z{b9_gQXRZb!4q>v_yS7uUn&6NK!JQzJZS5-v8t&wuVOJXJ8e^z%xQ%nFL@Nb$C6@U4Wxp^sWNKAY42wzU^~)qq6~LCPkb;TK-+s(c#MH zX90xJkzQXJSP>K}v^DO*feY#swKgGuCDXlH?G4I06%KS=+dE^G7QxqhXLPCZ%rowI zcr`lyi%HlKLYoXq0%!es^W>Web2Ro@IknaHWItC=kh8P-G)^^o4j<$^ zztBkN!XeKMOgWO=lYW5*)`7DWGCr9HfkEbm(3UhWMOz~!c1YkePWP)eI)widR*=KL z&(%jH*q_Y9m5qzNr8weXW|QO#mk5Lr z+Z3WEz=icYU%4(njr{(pwDBibpS#LCw#+Zjug&f!kVw7{SiKtgt|`NnSXUKgHP^#f z`k%W7LJbrc6<0O%yPm+<&J7-%f3$;*$exZ!?=JVgzp8cc{`r<|AYr^U=}&YYg#@tB zv8-uUEF@x|^!|XM&(!7=nJ6_O@tSQbO3`EU~W)Q-4AQ(Nk~ZOu<+q0HHe=I zEG3@R`}1nM=JOvf_Tvr_qw+bAW_YeN-#P(`5)&SlN0JU?K5Q$iuW|6!h#{>ik_Bf3 z?grV8u7Qj{7USUS4W&zK9f`s_bbrr!zhWYV4UGe1E{HLbF)Xd;==$!4(O)EYQ}(vq zL9qiWYkegNwZF|_>95PkU16ADRIK5kW7U39y@9PtlmfmCGQs+!2ns&_f?DSQUElZl z*6ZQT4-ajbaep++@2?T^To{3t-=@dx{$@ZTa@i6j&^`ZiU%QpgW_=GRz^DCrGAk1( zs0q-U;f6YZPtM0OwgBDMpKphVaqg6L`J7-t3JFF5W-8=fQjuo@G(}t%2U$sQaAkHJ zKc(lZhI|(O8z=HJ21l797zPZ{Q|djd(=;IhhKgRVc)qd4_H}Z*KXUftL~)1N9}R=5 zMDyow^t<1V+8h`hwy4~`%f{`(f22gEyNAof&%RSF58p7=XXF@(r|2`;U8Iqf`j?WO zKgHoH;7L+9nDA~t?y?U24y2Y0haBHEYIa(lECS|*2InO6i}l}jxB8zDtU=z0RoA#O zGFv0bad}4p0hQ7aLm0&vOSfNHbSKX$8$ht{a4CMi{E5V%9RI+%5(q|-Iw zn5%v&A)nJF_k#1REuA8wfz(Y2R19^Hkp_Pg^T;K3h9`g}5x2x0oIu05W zB6VE=P`3&NFD+#^Opai<()a1WC77I?F9c|6w*1oIRSoNpEV0V`bygHdEVG{?B7UTb z{Vh(>stpmomNuAC1h`mp(#Q&#G%mf>5@yO#O+o=lOM8ozjO$5*EGv{r=D(K)dbA%y zH5v+99T{xyPQi|@QZbP}3<%-kL%h=tgTb(3Wuu5@&Gs~U2(MGsH8t`ozZ`f;MtnbM zJe1|Fj3=re%jTcwd&ZP%b4nJ02MKl?2~~hWjAXrD(GyuZ$y@@DpA10AU?dobP-O8O z1NV$ealp&C&>*tP`ptQV6wSVS@M|!()gmnF5#2thi~(bTFSa*hrp+pR zii}(YIWzWx4W$WdgU^{EebL+ZDl`p7N^PD&yJEohW1{*M7PGGL{BNH&R-Xa&KWlc^ zsi85-ODd2K%9+V+;u zl&N9g<5QzS%W8<5W5(Jvj2eM% zVlXE`Wju+P7p4Z;xe7V}HO8s?R+|$rpQK$DNqVZ{AycDgz`rpmInm|oKTeuY1hwn3 z#~v))1>`jc*T6ek-L*r>mU2$UJ})B{scjCYBlbuuQ`)KYNTfm_v?!Vc;v3U24CZ}q zKjs08oh#;)V&K##4HTAldUt|Z&wumg=rO#9oA*~tJs4Qaew+?Kz`kg+OsZ;&JzceS`kR1R#Bva`8K5ouGqCwV~&>&>QH zfO1AX>JtYj;^`K;hHA5*5#}HFxd?7!%vg)-Psp6bHSWkg+z$AdS`)68hR}=tVjh>A zNbo=-H|f5j7D?!$cW(>8q?GrjV3BbDawqSP-b7xvPpT{~wh&!Xa$_SfuO}Z5V|B%> zb->Tf;{{ysWH5zDDNsXLpULS@djcgISE2j{1R0u67s=CdY;vd{h`L(OFCh59`xZ%$ zmnc&8-~$EoYZBrJ{7YqZHmvdrF54eZF3kQNTy7jV$%A`cz~%WJ5BP_g`(E;G*8FEj z#{;0do&|%H@M06@2Twn5K*K%;l7*ex5QJxcN@jK$CzA%$eaMkCU4Z1K(EGRIM39P* zVK;TW_~`rw#>AjblohVbXjzUNgYTGPjxo^$PjPG|0#VGCE-(4;5Tp<7)z z1lubrw^HS(tyr)M(Yt;LpzeXrDCzTQme65dVRm1Cl}W^`&9KuEOy#Fi;fb zqSvJZi~?n~Qr_X_q2!?(q+10tPv>9pWEZ*f$(O#e#4%boT!){TH@Plptu1 zOwnMzD3ljb)ZAPis8Jp6$NiI%tM3bCl+-MMT)yQG-VO3I7-sTTqd@e^8l(Xu)QD+U z@-uT0IRg_fXJ^hec}VwfO!HqRi?>*-vE16>C^MoMt#mLpr`&RR}0qZ^jY|$9+wxY=WGQE_**ZWyzPl;HDLbYi8-PohJ;+M z3VC2}^rmo5Nv$uVsNLfg(6>p;bwVwG9#xP&o8*b6j)1!n$Tu?7J<8WB+IK+31hRJC zl-Ps=OTWY%P@!{53p@pGjmwJLfw~d_ES`00(N9`^nJgBxR zH*D;Am@eDTh`Zi7(FyejLA%;TACAt{`T%GV9@l?y@1&vLyzab74P?cE4VwH30v|cA zUBv?D@!nl(URyL;4~y~9t1I&KuspFsg!rEA2$qz@8dBlgw!i$UDo$fC9nJ zXATiAH`6)!lhGw0kLJs<+dSWr1ZvZfvObtRa_Bb{FkHxfC6sz4YPiCqGjS`u0Aoi>Ko%^?;NPp28ef9Spy5$H$%|yX0{h*`S(P6 zX$wwxdjCdH!~CL6$XN?44e3`AwASb9T!6}ISWp#r1uvGCeiqOb6q&+1Iv0sAqJ-1^OH+F5dljaibM9Ge16N3mQ8A5IH?!A=@DbT2T2<9RN*k z5z*-+W!v)=)5|jW5@B9)k2_9@eOIuc*~G~M55uy1R~UEkkEadjLn;f6TWJ#u8sz2( z)3q|hEVB1t{-uQ9C=Do>CLBAztE_<}QW?XrtT~k|uYfm-Z9F z#23aH7y5Bgw3USO%3fT8Fc%FW1jSdo$HAWn}N zKmj7X$6ZU?BB%}!1l1GPOZ_P3u!p=y$-j4FjEV(*kuHUY(rfvq}0-#>yyfo zmDKknNR_rNP=`A}G84o`@hFES?w5!?cg{XS8OTf^1+ny_ein|HE<0iD*c8OwMa@k5 z1>j3E1q_ljs6f439Fj4PE=BxATR%4GH;K2Vo+;)2Ja;Rl=C4nOt)JGLVKpLrp5;#j zlf6Vy0O?c$C^FvcqR}9a&~9Qn>N!eC~7 zHbc2YIrbfRV7^vowOpOPb31StrJ7_1-1B*s67y}sYFHcE?laKO&_@>v{P7{05$6Fj zkT#eHyGB1sTW@Ei|Gu8-_oCSsM>|Bu1MHt%MuT2nIr)Z)MjLmpdJ1TK{-9HiLt*Gy ziRtV-F8Iv%LIx@6oAMnvn<;!$Wt8gA-v1c7M+qtkHowHRt)W?6`1SX5-Z*kU3t-?Q z&9__=|F6+TJMT}82dw_85-SR-UPWEq&L=lA5LSX`Lo?G9pQ)#MCSCRED;wHY@^6zB z6nH8ez84(JRjZ-enVi>b2~fZW$Vk;md^>dm0VJ;hT3iK-h*hWOKT{Jaj}5vfG|6;c{<> zV`0@sID6=_)ZM9)i4^DsEy17I4S&E_u=EgHKlDR4K!y&^qXIaF=lsS>rn$)(SIeUH zxvK>zwQMdCXDb1!OO2je<17sX?cD$hlG_wsFrYq@#`gk3n2jCmRmpLM=?*cKa6ZtW zZ7tW}-iBQK>y`DlfO zS-crl8>tbZ$V)B3_g-7YCw#zhopcbMlz;V{v4&kR&eKb>>dHW;i_cOVEh~*(1-lSK zYB%9A1ec`aaVMw^q`c9+Kf}75_At2NqQ)&Q=0Hu=reQ7ys;iq@R^fVW5lJ+BZjiG2 zk3AtWNi$kmziJ45`;r|OU?FR>`xNhm-XgNA~028CC-z(}KekOE1hqkzD z0SqJV#@o}(VqMw8dlK#|xnVXzR>GNr8==8hO!#GhWfVetd;<0u2mFTysH=1nd+`R~ zXlj5qj2FB&x-9M>Nf)5+nO?O1iXUc9`Kp4!7@;iEkr2dd zx-MPxXwq%l93s9BkRC(b&nE^7I_7a#FY4@;CM!Q~k+>f^NRLTfUb0j3 zy_A3oIz8a8HvwkUVhctF`X=axh&+>lCsvGp;M{{3e#nQXL`w_a$oaVa!9_<%hAB6T z0mPTKbMX@9o#M*}FkcD^1c5Hlp|vs?vX10n0&6D_SSZDI@rcSP_l%nk`h=`AUn(bn zbzI%9fMigKDqOg-h24nsk5X!4kA5GS!kJ$wY*EMDvs~wI?%!0Y~bo$Ee9GtKc-zD*)2)Z zAQEnPc6V>th=pJVv@&DJ{TgFw@b?u{IfV6a{gfs}!8w5nU zLApyqLO>csN~F6tARuf&LXZ+cN}8>(De2tOx#>6)pZk8F_niNS^E=qqe&i+?Y`WXS{(mR-^yx{VHJX=n%<-}>C){NX?#rZfoUTXcKpo5l(@ zgLAnmZ^?Fg$r7aM@J^_St44|l9cH2ecov37&cpK>KJ`BNO31G3sY~W2}d91 z61#u(g42E>c#nA!7>S~ZeNIg7<#}jL5V-r?yIn6m4MwTtj3D^+jf*;k>b-tuf1UY> zFn`C+{+$?YQ%Wi9u5(NcYuzD?-_*82S|HwTm)tOMnc{vy$wRd0bm$$d3<;mR3Up%^ z3)TZ1o7l#pwT!Yv9>J9VF|}9Tzq<3Fxf(diNUcj&Um2@_FrII3v0h+CdoG`my%mn? z=3GAiq=ESPgCzt*_jyHH2 zPJ@g61Ln(W_4=NjepF}e)24TTeP&_rk=~}&3pR?BBJ{dnV7v6@DF*=wGh$2oAQI?l z$!b)FyF#Bpx_o-2KrNJ6125y2G^8LgI1B&A*-mbbZTB7E0k-+b4c}+?j|{V>_Y;I{ z)YtD|lVYYEWm&!lvnd&hXXWR6)VCs6n??a7^0#N3BPJ&wtOe)y4gcAmE!a_PduWyD z>^w^svQPPW3!j+M@D{C_I?*br93rop5kBmS&xfn4&d>ZfA2&X;1vnUCB`xjK9-lza zu0IinEP6keX38rc3js^u5&C<4|6_y*7ihaDh|j4viR$1G!cEB0iu{o+MKbj8;dp#Z z{!cP)?0h!GFoq>v?EJ4RUcd#enX+5`2b(nQ*3_Gnd-+S+B#)P=@9~)9W8fLtXsD1m z95Cvj+N++VP{!Px*l=hURQT2b>{(PCyy^Sfo1G{fo#ui*X1NMVljm=W$U0)yn4QL1 zN9`hTVOYH$pRKx!``9UdGYC}H-U^i^Gw~*r8HMwOhNZTf1v4IdHi%M?R6fzx)}vTd zarG&^uq%0`C8sAnW?%tD)Z`J?-6;T3z2Ey`**U;dbs#>&WAghWSlWHd!0H%BD@d)d z&9|CZ^|C6wm=o7F7C4qmDSf$sHB-lk)coz*y$1AeF~8!=FXAVvOGt814!d}5c~w*T z84+#On4Y>k(ea^eZ_=VV(*Jgi+(Mb}?H4Txf{itQ(%1aFf2y5-P>D62%JMKUYUg7s zW2@^?e7kEyNBY?8`&2&Bds(eFie$gloh+(ZyyM~VH%@ST{rtR}`beB{9gwMIe|{?dyyKUdzf z>%9WJ&H@Cmk|^>K$P$i#6+$Z;)by$OF~ES;GVA}uFYfxs`Vc0LaG>*hb0PZlbv+By()+@Kur+xsqw=z=o0Xl=Ivvkp@X{ z{^mC@J2p2+@EeqdI&+O;bHE2?u=9bN{({UL;7y+Bbgd%vH5zA=F|8Er1axuD+Mc0_ zKULreS>%T~_9(X!!Nx6?3L~C{)p0_A_deD5t-;3!x?nt!oNXnb%MgeVh5LgaL-##N zh5|boLpSkK(kg3C)j(9XG2IFP+Ki36DAt?D4~t3<{rSw#hV2floZnkv9QeP$mR{;< zsB`G>J=UR!TgYg3zPrN954cr}`>l!6>?RzTBgic7VRS|A3ffeM_TTfaW@Zt0GIVUe zWAX80X}s^VXkR6M0e1$0SssI}yPI8YesoneBVakH`$4U_r!^tG@SS{D-+i*aJrr-m zWlg_Jhh&$PwP&O=vNG&bfMe~O;?&CISfGNwd?jM7x-CXXr-O#uYs{!M>S$d+MSdU? z7$TjYO%%u~U>gq^D{_di;R^tk;b_@=;+f{Y6H6O+gU*@Tzu)xcrZ$432_}&4JIXa9lv|cktd>6 z{-*2%PLnTnA0drhP5>gbX7d?wd#qA|ENFy;1)OsLCK52nNj4c<{4Bxu z8SYPe)GcaT4J4P8Bnc*|3DlI)tSwKU3I@Zr^V0k^*)2o;PFu+-T3 zWSU7>MU!u`S08Xxo|o_>IV%v8lr>RgkccpS18eZsts8|ITbD<%(Ut36y8>&c?)}oQ z)S4FMzW(=;Bk(z-QopX6|3ov!0$zBIS=Om#nW|AIPa`?DjUk4;!TxDgRbc(#K#>?S zL~$5cWq2**phc;b-{r2a=4$0K!g!Q(PSRlYaDY8{y%1kg`Zcxm#wgJ(Wh&B9G|n|K z8tr4(5_TH*H%|U`UoC@C-CZKllfzRo&-Gf>F&l$aWO%

qL`UzuDQ+?8w5kD=x&!d+gPA zJlV>be!J+Up`*8fEUj2HDtR<8Z4B;^tFKg33Rfi%SrKR8hvOJk)YV&tRjv(mQUzf| z#GA;Jv94<*>tNYwS;m3viVL_k7o}9Y91hd(84N$MUfUFVzfHq8$#oF&43bkB+r1RE zjc?O|50G&U|4GMpGI_C{$7#{9Q!ZpL4W$j7TpY7l{i>Qj#MoyajcS22{B$}W)=fu< z@_%Ejk+xM2*U;<;9^;35H1Xtigfi4jh*ENm-3m_GCgqjl!Kuw+jQiCjmepq>x{y)A z?d37PAE{@Gks-YwAy6!W!u6Oa- z7C&_OmuEDjI{aQtV?4S4HJZ;IS!z10&uQhc<& z(PG~G%2`G| zrA#b2|MUl%!U$tRRZMFkw<@otaE@y3Mr~#rD7E>qRyegaaqcJPVK0v8l=$rCTX?Fx zB;N+cBhUKdrSTHJ4NS|Pi6tgXQ)%JlS6rn}5|C`BH<0cWr_ZtQmJTf2Wd0)Fc7qFr zL6KAWwTuZPOI#<;sfRyawq!BYhYG9BSzpp2;AFzl=AT*bBd2Y~9inIqa;BTGK*PMi_LMv$jy$J(^|zm`Ocm zl$W=74Bx5C^;3a#c&1C>@J>Z`DXt82VE5>4zfxDrj6)Af9wTQe-wi=U=Mr;`IUDm3 z(}1qAj`1zw?+fxz#~}1#bWB%@ovCkKN^3&woK9xUzo<@9i;=ub>xOY3S@|v>mtaV( za9u_9yoayLSg)K_M#yHQc;2?{DOUVo2N%+95n=M8>{YbRE7p>(qiQFBU2JJtOK;}% zkBh{!AJK15t}?)_s8O$A2FwD~wD`AQJOux&`+zjwv@7}wq`QM+C$k`Qu3eohw1O0g zjMK2mqyu}DHwZs^Ig&=g@7I@S;FDrUV`^mVy1Wjv^<+jq`vAWYRTtTk1`rY&IB?t2 zhWp`rQ=dvsH?Dv57C_w1DRn>NrS(dEUkHy*W0DOdbJW`PqSD&B@>Xw_6#VHjZ(SQ- zK|~UKNEReQP0A}8Hxh$nK3)bTmheKE{}l=(Mgu84mitQ`JeC9cwRTgW zZfbhJ(j!gn`Ly}>5z@%0((G5{Bc6GW+{|aYOikI zeozF7U742|Hs>j%)>`z#KuUL@y!{zuV38Djo1nxosBXdaB%eS&H(WD6@LlbPw1&gH8VaY06f6q zb2P4HUwf6YP8A+o)6i9zsZcVh9&w6*nz^jP~8S(q|ngqnL6p5;TGQu3l16o zZ%)gdl9iIFx$(Z|hXl}{%l2O@oPeoxOCJ0GGtvk!(q0`Sz(o^5OQfoObf;~Z4_4$!HwcX=}N>$87 znMa)cgALISWEl^puyFLMdEDA!6-Sm~1WV+J&%VeFbF0-7JGHyADa$bgE(~83&B(=A z-T|5^zY_m^eAfpt&(v8o4(#x}#$! z&He{e4~PD1+{u1A3e2yvOry)&dMZsaxEd;7FvDQZMWxie8}5Cvx3V7GXB!Ko zvT@;E8PA;)3Y2ncRdS>fAsD+lOMh#W-`A{3`dG>`{wrcj`6&h?1x7+PN41mKpl0|> zF{=(c>Dt=GpI@@))}Ps6P-}JAVyh|Do2D=GyfRKVEa_~j?<%lm#jkz9q!s}y;nTQ!e{S)T z3eA0hbAybtAshgN*On3&I!wecao=;`hSZeH1>oxH>X@_?6#5wJBSv|xNB!=T0OJPe z>aj2C<9+ISP+6ZWY`@$(8_l>rg!q4!TpEYH8*)$}hT+GB#EWW`aWq!udvKI6jL%>b z`p@PnK5uo98SafzeI&wFqfUIZmGYNG5@!aM^8}8+bY|c`epSjTrg7cF;}xkxt(Wpm zm1sI;p2*Njzhvv3)Lw~a>MC=GNXY!zYxOiKC)vHP9xW>rBDD0`%|d~R+j@VdX@yKO zRfrG$0bu;*h|NV&w8*DXxT>N-I`i!Y3tZcO-x{7_ryMRaKrPht1wJEen4#0`_y>tx4Q#tp0> z-@m^YPkd3iaf;{D!RXj_`4VIa!ViE6u6Z90OM{pv2399JX!Z*zrMpdA%O|p7g|z?p zJ^z>uM94(^rFb<(;0^w)tX!RTNn9(SH4SVl-I~}B|&7T-V``$fZ5WBc^zWliI(porvLA6 zM;#yTZAe{Dm`b@Yi?tPY3$Lq_W!E9nn+vg27PVrYa`Ea|gnzhDepE&roIv~w1Gk!F z{{868^eeoopNwK~-7M6msuw)JZ9R+sNtF1txJ|LD8Z}4YP>@AlU|x-zdF~iZenPyP z67r$qkmW^lAt7>#Mf2s*a80t3?>#C>EzP_cInn~@7;NVD=mZek#~j?h2he}bU4=URA+c@Z({X1DXpydUW>v%LG0BeP(pDym}3!MwiX| z)T8PHYE;55>o7jsbfeR?7nyv_kDxq3Q)YauNEUwV$Aq|Y6+iU|No>-85&1E)uJq)F z_P$zGB5|<(X13JPMeV%>7IgZz%JTA|+AXaNZ`!JL53!N4qk0hrYnb`w>z@f-f%t`@ z8H`yEmhrL5y2^?PcvmM4Pt=3|*pm2Wv-aE!ei)ekj%4BL_uP!1YwzL4C@^Ps2xN}R z9rISE_xWh_D`iJ269g95w+ygKVOI#Y_pA0=k^}4-Eg_PdI6rak7GD09Gp=t7XmRfK zTEy9y?=wmDw|djce(bpDpR9-)YBhXq?aAWkw_TjV%9mxJaeT!nAYQojZn<1Ynu6%wi9>Rp?CiM;qQsjRd2XCv1Q^XE&(4gtyV)4R51?Y$f5r8S zMTJEda}8~6;+GPMV#qhucJ;1#=0)qLNT`U6i<=P-tku0@x=Xg??8kxd335 z{b2$%&wqPz=apA%8KLDN}>_&+st-@R$b27BF`wGJh|?HjZ9MN!OK7T zd(xw;AA30rvIsAJY~*3xH;9_L0);3mx)2rE;JP>HGfo*<9sPGSFj@5Z%~TYv`F=d@ zGv_J`m04X5nwr1yOBxpSS><%_Mnl1K{#|bQUaAalOm97B;t>O}rnSM~)*}Wzcs^1& zA9)EoL!0Q_^Q}C*lEDP3&Sb_Ceu00`my`G+3H8C?+e(hD&vj>pQq{7XD~Om`_r{j` zpznXa$YEN)X_~GnvdrRJ3Z;JR#u78{d-?skrib!H1;YLMU2ie5)VfgNv1^N1$ZD%y} zB|BC#K?*bDM6c{;roMH=ZuV^XjkJ?o=dZ1#m@?)L@fJog2`TE>VP1K67V4DRE=)|G9GncxP<&@3%McieyS+QFDyaI(>rZjgm-hy(P`H)IfMtVl zUAxoIE?fXO8Sx=&kQ%B_1!jyI8sGa^VmdVl8`EVAyv9&K;9$|hLs#p}_}=dJEfkOj z>Duk>5<)(F1^t5$I~!rbjO11d6fk_`A%Bvsjf>EngKnb6SF7<~Jvs5&750)vO{(OG zUt8w`?6!fNxs9*c1h-?-P8E(M8(NRx`8`ISuVc7+O<8%gY@m$=zx()J*HpH+! zNi*xFntJ)Weh;YOYst@?>LG8V-Vc-#!Jy7H*J@g^c{1DD$HdN7=&Dc^dQY@p>f_(- z&B&It_WP7+Weg)q6z(x>s`=tRBlX@^0V2y0RxzY5a{}sewqkZILb}`{=Bu6{X$v@Hip|bBC-BgGFB&|-ZA+ybq$aWhw z)V=wgRg||);G=PU#(wR>_~#14iRbv(Bz4LKHUImQ(ldiuk{C`g94vvLMo7x}K2g>M7EFk?7b;8C;Ha$N!trnm*4e2Qk zNhgX!%J?VjFWWNmi3NgF`R|YCc<~3PwqQ37V9qr(&K-!h?3RM zI#lO(2dSfbsh+@D+n?vgH$Ha1ZjErfIlte!@X`Q)I{$JLph0*7$QIM--;gSbVj5|5 zr$dr>&BxQWX(N5&L=10~S(GHM4nY?h$=shS%Uo8!6y7KI1V35CeFwzzX>XbPL#|h? zHy5oU6}KQSLSoY{{2!p_@xwq{7B~8b&p99`|NqK)Xzp@Vpq1-^q+8L!poG!JX1>H# zVV-r`7pY<^$Za_EI@!&{)|S@Vtiz_`%i*7yYy72=@QcD)`^IM!p1aK_+!5^T?8Ta; zBfRYEz0NlU(fD#oZ3NNrss)3Y%YxD6Rq2}jPO3Hv6i{YeHx^hZLc7A`@1I|rHjo!} zl23q3u|6%cxPO5=djbH+G>n7)gx4p9UKY3n^>Mk4+B_?+F#@m2;g=P+c<2^BG_5Qc#kRHg3lQAT5 z$NU5*pEPFgmx}VrzMNkl{f=S+V4s5$y+$G#zN*H`2_j7S6&8sj;&;R?cu+3Anizf9 zqsvn#=HFE4*t)_Rj^m*od`gZdFPWj33Rbsz^NHb~(V)R_{OfO;s+l$E*hB&*+XBx_ zgAi)3o|p6~Cu$X_SagCT4di`pqYa`7@md{_Z@g!7lhi;$OFl-f=>Y}lF>Z}uuvS)lX1<$58??Z+Z0L%%p zTE(pV%BS=Ma+!b_2tMDZrd2Wj}^ zUkFP>{DZg4tr)$8V0ML@2|BVc-KS%OQwB*o)wunIObN~7$rKSC{K#=uDUnGYak~#* zv<9{;tbHZbf#U%$^d8lYc2Su$7Y0(vVrwb8KM;v6UnbBRp0LyT;~_te^{6nAi88-s zhcQz9T_lS0wslBr_GA>zy2?q-*7nZC$7mEqOHVo6F;>OB}#q^5Y_Q&qVky zoz!HQ4Fz)7%NmLLnYHp@(_MO0m@KA@mG^&R(T_iFt#DU!z5XLa2xo+&5=pQyqa>VSqCgr+YypoLjDNqLw)oZOkeqU1z_j z-GIuk!qpShq_ce&NNOD;nX?Id4YcLoENIpGTn1EYtC50p>ezRouH`qu^rq`@c42~ z;>Htv&*yl`GD~^AASW6I@X@hCHNI^L4@qgS`Zg|2dGjLXDt)#z*=#8tyRN_*`?!W6 z+8b0T6rSi9isS9ce)2omL^3|2VA(}+B-s#Y`K2U z<|{(6_-x*vDf7!!n&M#ZuJ*ZqV@36r#sL5HGneS$Y$T z3_OixJl=9ULJY^x&wJ{iyTYwA*^2L55v`66X`_Eyym@QXH^t;k^H8K2qZ3x=E?UKr zWdP)V{mSUSfHjYsb!5&iv&dKLNRRhjGzm*-7=G6`_P%eJ=O=ez{nyhNlp?hDjVC>u zeR9rHPHe=-{yQvrUZkD(H2>8Lwz}-5rYY4zqiMs=XRwl`y&pRT37C2SQqy^@VjqNp zp1E4|pduRR%*Pf=&dd#)e%6$d&ehmUZ`m76jrzZ2IS)T?plM=BIc-EClS(ul+X14+ zg@&;YuFjFIhJdF5sDPxLhN8}^eSkVL=X21{s)g_Y)VC2FL%>&iCZ7lhS<6uZ^T`19 z2X7ug)_(gDMwD$-l|s=6fQ=+^zMg~T92giF9Di!BSYxl7CB(dgCh?)CuJvl$Q43Ho z0G&vu%3^z}iqV@30{JfR3Sd`fhQ3GRKLYM60jiYI%7Dmjyefx51Mk&}B%YWVY!whY z)2}N5H5Cy0^r|fS0g2ADz^$7!?A7Zi3fJu#043KU`tOGLD0Mjj76@p{Oak%_oHf`O z&1bB&zd;$@*f=VIobO*qncd7lZ?6a-Q1C=VFRwSukB!9}mIJODV4aYW*7_9zBB&EI z6x~hxyfu{f;)${v`Zxf{Ud_}o?E+7%OkcX#1$s4FICVu+K|=vOv8E1?WWK-rr%95M zXFXNdOUkDGSq}a>hMGNavc=b%mjZML99KUbCIQ~8DCjT9%1z}f(a^pUMfm;PdA_}I z^Lfx&l6MF3nv)>a{|*`Gf#ep3HBr3n?W6v!HAb@4=oDf>S+Xf-HtIps3&)i4Dz z@U`x!g{yY+M>Gs^bLQe41t#>Z)GnSQa;&2fLeyFqwZ?)C>funpV>T_~%&RQT#^-)U zmEyD%J$F5ZMN28|EKv-j&((F|?IMk)AI}~NbV>UPYw>$5#SC}B>;8OMb_?={@VXc; z6K4vvm`dyBg&pUcfSKLJA&pN;!l51M3S=2!JhH?yJzW){%xtf)%=6y)mfz5Dz8oXr z2cTZ*D2gLsJ-MT+A7$#erZUL!UFJd#H>MB$Y@R&l6KYn)RTozVK;!|7?YFSa!n3YI=C$RJ|#Cyd>-ZNUqsvtTdTcBvPwy= zcW4@06tfosq{r$#s^UtYWE4MJP;*>fhv7|5p`+5uVj_ckdR}z@y9f5jJYZj|{_^&!SGUF1xMEjm1m&2+nfK$M#!G#`c_ zGVec$TXLMD0<{n$z`hYnXo~IBpdTrAP@YnTA4vC!iHUPjBqSuz(BR z5kMC9{QlwAMa$8547^#;guB>1ez%pvEH;Ry5{m-nUcO?Qu=nxSKfH08RBF?`KCS*A zGPd5Jm2iJmqLC|?EuA~p%pr|J#(_PFM@xXI0~JgxMs&b0gs6AdFf4keO*vw)QPF=9 zuz{eSKd@|HfWcYCnu9OyvD+9XqFV_h9m^TE9tKm3;lFj19DG!n=Y4G#Ffe}|5q!aD;=z2bn7$4GJUGm|Hiii5Gt`~(Fy_x z{{MmxY}{w;7oRBN{RU@X9G|z|y?c0;4rqPv{rs*?W5g0Y+4@0z3&OYj>eTu2 z1Pe$ksDZ9v-3;U<#Rvqo;Je=%S_W_*+ta;8&{M6#Hv!CJkh;tR2i)R!bq=lzTHsCx zs~|r(R6TFkTJQ-8aPB^Na4!J-u5qifHyV)ja5$TWc259L-lZd)1W=BDJWJAlKjaG( z7S$mjqQ}AWkAZ{b^7cW~ij$(9^Q>F`_OJq`Lf2A9#M)qngxBFZ;Eumth^lvN0UZ-c zZ$se4amYA)Kr4lmU3Uy{Qq8(QgU0fkRQ~PMt$&6wwQ7xod~htoB4TI)*g%ZfnYzaK z_r3-Ws@`8P4kjuQTg5W_Lm@6HA$w^PP@wsHd;VYjGI0XTL9Ze(d^D;Kh zvY&}CH2m$=gb;$t%(${kV`j<1nLvrdU>M08*w{puLg~}}HaGe@YL_u*2zubT_^M1&(wNqmDMy9)T@_V+{%x^sVjap&C)eI} z3r-jRZ=~Pry|3DH{np)Hw=Ts8EU-GUJYvVfzjJl+b9?99Q|i+q|An9G8hfHd2zb>xi;-)~M*(WO4>FH6ZluUid_vYzzkPX7S>n#>*hoy@LqcDV{m$sd+~ zi|gNP760rjKx2nphP`Z0r62Hyf4UwlHYomoQWcl~AysjLrVBSMX6&zKMaiB7lmhHD zS7>OB!m*yUqS;N>*`}0r^--5D%!on!JxL9BW7pjuZB{9jYt)Vksiusg84a)XDIR0r zfjqH%2cUg${AW1--?f6`qq_ig{BnJEb&q)GLKT~U_m4jwi#pPJsrAAu0Yzlas2ro|YbimJd1QbbGJAn$x#+Z+*?_^TabVu%LH~ZT!m@Ocgw~Lj zcMra+l7e5X`k=ULu69P5rDpA&>f?sWuVWMSwg`(JSudq(v91QoSEqqvlsT=91rf>A ziudX)cBix(B%8mueCevc7pP5J;|vrBpv4CU#+fSl!)&yLlaH1GkHyQ)8>+((_y3(z zUP$bC@bvoWSiEb(1IImLMqVUN*O2xcDGz{D>C7j}C26n4^cR1Lm62ah^lEr{;qsji zl=<>G!x^emV@{_MUj$UPV>Y_jzO7U3v&9-CDXil4;wKKoAxfN}h@(rdw{qMHG`}#q zl(xtM*!e)1bi%HBSsk6hynt5_VnzXdGn6AY%(?Y3%%a!eaO#)eFJCcXzttt+1-4$h1;V(JM3n_XnWXkQLxk^M zp_p?lBG{*CLOg*QHoam}?yX$CmvH{>VwabR!ol8sxC zX8&Mt#RXhUKvV&(9uSgW_AtrRKJ*w0tbeZLJ*p!8(9o`9q38VO<|TYYPZvR4vudC# ztCR&=Bh}|=+}gR`zH&I*u17K5`FW!ha;%Y+SuMA2Lj8AiH@jPYv}EWQv50)#c)SvC z(OhAk^dOOpiO*Jg)@U=~HOi!`EX?hms7%+!w|2fIx)SS=W0JAPHa$8kJ`u(Fq?w?l z$VH6~8w^`Qb`0#XMciVT%>~7LA2sZalDEN>%J8AP*7-#6^n@FG%?~lRC8pj7URMNK z7|issL+wFWe4+wYB2^JJ7P*t}aSJe~rO-wHKg3%;y|$iuX*gD_i&;P^M^&JmOrd*$ z9qkw0W1PV1T!%(fbbM`|o;{m`o@r5sOikyQ4?B4c5iT?GorHo_VmY1S8_$v)p<3Y? zCCsT~`4ryV;+BkiR9R9>hCJ8Xv^34K({%OwBh+h+UJc5N&KhdZf%` zhe|~H_Q0)B&j($!76Z%mT2p0y(iO_EYk5t$R*jn~O1d!_7twrr6XcS^Tu5B1 ztdHjrIP9e@FE~awy@;7FwA!F4NSHX1sB)6U-9W`n#hy5>!8B&2Yr{otGv;ew;zIM6 z0y{)X#IDOGtWjLIPv|$x0UKJcciy)6bVs12p-h`QI|PP+H2qS_0_pl4$n=%n{WP&Z$t(8Y>S@qxi{&eojsdvGO?5}JmBI0!$)NvsBmbMu{}R%MOahPx zbm;A8YE|7SrR6-kBcP#M=k-p@4&PQ1`+9(`<_a)OxEg2L$28njFu6Sc{wY+;x6lN{ z%@&Z3@mwrsm(py$bAek=gW3;>L<0N%(R&PvUu?Z-5Pnk%%kxAUxJOZo>4GM!NQxi( zEr`owG}j0qBEoecOG`^YsMFU|Zrpx-ROauhDPawS3R<5uRa8_!eG60rZr5jPH$ZAN zb7Ia!%)-R9{?l&+0dy~bcE@xzcml*uRfFQG*K0tkq0IC&&;ul7UdLNP)+0~%clEaq z&Oi=z1c;TpmQGB>4VQm=QJb5A_(0Uz23Sn!>wpnfmzVENS!RGH!1iedU~f>OxeAT4 z3y(#Qld5j}vYe2>@sUT*OQ@R@Iz(FaMf`2GnXg@x7hz5B;T~^F9Gdf)3O7~t|-+M*L`weYLk*B5NR zm$3S0=qMdqbJ>^WcZ_S$Ni6NIu#d=dM{tR#Ha1R7!t%E$*~?;@;o{>T%)uP zeE;rsomh%%)y=s95#Jm`pa)QX07xTN4i02Fm2ZE1a@o@Z;-`t zsAFRu@mO?5J{lA~=nKFT_W-y7ke{#_wfOAJenX3vKywIeRX_z;hmg6ry6XJ0CcbNH zsQMvyDUdv*jL-gw35+)>3tvjR>l<$(HKw=AE^CD#i#Duy(bjjcIp3F^SF`WdU)@xB zn`a0{9TE9uUd-E8Ou<}-m*V7NOmwu^z0B;z)w;Koe2|fvR^rKejU=zs*U1*Sre_S( zwD1zPjaVJ)9i6S+(fky->s(hUM{QRC0 z78Vvhdj9tN-<94`$D}kM+XQ9H$b8i;h@g)k(56Ftnt_}+i4DkK9)RsqG@8Ia66Iy#`C+1c6C)6d^t^sC?b22i59Qd)veo-~!~*frS= z@S`_C|Mw(tvdS{1YguT!dUPbespV`n6(Dx!#@7IXxBm?YzTje)z&C*Lo1`uXuYGkk z1RSzhdTFob`ESl^JO29s|2s9hIWhuf7P)+Rvo&Y^LJc_~u;=^bGsGC13HtKqemHl5 zlx;_0hpywerlYNs6^T@qu2kVfxLT>?kB=-YilLu9sERaSm4&;$h#(=J84y z%0JzvBbR9|PL(QD+339K{g_4`bCPL!{|Zy%38$yNegRo7)5y1)Z07_uPjcb*>Yhb7 zF*A9G;jYPP6B}8xnjsB#uPm+(0YT{&!abLz-IOI1I$WuJ6GR?VnfoHP%$;2-6gS5q z%S3_sZKx;Y;_`7@PG8>o-KaS0_lAx#-~f|uXSX#daic#a+cq_&(|AutB|ab^;1wMg zKmSAv84gZFa&mIB_epS2P>uCyClYxAnErs%PWk-phl+{{Wu~!*JUl$3wJ+G1n98fG zU(v8ZAc~n!?m(;@s$0#Ze?|T5;2b#kL%==%irKgGI_=^<<1!_VTS%DOAWg}6>Rbd} zd6ZKhk81A1j$byehK;d7wto+k+8k}pbctdyC)POUy_r2WdtS{oR>Vg1AA)%#doYXc z&=zxg0d?|fr3sZBl~TbM?H_oj=}H}US<)N0RXgKjH!13gpiD4p_lq!x+@a2rY;^~} zlL`lAW-iltcYD_7!>zDfvF=(y-zXBFYfqzmR-KaH66xEGiJQLHZwm7|OVoW1yxkgN z-_Jn(f|RxU#LeS5S5p$TH}7eD!tQx#?l=MCTbt{uW6!9%Dan`;$2S;7U0cR?h^HSW zOe>1|U22~g`}j1)#f_G=UN?Zy%x60>IWv>9eFyU4CEBzgkeXuCnXtXRcXJ^JfJ6zb zkJfA`^W}19)J&_t#Izy=LQedzgaiFStO-dar9m(gz)~G1%NKzH(@NwP(UB1XzbNK#@uOExSQui z@2Rf$L!{(~`d!n*&%QlO8HBa0m1SR8j=0JMSeY{K*smNnc*gh0%SPEV7I>!}<(V@< z?fT`@jvoFo!=$z8aK76pd9R|z>)PD^_^Xd$tsg7SHjY8v$c5bw?7+6KM@DT#Wj9$Z z*hD>7f4E4-kx~kicEzOGkT}pd89Pt;`m0zW!7s-j*HsL}DlSNrZdMVKMGWm9kjYp` zu_)bvGuZ&OYJ*Y*_0D{AK zzEL5SA7nd5_3yG$Qgl`z335ju;i3ZV2+((E_Bw(IIL?3nh=FnsPQrZnFtK+w87$+Vt=La|c2L%jyv2bems!PT<`%bD z$tR~+Rx2vCOSPKcxZvvu3l>V1Y*sXgV-rhZ3Kc3^)TBLEA-^dTRB?YAv-euhr~Yc6 zW8y)ay|m-t^Z+);W`mUuL!;J@t%0hDr{ThNX_;vpbHh=@Gx98Qe;6K}xCU${Ccf_? z&1RuuP&d6-EAy=#Tl{*c{rm+T>*=L4CtkX?KpT>LJf1{}zTC42c~JiIG9^~mOy42z zF`EGMYKpQ2c5~xyeAC~2p%_-h1083WPaa2%>CG&ek}5ME>T17m2S>*g3WZivF<{ar z_+sW{XY1D5oq?Si2%%6(Nu_jAYdbqiQql>a(Vq(ezNG;v?saGdxsyfd*V+^=j>~FfoT-gN-{H z!IA@V_Ft_TGTYyOX3jR@j25!_oWi^ss@tr1U^Dq zGoZjGmP!+GSG;&GDmvTUZFPNlHXY*T=637WEwE9|P`Z*fCy%;@rsf3LGX-piGY5=) z`c@g2WvS2}y`!B#}Lnl_EmJ9;KWpBTAA@_NGWgGAdCB5B4o=1^S*<$p^tc zm%Y*0tF7IPor6AIYk{ek^mLuNsX^Xsiza-Y;?RV40`*J4) zGx#*>n`uD|g~G8x^RjqcK3$aN%a4+(7OVIp7ao5u%8K96kY>|JH8a<%7nbyMsjV}8 z=X~u)M|P0C!l~+1yS;b64#l{>Cc75gjxSa5qvsZ{_bA_gs3y^0=5qM9{%MD4osz4+ zq@2_Yn>?Kof=s&U8BMd#2neXo+@dABiN4@rSzc@sk}#jWrCF#&Vf$&73_AKa@@m~7 zx`IVZs@cj?zo7CpV*_i(e-r%CdB zMoe**ir-E8ljj}`jQwCbm-XJ+uS{1g?@{Z-@(ktjL%j;@89HVrmF=1PGt(Uwa*He5 zN`01xZWbEkEx2@G!k}=x+Tiu8#l2GXk>*)*J~rLQjm0d4USF0qJS@iFXnQCjJ%43!f9C=b+ z=wMPNA$>#2F*n?t zy7oGCe3AdmnKNBKOf)pi&Ym^2GY7=Y$oPY@+&iJ8%%dnEpbiZ1M=WMiYO2d%7Qn z5OL&I0y=F33`O=GRx-G4&xxI;bm_jr+zy?-5IeM19Cmj+WYY44vicOElC zQ*isWCDtFI#I`jfY@!M-z}3S;JzCO1xbrKc^);qAHx=rD+|A&T`jjdr>owet7x=+F60k zeLbGO?b8{T+V~nU8O3R=V+uK#4CEEagr%jVFcW6<^XF-mn`hN+f7kSU-?sBnEvMq` zP23BcB{%HV_V+wnYp=-3nKYuD@6C2bk$>jb@d66vW`;uYJ6jJ8JGrd4BiaEAFH?31 znZ!7pd$E5pc)%~KV(*-uu1`v}WneR_o<6cMFzA~9# z`0@jG%_$ZerS#tL;WA0}7nfSdZ)WN*C({^C*RrlZvzTwQQZ-*U%r0W1_L)WF1M#jJ zY9H^m+aKb(tqjx=)%%?1Wf%`8PW;!f^AqI#+6JDuC1^as5GvhFJ+W#Ap`A=OZ6X)L zzGR(>MO;L5{Fs@Xrv6kRLNm?NdiFtiwD*IopjF}hV=H~{+XxP%8&uqyeQ?ZX)<}ch zSHz)-ntdhrYJ6#)F>g+vXNNNW?sA?y;e92GIzrZb zdQ#&qL)DQfN6Z|bYwvZXZYFelN6z7=G;=^wJ@neyBA zUlkQP8}%ozvnaXqZPEV2#>GXGN{(Z1qJGe4%DDSu;D^(zNpi00$(L)GsG-MAwf1b1 zjf#e##p*4UyIDr)($+YCfkVX)Ed=KWkV|^&2%ObcNk^#qHpDz;hMr7CP0j1~T>eBA zdc25vIsoIEnwsDPZMz?5PgDWBRqb}>-m&8h45jYg-pt_@%ShgI*RCzqdOzIlcGlL_ zIsHtjPT*Z zrrftFOKxr*G9VHu?ZaqcjM+?tY&R%#d7r<&V(QytW&rZ1SW_O3(cNe02A(&9D45Xv%?Ua^hpALu&J_D_3n4 ztBID*rVpO14Y1}gb>Pi@taUd-howZ$U+0o>l6dCCgDYDCOtw1mf7ueiUqSiBl~vKk zJ(?l6>{C%wNB%Xb%KhPw)a#S1YmLszX-nGeysMOy@|amF_M6w{58f%se5bfA=YGB_ zx__fZukWG#xPiW{s^W{7tsR%XrTdMn(F;td;fd{;Kj3yZB_+#RX<9Ye#{+g|z&joi;nLPYpfOcZYp8HTMC_22Yjj59cG+swKbP5lq|?{sK%uI%bEDr!)G zLY;W&=kfnSNRG@O)=oP*A8<;1eq(Y|qk2GR`KXJ?eh+TTB0Ek6yL0t9Wd0N#P7(94 zqjxg`9e8<_s9NlHdYuEo*INR71npMdJAQX2^kSK>$Hs&}JGJrgj^xd8U$iR)2Ezqd z_wRSEQ&36}5feM@Dpbqsdq!E!ZYQhn57k`N2QOaIUVYv?61PodzbE^#3t@aBM%KLf zu;E%aDdvn?j;+2Mq5_-(PBUve^JnhA-!F5ktYev|VXh+RSCs%8Jz4qe%|$oF72(hZzVSXhDV%Lcn)SMdferA3L!z zlY`~iP~mf)>XY1Wc3HZZ4o$5K%drR-lvk@+!SPgJh#Jlx^rApES7o2zZcYDcn+=(H z$ioy;xR1p*7c?HVwyLzwVKHgmR>f0VVYd*|u-o$FsI1XO_I!4!4gp@N{W81L_%&=* zS(SFGK8h+BHDj$XJ?OrS`L=BGrr{r4Iz>CMCD(^qc!>oqS#q zc~5NeZoEEq(mu)ZirnN5yPatLj6dWGCErqRr13AP24Q@qt?*ya%)bC058x?T|H`2L zKfm=a00$AHf-Uf`aEo+~B&sfWuX0nH&^q5w+STuGv{yxX=>*<5QntG#@0zE-MDy6R z@+uk^OLD=&rwFMaqqLCe)~rW1Hs=m~GJmgW{lKNx`j|y$b4hAXG;JrZ(&GY}*oxrE zJz--j6y0bK0y3jntAwvzw0*hV*kP-20$@2m40=TOU zo;#dtqqz+j};{GsE$^F_+ob3iFmEvxrB_VN$nt&&?`TR z?P)g2pCUFqyR0R(pE@m8aJxrJR9#-1jnVW)y}z|i!L=BcDvEX)cjyi4w)^@vhZ1xI zlC{!(eB|BS<^dL2y^S0g9rb_<57;cUj#c=1M+d7N#GedAo$38$n0nP{&t*-fNpil} zhU(4vR|X$5f9tF3TxIUU6ZHPthZE`sTtdvp4D5EU6i`g4DXmn_)m)~1vYUQ9cVTC2 z%s_bATvKyfb-G{8z))gh36C4C{dLN*lrJ2%zRo*tLEy3d1mB3wwTp}mDzYnu-o>vJ zTPRJme%aS1UzXY3@lMHe`f0F}kIGHMRdGVaadjop&IL{)=D8=n@YiNAKHfCsrLpQa zTb+*5(e#{Qua@5&1wXexc$TbhwZ?eMrM244Ol3~T!s4l?b?r?m7MOKz2&e{hj^+%! zOwPK!LuKvKdQ=F%!H795$!r(kl7j~i{y|TEHwJ1xIule@CjFn>h=^2@k7JZoR1m{{ zL0^qvwMo#}6$s6zDnDi_9U~htRprmGAAe;B6-)hCOaDe#TzqzR)};J$Swuu9#$!lH zOP{i^0QCO^!d_^^mi|FP#Tue>pv4{oOu^phelGFafe!dNX!_Q%iQb@ySk-TJarpu0 z1OxfhVkBF;yH9Z6eqVm&V|~5gjvYIAczAa0N^|)5jIiJ5d$X1h+Pxz^&KAS(lEI16 zLXfy`-W>k@yW{%x!I+?D{gp%Euh_}5wA05e(`3_Jc)y4&(|sdz_|BdIeP)LKeFd^L zYrcsIMD8^Et}gq@w#CN()f$0XIQTK2qXiQ=$J?cU?+++h*!fi_JwwNVqWFcrJePB9 zS~z&pS##{O13B@`F1fIr^)|kJ+9gN2twnWv`WJ8S7EoGnDYK_-nxt2B6(~#8-og>Q zuWwp+Y+6TbAC)UO<{mY1(^ThSa~8Hj<;B1@peWLM?%#h`1j;iz^0Zv=)nryGk60C^ zFvsn0@tw(xTs3JeQ&q1bpYA4lXg8xNU;IpM>AQzoT8baKk1O*s9X?#1mbObKZu_=v zNK8gsGxh!a{JJ|k6%`Z^BbKrexrFnz`$@9zptdrM9lA6c6GF9jLt`H407bmHe9|3w^N5<@)@G+-7UK-fx4 zrP$e{P^w|l&8x1ik}ioV;TaBvC|8nq(Moir0FjpfEV)h0rUiUDDq##21u|L;bL!~m zu=%W#{IJIdRjKh6aEFboOAo>tjn9ice8uE|i09lS3`&Px2p0IG7X;hLAnH+Xb9sVt zFgp*-a_yQm1)0vMK6k3eii(Lbu3w)kUN5X#wz{gSs(1l!7r&3lO-RBD^z`&N5)BOv z;mW+&gPGaclwBDquJS937w}T?`+DzU+ziPlG%T#p;iHU9++j?-Kw3w)dUa|_O4~+< z8=URi@e86%(L{%<+4*NsVgRD}2+RU+gZdQ%Z5I|6UcY|b`qE9xq-=F)Xy`wlKw`~x z3qWRg{ezf?gwsgR)g>L>`jVZy=933zCcdP3fRZ3F+zJj3zJ6U1&?QDQcjTV}K8u?5 z*4BescJEtS3VM79`E2jrt3+n{yf;lJ1AzS@35h39pZfXw3T*TT1KHKlp~GI3mzVY< zJ}8K>Jq{l$N=JZ<*bbnRs;a7v&dz8I*eqy_f#rB2YysL0)X37=P?-I7N5J{>=jG%o zFbx(zPccIjT<+M|R#sN1N-01&F>cnzs-~f#+;R9FF{$YH{H2=;B4*D?2^!XxmfxYl zwq31r>-Vp(<(Xc4?RyU52?UpX2P@H<^6}%xMR>P;`}V;&Y8x7e5v-`Jjg5`%F~S+( z8i=~iM^-y`?u0^C6k}m|mwtejqs2v3M1-4$d7N{Y21`tO{5dlUzuJwm5`(C`FrHf= z%zwrR!r%1S!Y8gDVOSjmkV7)Nf#Ku^dV2T5!Un#4dFehvAWWMDMfdM#$EQG6OV7ol z6v!&&I*Ct2x6w&>H8@g?K56;*F^(bvDL5uT&rW`-0)|mjSGSgdAzIunGC%*qHq*5v zQsjYuy&n!N0v;zP=ks^(9zJ+L-4Xg{w%cLn@#ws~Jl2C3Elo^fi;8}L003nGwFzpS zOE}lHwnC=Qeq(48fZT@8&SJFhV0mI=W9{wj33w2YFpL5G%Q?VcqqY~Oo?(`IzWH^c z+PGae00;zH;!l#dcMzC4Ed+fTexnK<$UB&~Z9A!@WpVcGJT?jy{y45Hb#WebK)cVjys)(_lz@FLE~{QSI(j11UDVz52X^GA;! zfnq4Oc;OEu3^Pr+BqZhl5n=c)&e;TTy zDA4?BQzfgnZQBMDm?x(3V>IbE#|RrAT>y4p@i~B^&LsuIJ+Q4>N^f{}?zC#lGBhzU zxq9`g@!)a?g=8(KiT4MEguWhLoDWVISUeTtFfMBfB(KI6f6mdY4#ej_(m zsQqRhM!dIIR`wzDW4ei##q=;MOyAwBsM-1wlaBRYnH@cP6y%kF=>U}STSToj3M*_L z!31qOAD(t~bwxdex%I8Rao~SNr3hDLy$*kS%?FFZ0Sn~KxpdY2JhDmH(kePS%!AU| z5t?oI=nLL0gWu$bS>dY&9ri5#{MVs7*JDZz4po;Y+nfr}A#+ zx>?7|pB~}xJZgXY_HCp%&z?PF3rfkCfl$KwFJ8D5R*Ao`?|k^8spq9ogl^Za!o!M#I45jE-~AU1*gxP0h)Y^b)N+oJ}l4oQaiue7HJ|G3%8Ph zULObG?%j<@wqDMw;@P;Cs^-eOD#Vbsi0jxHgO` zrf)A6J?d*r(PM*;!=8_@I@~Z*J02@Fk6yIZt5@e@?A)zz1l5EkiHHs#AK%PqJHn&` z78@_2v*nE3eUJla!eVDMJ2Ulj zqu|_1-5zzh5>(gfQ3FOMD$L-fJ@2s$~J z&Q>y9x~`F#m30m{FDxD59+Mph>pnAX$Vwzg2ekUYZDh}EWkVE{B`{`d_v3LgWdMT! zU+DO}y^m9gQF&l4`8EaE1|3kyyM=`8Onvm04I4IW-@cg94%-|gB1vQQMi!Rhr%wZ3 z^tH6;jC+|*b}_hJ&!gAewGqy9)v8rnwrpX#NgH(pcFwZ&xHst;7(BlZ-PRFM6eH77 zd6`~YK79ZFJ-#^S5|Au?0%nTmzZnn^`r0yJ)7}yE{k0d9N*m$y(blD${0@%bd<=q2 z>GGwsA%dGJfIn>8y7f+IXi#7vjOO6;drj_1dYNUVr8qdaWTGcScXv)RK3$Ti0Axe= zVc2nHB{f~g--f~vBFl-kyNktAoSfdH##q)IBKHzygj)o^54I*JCkK8@qYMN05tpO{ z1?_=<;ZH~;r)ztGuc^r%KYlAJ>O{EUN&L#I!Rg}Tsq@4m9BD2KM6qBaJcpe~z+oDtzs^4kVdoH}35*ymRl~ zW3OM%IzEj_$mqvA@*$~V$FqHw+>CfjM?jW7p?B{V*t7~pkR?;Cl~9O0uxoBLaq+MHf$d|aJ7G~Hq2b}}Xrtoc z=En9E6YFd8{2o$lc}*Ri{)q{}O#x8Tq7r&?d@$R4Z(`8V1Pxbr_e~o&T3TA7v?45* zL?up}nFR8DjAi2uQ_*CkKEfp-mLi5oihw}jjF6r$E?Es{^@|rcR1izdjCF?M0oYV9 zbbIq21I{oNAid9tjgTc1L>B9{-@iTe_4Sb}pmK#T&uMlGFvA*XXSO0>W0j$hacIq8 zX&=UU8z&y&c^N$CrcIkvlC`iAWArPRr|SrW*R5E-e93T#qjO$uN9Z-9=FLTy29Fba;M#3ow~Isyzj*N?4nMAsxrmfNCa%Fr(qY@VEdy)RntOVB z(7>yvuI_U2VxQzTR8gDtP!yo5`uoXo&75>CMLy}|2;X+yVnvY=Lv|;flr^{(&OglT>T$l2ligyn;4DIZh$ldNB5A^NHwuw z4m^YjocB&SYieqGRhGiSa@~f~bLMYR)0eP;9wkCdC6R~Wrq$Ke0LLXHB`@NnhX0>~ zy3`4aWaaOt=P zh3y8M84eTh{JL-<#HLFz>rkz(B;Js%^$y=LL=0{o9!GmWO}$?osHdRFYMW9ov84z@X$d zPJ9((pt0cBwrqB_W*jGQ!o=a7)O$|&Tb>9cg*a-7iHXEB9NV+$RdqGEXvEx0SexhF z%Zd8^lmyC5L>=UvxD1G}Qs26|I$KcA2s%?!Q-sIG2jbv()9L^3!C6h5s1->Xy8!&4 z5Ec;;fl7|BTG2~O@$Ed4Pq5T?RFc!^mf7(A&%qJBvb4H-#>UaAJ5Cf>Ya(mGIgLL% z)Km8B+N!llTEkaYtR|K#KB8*r0q(}deZ@r#y}cpP(dR5JtDPjD`|eGoJC?2I;pPU% zauP@sxIJPK8qY0NCd&XQ73Sq>2!uUgTj|QT{Hm-#Sna?!Z*N5GWhCqRrJ%DhLe&|9 z-jEOqP9^@_+FjCRq7(ymKoKljd^uin1R28o2j^?7<8U)73dTk-!1 zI`La7iEa3EiuDXSB2Q<$P}YdCC>k5BaKDhFcGO_A6+9L zu%8Oe1-ZGovYZefQpLy`rZ7u5K2I+%F*YPa*sk5gPK-1|35Em<5}m%Gp&FRNTR*Vv zaEDr2??zfP2_G77SV8QBduT+&@bK_K-0+0nStJH6^p69@_a+_*z7-UtcJ$~47ni}M z2VSzVKUjWf_iB+a*3{(X=YNvimd3o1rgjV+nNd+u=+lHc8&^*iBUHyDjldWD%*SO; z7^_=TqpagYVyv#M#icPL|BXD}XO=!$8mOfaL;>aHi%`7~#&eJzm0uE{%Hz<=leMxIDAAC=Biph4XT z^#KtWm!DVWq@W%vHs+vEmZF^+6C$&9J;Dr?OeFj088!`WuC;uKT#`nkK{ns^xqvju z_J0psGoFFe7`=~SKL9uw)noe)Kf4NTkySg$Sp84h_tBHuOM&sN7gh7{@GvcN7n7F$ z@cQ*lB7=xz!amAgQqsJuBVhNTWCpbyaXs7@W)X({Zr?1EwYD%b``A#P%lx)`Solq*O(OO|=!op87MemNfIar$+`}oS*+JoXFCpdFw)ZXFDCZi+!1W0_VA$%fO!??pgU)8GPAFaPMBb z_MDhmlhX+r5&#e(%tJL9YJNXDdTYLcak&r%Y&8-O!R(CYe<-N>zkK=TTKcto@iNE| zYC_&f-km#lFnQ+>KtdoDUbAC{r%_^=Az>G~LWsX$#elVN7z$$_tzO}MEpN;8j~~JQ z{+Kgy4)Dl`Z9QsEZ*T984g)G#QIjZP0imjs4?#Hagilm0H91*#Lf{H> z$w%3;UlULH`T5~ri~uT4+z0SdfP?=Q*k*iFFYZ3ER>_FvYeou%#YQHK#49i`5MsCM zzP@daeNu4^UvUW^V;ufHDL?)Q*%ltAzAhDa zjk&nE?4)_l4}`a_lW-c@sHh1{GN))PVF5z16riNEkazF2>@0~}ln#FY)}SBmMj(mj zd!PHh*(fpl!R4doMyKC%Q|+;+mlIH(c9rXc0SH_C2KKBRP}9W@+#FW8O@$b^l5&)I zG}K_;Dg6UhuZ0;N0TzM`J1jgLFar81N=paKJUxGxFaB}3Dyv~^e9pq+!7m+6&D&3( zJ~h~LTutq?^s4B(H*daAPB!MO2)}pF|3x2Yq93E}=v12j`4fp1o_Qa`CCstLrj&UK zz_rcde!$dJEA(g}bynbZOSauDAb^oOdCucTzUD~JVJ8bf5_PsYV{MnMprcR$xs8vF z5pwV_q)*My?WETrNC2k>m`Kkh#qkvlUK(gzY#^{2fQ4OG`g|F-;M{9BOF_x=Ze3kN zgO#+{<=?JXWzXYO(7COcBs%Wo$-{_>Mn;k1BCuuZjq>vH*-uNLJA8AFlRy^b8Doxd zv4y3jD0(*aOH_*X2L%T=;43n2AtQf{6GhJjo6L$cMuNX>f@`IB${?B(%5bDWw4RNG zJU$ukYGh)WBnu&DOcU&9s_ZS zfiI1g)@t*?%FuK&JUo0<=2-K0_**F9;%?tgU~fPn0I?i0ctC`wN>{r&bxqt3yCPd$ zTuh_fR@QNo4_8V|*rl>(Q@bRK9{D4aKv)K<$Gt`cuHX8Po_uMmo|ADl0DE77$z9oh zijraYIN&7>_rk+huUbXF@)|rwi~20`YWm%9DYT&Nhh?Ot|5U9%tRoPHEDM}-Ir=#U z9^vBD2_T{_T(Wm*@K$DKroHD#OZxTe*Wr7S#N6(oD}8_oBor!2 zrNZ?<=;X=7OiKms+v4B84{Q6HH*#+k_*)G(O>gkxmpfXxlK*pZad161Q~l!x9se9iBJ;I#kv?BuT~!(_==zUez> z0sUv`2o$y|dRZ~f41;WgOwSsSh_$sfKszo=Y&4jdowRd^&-i>i$fLr-Kj^)dIKGjA zA@~)V56-ZjLFbm!BGouq3${o|2k;o-+1cX=y$=!-cW27^nz!K|H!L*Z@O%Tz>;GbN zAQH&T9wM^cMFn97v=&i@Xk0*{_bPD9G;*CYVkRC8d)yfPx_9ERgUEB!#)<{O5=f#78v)p-pk<&0fyD?1^o24GAW z02uJdrl$O5A4#kn@8##5-J!$;vWwyZ<~RCK5gAG8w@Fs2GSD$uSy}Yea#er$aB@c| zGDaPlr{Lp2-PXrS9}*H$hoX~;F6tHIhEGT&Ix-**QAV)LlS_1C?VC4QSyT8ltXhHT z8^j)y9icPB&3=?`b5o~0Jbp>mZ)IX4q}}kTKj-E|b!L}B$F%$A3A7>)tk9r5E3`Ou zY7w^uqJnt??k!AE3N;E64e%#!QazxSK}c&QXrvvAPf7wLh_*IA3RSZOmV%}%r_rN; zO9|{J(ifmJM4-d~CUAsZ%Eyl%M>?qlnjLf}{%)YZe{%k}!?XF9Ky45Q(A35*Kx3Uk5!V`$_cEsQ5H`rhST|fEIMLlaDEhPn!oZ(y_xi4h zkcQk4ED4whIr69Jd2piHPREnA4%)w$xT)|Ez?N^_)*fSP>s`CyVVlwL&O}9r0C9ga zW?vc@8veoUO;A6e6nSQ_=hlrI&*x<)FM>>+hlL<_@<6hF>eOeWS7@bJMBrS`#mjli zI8W-|S^!SYJ$nKRkHkkh{+u-ZDH1gW$N?;ZG#_S5yfy=K&Hg?b{?-)`hv%q1XD_gETaXwx6Cvs}`mX#$==#>|;pOO23SZ@T#mV`E2LI z0q~E=a7sWh8AV)K+v| zc0?iX6#W|mC_H7LP$=gT@uL$v^^$>FgIh~%*y2CvOMyc%N~Ow?wNq3-O}P@e=t(*> zKI$^UENsdXIBA}^t|{!J!uzK#>svWVtTIFu1;3>~2fJ>Aq=)O(MqSF;1?j?p{k6h%Ta9JWxM2#tZ=?gD<Wp1J~d{c-y(724Ej?%Jv~3)cQi55WiK4da&TTL1!)HzT0tgK!#Or$tq^x1Rt# zi$A&WYt|0+9%e+GkJ>59^*0=>b?OcT3KS|zX_pUQ+kkd|^!O@mCpL%SvxF-{z&!i$ z*&hU95V7zlc^xl&v5&$!5?OeNVoxfOY{7ZwEiMV7Mg?VAU4-2)C z=v>AiK})o-ntDztX8QnG#}z`mmf)mwr%uU}QTmwzX;1v~wzj+b7c8Ocwy4^#`S};s z)qtLfl>b##`xMDc7A3#;Rn)CF}s+N&#FC?*S!R2dJ$DY!*logq7BOwv}cZ$Sbwdbp*p#uUy%3x->cY z^uWcBD5Vt0Q!_J+YuDlyVVq~&Mvb21tFwk2!Kr)K8UEM=qG%oBJ!=7Q5j5kWFjY^` z@Pr8fZzObJrl&am4fKaZO18@}qc;wk@=2IUH+~>_ddN)we02DI@iasYpZoeyk{bTV z?7ujVCb^^Jrk>(15G6?PP+6lo)3bj8r3ozrf};bnZ78bN1Dt>E4IgA$d{Hs63D{RM zYVxoPkttWO(MVAQHm-qV1r~Q2H!wTJiT{U7=z8hP7y|B&k8c3Q21djRZP^c{Pq;dm zZVi@yvT_-9e2~-x&&KU3Hnz91$zX)ugB$EPn&_}1oHTT=9NxEYig@2b8{I0t^`yxR z!hGa*2@1xF+1^v#(QGZ+b;Hl^6*AiLpCh~N+U2MLNf9hE-%9gA(j~Tl#_42mcOPL3`wFGe;R5-G6X!#81)fw8^3)puT~CYE2&-Pa_zlbY@%-22r1;~kBvMWgo0vc49by_pPlZO=8oPi( z;Fb&R@x$6gAVHwr{$UEbBZ#k^BIZ$=BS<5UPdQs+esT3W$I-SRiU_1dSWsVW#wB3q z>dYM$(Zdi_;r`1qc)^o&rca%N8V09brP6gW*niB-v@U3)b}4`OP{eK${)z*0Lu5Ih zAm{uu$Vi$LAb17|XP6$wKsB_q5aoQy4+vR~M@#HO<2+(J0$)LaDD;i`kr62b!*&J? zkEJCj(>B|-=X|hG6d0(q_5bYFWO*D|c?`X<9pJp+7H;0W=~Vm&zuDE$5Nv)wR@%ee z)pgfKe{2b01n7z|VHrb1HJ?TT0!D;>gRet12-pSuoY?OZ%SdS(F#3^nYy890aEi#8 zH>`SM%H;XE&%v-9TU5?)l`OmUN=N<+O|Q+U_=1jAW5Muaymt=d(k(No|2szQwB;~* zzd=QxIMIFg?p>sJUvYe~OAwzv0UZpY1H=*}8VHtg$0J44|4PcaxhpFw5)wYHB0aAo zaiZA&swcy*tjW;Fw&9b_r>-4lTne&C`#cUaeC<)89zXxh;)IT3(N&A1ah>ut*tYN>Rq>iso)YhS6CXd zC0J;-uLp!BLWGh)BIV@ZJiM(9n=rC#Y7JW4!L5!+q-v#a#l@F^d7fN2RmMy2E6+)p zo1fo6#khkyC&5X*4gmQmav{=0209{QvS$;%rV$_}T*)elJUEA}vRo0+|R&Y$4g36nyjhn7bX z$}KIEkb8LblYRL_MZY75dym2i7y}Xo(;k0HFC&%$73l{&F-pnY3-j>x$TbV>Cdx6> z2pPfKNU^$i@9t3Ep=5wM4SjZdus1zD&tj+PNNMbZ*l=rT-GHE=Ab9bicgb}~{xct6 zZR7YgF+3b`=Z;o5J(O^SI&E;U2-P)R&E_XRDpqe7W`HIo2|&UIyd6hwWUhqmN!^zT zA{s}K#eoCE296_x*(L;9osfOum@IDh_`$LH($B@<#mM>yEjt4RqgRcFjuv(48plW9 zILrEf7_WY~;e_E}(w>X=)!r5a@TCq_>)pA_n$AyENpsfLc~>0qaeMAp51BvyY;Q!j zar`Jhlhf{Wa@w=lO>ElpWcz3d5CNce7zYGKgXH$0ODL~k@^z`hDrs0~AwTJM{3!G7rBfZCvum1yt#lww9I%09;J!fTj}QU|QP!(9r3hGq%(l1qI(B z&qN2^FRb{E(1?5Y^mKK_P`{(EuCu%Q*wMnnF$st`M~?U%Pkq#R&dtrODUQ+62Hp3$ znVE;cUUj#I;M>zPGxv*%dSZeY?x5VLK^o!+0VlH>1sTdR;zC(SzyLI*2d#z>-_`XA zU}WTeRrx{P6DLjpuPu=h5^6x$gA~x`NR&L4 z947!e6VpV10%CdlZmoidC=Xqxjv;V&DB>`4$`}!%oKZSR2^xwGQEy}STdfOzb;-p= zT~+mWU_HpKHx~IQpnT8e`P~Q#YHe#vX&$cKZeeDIf%(n3riU;1(SHbm1Qk41=xc`c z>o>dXf%3_lMj=U(3*W|Hzy1QS&&FH0s9jx>yLSiF4P4H;N|*7&eP^82GAInV*4d*LtAZyhrnL}Se#UZPF0|+xv_O!iw$E1|kxC-do z1}dh~9J#d>*8{|DzdU!9awj@kHMMy)18eW+&yNt0F=1+K?A(PTYd+jdN%?|0M$q&b zl!QC7WO9v*A0#B~1JDCo31Zzx)RdJYTS)PY%H(CT{aM-BkW{9L=HfbL;?4`RLQI&m z5oioreda8F7~h6dj;xfCJ9q0{}R#U$<`ITkJAYmoIi+!M?xdHueCOV|zd1~vnZKI>3&{`Z8XJ#qkvpKPWEl8=1NDZT--y?9% zv!I_LAwK>*3ihe$)zUsRnu4-2IlS&FGzwuWM@`^t`h!0Na({dG7KmwxBj3uU}62k{-k-Bz*e%6_uR}mZZV@ zGMI7T(OS6(?YNxQ-5rC}X%w7GRC%x)aLjA=nUTEPh^Knh)ZT9Os1pb9Zb-Qgp2KPXaat0?(V7Ss0yjEO`@PPyEsH}lD*hrXHuB0j>M=q~K z>^p5~3AwF_jt=kp`Z% zfUa?y7zcisn7EaT(8EwsA*Z4u0CDAE2a5YGBC|_N15)%E8Od=K6>gfw+8|6vo-uuta>o5PhQ@KLQQPKBu_c=!3%vWbw8oC0-7DHdZJPg z)8$4IY0-x`9S_iRgU%MDHh3fCLHGrNiO9?AfDj0>Xf6dgxlh$MnITkcQJX^21Ls11 zIHL!Y3>hh6TZ!dsrlz>nj#|(g0_Z{=1bd@V=;?0`4Gj?>15gB10R))j?vBKu_~MU2W@#o_Eh9-&l;Hk&!De9uo9A5K zg9qGPD9*UR!2H7F;s$bb;J`DYEUQ&kp{R`bSm=HFOw|7%Oe@ujS;>hBZ3Bb zW+0UCRH@CwXec^$;X?kCM4#9i7*|u%1=!c`!Q^h)#3m5rut`uSd1w`YMh+E-M$x;- zkCU}EHNv8zKz?%}I6~2#7UMx8(a4y>E?eU&Wdh@aAAx2Vb(^^3P-7d*Ee>fylsYnE zgPv*hB#M2s0r|uXn*?NXt|_CW#K_dNJRyOLhsTG_i544JVFt2ly1Y_HR~MB$pcT`R z?9$TTkna&9IQzr*Mb=c#Ed241mX;O_j{=7rAKz&I2O<(H?9|)saj1iiA3FxT*w)6T z3oJ7#YcDTpCuJmm@G&qxBEX~pk9Fq=1ZE+8K_VJQ+{V@xNDv^tKQrxZPCzf9$pK=% z0*paqB-;Yp=tdNoZJnH4mQZH_XMh@_hVB!vJ(LYn91e(Ndp2bvt;Jd)3O;;DP!u@N z8R_YUkIxy($z6TIbDaYjAKDio|3-U}VaQK>657%X^DSOrrgLIS%44h(ynW5<*J#Ic z1VaPzB0V=3Bk5Ry%>wTplNYRX_N8J(*!Gqd&%Dd0 zP9;LCh!nYNoIsTlnyeu~p*Ytx@U44(nZ&{0{$lD}X+J3*LHDfUcHS-=|Mpu9@%xIE&hy@qvM=78Vu( z=Rzpld-tjZg%DWWjb;BjwKVt)e+t3xeHq==(bTV z3M&I%bRlELlV0Dt&(W~uO~3d(rewYFrg!f~p4=xbEPkJvL7U5c)i2_^jEqLm8DM6{+53&5Q66d;Z^}g|P=a;I^z>Xb&)GevNeN&yBQabY zI}7ZzTs-4snY-?>W4ooKqLmVH1~i%FphA<;JG^%w!I;LM({TN zqsJK4rgio8zXC@pp_vB z<4<>^oHFc{xt9oL?RLOu%z?B&2kpyiQ>IuQ{^`8?hdn)Z|w zbb%fGeFxp{$m?zNITj*Cb#---;P=2iLfr!mZ|=#b;sE$=9a>EqB2rXu;e3NV@C%qX z%g>*V}AguUxrOgELnw$`?e=O$k~AG*U7qlGNFrd} zgc2KL%8oG(lzGm-gT`1!CYEAhZCzuLpLVixl?(hbGM$@``41c&^0Aw5&mi=k2N(`x>`T42@yL-^;FCuRk#hvR04{cO z@-v}3lG|_luX3!X=W@Ic4{v8T4tfnat=DW~lN3krmDDi+b1e@~ zAkjqBL#BYXLx7f*YqyZxSDwSbj5va^m6rB`HWm>^=NqI~NB*qY0#OaV|B106mt{+u zCNdJ7B}n@2Au=Ce=cVCO5AgF3qu{EcTNWRMsp)^^%2U(RzXHFY$qMhTrJ*r|8S(HU zZf?bhu4uYL(*_zlhX)2)8yoXrWo=Ov%Si={JT%heS>hmI?0}(RCmN&|D(OHJpz_hz z(C9rcfwPF513~)A;zCOk>>2g?73`ed5BLu|Yio(rQZLSbYXKl$KxG*)yOp%Cnupd{ zfdP8%pyW^&f@mc7jG&N2#KRx0Dkt6z&hE3&iLRCwP(mQeo#00sOlb5Z_Z`SEo~Pan z4D6qBMeX^;3KPcFApFExLaY1`q@?i1z?~*WMrs{^mNeRn8z399c(I0sB@9_wfUrA> zlrM>Qf;Iw0l*x$`yInJpMU|n<&dhxVMeUxbw-5ymz@-vogO(Om7sYIn-lvj_1OCc= zuoB$LPV$UI9}!h~TCoAv;)PrnLN~2LJJe$&!zgGGJSwfbi}T+pEj+2fSjaMxoD(o#khI$PlcM$Q&&Tg+i>PyM> z$BrF?(WCK0<7_NvT3AWs;hSX_J}aSbTs%q|s$~c>@ay&oofD5T>faO} zfZ4FDl8$L8GIe#sIA@?(P$HWPv%Xzhw)BI{63isVBUS_4g^TrNbHyPBf#G`U6iOrr zD^OGg`TH|fxRGRC2#8AtN%|-OniRpV5=@3hN1+#dl%9ST4joK4RtL2)I`4i*qLnTu zBLhcFOGjs8zYlaRccY@%Q8t@-4SfP0gu(sS+nCebGKFw1%;ZRYmXTwpHmHojfLa@E?ijgGa552dFon1Cg zW^}Z%tSl+Kj&a>OfR2dc(xwY#_(e$NoXK0sxn$aOe^R&>hxi$Wb!tEj-lbnWJ(= z7oa8t5Z&3)VGO2k?bFJ~%$!Ov8q}l^s12N#z`q%914hOG;0iZOV(d_jP&BGAK%&#v zpJ7SRm4;S)g+DK!;=IAocJ;0Hwx_<|!cTJ4!dZu(fkQ}M(8C!?QM?WoAj`P;j#6Ub zT&4(a8bsiflc}t)2kIe!RC47f`2#Kszlk<82oaFMubEpM_W_{Y=d`%sg|r#nClygR zVY~VHH&9WT5d$Iw!@GYELDPT>P!<1(5iXFc8dRF%diec?Z#B!}yPuP}NChvNn=fJa zT1N4{F%lOZ;Qik2Mt~BIc!T5{FcdHmK`04O|7Sm{ZUb%u&IiETFKmrJuj9}&+%tKc zObph^bn$Q2O( zv5^=X1wa&K5D+OBV6%7^FY^YJiNHs&85sT4(ql-v#@v5v#lJ`kXY2`r74VO(>-@Uf zQ|(YFrh;KWx-;!mj{UT@vU+vq5j_`}L>zJ?mpruofdMa+fjZ*KWLP>wq1iAJQrs{u zcxQT!Tb4ndpyfKKRukhz^ip*xK5n2*>Z~XB)LX zIEs1)lQ@vLsStxd;Mah{-%_q$Nh(1mLE=mU1VZ%Sfcrxc07wHquf_iVG4>u{J@@VV z_`AJGX_B->i?69^H5Q;9evt%%JlitD&c9 zXMysr*zu_;MbM1MDJUDUNMYMA5~D37=_ffGS@!2mACS~fA{WVTO0Pqjj%9g-x#&Pc2pBNu=`?Ra6S>!wX@D^ z3k1Xbb-~T;eSN*QfdSgY96SqMt~06FT3K1$!rYFeqyreA;~@&(0sSf9IpJLQb9NAf@k>0&ax!VW39R}4$!bPMB+|{Hj z#tCaU$vj(#+qZ7v8+rHyckRl3AV4vHnu2ON=ONqjN+A>?v4@qGdfM1L3e-Sn+1lc` z_~skK0|VzFUV=d?PCrK?Gk;HUu(M;rSTBwkBr`O*$FXB922FTd_&^u%v?V3%2FV2IfIsp{Z~2ACb02_#ap04f_P|#b5wT9`BGw)D z6U?_dI3e_D7Y-_^BoME{3@muJ5Qq`2u!YgEzqfCy7bVECVR3{`HM=lM$f$6&!3-(^)xXxo#^jR$<3`op&~xDKClTx)Zw*3kb^)3g-p(W zc^@C_DkKXpDtII}OtQjAVO;#g^NM>%4F|dy|ASxqbAYUWBb?@8mK*4MM;RaZzW@zL z0++fvoxU^I*aaoLFR8&#m=Vb0lQBtC#F6c}@`9JW5VLYQ*=6Rq~=q%$AF zWI_CvO`M!~Q?9U7LGr_m4DHx(>9WAU!BLoDaUvLx#6T+g0~UWz@od`U^`(}MiYf%= zAw&jH@5#`C&0NsEf*v4b9H7G&H&_Ch?x&C0b-8SVrKBhp9xs;ub_uCY1#7%%cBi#W6$UgIut{aRpCDt1-=;PL^^N zgW@ok|M8@RR)SR6n=}5i4SSPY5B`JvL;$`|$D%}w8TQ9%)z#FPJb4Koa9e+qowLuM z?KQ#UDq<>@m7U!tF0Ss%&vkXS*qO^b{@C^i8fgVbsvwRbA)sqz6et1ulZre8F7`rGR-=*r$pTR6&7<|26QBe_9aax)nb}e<#jCv19Crq@Lh(CTNh?gFR z5=KkK?%YD`IiwVie_eTx@M0KX`Bf_6cB&hh7VqJ<;0MmeGM- z5AbRqy}qE+k%A%!y@-&sVF;lU^(RKZUnH6Z0Krd0TFk6%UbkgmGYsdcsh7;bJ4|y- zKHhqOIc)^05sM1u1RP?Q`{@?U1m{!9I1Gm7`ufFxXz8vA`V`3&VXrG!uQKSA7Zu%J z99O_TL>oJ4@I59}cO`2>O9$_4e*!=JIZhk86PUmjU|x$I^F7>rr~_8GnFU+25kN*k zA#vH|SSbY5){YJqm7?O}!NI|W(i<7(bN~q`PZD^wp1=uUZ)XQQiECnXuCWueRCgOl z#9~GViVZA3_UNjG#@5K#Tek|aNg!>=$mBh?c)Q(=?H_=11lZZR)F0;vQV^+~3WA&e z0J8r<6%~N)gpT)b-T*v4_4y5s1jQht97GXT?`5LdD@;y+ijXiYaoogr=3m6h8_M_rro)elP`D|iFU^J zYc;nc8~Xp358GqkDO{Z9l`c)ze2gJ9KZ6u}EkD8QqE09GoHDR+65ov3kI}boVVqTe z-!`~p{2(QQl7Qpygt@tkmDS7B`8b|h+$*1sy6t>on2jiiPon)Gf>4nHF}%8lo-#4n z#NJ=VM*x{X@r*|`6SARyc^2RfVq#~vac~e-W1$X0WJyg+yPc2#?WA+L8QTLBpwQk( z$A|bQ#_oWw*9K9GOPd0>lGE`iMY3$#^k#4d7w)`oqDEnW3IVhr;!Yb}CkQYQA)Z!L zK#ek(b_U}G^a&7t%GC4_%f6pyk-7S-QE#Fgsgu_ly#!x7Y!fJJPGfe1Ip3r8I19qT z>o|9(9FpN=XGg&UlM{rh!SV5@$h7QB9@zD81p?48t3YrK4rWT>dMWaNP|&or`ibkVe$oUCZyx?On@ z_(FJN_oO9GKlo#2nELva#4+y?3lCl|CxW_C6P7&`tA!bWy;cgOa}AmD^4E3)PV%a{|R_y31V zh5n1CahNSOs$llP>oa>YLTcyXjzgV`)q*%U>PBLJz}<=7Y$i*&1(2-t8@d)olaR)i zf%AM?ULF!0?ATTG4cCVuu>dP!NCN4uA#?-4b_oMKD4?b$RD^#MHyZ`HzPgq(GBSeG z!f~#rR#xpYQ+%`@mBEV}lqt7>9T7h8?*N>akGCeHzyvEs$Jf}{i1Nlw_SwRR4ZC(@ zKr33tw>$DuHm`(T2-78);sG(6K7YPf@g6QZU;z}vsC*7_`z`zsTHB-o@C%vJ|0TAY z&RwRY{TB{LZ2%CC?T;Zl5II^k2o}Z76fcT5_<^j19i7z=dM^TCZ_(OAtbCLwCJ;IfDK^&2oMw29p~#X zEe4lB%RB@y4T=n?G!H}~EQhE$#^P_uU@8!7g^hRjZfJ75qz22OpV>kCkTe-m%(O$o zATgR)b7%rxIj3}W4?69y{|!SOoWw{m8&$yE7>eD=&E3TZ$IY9TmOTd!_+vmLmQ_b5 zPMf+p5zuyY7%z5#p_VkS5)v~u`9l({_CR%uT6pIwBkm;|1Qtd^i)XjOUMVRMMi_E; ze%}_LuoILUcASp0Z=wDBr67N<>dTS9k2#rK>g@ZSjW|Y`he+MPk_wDK7@wb4F4`lz~<(2 zV3X0ShM@@dBrY76)W8b($4)>fiJ?#gIf)JjKR-Vz7kwk6a!@_s2=3gzy^c%fJ90h} z)qrgfJRbL*1-9-xM|AQkX$3N?1Ui2~2RRh!U?!{^I-8;TYm+>EC|Ur1;BSgZOzgp< z(DGpiLKS2c9ACoZklS#;Rc5 z?VCp}PCo1c*vVsJF$~)zxH6=8RPneoCoY{I`-Kv5dG86hlO`u&`B9;T60rT+EBpL3 z;8swsvF84eUT7ohxNw6P+WCsh&f+Yane{>npjys`Q^3z}1wR#Hhq3`b)x1h8c?o*( z9&Gj4=&R7}Q9T&Nq_TJV9}a-$)m)#hpm;~cN%AxRi8j20aSdcCU^plOXy!d%E*&IB zb9W;G-5u?D`Ww|b>>{|58nR3!2Hv)R{8$K8*eel-3Zuog%gB(f`9YNmv*pb6^mb9v zZlGHPCeW+G{kDJOV9HKjw{@T(@n`kNZ&z{_mrn$D(0|MPh#5GvPSJ44qlFufM4GA$ zb1E+v<>-DAXzP(Om)0~fkwgEXv2<=ZY8X^9XpFkW#J^)lCsc*(>}9kM*^exi;M{0H zQ~^yzD)0_16WnyrC!9!fB4+W5h}Z)~B!9T)J*lLk!Y?9%V4Jy+ihu(y@$iu&&_lc+ z@~MP#fZYdYWSRuC3tWDQiKeqE?AM0I#*F`&-`eFku&e!n`M|J&6oN)h>VocC$p&u; zASs*JXj6E8jkAIbJdzXO;HJ%+Np`cB1E?o`b-Dp@u(Ty8z>xdkWk{t*!y3q7{K0)s zNYiwD7*zrL&LVisp(i(_!gWy z)9elCbwVwRR6yk$*xcK@ib@0A1*!Ebs*yv&Xo~*9$k5_2&TOA`4* zdHIv0j5MbjZS?KiTktvYUU2rJqfd<63IFTa7|p7D_XBdNgo5QnBR?F>vqNTZ;sGn* zl1xAl39G|^qcDjp&IypF7ZerY@zH#@;NU~JU56l5jmLv06h0Z@8;2o(!hTCjPj6qE zieJ>tMtaDPpFW+nvAL6++%#~`xM>2jL~M>9zn+&jg-nZ^i2w~f0B_(zHxy5whQ$!+&A}lJnr5dgdB)Ekbl+K|O{kwK)D+!4&sd0xO{C4=f+GZ@04(5lZr&ta&?X*v;|5Hl`j|%&92|_xxL`B8 zn^)OnQwR?OaIq>a_;GdYn85KLg@$5i-9-*X=PB*VDWVJJYP>m8agDYamHO(nRZ;YD z)ZZ_|k##z$q(a-%0_Q!TZq4a@Oc^oR(pBM}m7Hu2ZxZI;W78lopl3!>@>X;-^RaY- z*8@J?iZt*OfPGM?F{=HxNCpg+kWKl%0yB^thj9JT@}VxY%r^wu8r%z4Z%={sG0>6F zJ#ar2Z?e9jVR}xEg3bFl*wN(=k|&ZS@ll@TihYNRW9ucwc(}y`?pX8WYqu z9z)TVVPWMRxGT(C6@JiIE-$VDTN zFX11kNsfqkLxOW13|p|Rp*?&9$qX(l4lUMAU25|LQZmjg{sX8EU@C5q?zoxx`Sh5vIuxk_mme${s9uDHfz*>fE8sF4-Kv!GdmwW5k5(*#I1&=rt=9WJRkhYfbxKgIA9Oklk7S`5hH4WtCKm~ z%sX(Eks$8x#q40}plAqYBO@f;Fy+<@T<>kl8CeJRY%@p%OfUt>{`LF!Q#v~QxWmxy zqcE&3?GB-~*4B7iuxCB$A!Q1%&ZGc|s`^7MWAl#wO)8^w|D}wF%CQrpBuBLy4-UVF ztLuFa{`LCeD(P z@Ma`3iCN`E2`Q-}lEWcB9tXMasi%1CyOmb|%4g3y9c6-^E6HF`@p@!u5Z@?v0no$$ zeuTYX;)U`Z0}QQ!ABpn2mzYI6lTWKsl-jE&L7hi=ksU_U?S6FIBY;{Wyn zD2-f(#jS@WvTg~$7_LJ+>^HYXU`UjGJ(_w+OK0a@V>Re6AH*ubiv(i}hNd6J$567pghyARZ=wVXnubJ9oBW-|Olg)6l?d zM0U@81UJ3z;Z$3DM@Pgwj8htcb{w!$T=tTTI1f!xNec#_3P2&@TVakEV|o?%`}Cf8 zBt%q7qy?#6N2>l`pU#J%f(-)gLI}SOi*VN7ei9ReL07_D{O2p_u%Enh;edd(1(h2X z2MIqMpH-sf_KDFqD6)~{5rToZ5e8pzGZLXRcu(Hj|2v8iDKudFVUHVdEr%KG1udCU zWC$w$tMF(4CEtKUFDtVmBZwKyB%a31vuoGTSe{P$s~P;Nz$8coTJTG?wn_;LUpf3B z49}4N9Cvc4plL<}^*-*ngnajkn}KkX!fW`s@4s~s4E6q>2*JIcvsGMmiK{NhDa|-(}boXeg}CpZ62!0)m;;%Z)l4h6FrsU<5qq zDKvIx&+e9x*dZbUtsUY13nPuvGLH8&273K{WI>^m_RT0S>E{RivyvfTNPs6uDI_f= zJHl(;VC;1Dq2?(WO6V`~X~k|2|6Oh^mv~D3dS@ z6F3E4A<~j5*&>4ATzVj(Ap4NEGyhf6$v^eq6fWrzF5smFZUBP)yG08HH8VCfuL>ur z4h6x4F$rHVh z2>7&t=_DMRWGH3;(H`|MKwvF)9pR=AQ$BoeB%c_{InvIJCM~yfItJXDnE0TAM#@1g zKw5>_7x)(s^aCOuJ;GEn8yl<$f(ya4hm>pg{*&J#y$WAG^d4XW?ylIUnB=`qkZ@BZ zEyP{CK2+j0H8p@ae=P(fkRXJ9^vA)4&TMCN8g>R~^B-tK7x z?(7BsA}72xFxMJJfpydZu&XvT<$0CEWTUCsh*tetHcrBqjszWa(5Qea9jUQeP)^PV zX9I+YDP%rQ3X0M9xIGrdmZ`DvVm>`6UeGM?DtxO?Cn};~4aPjl+U{;S;6`&)UHhOm z!a^P@z6&l%(&8o|3!!(>6TIT`O=Ms=Nd9Fllh_@oi9Y8l5~l~WY8V1LR!2t%>8=EU z2jrv1f9ZXSa&k{$DD)q|_#yOa>gwwYy{;kpXGz<~8~b2vd_3dT?(Mz3y|7O`w}AQ^ zPWr*l*eF1kPT%vm|1^HU?%NZ6g3N6vDpJ&CNK~k{mtUX^2Mr^*ZQC`8-Nd~7p9e;t zJI*@FyfG(C-~QK3MqE*m5tC9lGLhcK{`2(LLl z;akuG%RvH?e(bxy#WV_OjUs51hYue{8TuuHfjF><1kN78)(J&H(cJCtzJLafxcwNR zgTe>IY%QyR(g?WdYK-oJEvop_mDsvL67~k?3WA2?q$81NU~JrluZH2^mH1yRu1KDJ zm0ptim?Cf+RSM?jUE6V(m_JThpg3$?m>N#dS>h%kZS5#@*p!#=cP}a^XlZZvcoohD z`4Nm4i$fZbcpCz&vNBmfCYKOCl%gWf>>;uPXThN3YeWsQaRoX`#58(P;(yCu2WjJ> z#_8&^l*~|$x{|iM1U_)<`+JDKKi(eNrsTY| zwARyh@lT%Y1{eZq6)q|g*mxW*u-Lb_+6Y?>h;X1!s}p<*2p{ZhD1Q!)j%aI~;p9__ zCFPxKK%FT`J)Z9FJ28lFPdo_UQ@egckcZ6ac=jyJS5TQz0<(IOJ|m=15XqR$WdhnT zrnS8tN|8AH?A}rwgfVOi=P)4^y$NW{g=Nvt*B24)jI}j93F_)$SUmK{zki4Gkkkz-m~$#77Wy`&udj#3WY6u5}t=rasnLVmCFMNC9z zGpRQODB;K49Nbo?(VkaTwR&f#$zOhch)?(8;}^hhqA`|84s8FD;Z2Ob|EsMDbA>o@ zOhM_QF2_Tlj)A5IE`D%CEHJR_R4%x&q$G5wP0{iJdcZyfbjfKc5X%AvQInPDX13_3-;FjNq~25lN}pR;D6YoHIRtQ^0|0c`MYsw9-q}ge+% z?|_H^)*oYgKRK2FU5;jAB?>Xm4Qm8n#tIr6ii?ZUvj%X=g74vFI=+c&bPq%zT0Z;( z2xihPS!jbSP!1Hgw6#46t#PtP?tK~c{6+)=d}7j+LfA4;{nPQqNz*rnkW$aP-I9_| z{gz75qYC>xnhgOfm10jqY_ARoP*DR~m?I~uC~v(%XEoS`9JoQ@Js_dqOQg`c2jfOz zh;v7<`ztAe+QoP~zCZR_Sf!l#(WnV-Kv@~(suC&TDdDIRq(48kFJ58#^Is`f!L&@% zVVInq6nbXS{_-VaXcj#zn9hRVd7g$`iFTJL!CYfaMO-FzbdvrwA4I(T^IxN>|M`&! zJb(Vqdpjv#sly_PXD)j{j2fIXBBSNrB^tO3tZ&W8vE#>KX_>)MMW#aJ0&C$$9fbbd z`TRu`A$X%8ZNQp<;s%A0hciL4CP2)3zKHtl{)e-Fh(ENKP2m+{f=4OBYocby$B(#C zvH^>%_{#`<3b@1%aFFTfjNvOvN`3({uHij;G@Zo+2oNEdt%Uh5dGG*Z=rm?|E3IuI zUIf0QR~p6BDw$j)c%R^mjlCd^&!})0y>ZyVPXo)Mh}LuWZV<`HkddZgpnlPW@9=>% zEHRh~EDVSTi0JJ(m}G)044W4V!KFS(PybZm4@wr!0e~o4J~$B@?xJ@MfYyJv41BBj zoD4I`%qja%84xO0-_aA4M=+kB=jkw6N(kJLxFL~=G{+9D@3@-nNCbRLAoOsOHEnE! z-IamBG5k*(@uLr1416S6xw#Qcd)!8~;Sj~1$L!Kc>=5WskDWh~tPZfMIIo_^Vgdl7 z#O#H70-X(Gd*VnJ?4cPCSQ!^5{b}fi!5d$Wd)xy1M1+N3cXcJa8``J>kqwPd@P?t` z7>5E(I>e^5w6wn*Vy_0yr3=Ggh*KmDz)+8T2s2 z-Umm2_8`Cj%C%r7#6xzTBRv-$k{F!^m$z^ze;Xgyy$U^LehAS5apBQhj5(V_-`Hv@ zNnC+9yU%jgCl_c#FZI$TJ7b8r~fTK!GVL}2@;zWmqrpQcL)ctyJP%sm9n zV<(Qll?b#lKh)Zhdik=-c)Se08@ueWv9!wzhhJ>);ar6G_P+j^GlK4J$hgZd5CL^V zpi=LwdgmqIi#$EgatS{ZjU?AaFvL6Or7lp1wl*hNz$0s>MAd(O{mc7%h-CQ9+g`nT z=w2Ql-w95Jj#Rb-Z7=_Tsv&^Y6%smh`0yilQQ1VzXP8ww-(R;dKVRfeu8LU_-pUOV zsTf74D~=HtLVO>7ke@tpf^?1B0e@q`y?aaDEiob&$LhdETBXo`omt{62hv^>O5$~J z)NI)LrB4a;)Q)O2s@9;W^FB~jj>H3Kj)PaaavnJ#hvBZ`oH9}R%j(_j{f^M#gdw>MsI>2Zl6p=`YYN8snrt`*BGzP zq7ns_j(Gf+C!=)52x$!x2a8}P_O-6oawL3!R_>??fboregV2NF2+)As091hYiB<|Y z@%DhImXRp|hbklE?6<`J=dhDP)4x9E2j9dZc9Lg>0}*8T1wbwQ0dNQa*9^zN>=xwsJcyJ0rK zA|r<`1WASx!Bnwqfz1O2G$TI0{JF&#?9f4y-~3gxX`aqx-o(64A(eXY zCg4CbR90j2(F!;&3~2|2U8wm#TLKM*bgFv`xQ#{E#SsjopQuO2rAaH*vs+kzLkzul+ z<3qASd~ZBy?gwrLhIV|Qw}Uh237EswS(SPW;{YMQZ(+@9s$ozpEA#18aeJ?Ag;hga z&!LYL>%;j&n^m>9Fclx7h~S*9-LYB7e%ben)%&|=*A2f(KM*bv$>OC(IVb&^j5(Oo zWIbagEr0Xjv`u%DM#mDy+qoNy`V=!$r_7f0bk|e0Y2-}RDV~`tAIX)q%`0q_{oUI) z6(WAG!(MLbdttzjTglMczV}u4Y1lwRv#`L`O0!A7eHT9_`|tDbaqoDxJS3jnlmbg7lahE7fzAw?~=oY}p~I z%)}n)Yput$b^W$Px0dyLKTnr8`Avq1`wlcWM@=n3JIeE)%c@?Pa52BoAnok)wEr># zdJz0S9O6(IH)_f>$eQzBF>3N|f5l<$i*ec2-!xphPzN1RT>OCK?vvyRLnw{%H0MX3 zmt4K)MiM<&JCj#BF$e!tUdOSAEp*%NP2;ABwUTaUxsiJp=*?Xl_m6xISX<#)89idY z{DmX=+zYxBtZ2I)doS7KJ8sgqh>66@T@HCU23e63qRRWEbPO&(`Ko3_cX>Lr{^VgQ zWhTl$|1;SBgD#bq_VSS=gXyflJPD#gz9;0FcQvHkS}2kM8MTztB% zV@*pc_gDUi$y;tOttzhEPx>K|EciX|wB+6;sJCw$ed1UmYx>d3} z-s*X8`hoU)Uri1xST(%)Y-pq(R+C$syr zFOS@oCQ2!4&ev_p)9;9(CzC%|ewvFbX2+L93BwX@^E-Ac-_a6a(0LUnY;0Q-_w-1q zOLs|wh9lKRTd$V~z7g6RDmBMiFF*Fwm>nNe%aQ6)|8(TpT#bX!CehagkB4uHHD(*r z7G<)zXBl)k3mMqzsaof?p09{`{4@At&Xunf78-Vv$O;aSW{XJrMU*xYQ(Df@x%bx1sKgSad@6Eu$V*X1~FQpqa?-7F(75GVDn`9g05x|(_NrI+YlFQzIOJ0rnGdttXxlJ#rZ zSJcbRChqO3Nd+Wk6CjAr$Q#x2j&1_HvOL2r!0Hsu_@ zGqX`ZP_ME!D$=&+)Q_duUngm{t~SXZ{Z>{cD_tXV*F;igW47&cACu}C=Si#QjXSI^ ztYzL<8M$MYTvYvd_DxWHn%9rayy|JDu$=9#R`gvrbdM6mqjZx^p^{Y@5>a3GY+a3C1Pj}9^5}sSGzf*|#O6Rgyc6VS+1>44y6WREu;M%8bfnoHU zSpwZe2hOT&&0_e!grew6+W!i9l$Ig<_xHT`@qqTA(>G^kg5NvhGXtMqqItLg;j`e| zyzR7N=#gOU=#qd~^Yj2(V(T|;8jo55L9H1|sU0VoS))I_BO{nii#b)ryqG^$&!m^h zeE2A4+Cmvz6G1TB=NygZR^?S~+8-F2YrKxXY@<_IO}@^7)Pe|+jT@U-wV5|Q*|(85 znlVu_y;*cNC{T}8@9NDjOa!m?(OWq~K^yFz7%H#3eOid!J}2xmy-;n9(S~4c*YIfe zeTu2{h9Mj88-!nfra~O#=6zByH$2#*tmQ?|CMpq<7B1q(cZ%CoRW)bJiA`y{m7H=8 z>q!O76$H`WuoOC+bk%rfqg-10^>1Ob-m%kHl1D^tycF&hle7~U+;g1}p1PnaN85U3 zi|dkxpSHt#cZTNBb%!~ED>0*!udIij{wbS^_D@%HW(Ts_xmO+)+NB96HOC^h>xA@# zN6}Zr=pLPYUeDkaLVj5Gr_&~rKCf5`pXP9V7W?(8qi&+RuXu{aRnu+%bm2s)3cdWJ zJ>i*#?{E3G{JNRE<|3@Gaj1u$iRpZF4}A)+8pAzhWkV0-lsh~s+P@SAmv_eaaD5To zEH-;7oQXj^pL%}h7IM|3)5^s)8gYl&K7FyHXM5U4K~VmzAHOlCX+TB6M^I*_Oc|`u zk3aQJz0~aFN;A1>{=@y|-}1KG4Bbw#MVs@oJm%lF7DD|(DLUugk3qIuU2r79?5g2WL*8?IcUz5UXT`73v)2bA`Iwj!J1EYo zcGOz)*{PZ@I7;(docLz-N;F1(-2VihweW@sZc)A9`lIWZ6L#f3`F zNN}2FO&?6DuMK-DWG@p*AreA*H(ym`{KCFX=y;~dKTcygXB8x+we4};f`b5yLJWsX zg3`o(GM}b>@0V@u>lvNDZ@11p%XDJD*1q{K7imjP2FOY8C`S0#d+StN(eR6<{IxGe z7`ED#n((o&3nrM(CfkM>&K%V&71{bMidO!27~S*(Yu6usc^&!!yDAw1sh+ZRw{NQ4 z5bXE1bMTl3kurZ_i|S(&GV*V)JVaHuj~XQ5u+ah@ST5K->h$kUJI1nJAfmLq;^&y_ zC)ezzA}t@=1*;!}iKc!`eAvvZ-N=2eM%4HFp0=dZ$>Hl_X&%WH9&fFxZe^g33-nJ3 z^5}{$+({$A&D)~-&UhfCl~+IA%s8=qswR(UeH@swZvNPB{h%t&#&xtg_J^lAI9 zqdP)sFH;5wzKxDJsMH}#&K%Fah2Xs`9K-cU_~h~v>aemF1!msZ!>Tz1^A;gDRX6=P zvgq*2?cuB%*CN?=P};BshSGC;xv0K8q^!=zd%w`OmV7~*@(9f`bI~Gh4K_djP)nt` z_SkhMx@dh$K9M>P6_yPC6+g<>$&6FHqLK1-oYV><*(@6aErqTS;h`~c{5NWj9cO0l zS1EY5E4zyEYfAC?Id;1B0qNoC(y?9J_7K^%YTqs+0vv5z7Gz+w*Zb;!db^gwu2+^% zcxh=TZi~8*Dc!d^qWF&)pr&G5bTib1Zs?(s}ET+4(wt*LPXwd0=IAijhS^ zGUBlCfWt1|6`p5Pem&1aD1F|1Gf0rykL*f#l~&+RwZ6Fs&ju-*&MTC0n{wwKs+;~i z5^!;V%gn{LSgBMeGsT42mCyVkaj~>w;5FCU{K`~h_o+2%Rtc|dgm%*Ec=i1BF*CQ^ z6|+}$^lYW7{Nz>_OI7ZbCO)~`amuryZ~3M9$RU*;^Oos=A0@gBYlUy^Ob-zfX zv|K8I6aLujWR#8wz zr?xdeI;wfoGuDi7a}V8}Qt8{}Om?-N-a)_JqV(=tUM7cpwa~No)v-Prp%^7&a!bZMylGxKyCAllNNHyTe-MX(~t4*Xi<*t(aos2_hh%|fTg$J0q+IX zu0fW>BWJJUb zeiS*|_U;Z#3M<>m^$sMc(_u zJwcz}k&Qeq*yZoL5*dI(eb)g@Q3 z_w3v7UH0U*y?LvR@BEk8mY;=B^E-WSyb?@Y;rhzY%U9UD@;V0Hq<2j4RROCV0nP_5 z6c(GDZ(xhiBPHtO&VAg)uQH@RWa>OAeUr?XOBa-=yR1C?=u#4Q;b-1~GGng}$7|i1 ztw)WV4VzCce~k3nJoA~~X`8*jb;o<>Uq7tI>n0O=-W86SmRgOGB?a`oJ}h7N^Y<|` zz3tbM8ykn5#tk!$(yc2iVM)=e?5h$N3~ygokJ9>V9 z+$At{PDXviu{-QibEMpxG}G(F%^N6^_0zSam==9DYxd0PB}BNGzWEqp5N*|PzQg16 zeT9iG&Fg!&ZO$L!lF-{+Uvs?6ctO8<%XSwx=K#-UfoCOECCnEj!>a1N_CV>G*>|$y zH_g)En;jh<_a$YcJ+qs>ywIocy7`2@EvDejo(_)}S+_gy1g2*;>ZV;y*I=BB3-aHX z5n&P&KgL>`7`JK5giFMe{-7A2yM14!b^MRDESA`Q|ETZnce9r@EJQzf(TKiM zyY!K_TonR)C!VcER{wSp){uN^d4e-#$vw`io34APUexXuN2li5)57Yr$?I2Frj|c` zjPSZL7n`*E<7#f(rhu}+3i0J1x`~HBf3mgK-@NXbT1Ct`LH>W`ju$Lsc3LO1UC!Lj z3gZ~5@Zr5)-Zn6p6!X}vbMb4TPR?jS$4c$tLyae+d2EmRYl|C2s%5s>?|gEgU-TP! z;q$r}9qr63?ML#AI(Kh-t+c-{k2zR?3km1{L2LYXEm6$}s2VcbdD$W%im2olC2!LI zeRw+jXRZ99_nzd;%-o6dR0aHkPU9sQ1o(q@BcFFf#a@2aPntxT$%}(87JuDgP_to? z$naJrmy%bbRQ-JIGA(_BAk&Ar4clFF3`Z^a_Uj~5szt<8^7Hm>q+8Fb9x3ac_9TiU zq~271V?y(cv~o!OQO91(%g8i>k89mdFb(@D-}{)~{Ov?q*taeL5y69}Xbf+i4mqg$ zdU~U7I_t*n7J(bH8-HATkgi0;xKbTDu_HG>c+_A!(`7z`(`xil418O?`D{fdJObPt2X>Z&<~B9^c;jxo||h&wZx$x=_^~ z8CiOQOhvr&O9kO>9mZ}wdyUFVdS{W!XXl4%<3oYdmB>zhF?%nFCLhEVr2FUC$lf1| zy0G`!7i6K%KUqj5NyKiI!SRrk&X*U~;nSbYavx}f))~ydlO9le*gte--t>dYgOi=& zhs^3r1o`_s_8%npjZd17SH>Efm`tP{9UrTc&0y!$6O;Oy?y8>uQYAE$b&tA^Du2gb za^`0TCVeict}2NKY*W?u2p(jwe=F*+%PdkY!L6Rgb&!*epPav9Pik7e?3c}ig>?+e z?X62{*{))Stfy0aZG@C)Q}la!FRpGn+Ua#BB{U+ZTv=?tNGL;MivN)j-RQ9!-f=H4 zscaV8!1(FG;IhKm9+_KldCdh)ms8Z**q!7C=Ga+7I|l22vrxVClSj4EL{AeEYEjK*JEl*2*K}oVl@vY1|J}#kM*4NM8XP7^Al}yj9F7IkN`P@CuiV}?$ z$^(2QEHvBghDx|fO-z?w=9n-1h-LVF?zPgKC%H*I$G0|Vhux8K)7-@FEBYTV3#*%P zo^xW;Q>A#gI@$cV%6+1v`q$hGg-VOI;R_CTBF)uS57kwcFJ(_%HeI9YVAgKPc>2OG zQzuPj$*{pwwEO;Gi|DSk*QHhZWmkPy#<;U`S|mdy#k~wX)4UjJ_L3F5Zf+;<$xM4b z{aTffeR4T@zD|p^;yka;%FmiDR_ohDE{{zaif^cP=&$QPDdk{D!kg@yXhViYCDpKc--do^CVxzOkUnmi zk>7sCv0IZ=yvR!4_++oMl?wVv3RrN}XfS>c^O)1|o$lpTXNltKyn5E{<}*p( zojDUZ6GbMUf{>^74M|t~e7VC=F=%_Y(?!Z5cKNmO{VD&WD_Ki7XTJ6eNkxuuP-}L- z8Wk1c*tB-M~ z=^(A8{<(7w?Q@P6{9F`)pTFvs^t@9kVRCUWXE#aKl#|<*XsUI{`eqCL2 zJu`lM3PU3sYI6Ff7-jmZtlI)sGUZx))>a6Mmh0V`l>VveIxWX%gO~V*_MhR-x>G1c z5xBNe()7!q;>sBB>=n!Dk{dHl?FU3TzRraWOsbWCU?A)y9d4N9>`Y&J8|y5zCG6jH z`IA~b>MK{1eiTjCKXN25z45%jzsq=2?r)cZN3rW;Zai@+Z`ogSKI@2P@3~W+XXJ#5 z<;I5T-vZ-qdXmK{YZ2N$z zG(zs<)QFB!$n_f&YxP$TeBwS4+|*mS;GXBxWA$dNYOUhJm)@10XtAzXdFh!+$D z+F2cD7YA?!%c@~P#WGFooy)t{pL068@?6xXuSkvSZjR!jzg6SSwi%U`C6~1o7R`MF z`DcV^BWbo9x4bB@3Uo*iATaali>jDmesG*zR@{?*&n4Pdio@c!nZSvxq z-;C$(rVXXdu07|!W50`@umACx7v~+ks%kjmMJiSpu4UP!S}1EisVPv**7;(zvr?Ah zLpxt;GB zOPul@;n?-8Xm?hm@4UGA^zw-35m#H*r8#cT<$FXH> z?+UBAo&pZ9qf-usugw#FX1;CC%`p8w#I-0h>Ear6Rl04UQ!|JvOW8W$!e#f#O!JI+ zp}kp+qrnbx%El5`>F6nbJUjEkW005r%HmCR=MMuLehuyPA4z?CLbkz0PH)GH`&KbU zI#yciWVI*4_Bk6eQYuGA5>DNFRgTDx{k|pqTV(pJvE#No;oKi1CRB6ed(`P2w-q=R zSaS~;_lH#Nwa;Tp9*sNt>FE4dX56$eye(b)ryqowt#O?%@2se~U;O>OSJVDkheWZo zZcfG((|reH`1l*%3-XI+UVP|bUw(io>hZHTGUmTXyvk8xx2JgCP|Kop;)nAxEK3Jh z-h4W^nOWHUtYtlKcWWn{u< zZK>*4fGbzr=;fk0r{2zY)ydfrdkgxj-un4HI4yVn;(L#q&q`iW64^N?<0fhg&3^n4 zg&w)&B$q5#;|2ok4yW7LWQi2)~3dazsirf^htIJie4P*^WCm~(T}Xg z&F4PlM=7tiS-7w=cE2lr0i%|CwAxoq`Hp6N{S()%PX1&8}`3SMKXYxktL z&%vJaaa(EA=h*(|ukJnUwB}hnb#vN5ny9tXMLF=0H?ib$z}%{$--lWAs87%HOx=g{ z*UmewG@8~O_H?h~*|$=rTT@WBZ)je(i)ZPglUs$)rOCTn)(Qhwk6Rkp$u&4V^%}~$ zC~N7jmb@@;>ry#%xIL)q+`@=+**DvjH)F`sJu}Z1C{`MxC+kBV=Q6Abr*IpvRQojj zI+nMpX!rJRBJUQuzXR==?K$Q%-PL}-%dE>zio|ks^$wM>Xf|v44Hp%BKAX2XzxFnq z`o*D*hd)r|RR(VQs;M<&D|EI0ThqRbt&HxY{c*Qnf3u!0Ka#kS_}T7bHk*0!)l$yD z!Y}i+-}qP){J)pQj# z$tL+MSqs0tWd^y5cWzS-oImt`)iV12CBMouzn?7gtn;kyd>0yP8i(G!L0dHY>?&BByv`=#1mZ}Edtc%@C)=Ck1txG)R zfcbh6Ym<>%fyD9F3t~Q^DyRBNd)0}nZz(37MGthaDb-em{=OMf@MCezEHdYyT5u?< zQ5VJR&A=k>s40W!zP|DAY#FQ-Qx7vEC|{5t4U+BGxf;myYf-tUw2zvo5$zrc31nT2 zpkgPdluo949`~e!F8o`qKz_wWi4*P`Uq#3E9$*+g+(9m?MjOg$m&MMc#CONf>~y)r zO0>^q_P6#?)(_S4GO|yzWvXw8xk~-rUMG#|$yX!qpkUR|1o|{N>Z5+nPohTSEVrus zq*;thr55=??HwO@K!m?9sK9SOzl!SMsR%;p+pCQ0oD{^-+aJjQ+|@Cs8WBAy++?=Vt#7eWoc@BgDCSgUfRzolNn6BA)~~scb+rH^J(?xUr&PX5`Vh=)?GZmYP=- zF7>GwzGqwvm)bwOu13%23Y}N%imSTUlFiNrXN|?Uq++WE^`*AmdXqdZGgoiF93r!^ z#E1zyg+8D`hvLC&me(sLKHh3b&sYP761;-&XRRB9LRcd(q4I>92e>yOo6b=Mq-k zZIoFwA3LcfZ%upK3#-R-gouPtfB2;QQ_4Gmii}Laq1JDE1hM<}jdeDr=y&eizZmEs z_hCs!Ke=CWqOA0Sh4W5^$*j+Nn-5$mXPgwD7}YQsU$%I7Z9;W#j$qIDDV2_2dY+my z3`-;`O|pGa{#X3twd5w>;nfu@$9G%%t`**M&(hBL%*ifT+t+ofzvuwhUc(LaMSbHZ zf4~23Y2rNEy|4Y=XhdcIka)${o5y}NO=pXkl_z?9`WUZGW0#bVl04C;@!IF?mW)pF z?l55BoiqABiaJheJ<9Hv^B)P&6KT5`!DG)BQhuS6uTL^JHb{p9HVrBx_X7DLVfC4H zrHRv7U3uQw5-SU9%l*1ZKU%Y2DzfU6S#wVw%2s*XB|jRn=ov8O*^~WO<^6~GADB6` zW3KVqu8M$?HwPRQN;WpU+To*PH2X}dNw<5YMIgNLGEGQi$oBBn(PsfgE)g4oAryW4 zCB{WNu3U_#zp%x8;gZ=Gt!Il%i>o6%YZ3vE==$f{3XN=!X5T4)xQ$rcIwn;0O2K0y zKj6ozqWUoVT-u&=pG3R5qovvEr!IsDY&44fw`}}>H@BpmRcCmonJ^^rdyk5_?mgF? z;yJ8K(F%lWlKp;@!^RKybIiA>mJb|DVoFz25^uaIRq8LCtHx|`&&c%}E$2ncgqgkw z(U$lDqlLG}E{sI-$H-;y>sT6i-Q!#`jBXFK_{7Ys^6>a;|KW(Vm^b%+>zujwApGd2 zy`nEvM(A$MjMHxX8YWTlbGx0Y%BmSpc(c&_;EWC$$OcTwB(^j1Vwl9ALB=>$zW<{#cPeRz4BjZn18fO*6EHLy}y_vWHFnVGpcJxHHIi zZf{k0U&q?H=0Llq;vee%7AtMxdvYH}FXkt^(ybbnE{hd35w)2)7n0vUm%1tCwfZiJ zG>XY*vb?Ur>0$J6d3T)e!+Y%1(T`1bn7c$O4ovb^-`J6nZ9(xZ!a*HCTNJrN}})JPtMsw+SAZTget_rl-KejGDNIIAJFWonvH zLQiMV$=_Dy{>xT7>cc1QzAI7gtjqAY`DrElYeqto#x!A(sUZEKAh2%b8aDH&QU z&2uSrnI_A^?n%qZ@8V&&)RyXOtcnGCgnH_xaxl-5b-|ezEPiVy{`vHpLYcT$D_IOZ zIZx5de*2)vwrF_U+@vi4y6K1J9mDB9b&h3@urm`D)~eU~(wy-8&LLSqetGT7H!I36 z!NuUrRL{~+bPeU-bZjgD?%en!5!zyKplROx3UvE-zz1d7`qRd~pS2PkdcKBlmh_+% zrFdEr0QRrTROS`v#B|AHsa}nPLvmnL#3QIBqyXvWa2+`n0|N-MW~F(CPa72ODCh@1 zoPMLxBel$nf5c+R;Gc$_qy^u=K!ows6^=l-n*zWrf4 zxx^Xmq|}{-sOb5XoPot>Racq(uab(!WD6{_UzNOM8-K^jVgcjhG{d0dfQlyv<}xQS z5V=e}A?Yc9VK_RS`@*!$-}qKtjAyB^{KJ}!W4Q3EBwATDG)(9Kci{P zQ=9dz)!$l9HnCXa*CC8KiLuD7ED7)e$DmCrF&c z@y2db7-?hVd}EaSKKuRxHW3>NoQe__1YfyXF!3ndv z1-F<&#uc((SR4)xb-76)2hF+@-1nm_2_z^l6c$v3v6GshL2@U^KFGSH}jAQd>vUO7-<09oxK!yoGlWGkmcSrK4Y)kbyWyw#K4yL6^+!fKf zH&rlkl4WPWMW^6D&`p&tnB_m}fq|&9WJT#GN7O~_}*Pkb*j{%Qb2@=a=05h_9Ls^*G1ezIvSGb zM4mbZ3Zlp{&-W-kJT#_~BFo~gG2~DBRLkNV`u`sMhid{&GsE*x`%@@BdvAj^$}dqA zkoIlUtd_&L$dCAX;54(1A^ESpwy@EEb_poTRR2r#O01Z-2Kcl{7P?wy{p_mXUU+a-q;W%?hODG3I!oH^TT+)1+d{IrhzdJ*5w z+B+;N&3#-05Q~sK)*t|UuG{0{>Pr@OtEnpsMnLvE0BEcFEvE$drr!Aia9bBv9D|kf zaOai{%<=|c`ABq9jy!2y-~KRNo(ANQw;kxRHzs5z%0G`ILcI@=bzyzl)_K{^jn{?; z1-abJo20uP6sA8+ne!c}zy)T#P z&YOWc&K^8|ptJAnE$a}(cOC27o`xg<1{na)X7He)zl#U9=%)aGXROK+kjD?9Epu5% z(18VA-lEj6xE)gGr+|Zi^muu{o8Inxs=ay(VE@|yg#@9aid5qf*28cVe)_Yh6b5NX z)8B9iH{S(Vq|_>M9N&MPKO9Ok&v!L0cTK07f+CJ(k9OidbP(m4AZHl-cB35>G?Fu* zt$jY2N@on9ttb~+=;qKB@$Dx0R|pXuai~^DXigmvxs}sk#09Kd31Fq--i8Yx+1RMB zcVLk6uEitzP3oiSPupAW1+mFW3xnSt4flN{-}SzWq7c^AAOqWq=v97!%>Wn2d#X8z zl1}E?1IU%4&+&wDEhSBfCm$^5Rd~W+OS)L~C`T4JtaTd1EUp}hE_+JEGm|HFMogAGE~NtJ zKkL0|{gpMJsIL$ZK}l#U+r_b?dCj8NHlZDHX-R z)bd?4`$6v>sCYd@eX8suW=%i!WKO$HPjb;!c!T&@d>~MpSo6)`8O|48kg!2*J9TcZ z6t|W_2LDkX99Eaa-c44oo{Ue-1fLE-zDyJ#e7+Q0RI?_w*hUAhAVJOgf&~c@mgIgy zG*6G>^eT96B9^&y_n{Q6M@x(8rwr)QyWE%Y<{DxKH9TDm?LHO{z4?_N*UqK^=cgTk z_Xc|Uo)_8Sgn0F{)S-DfsoU7^ z^0obFCS8}`{NAXYfTlfKJ>CUeI4gLj=GmNT-}K{-C;P;@s=XhSg_mm)Zz?WraT_cG zOjpUYoheTrhLpvQ(>7T5qT|pQ8tC)l;~zmqHFA74b*zQaHv`ZW&FF7;>M?4Xu=;f#u!s z_^W@~F#Oj*jg*X*NlNt#@A7)Rg>P0D34bR)$4b)hv60SA7OR9>1dsV|`;nY!!XqSs zXmj$JX_7wz#>~q4Nj2p)8kq=40sBV;p|UthAD|xf{X!<@IoWnHXLP?Q|HKfSImls| z(JG-4g(uV24+?}J1rS%|UTX&{;;Y@6Jd$QY@`)z~$!sc8CGTdc)}Bk7TQuC&D(oj* zE@>C$RKoX^zV80uO6PKEo8WQXRN5uZ9Se_dDOtchRR+mk^44qI3qvi_oZ&Nh%i~gg zLeICnxrEzAdvVCiQCjDplhgp(TZ{As26xm$WzZV+SZQF9j$N}-L3icM2kuiNhNP2W zip1KZLjkKyU!Vjul8_4$_85N8?5h38UtDB)@D`ztF21S}t5~)mP7!#*!8u`UMP7cf zMP*s299g4EPjxuhU}suT5w-(u`%a_4#aC#-^?qUCSH=B+j2Ae_B;E6d6JP`cjYxBD z$HccD8Ld8_INP*d&rs5Q65vpetU`My#aW`5?Js0Wl&ctAY?f-3SM-&4Pp`A6%ng;; z=UH5`jqPUHtT4*Ochu8@#N%jy0UHS7B(R|ZM2fIKMtE21?=7-7`Tjd#abgl~Y zM=01JG1W86T-jDFOv~Va--ggwV(=)a3A*n$JkUnJ2N||wqw0)>^vR|ArUo*>x0I2?@WWx-CUDw;n;BEqa5 zOwkJZmujTtM#5`G#SuFamXT`b4}L%1ML#-6DsWuR5;)LcbW&H|8y-J})~F(9A?=kN z1~B{d%8u4C>wa4Ur}WWny;;`<6{KXq%v}fLT{v?jsa{llLx9AhBJc3ChB_&N^109b zt%CHiO@lOIvJ`g7+HtM*UA6|(fDYt`{3I+o*RAP*%h}hi-nFZYtTt$nH8tT}^`sE? za8biD2mRH$_kmY@AP~mRv9#Ais?h?rzgSWRbnlq(J-IL{o#f)d|vmBQJZ^q_sK6bAhfww6W3HR-_~ zjRr;FZ(a%V|K{0^nuo`n6aix5H-C8Q5v_g2SWXT3b1Mj+b??q6rLEMKlb((HoLD5>4&rFCtCw=uDsthX3 zFr3=%2iIADa#br;kZHk`&Kl!-;ASZ`7Qsj4qm=n>KR_`^^ZEJTYnPJot?$Nird2-^ z^X1kK#W_!HM=VIpPnX9Oc#S!Tk_|h79kKeB2wMQy(nOieUW=Tz9nZUw!UHC{N1L97xYxfkytHq3?sNI zdSJNpgHd{7{7WblOi?Z`i^qKVX=ylD){{^!i7XVQskeQ~vJFzq1BJT6Um&i<1y3d6 zv>?M?&Opj>0oFb!lH#aoG6zP&b65}>q^$CNDF)P`b<77#kUy6hnw`cXZwl&4LI-guRj&bLC zW@_IpUl>%q%u|uGCFIeV0VT{$!LgDhApr)pgs!hlM7Re~GO3%ft?bNB`}VIMI~0da zM_F`Epu60L%Tx#J3+Y(hT1J1$Gceyaj%%(%f0hG!;*Vw{y>aEi6k0b~aQQH$MTkwy zMOccWyS=Km4LlVVP7K9=A`go8N9n5BOYU-kR8u{eWMv#B?2Fu=swHNztYEKYFHm@s zCWl39g|pAouYjbCoTpH2nWMNJ)aADt-dhcKD^%n{F{EZN;Y*f|ws;c<+gjAuN(G9^ z3!g0Q()PCI)4|j$FZT!EMEMs8p9m>l+if49*E+XdrULxtP=>aV(r2ka@JY=HJ29A1auzqU*sqf*YzP%L?ROv!eF4y*)H;RA0%I7Pc#r9aE zhZSW1KOY5L0cU%huTPhNtkO529elp);{z-mcCW4+YSjsGaXAkGk|DtN`_|a91P9+W z{^Oq%^n)KrK}_q9FF?r+@OpO{oXPyowgmpkD1j0G=6|f8lZS7%KmP7J^^QQuo$Ag& zrIhTiKX4xd2z4W4ypQLj=EiP2(do~>=Y}CeBqFO`WmCOfOwK?hjbEUaFT7#_SVe&$d^Nbk z6DFvjKh%$)JRicHUbH-#IC1G^`%Gb)&~?a_{&zD zoZC7b+IBc?9IhVKrGg+Kde1E(A)pCGkszSucUxIOvzE}ZAn4{-KOpS2Z1;#39{-No zbfV?3r66u(vU+~G)wzg@r+aBld%4QDd7Li4bEl7pbvL6cp}56!1CDv?8#U5HnE@z@ z06J*cqc%d$HI>CW18_E#zZ{eUuu>6ht*iMlkMF0|5h6~sR2<4SUPH+YfSXK@39$3N zz4d;`_a0mo2T*^)Wa%jIzoMk`?fVFwmt1#KkJ+%5om?-IS3QEfQx865(@T6)M@Rax zVl6u5W!2hZ?-mZlem#3av@3qzcdc}qZe3+kc4(gK6qgHZqzjaKXsH6`8#Gx2QH z-XRII;#?oo{y94F)^)>1AX@ca(%O8=GgnycJ)fBZFso7fY7}FoH005S`#*CzrR55; zND?cE%h90xThBSL$!=lX09-n=dpamX9Q6STi!gQmgN)T;a8*1xuF7pV21y=JzX+ml z<#8HYgrh5d&+gUMh#}6XqDaEuJ}l+II5_)Cw$&N{)Y9Q!strOHe#La}D=$^hOF|Fn zCGAGjODMHtxnwG5+be(mOHi0xqck;;nU7s4he=a0EU&k*9<#53`}HnL|?+TrG0{RZZd+x<&ow{V3UBW}7r5#x)l z&Wg3kk-2g)e;SZ7VkBILJ`V*oY10qGgWPU^T~YcYznTGtPaNk;Wd;)Be`P&poxbn)5j6$@6CPKPPne zL}a3@$$18VsN=$_>3Kbk4UC2W={D@f=Z#ZMD7_vsV45H?8mX+Dn>p>Dub~6UYj5S^ z-G_YP|K6F%c`f>v1(vk(``DLB`p3cDGWV0xP50D*A9gTKV&TBZ4Usvcje90iI~%d!=b>TQ&ZwuU!k9Ez2C2rHj+Oc^j z@nMhxE-?Tb_%FE{)~^BwfN{S|27YZq|aO8n9zaJEBt%2 zN#h_*IJb(X*S)kxr^O?oGfyOE!|>?vOJBRUv;OGdK_0$Wo96v+wT;8of{kbDe%A8C zs;2fe+|J75$@BO%pJ9_JSq&{uFfg;?uspba0MrQjVX>>+rxbZG%_QW|!C-Z@WPEKC z@qc%bY%Hh;o8h<#6Uk-1v`KswjjZ!3{oJmX@k0$Iaz?R~1hhq=vua-wO@jp)`H)5A zJk(X{GWTjSJ(i6h%a{&IgZ z+jl)6;I1%TgAj=LY@ZC1^SKm>5<+(q43q{!SuukY`Zg6L z+gA=teSHlF7fNYFy;_q-7sU63iwJtMHG@2~`O~4EGkrb6li_7C1S7rq7sTxsw};>G zpYxkagatLxj>dGkUWC*PvH%R#F$ZJJ4g#Y6z%frB3(*aW+m~PfI6jWm&Q0T$BQc@} zvHMQ>dK$ur%Hq@=hKrS{{5ZfC#X|(5_9Bh5ti3%`J<0SEeG2;_P~kCre|gx-NXv7p zv-d^X_*hTM$b}-!YL1BU-w4n|005CJZJ7+>We#M¸|QFbQ|EbU*`+f| zw}s-l-sZ(y3cih|&=*?nk@Cx8&3pO***Yvs%I>eVlu1XqcWbQzQ53dQ3(~-6tKD!o zMbwe7a4+J{FM-pWor44+T79-y1HfXO3Y5-7_6yi2HD&d0XwaL2a$gvRyTW~t4;W6h z6{TRQo1dTcC&IDt`C1gyc7`Lpcj%9KqF}numuVCAdKKJWZu|S~JU4Ofr!}8n9@Zv5 zH@shncjm>%LFfZ@;ILT4s}?{=LA4J{QW&E>+Vg4AN1rksX7~Qa0JUt3FmM}p44Sk3 zVQ8=zZ8x!SuDHLU$0w?JcRe~l0pgF_mJasS`BNI@6i2y)Og%<=s9L*}VgcTfJbLdh z?qWN|&h-oW>H0Qhsj-jd$3ZdDrQ7~FG#H76NvheQIo4D<;K8hFgsjW<+6UBm)Q?* z$-AhsTC~c;l3G>;fF(z{uy{xnLa?2-PmEEdZ==vFW;l{qb!W4%mGN z*)Y&6qY$C~pTm0qsNKCIq4O|79@VY6w)4IfXO}pw90e(d0MLGXHu_X&8{1Pbv@Y-JTUP3(E01Aq-8SA zb)iT}b9Jwx;kd0?qcS&x1*>2ZtCY0W9nd7^d(d-+^t8FGPG6o>C?TvBvu;0)bGu(7 z`k4+RR0Afhy)|^&`np1_ZIj*^@|sdT#&u;fr9 z54rw!73(Y+dn+hqZZ)P(ISu{;PO#+8D33V30l3IAPJ;#-j6`Ny}R4S7%F;htAOFmZTB{hpq9PLE+7vQFi$rQo*oADMl}= zZ$Z-y8pip891oLlRZ#9Bv!B*cm3kIq(jwne53dt>5tARxZD=Y#ozc;q7hyX>5=tUh zVeXSFp7ujYUlg-;;=0JV4qY9Lgo*tf*$0u_?mOI9!#ffY7$rTV9cl{naiTh0>a(<2 zJpo0WXSVuOeqv)c(fL?P6*CJL_~snZU8OI-a;`%dL93$2z$;V5bO5@ck)yET70)oa?!D)Yn$ zRNxwVw;nJ^V8#5*sA;ODX;g?WwXC8y!7ylWBP3?1;}U7%k{8W=bR?4 z0~g3Fn_=u#0Mv@=5zSYelyqLOP@5Cn2U*LGn#1Gh+51IjTU#XWMR8U!PZ9l{5W1>OPZwfEcX)sIV{zI$LLWg>&a5d%5g;aeQW)kxV14 z61Nns2A$=WYoF(qUm&NfzP{Xg9~lrs2yk=(MJ0!&*YlxH_v_e7a^Iqpl4F~}PtIL) zC+E@m{AN$lI;3i|0Gt$-@Qlm&F9eE<4(0dg=c8RB5KDF5U zFjmU<10hHm#%yPVEi=okM6$m*`9{4>(bKRCG^KAcE~7LuWxO-fsQ8=~+*%s2OPnmu zuqpoh{pvt>`96BBs1WOD3YZ|()?JGnU%Mco+OLK|Wb=#Y?a*dIWSWKNT6m$5B$#tK z$%8roVr;&84{1`Ay;1d&`YQKmL8p0=6EEp$MJ6GC)rpj(V@VfNbpA@5j~L#h-*G@$ zLMI;bcY`lbWA|xiG4a!k5~*Gr_#ci;71jM~HW#H?E#!=s-BuB1gwRcEr!K`M(T@w{ z`F44~3sx`fVi(}zD%JgIpU^R~rmdbX?78V8xqL_@3?nQRC}ueesZ_I~VP2kU7I{xd zrps{aM42Jm{ou3MDycG7_wz|&28(CH=w6Q2H$!5t{3Gu2qU1Z8i z%cMA}ZjmSgll8F{=*)fQ7e@CVhHw4-J#4quyN@*xwrx`hJtDEqwvn7>f8)||$owcO zmb$W{oax=&x0UoCY4jaQ@2*47Zz*{&W7EO$cM4aUH+AfBlSRd?Cy6g_zvT<&|2_@RF~x(Z{GV=%M6W5vhGcFDr`S`8EbPGhMh zv9z{+`63sv!PHk)D;|QTPzt3+{I)84u*`QGI^7WUh(&knaokq!d6<0gdt#Kl{Os3p z5)aD-7MC;cYft^_mdyCX!r8Resng3&oj1+Mpz+KD7PEM9O)P~~d7Ss<>hlaG@=^+N zOHupvC}$Z zeZ^4ZcUc$n4_~X8NLm3PJ)e?70D+Gy1Q+Pg#rC~dlmMtATxy*N+4!Y*CYE7B!-VB< zkzd0APT_E*gMb4e4vPK7_xR9xHz+T#& zXEv&2(C>ZJH>`|?QpcHeNDTzo4u4!;FGz127^AOXb1ifa1iOh;#d^#Z3SNuxQ1q(1 zs*Kgj-1-7fD>u36juUFzaXK#X3o-Et_K71Qo%(@0qZ}Y@{RX>$=#dbWk={O|Mp`0L z+L#2Win!Q>YAmhHBsPi%o@wB~$~ocv{5~Q*rhkG~(J}^QtBT0A+kdf61g4aih)fC~ zopc$m6o=D`&9}yc)nbt)19d&K?mLlR&b!+LPU73o8W}v-FCh?UU$mkja)b+CjURzk z`8irq$^Gf`$?F9+j8$6}49GPT3wE6AGvo16{iQ$g!y4%-$?c~1^?7sqH|LFsvdcI; zLjJs?3MO8ZmV1*Gj}J-2e|Ge$KQtf5F<>fygZf>4WvxSn=8UkluS~ozC<;U07(p2+cmr z+6-7Ic<;}8t&jH+$z`xs@ClI&wurH$xy>@PH@{Tee!nSRZQQIY|J5&!QkS%Q;IBPL zGc!YUYtC+D69V+gcyGNj_21rh{lnkWLsCWt@FT$oSp&Pa(oqoK_nAMj$B2dY z<;rc_ExnEF5a0o%Oi2zqW(Dlf)?@7P;*?enZ+3Z6tI%<89$kxC?r|LBu$Zi=PqFPk zGQ5C4O);9@&hE76oR1VX&SacE5r^kn90%G`XO0kq8Ji8*Sj%8aq|Rg-$@Co0X&NCm zc-=9jemR^!`z8GA<3}EQwNzCuFVmAXTf@)13+kH_ZM65AR^yLIyBiBE39%$k2yY*I zaLKkC3G~O5b!K+frscdB-=@V*UtjPZ-t1>!Af?+o<)3NSBOhRyrp)Ws7&C*75yWpH zIW%k&NCJxFM1BN+$*}K>IT>1wR`Cxx7d4ei0y*Cat^{Bd*@|{L`2|sAWyM1%BfZK8 z&B0noPA}Wqhn{Z#DWF-U(G?mc@+<~T35$2FpWp{ONUJ zo=yS^GIZ1^QsqqX=pFL!8FFEPOMXTe>sOGWB$0`xi~_kxKj89Mg?t4>Fsithe8>#P zaLGVaF>?jn^I#qFPT=2vyRak|;bOP`bcR)>MW9g)y<6V+Q-?ovB$QfpUp871A$g-& zm&&nigo*iu7Q`45A|R-ntyGN$(Q&@W=l$e#>PTL1;Ubt-aHa}fkf3_cj*|&5h7CiJ zjffDg(hIg$mTcX8n78X)a_o0T{^*4VIzrCIpp1jQx#5-{rXKIVECU3q6S!i4A#e$R|KqT`il1?g}`% zB|iI+WWM&Yss>J@^D)IaG^LsXW9S31FNuv(i5AcWC{+S!*DYi4D2n`++WQ2mhZg~~ zLS)p*7o1eoCM-k_zTMHa44*wYw~anYnndKb3{5Q4ojzI<3mbx|1}lNyZ;|Ikk{vdg zRpKyFt0o8w=a!BxWQ-_&d5`HhVZAXcmLY`D@p%AjYqSbY2-4xV_|J%#yy3K?;@Fyz zWqrj@qs^X9p~X}IJSNjynrq*N{MGeN5~|2(0z=~G&{ul}@P6zY&t{Tpoz_JExchi* z?|(qY&aIVyU(km{-{i*YgmiUC9jF~>Zpxk>O#S(X6{WPRno;05JR5Xgm+5p6xU%?e z``QJt3i*|;s!20v6Xn>ltqhA50Tp~^G^?#KT$D~};koK0xbG%wkc|nN^1~|*h=2a$ z2v~wWyM;7LRm`%MRE)t8?Q(9}BO2cXg~#*r&w>5S{8IXesuB7So**X8)KVxoiWn^s zq)&vnUm5G2@Zs|qCh)Z)O^#LhdIw+5Q6w6XD847+v#=ayeBdA} z)}Gn5rqy*{>OUd01ZUd}pB7n(AQR zJ|66#3g~`LbeZOULOUNHR5iLcbsV_I_PSwtrPa74KmhAt?YmI^0j1QMiN5Mhb_*h z4D331IZO0^CBXklaB2nr(fJXW%M%m&M;THINGAWeNiUfUKzpPGV7Kmx;J*UYtmnnI zv)6WOtMRa`Ic-hneQ8qL6BjC^_$Nh@SvBm^6l$i41Hk^J1`Safj<6i7$-~ zR$)RAH4h{Wqqt13)N4YH*tB0(B4q5-C=uzzlLV=5fl!~)7f~D@MT05r`63QTe&qo} zR`cA10$#F+tS&VuLAvVHj*JX#{_QMmL)ch`tx{PPR`b)Pqy*XMn`pAY0@)ugw<7#B zkYGL$YHA=*c>jUJjv7#)^=2_%ev$*1`t;{$=T}W#2f2oj$QM9tk6%iW-joeR->ibQ zIJiJgR#|aV?>$RelfRrV*$@pG2}GdcCo>Tsrl5p&QfBN8fd@6o87+hq1Z_kVc4f$; zfbLB&YoQ^}WWdqDzEk=8s{51h}tVv8n zYIR#I`khh-kZDNh2umwC)JgesgeYkIg8+38tQg$P;8Ge?MwXv{B4(P_)%r8Y6oCi@ z3KIW9>k|e1A!S!XLp=W#U0$yy1QUN*Q7q@));~azjgd4CD$}qgYj@3*+!8(K?HB_> zukM?CfULagR!k*n!>$OZBIlU|l4?$m(^hVM{1*r>(Tj-0N3bmY1#)aR>l_OVyh;%c zWJyX3u4p8c+7%@i;sd&G&`3fzGI_-T;vP-_(1_ZXl2nd6-F$wbbNgxv9IcH=XJUa;?Mr^AREJ>DG6@O_E9=7sg~OzSXg)0}!Z$+lHZ5VrxDe88+`dQk z*&MnDSbNLk-ynr(F^fOy#w- zLDO8>^YMdoyH+Z5EjD#9tkJ2>#qhR1&kJ9pg-ouMJLsoI6>U+Y)#6O3Z^f7$|Y55jWxjeS>Cxp%?79z zdyUfVb)q2A-I5|IHNrcvAD3UX2Hu#<)_&9%kW&0)XVEcTSxjMka1TN$A{n@khgXbP zh-sw}_$_~HxJbOkE2FJxfP|7z9gP6-?W4ux#gcFl8YVr=S6Y=nlA@&&b&85y%`)6( zpU<=w5RFoQ(%SvX{xbN`1}wmXXzvHA3_#2ad;TKjcX}0~%Eu{SkRHQu6tYz$wm-WZVeOM1%$R7lx3@}iNO*OPQDJlb# z@TZ5=Oi$I_*b(nsrsQa;S9XT}1q8*Vbq3Dn=~{K>PQO&$+9c@;qv|y6@*E^9cAYMs zA1f%I5sW@nc+`OVm}i7$E3v>2iWak)q)Ox{MlGhiM#APb8c}@p&6?md+c)v3fp^UK zT1^6C^;5U2DT0|s%~l%!G@Ii(ILHQCX|Rq!hIZ|{Y?Y10N!j@vpstZs)f6g$_zi;h zTaCUI8)-~xaZNnHf>tzzajH1+j4S4z>KCOIRCI`fhz=R7n}R*yWK)M*gnT>t>wwEJ z-NhdvWUH?fKm+3cPXm%h^lx?pfZ_A2kcwn~OWuGR1gOGd_M^fRZv7ZwCIUEfqd)?S zJP&1g^nhI&U?6Ne_!rN|fxGqAzRUwA%7C@On=29J@<^#br8!0zRl4&dvLnf>iu z00CzJ5zpL@FSw5T0Tvv@;dC??ZJAd<1jrPknrFEQv}>bQ(Cc;AWu7hCLBa+Nfus46 z%D2^|<7JAX9b^zG{&*kxE{vH@ObniyO_LcPER3e)>-#9s+(MbZ? zpa?P@bMI~^GUIp1utA#ZRzhUuRJsavqn9Ww)}=gK@EMt+U`Vca;wdd zZ#kx=c=yybo|D3MgrjaIXyjw_HK^n_3TmYIVHpN+g85_!S|dUPV0<5jfG(7Tj)G+) zplIUhtUHKrlM$EuZO`KJ`s`(u?0d3<)kD%qd66RPgHbK5NBek=}eikj|Zb=n! zw(uIis0uvVyPQtg=Fy3d#Wisf^Kz*lq4Q~%IFUeERl;B-RLMPY#!BkWxd}U}Oa*-h zMx9Z+5Fp)sV#+vPSMmHhkurdZ;C|X#Ke@XRF@_i90zgQur}O#9)Ap-EYD0#4GrZ4D zm3HJghBE@nOnFXj?fFX^gqqN@lVs(lQa{Zt#M>Z#A^{%dYoJjdMFt6~B!N6cT=sJb~W0 z1o?k;#RKwvpMbvF7#AP^v32#awRBVv#Vg~VQNkjYs}L0rC!o#$TG2jPtbI)bx;y*9 z=K-)9_|C)a2z0&;kOL0BW0qciX9U8)wJQBDOs)(Ba5VFWdy%V7ft)MB(CScZj~YOX z@?X~@vNmv+H~bBF$CX1cNdO6~3^K59;n;rD2`5QGy!fvoEsOarPW=5@#4!6u4ZMze z;vY3|O9dd$|A*@G|5)=O{UiIxCW7~m?6_43>p!yN|KDC{TqD(|V!3fQ&D|Oh<|rLm z-v%@`fbXtoy&t>nED(@xx7UargD&?xws>2$t@l&%-48UMG+7j1fPsYH z0q{#tv)<3MtFNno9RlFGNIz`izxq(R>bCm0Qa`Ph(sosq!n+4SCan7lFeS22);NR; zW{sr(i2={V00~#wKu(53b8ivj#b&!^MNpK%@d0&$M5g4jY9a?N7z(c6Z^W|qGoLKb zX>(f^bnA+fQ6q|oq{@p&E+*`duAS;H6H0_Z#8D%}P0;+L%U zD}>TMUlR2{ZGRktuSMCfz+ue+`YI?PLSwegdR}TFavN;TIL;v(cQU2nLA66>@YKW@@S5*&?wIx)+x?-5~At1tUyUj5td|TsSzwBXrt?Gy z-bp*E5IN}Kw+L*UdhhnuFk0FOuUw_2i`3p9mCd_|GR7)BiMII9$OAr6-Xcy$9_Mb{xp?|;z~y!y+m#@tPAhkdvmJ$lSlc^S0j zN#Fm0k@!2=9y!ZemPM(^U0_i|Lt7;@^7ecWI!yW-GBJlg_V$3*%J$>v1iOvv*=CPD zIih_QJI-Be--)@fk0l&LRn>05|@s9Xi4#-_otupgwf4ZaGzC}gRj?L9kscXI8 zs`>cZk$M`5wwRGV-}uocdemC6Iq-W9Q9^gI6&4TUr?v?h)k8+iABSHD@p|4mV_e!r zvEuWJoYcLX*4Q@ZRp`NC<$P6NkPn$>j$;bcSQ>{xY5S;ObnMRf4ctsiDpQ?%Zhh~J z=7F9SU5Suy%i>sb>pE-?s z7d^*qQM~lY{O$8AQpe}jy5l45y7@>O@52`Z2&|Ty;R5Z|5kH2#G!CvxTG7*iW@jtu z#X)$t`e(kUlXl|RX%PnRwu$8Tg8`+)K{w=^UP4BC`)3>K$n$L~>}B_HUO%C9VzmE^ z+~NCJTw@{}mz=WoC9E)~fAL5sfwguypYD##{er{V=R{S0tzJE!`AA&C*)D}7c`;Eu zdUO`M217k>_lkE<-}v> z(9FEvR?ZFSP{hZceN%Tu^J^15quC4hVUpWLHLEjDMwh;EYGzP?HH243WZ*vvR{!gC zAguUhPM=M9cod)R^r)xXPCm$9GlrbRWs&G3)-NCITP#&s-^E%lKPbnv){feQtG(Cz zR)P>Ut(4Tkuzee1|={d=^2SOO0BDmvEEX!IizQsk$-^r%#p1QF*pW_Dp>gqOeRS%?$5~1Q& z0j&upYws0us9QCgm#SRH91=9L9@g3O!OpNvTnSQW`o=U49yZ#hS9kbz5^^rd4U3)4 zsRhp&O$I=&J$(`Y$0-*Mn*$nASz+Ie;vWGVxc2w50a0uHCFYZKv?A)!#sc6eA;}}A zOJh2ux?38eBpFcH7BZDssF+2G2LnmjkkOiXP;g9i9@M{W^9FK7Yr*-08dQ8{#Fbii z@lnXope$i`78LOB!RR?waDJOYDP#BN4nE9zox|DYb~(&K<~@5vwi`I|cK>p< z+jm*U0Q(TCpquZ6RKrfxe7Y?=d?2yUyTt|*tY#{$aG4AtW61(~9_;&d$ESUxQ{A(7VM zSwoc=@_CQG$#UeNJoEEPHf$w6`x3W{I`q(Gqa9c_jnt&mkL0d{eruWsw9DCWlRUHw z(kL563>oELrG9T7K4U#z?H?GLDeuF3CnOY}cLs}`X@U7Ae(nEeT>V`qa!O4W3*q*%(5!;EL_Z(Ll!ys+55q`DJW&1!%5)QVlX z=0CKWGU)7oN#iC$tYGhWWcB%Wf+r9)upMbXc3%3ZwD*SwAQ;>sT&i`JWm>dW8H;66 zHkMLAY;}v)E_ge&`Jo7Rx>xW+>H zCl0hsZk`0$DIN$VI8E@Jj}{f;0-kZlkWevBo(Q;t3hb`ErO7dQ0?lijoTyjI4ODKd zsA3XSDQW$w)c>xG-}>nPs+#}r%iN&Be?5k0a|xinuYP9k6E-3$R>5-jpTed}3h%aO zXenTFtvYCs!QWl7s$XVn@7*@X*Yhl_?}8Me+^D={Xv|QjMSbO|%`tlzd-ZU)(M#;{ zPc&AJ@Pw!6(|KwM-DLDLNw6+=AJcL+`8v8GE;q56#W5XxcMtP%Ry}XN%O0XpA&}l! zXyi$$i9MS=cdWlL&%c;{mbW`)>RhPjeTxxxyl)xRQ!rfr^SGrrghQOY&PQa?MQP2< zkIF*KMqs88d3hgioJH9yZa7qwSu+@hZ>mYaT4}uC5Wed=A?N+DFSx<@$>>rMAUbw7 zg{qLP$$JpydNHGnp5uR7!;|R>^U-Ez_H{bS(e0DpJBbc^B?GFQAfHLsN?U>^p~I5j9e!Hr2`22{ zl@fUk2#C>aEC6vPg^mdQ!q~bEJ`?02rLE3hQ#p4ww z(HMEl4Sv`3+V#4s>|R1V*un#MIS+s_d^Z66M2{VW@tya!zj(iS@?3R~s4FY(&!#rJ+~f5LuIGfF6$83zB72_f(M8l>P8w3R-+ zdN%?N~*hJP0ZOYpO-;xR6e8+oLY5HbovqAi9Fyz@|)Fh5? zLi>4Y{T)Kvb4sO*iHF(QF6sSa+~NJfADbkfLPC~>voO(lX^-yD!cHv3W(f%y5B@WU zVi13t7o*cPpAfmbl8tqoB@Tz^?m|aqUv3+d)y}M%SCXbX-pxy2MMZL*nrdBUHm-|V z^x>$gq~BsmJ%+hl_v^n*!+iJui0G%H^Vu<_ex6d0#g5OWdROP$3+`TOfe7LkBN1ix zrWJ9g&^W&wG>Vmu#ZZmG0`mi0Z6rmT_3``b=BM}OusR0|I$H>pFyAarKF`( zMY_AYk#3X*U7Dq&S(omGZ=ZMOi^F%mgxv!CS+^fLSpNS{A@;BBLn;PvqsbU+#DK0 zY|}5M$Q1L-^_(}~LYT{DuW+ydjY9$I4clZJ4(c*c^H`4pr?GvBn7$jMaMSTx8*1SF zmdiy7&HWge3H-FyVb3{5H${wSIT}7Qb#_B%_OSd6Ys9FN{8Ifl0k_|nE+HM#u=&E| zZg}eArSxQN*~nAMC#zo*hz_yu@PUqOMG zVW%60ZeM(uj2y=j^@V-Vftr<|zuhH54d-5h7idZm%x7J5FeQ3}45VUd13$c^iESM7 z``fO_{Fvs(NrKJ|Ou1rgKB>00I&45M`>MfqRZOoYVJET+Riq(sFO%)BSl}Od@0rSu zwr6ewax%gaU;k;q^&5GPo+P1I6U@B~%Gf0UJ#|5`MgjRe$r^x+^V0W^qp-u&Zqm_Q_nA2*2X99sjX-E3H&@@@%xZ&)^<6`q9otmAoHM@d{W_nGRi}(VrO#;t&F_ z*ZbnFuE97XulmBCzIIxqFEZGDeHbHSwD1}XGP0JDuj}>30sy-)Q^r)onq9%x`>w<> z=i!%F)s5*B+J_fvlRMwH`o?XS9LZO%eT=>xV4rUOLO1SnCjy*pUmXT!qd8@}{@JU- zI9x~>eFgwt<803D?7s#u6wLdOT6{oSqiT?Ds#0H-U`14Tu4i}McQ2yi=+D%OSFb2L z^pZf0Bh3H{u-Y~8zf|u53qQ1U%{=Od7U$zxB=#i)-5(8)e9V=6&6&wtsJ2k1(Ji{w zTaWtFgaAn7Ug>%q$q}LnnmfZu$L=G; zwJuyS4f+}D(sqn7aPs|-tNPw7NQmZUG&;1EJ^;PUzP_IM{ zphuxhMn*9jv=>k>YPaCU6vBfvW z<$LWrO3Grga8r@((oqKYW7ovyQ0G=vWlu%2~aI}@{^ygJg@o-FpPM-+RSke z?i>UFH0;`mbPXI`O|ztajfDIKwI{?58P#s7%!N^qe&lAfQR<|fo>QX#S$(_3lJ-#r zM_bM3foi3U^=c$!tD8vmAyQuS`P$v5uT5Hwy6OdI+)}3$JrA5cAm1>&O}^SQtg5de z^Y6Oc7tm}O(|ZUX(g6d3^4A;MKpwliSwFr2N?!W;JL89~pa*sO>%zyvb8JM{FMnsP zAH&T@Vz@3C8sUz!+m<;TTBJU^Dh}?G`9bbMx366P3E5Ej5`0G@JWrBbOjURLdboep z+>%zPt12m>XN*McpUr7YTKvz=nQ#!bkRG~~LL=WvD6M4ZqUQV;1%IAy%7#!3&hS_- zT>>`Y<6R!R$f!|$6CN2VUJJzNrk=x(MC5$ERdrzSr5JizArl}C7X#J3TS>*IGrXq4 zlXQg}m`wB}p`~W5;J=715v5K}9y|Nvl#`n#;YabzUCICBNwi^`cRTNn>ibulDpH41>je7qu|AD4qL?La#t31>axdom?8)Iqqn#xe51$!fPD4 zYCjB_$#yUzZf!%iQ00PeS$X6}EBF(^?IHshO3XydDoB5AN*eLbrP1YJe{Yz`>9sf; z`mXc0v+z*+!M)Vxj+e5UU$1VDsx(NS7Myv)h-XUDFDAq_62Ox;GFZWe9a-6&gIbXU z=s*+$T}?w)gQOwI8<=)#y<6KM$KFArJAiaH+LjpGw5yz$FH0N;e-ly5h8%kf3H6`v zFtV@=PDt6VSd{qfDjZcBd<8wB?TFYSNrQLaXTWQGDfY73+<))SO^5$jKcOz1;!N@| zkW2XEzr=o)wDtNo9JMsjf#BYX z7w8;_n*`eD-{BT=nr{rZO{6MAu~61$8>het7qP&K~`~pY=BGR7?n@lLb^#f;IO`c!9>|Fk&(zuBXpV!0jV`ch0HZ{g>h6cwI@^$K%OSM1Xk< zi5`env3dMB#huj5X-%rrQP@qn@%7o89f2@nbiRdq#Yc-4_>dz!pz^AI9lyiXyaTNl zZ=)da>yu@*bF`Ywo@mco8925}RRtPJ;QXCc5&y)8l12Tq$vj9CuE_FJ;M>{dAoyNl z-~hvqEnptbtNWJ~3&19|gEB}=uQJpQ8oU=y)7}9+_4^TY^jzeRpx<;)70Prn$I(fv zs7a%Xp($3G?@E;x`|Pu#s;kOK8SaTCG`JdG^CZz+Vu6lC)m`Gcv?dMuAzEOenxahY zG|@0~%7Kyc$SpS-TS2|rl2w=4gpQvkd+fA z4}ZC!&Ih!u-_Dyo{E`x)d7SaTL9FR#U13$FP7V`VH`xnuhpFNKG(aV5X+A0ogum|R zZLiU9JWry7uNXochap17-H%IW5nHY`UAGcz*Raq^tS%jI#2&9cO<-u}Q3}v2I#Qv` z7`{@B4fI};fK;gf)PWFch4b#*hj5B)@Ppg^Mz3JE8~w|Vt5&B4Ip2oq=zV7)2;!biaB zBIYl4wQw_)dOK--xU`<()3niaaeghMQ`J|!Y884F) zP57+dIDRT44gbV<)XfsZ#M-R>31zn_=;<3Ljj#>vukr`zl`~&eql#Z@zo--gq|rSC zWs+lplPQ7V2p3OU#7G=V=4VgFHSv0Cj>3M-d{7lRAkAsnXGjV3!su@bm!(dX22P}8 z?&qZ*CwI-R4mQlI_D*}fBDmxuZr%fgQs>i?A&p~Xdd44+@x=}1MFqC}JH_&%8W9*) zWGKDW^w%9mQper{CyzCf=Sx9XOO4!Oe!})YvM~H2kU>yIDC@c1*I)PqrY2AU==HD= za)zO|lhKXtP2DKwkyfZ06r?e5@qzc)bwtV>Q@|excVQv}Qtb5~s#l{>)(h$H7L=qe zdA-7rjN}spJVLPtdirYzK~^ zYmeDi4-ar3C58JfsfR7^p1V~B?9yjQP_q(z@sCn?R8twyq*0@{G zfNClVM#0PQ6rVBs8R^Uh!cy-;kSDO?Ho3+pW7tm9d+d^TsV4V>y%ba>*Cq~K| zS{eeOryjKLy{!+!!(=8hYuQAa=?`}Ba%i%awul(vKD%ZZTq{n)!wX~{w5_H|yDb`N zzj4`Q(hFG_P{EGhgd;nW%SR$wj)s-G0ITx@M{7}inznFeP$a;B_MM5~WXP+oq}uI!IZm#(FH16`w=ov=KWV-!rs(;@vTNoh z(|RZ&>(>SCzrRPCR=5rOLBCNM>(}n=>HdOn2kgrcN?9TXxTa`3;F4UX_(0g3hrdzi zll2uJ_s41xX086L%3Zuo5Xb75wY?eL=2JEUACeDOlNUFVN7Kfxg;MX|S{K_8v53}kEt}Sy zo74W(#cuAUlW$5#NSr3`szd-fyZ1RGbjbM!Mqu`wqHVGfxYq7N0tfDhQ}altpeGMs z%6!4~a%5)!+Sa9-z~>K<(H@VVX=7qnr))y^Kcyb{h&FhG@>tLRxIM4$YF7GnWD#^U zM1%6{5rzRXT^8o7VS!S*_7Q}bu55HUnR)ixxPDw{x^e8%uncRZ1B+t6Wo!O!s6)9+0Q5A}1bmtDL2$#ma3djd55xT67^qD?gJq0SKg33i1H$YCu4 z+E}}_-&m)+Vij-%*+l_7HLMYpFY6K8#R4E?VCmJOB~RN+I~GhJ+g!l7`qKrMsv*2$ z2-`1HT`hBrx?dI3pxaoVsxrcMv1hN*F8gf4HQ;cA1#WtKN+EgGBGhHkH?um|F-oDi zgzHoeKRlxkf+MiX8+N49gWwQ7!li0U5W=}m@K};l15?$e{IFWb^m-Go=d!w%*6?CD z{L3R`WDUIKH&+ji6Cdd@xv?&NeVoxw`EV@vc=3i`DsRGw>1~6z$;H_a(u&9nYrkEu zrQI}~{m1<}wOIf{9q~t<6%R_?a^=5H2z}fj9O8U0XkPs{BkjU$d*ZWd(D{^? z&Bflz3ku07P=idCukAe3^Lq=mK@^+ag=aqOZ0Xwb_kwAi zcV7t_nk@J~JR(vbs~?U(Zy+7mz$0Q0W#XL3gZfA4|3SEjDvNV7bW>A^hX@9}pkopw zHPs=CA^d5gvvtdhd%`r3Z1_aDBIz=8a^^eShWlfJzrGyUw8&gAFu7#^v*vA5leZz?T%Qb~zNLyHY`-;KMt%j)7+d^&wD)HGWky(ojsf1FLYd@dCC8u!KVkO=l0 z#_(Hfd^(S62Eoub$=GQybVdb6aGJCNCHgxVtaw?4^?N(w7Yu_T3M1GwfX68)%TmI}H%8Wi1jX72MjV=}DIrtD|0pa=^hJ*hwe(9Qc6>;d81 z@F}h}*o(vfvMlDBw#uvtlx(vCSh9`PH5Q6=-aClTRW++kQhDUPL+zV-^CD)T4H4vj z0_{PJx~&M?eAJRAc%?6t^t)_^1Ym!nFQ7@9H&d~R4=ck--jpdsS?>z+KBEsjagE#p zahmw#SOcT@Y#0ucL%V`ss-nKmH{kx%K`0rQX)xmzC;~q7erx3D(8Lkh&nZ$@GzQ~c z>kPz+&o|DIj2?^FMM||xY9WClMpx|N>72uB`67#cFqOaX^RQSvl|&TT+UDVB@NIvf8{;?*mxMebA!}rB@itup}m) z@d^WyAVOSx7l2h{JHatZ4YhZyWQ?1yT0;|-r;bFJct}jJ}FMNsDH>D)h%;7o>>K(`0o^wX|v!oP3$RMue)LTndo|Ew#T`^DdHfU#I9+ zAKEka12f1`It`7VpfZ&b1w`V=*^?4Gxf7Afmc>-^vGf(#3}7Y@;NdfZR0Zat@2!6D z_bU!@CuGmDJKj9K_cgxUqu^;2pcp_| zG>=6O!)8gm(`@>7VP5yWOAb$<^73rI&BfCH6u{c5UP}n|!@)llCFkS9(S3{yvJ+JNe=I)iv ziXJu`rWD)osPT`e#5zB6sf#o*zY7;DF zvo-E5jVN?xduX|^p`jw2#J_@#9p*~j?r*%WXupk(_g=B1x4!GvfzZt<8MraMuY%kd z)w-D-Er>$=il$PL+C<@8TDbz@m^ zy&>H_Ov*C3h#N~Opo)|Jl#U7S+GZN}?Ea_p>|lIE6!@-O{`sDmmkPnM3V^?_!00d( zk%V6Hcc7S;yC-3A?o(o`56hO0IJ0?ufy~{8wz&H7m{eM0a|YHC?`6zY25OL~DwHIi zg7WG1X3fim5YdxNjoHF-@ErI!-*U8sm7i8BA78YuKH9Etxi?>=Xq?9nq&8R@OJO;h zR~H(Gzw^D+zPN$Y#1IJ!Y)tM~ty@sN}oc9wtEfN*HF@$LBHU|QJ8;Gp(RFnE7M@*>|>adU)DT8IWG za4crg`a0@cSCv!gmK}ZeCUhmK)DNYT<7$(Y)*ZQE#GbLffBOmTT^9AzYcCw{8OmD% z`%;N#WP0&cng+kL6UUqqemQDf6xWl9^mlLI2nTbKtK)k4^F}||GrD34qO9Sgx;p}@ zcU0d5e!LiqyAr!Iwjn=D5@#feoC~p$Ss)s{3KfY#-%KR2ACfmA&DSJ#Sc?rIB4QfS zQB-Ec4Afv`2;rC^9GW$E0OjLmnZ;vM9(;YqNc7Fu805i@jlS1Juk$9VOdrC`7*Zg+ z8Xt^Xf(k@^k}-p#5r4152Z#!okGI}nzmdkUk&~yRiAD=1#T?L0kqtr8;sG~%gJ=|h zA+D@MQj{Aj^6UO@dPnRKwbj_xrzgt_Rg4Wn6tSoAZw~xy!j5ut2ghH zHB5-X-E5Egq2j=dL~+p-VqywP-0z*8<`Df{vufhI}EYIc9H`TR)K}#Z(@^uJ5(+ime-+wJl@mFtB;Wbl7OGjYR z-nhQ`+%f73-a6N`ohd}GjT9M$f9un-^ZB%BlBKFv{;2@A(X1pvCMm6ed@8CPPEv?R zfKtHJaY`6}MDy7B%@MXhm2t(?M&!hiPHv^8sMB3+j^ z{!hEjIZn11BSh_nZBRzx<+qd%Oiwiyh6{>Ktyop&tZdd_E|pa^h)cBiFW?DeeaAiz zeXSKAb^)WKhwsqYzisJbgc8&0?AQN~1`3C90Ekgh(VT zMyi=bUT%;|R-R!{#iG5Chy%l>M-!O|pN#VldBz~SDaDD>aF=QAjYa~i^bS{4aFl#R z03AnB8kW-2Nqz%#vh-+7LdRk!2$IS`xem4;j1N6#VDh%7NiIYKgu8vmjl5>^Y)w2~ zncnZi;T>tevh5nC!uO0uE(O%hg<7kl;&R@*8Rbc9@ZBw@g`_K#NZS#@)_;UDN%VczuZ$`=Er54jiNjt3Vt@A zQ6$&$S&sQ(?%jOlipf`OoS9ZFdHLU?{J1zo<&M!>e3-?o9J@D2tDZNx4=JsL{W-u)e@m}7+J5BFLD08X5;yo}B>*ys~F zK_+^UOFiMHBX60DEDAw0AEig?0V74CPT!*gcvuhW}iEBM2Z)|NP*gO@6~`ePxPL-mN` zK8M*7UJ2W3aL-(ca0B9-IrOkG;%k52pK4}lSAn0trs0YtpJ*2n>$4eTO&}~SB)Ssz zCu3Bq=*of6+W z$D#+xRP*geS9qXr=ICExg4``9F|{b=pU*XyF=D+gvFn4qApvI69e-PvyF+UfwLSTC ziz^t?xF{Wdqf$*I=`irx{2=;9)PeVlqx;G?>i2Aue{SUJP>`DC8nqy}4qjPKdCRxZXxI7Lw-ho83G3?=Ct!XuZ|O%*79SENGGPfBev8 z%$EJ3gxk)u5Paa5l*=%#V)-ebS~@3<|N%>!(9 z0yB3?>6a$b4$CGR-}Y={-@b+av#aS2+r-RulLQ~4O@ts2`5of_>2Se=*iUGOhOy%E0MU$7e6i$B2 zuX^O*8h3_RHq%Rtg})7VtJ6Ql?(X|HLhp6gwsOF_#YtxVr)M9)JL0qxhsBHgiI>cA z4w8E3%&ctc8(O^|(#=ikU$s0es_*etdDKI~+6JY3H>SUZoy$ zhN4&$Y?^lWw$(P!fW7w3_Qq4cUmX?O7u0 z`l?tQasH)x%PjkjSTg8Nb+S34@$&MLPSXGSeDYy2R2{T};C{SBo%~*rot-`Mg+Azf zu@t_8GgaJNF)=am)B1E`Y&ZA*rq#6v>_>VSG(I^w+2Ol))eou8iOxv9RXk4C@|yR< z#H9Bl+#y`rHF;qJ zyOVIOoAL6)N)3Mqs`=~-f>in77$P4|Zt>$+V}T3z|b}qLTi%B}ms$<;KE}JEmb1eUavhW`*(szaPf8 zl0newOFr%F;z3w*VIqWi2wTIc5nYhVX`LEYd&F==gyw7wC{HOyIT=Z$X8%mi>9~SE zeGt;k#QRWBKtSMv)MWTBK~)cXO6GiFOU)onalgwWXqO*_j~BlxcxyO*EH%~3eqn9x zA9b6;tMa7RRPip*PLcGN2=T!4y_rxfLM}(;;-sI}?npmw3%ffpA1U#mhx>mlKK&9p z0};2EEw4-gsCozyl4_Qe{~7>*d~`+tkY<-bf=EOvM5q7|_B8B2U;pPn`Oks)zi-0> Z3QaxKj;Fh30QqhJ$_i@oHL~U*{{`EMx&;6L literal 0 HcmV?d00001 diff --git a/documentation/key_concepts/images/datacube-vector-example.png b/documentation/key_concepts/images/datacube-vector-example.png new file mode 100644 index 0000000000000000000000000000000000000000..1bbd0fc0b7e332d2a4f00407edd3f3e3b7eb7c3d GIT binary patch literal 40064 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 literal 0 HcmV?d00001 diff --git a/documentation/key_concepts/images/processes-overview.png b/documentation/key_concepts/images/processes-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..c3584a616a9bd80cccbd54ac0426235a88dfd0ab GIT binary patch literal 31202 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

mu-Un5J~hxFoDA&3--K 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 GxBnN4i|_LQ literal 0 HcmV?d00001 diff --git a/documentation/key_concepts/images/processes-udf.svg b/documentation/key_concepts/images/processes-udf.svg new file mode 100644 index 0000000..94b574c --- /dev/null +++ b/documentation/key_concepts/images/processes-udf.svg @@ -0,0 +1 @@ +

Data Preprocessing & Fusion

Labeled point extraction
aggregate_spatial

Labeled patch extraction
filter_spatial

Inference
apply_neighborhood/predict_random_forest

Model training
fit_class_random_forest

CSV/Parquet

NetCDF/GTiff/Zarr

Final Map
Cloud Optimized Geotiff

STAC API + Object Storage
export_workspace

STAC
ML Model

\ No newline at end of file diff --git a/documentation/key_concepts/processes.qmd b/documentation/key_concepts/processes.qmd new file mode 100644 index 0000000..cce720c --- /dev/null +++ b/documentation/key_concepts/processes.qmd @@ -0,0 +1,203 @@ +--- +title: "openEO Processes" +--- + +An **openEO process** is a named operation that takes one or more inputs, performs a task, and returns a result. In simple terms, processes are the building blocks of an openEO workflow. + +Some processes load data, some filter it, some transform it, and others summarize or export it. By combining them, users can describe Earth Observation workflows in a portable way. + +As described in the [Glossary](../glossary.qmd), a process is an operation that performs a specific task on a set of parameters and returns a result. + +Examples include: + +* loading a satellite collection, +* filtering data to a time range or geographic area, +* computing indices such as NDVI, +* aggregating data over time or space, and +* exporting the final result as a file. + +In openEO, processes are combined into a **process graph**. A process graph is the machine-readable description of your workflow: it tells the backend what to do, in which order, and with which parameters. + +![openEO process workflow overview](images/processes-overview.png) + +## What openEO offers + +openEO offers a broad catalogue of standardized processes that cover the most common parts of EO analysis. These processes are grouped into categories such as: + +* **Import** processes to load collections, STAC resources, uploaded files, or URLs. +* **Filter** processes to limit data by time, space, bands, labels, or metadata. +* **Cube** processes to manipulate multi-dimensional EO data cubes. +* **Reducer and aggregate** processes to compute summaries such as mean, median, sum, or zonal statistics. +* **Math and logic** processes for calculations, conditions, and comparisons. +* **Reproject and resample** processes to align data spatially or temporally. +* **Masking** processes to exclude invalid or unwanted data. +* **Vector** processes for geometry-based operations. +* **UDF-related** processes for more advanced custom logic. +* **Export** processes to save or publish results. + +The official process definitions are maintained centrally by the openEO project in the [Open-EO openeo-processes repository](https://github.com/Open-EO/openeo-processes). For everyday use, the easiest entry point is the rendered reference at [processes.openeo.org](https://processes.openeo.org/), which tracks the latest released specification. + +::: {.callout-note} +## Note + +The openEO process reference lists the processes defined by the openEO project. A specific backend may support all, some, or only a subset of them, and may also provide additional backend-specific processes. +::: + +## Embedded process reference + +To keep this documentation page useful even as older mirrors are phased out, the maintained process reference is embedded below. + +```{=html} + +``` + +If the embedded reference does not load in your browser, open it directly at [https://processes.openeo.org/](https://processes.openeo.org/). + +## Process families at a glance + +The full reference is extensive, so it helps to know the main families of processes offered by the openEO API. + +| Process family | What it is for | Typical examples | +| --- | --- | --- | +| Import | Bring data into a workflow | `load_collection`, `load_stac`, `load_geojson`, `load_url` | +| Filter | Restrict data before heavy processing | `filter_temporal`, `filter_bbox`, `filter_spatial`, `filter_bands` | +| Cubes | Transform or restructure data cubes | `apply`, `apply_dimension`, `merge_cubes`, `rename_labels` | +| Aggregate and reduce | Summarize data over time, space, or dimensions | `aggregate_temporal`, `aggregate_spatial`, `reduce_dimension`, `reduce_spatial` | +| Math and logic | Perform calculations and conditions | `add`, `divide`, `normalized_difference`, `if`, `eq` | +| Reproject and resample | Align data in space or time | `resample_spatial`, `resample_cube_spatial`, `resample_cube_temporal` | +| Masks | Exclude invalid or unwanted values | `mask`, `mask_polygon` | +| Vector | Work with geometries and vector data | `vector_buffer`, `vector_reproject`, `filter_vector` | +| UDF and external processing | Inject custom logic or external compute | `run_udf`, `run_udf_externally`, `run_ogcapi` | +| Export and STAC | Save, publish, or package results | `save_result`, `export_workspace`, `stac_modify` | +| Domain-specific EO processes | Use EO-focused higher-level operations | `ndvi`, `sar_backscatter`, `cloud_detection`, `climatological_normal` | + +![UDF-related process extension example](images/processes-udf.svg) + +## A simple way to think about processes + +You can think of an openEO workflow as a chain of questions you ask the system: + +1. Which data do I want to use? +2. Which area and time period do I care about? +3. Which calculations do I want to perform? +4. How do I want to summarize or export the result? + +Each of those steps is implemented with one or more processes. + +For example, a basic workflow might look like this: + +```text +load_collection + -> filter_temporal + -> filter_bbox + -> ndvi + -> aggregate_temporal_period + -> save_result +``` + +This means: + +* load a collection, +* keep only the dates you need, +* keep only the area you need, +* compute a vegetation index, +* summarize it over time, and +* export the result. + +## Standardized, but not identical everywhere + +One of the strengths of openEO is that the same workflow idea can be used across multiple services. However, process support can differ between backends. + +Differences may include: + +* which standardized processes are implemented, +* whether synchronous processing is supported, +* which experimental or advanced processes are available, +* whether UDFs or UDPs are supported, +* which input and output formats are available, and +* whether a backend exposes additional provider-specific processes. + +This is intentional. openEO standardizes the language of processing, but each backend can implement that language at a different depth and can extend it for its own infrastructure and data services. + +If you want more detail about how services differ, see the [Backends](backend.qmd) page. + +## Process profiles and support levels + +Not every service is expected to implement the same full set of processes. To make support levels easier to understand, openEO defines **process profiles**. + +These profiles group capabilities into levels such as: + +* **L1 Minimal** for basic openEO compliance, +* **L2 Recommended** for practical day-to-day usage, +* **L3 Advanced** for more demanding workflows, and +* **L4 Above and Beyond** for specialized and highly advanced use cases. + +For users, the main benefit of profiles is simple: they help explain why two backends can both be openEO-compatible while still supporting different sets of processes. + +The main profile levels can be summarized like this: + +| Profile level | What it usually means for users | +| --- | --- | +| **L1 Minimal** | Basic openEO compliance and the minimum process set needed for simple workflows. | +| **L2 Recommended** | A more practical set of processes for everyday EO work, including common filtering, aggregation, and data-cube operations. | +| **L3 Advanced** | More advanced process support for richer workflows, including broader callback handling, STAC-related functionality, and advanced cube operations. | +| **L4 Above and Beyond** | Specialized and high-end capabilities for demanding or niche workflows. | + +There are also sub-profiles for particular needs such as raster processing, vector processing, date and time operations, text handling, machine learning, UDFs, climatology, and analysis-ready data. + +Some platforms also defined extra requirements on top of the general openEO profiles. A useful example is the former openEO Platform federation guidance, which introduced additional expectation levels often referred to as **L2P**, **L3P**, and **L4P**. + +Those platform-specific levels can be summarized as follows: + +| Additional platform level | Practical meaning | +| --- | --- | +| **L2P** | A backend not only supports the recommended process set, but is also expected to handle core raster workflows reliably at meaningful scale. This typically includes common processes such as `load_collection`, `filter_temporal`, `filter_bbox`, `filter_bands`, `apply`, `aggregate_temporal`, `aggregate_spatial`, `mask`, `ndvi`, `reduce_dimension`, `resample_spatial`, and `save_result`. | +| **L3P** | The backend also supports more advanced capabilities that are important in richer workflows, such as `apply_neighborhood`, `load_stac`, `filter_labels`, `reduce_spatial`, `resample_cube_temporal`, and `run_udf`. | +| **L4P** | The backend additionally supports more specialized or high-end functionality such as `atmospheric_correction`, `load_uploaded_files`, `load_url`, and `sar_backscatter`. | + +In practice, these extra platform-specific levels were useful because they signaled more than simple endpoint availability: they indicated that important processes were expected to work robustly on larger, realistic Earth Observation workloads. + +## How to discover process support in practice + +When you connect to a backend, you should not assume that every documented process is available exactly as shown in the generic reference. + +Instead, check support using one or more of these approaches: + +* Inspect the backend documentation. +* Use the backend metadata or capability endpoints. +* Use client-library helpers such as `list_processes` or `describe_process`. + +Backends can implement a varying set of processes and may include non-standardized ones. + +## Where to learn how to use processes + +For practical usage, the next place to look is the documentation that shows how they are used on data cubes. + +The most relevant section is: + +* [openEO Cube Operations](../cube_operations.qmd) + +That section explains how processes are used for common workflow steps such as: + +* preprocessing, +* spatial operations, +* temporal operations, +* spectral operations, +* cube manipulation, +* UDFs, +* machine learning, and +* job execution. + + +## What to do next + +Depending on what you want to achieve, a sensible next step is one of the following: + +* Read the [Backends](backend.qmd) page to understand where process support can differ. +* Go to [openEO Cube Operations](../cube_operations.qmd) to learn how processes are applied in actual EO workflows. +* Open the [openEO Processes Reference](https://processes.openeo.org/) when you need exact process definitions and examples. From 385cdff99fd80c9960ccecae61af45da553e2f95 Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Sun, 9 Aug 2026 18:44:45 +0200 Subject: [PATCH 03/14] updated navbar --- _quarto.yml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/_quarto.yml b/_quarto.yml index 25afb2e..34f52dc 100644 --- a/_quarto.yml +++ b/_quarto.yml @@ -50,18 +50,22 @@ website: - sidebar:support left: - text: "About" - href: about.qmd + menu: + - text: "About openEO" + href: about.qmd + - text: "Project Steering Committee (PSC)" + href: psc.qmd - text: "Services" href: https://hub.openeo.org/ target: _blank - - text: "News" - href: news/news.qmd - - text: "Meetings" - href: meetings.qmd - - text: "Events" - href: events/events.qmd - - text: "PSC" - href: psc.qmd + - text: "Community" + menu: + - text: "News" + href: news/news.qmd + - text: "Meetings" + href: meetings.qmd + - text: "Events" + href: events/events.qmd search: true sidebar: From bafb2b3e72efdc538a1e50bdde6423bc6cfcb600 Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Mon, 31 Aug 2026 16:39:48 +0200 Subject: [PATCH 04/14] finalised cookbook --- documentation/cookbook.qmd | 82 ++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 44 deletions(-) diff --git a/documentation/cookbook.qmd b/documentation/cookbook.qmd index be9e74a..f69e019 100644 --- a/documentation/cookbook.qmd +++ b/documentation/cookbook.qmd @@ -2,6 +2,8 @@ title: "openEO Cookbook" toc: true jupyter: python3 +aliases: + - /cookbook --- ::: {.content-visible when-format="llms-txt"} @@ -40,18 +42,18 @@ Important concepts: ::: -This is the openEO cookbook that you can refer to to get a first idea on how to solve problems with openEO in the three client languages Python, R and JavaScript. It describes how to implement simple use cases in a pragmatic way. +This is the openEO cookbook that you can refer to for a first idea of how to solve problems with openEO in the three client languages: Python, R, and JavaScript. It describes how to implement simple use cases pragmatically. -We recommend exploring this page if you want to use any of the openEO client libraries. It is not a complete reference, but rather a collection of examples that can be used as a starting point for your work. +We recommend exploring this page if you want to quickly get started in using openEO for simple usecases. Please note that it is not a complete reference but rather a collection of examples that can serve as a starting point for your work. -The guide requires a basic understanding of the Remote Sensing and programming concepts of the respective client language. +The guide **requires** a basic understanding of remote sensing and programming concepts in the respective client language. ## 1. Explore openEO backend In this chapter, we will explore the openEO backend and its capabilities. We will connect to a backend, explore the available collections and processes, and check the supported output formats. -Prior to running the code examples, make sure you have installed the openEO client library for your preferred programming language (Python, R, or JavaScript) and have set up the necessary authentication credentials to connect to the backend. +Before running the code examples, make sure you have installed the openEO client library for your preferred programming language (Python, R, or JavaScript) and have set up the necessary authentication credentials to connect to the backend. ::: {.panel-tabset} @@ -150,9 +152,9 @@ import { OpenEO } from '@openeo/js-client'; --- -In this cookbook, we use the openEO federation backend of the Copernicus Data Space Ecosystem, available at `https://openeofed.dataspace.copernicus.eu`. This backend also provides access to partner resources. For more information on different openEO Backends, please refer [here](https://hub.openeo.org/). +Throughout this cookbook, we use the openEO federation backend of the Copernicus Data Space Ecosystem, available at `https://openeofed.dataspace.copernicus.eu`. For more information on different openEO Backends, please refer [here](https://hub.openeo.org/). -Once we are sure on the backend we want to use, we can connect to it using the openEO client library. +Once you have installed the client library, you can connect to the backend using the following code snippets. ::: {.panel-tabset} @@ -181,14 +183,14 @@ var connection = await OpenEO.connect("https://openeofed.dataspace.copernicus.eu ::: -The `Connection` object is the central gateway to interact with the back-end: listing collections and processes, building algorithms, and executing and monitoring batch jobs. +The `connection` object can be used to interact with the backend, for example, to list available collections and processes, or to run processing workflows. ::: {.callout-note collapse="true"} # Authentication -Please note that basic metadata about collections and processes is publicly available and does not require being logged in. However, for downloading EO data or running processing workflows, you will need to authenticate. +Please note that basic metadata about collections and processes is publicly available and does not require logging in. However, to download EO data or run processing workflows, you will need to authenticate. ::: {.panel-tabset} @@ -227,7 +229,7 @@ For more information on Authentication, please refer to the [Authentication](#) ### 1.2 Explore available collections {#backend-collections} -EO data in openEO are available as collections, which serve as the input for your processing jobs. Collections can be listed and inspected programmatically, or browsed via the [openEO Web Editor](https://openeofed.dataspace.copernicus.eu){target="_blank"}. +EO data in openEO are available as collections, which serve as the input for your processing workflow. Collections can be listed and inspected programmatically, or browsed via the [openEO Web Editor](https://openeofed.dataspace.copernicus.eu){target="_blank"}. ::: {.panel-tabset} @@ -238,7 +240,9 @@ EO data in openEO are available as collections, which serve as the input for you connection.list_collections() ``` -Similarly, you can get detailed metadata for a specific collection using the `describe_collection` method. For example, to get metadata for the Sentinel-2 Level 2A collection: + +Similarly, you can get detailed information about a specific collection using the `describe_collection` method. For example, to get metadata for the Sentinel-2 Level 2A collection: + ```python # Get detailed metadata for a specific collection connection.describe_collection("SENTINEL2_L2A") @@ -282,10 +286,10 @@ console.log(await con.describeCollection("SENTINEL2_L2A")); ### 1.3 Explore available processes -Processes in openEO are operations applied to EO data — for example, calculating the mean of an array, masking pixels outside a polygon, or computing spatial aggregations. The output of one process can feed into the next, forming a *process graph*. +Processes in openEO are operations that are applied to EO data. For example, calculating the mean of an array, masking pixels outside a polygon, or computing spatial aggregations. The output of one process can feed into the next, forming a chain of workflows called a *process graph* in openEO. ::: {.callout-tip collapse="true"} -In R and JavaScript it is useful to assign a process-builder helper object to a variable to easily access all openEO processes. In Python, a helper import is available too. +In R and JavaScript, it is useful to assign a process-builder helper object to a variable to access all openEO processes easily. In Python, a helper import is available too. ::: {.panel-tabset} @@ -327,9 +331,10 @@ var builder = await con.buildProcess(); ```{python} # List all available processes with metadata connection.list_processes() + ``` -It is often easier to consult the [process listing page](https://documentation.dataspace.copernicus.eu/APIs/openEO/Processes.html){target="_blank"} or the [openEO Web Editor](https://openeo.dataspace.copernicus.eu){target="_blank"} sidebar. +It is recommended to refer to the [process listing page](https://documentation.dataspace.copernicus.eu/APIs/openEO/Processes.html){target="_blank"} or the [openEO Web Editor](https://openeo.dataspace.copernicus.eu){target="_blank"} sidebar for a more user-friendly overview of available processes. #### R @@ -369,7 +374,7 @@ console.log(await con.describeProcess("apply")); ### 1.4 Explore supported output formats {#backend-output-formats} -The openEO API supports a variety of output formats for saving the results of processing workflows. +User can save the results of their openEO workflow in various output formats, such as GeoTIFF, NetCDF, or CSV. Supported output formats can vary across backends, so it is important to check the available formats before saving results. ::: {.panel-tabset} @@ -404,7 +409,7 @@ In this chapter, we download a GeoTIFF and a quicklook RGB image from Sentinel-2 ### 2.1 Load a collection -Before loading a collection, confirm the exact collection ID and band names ([see backend collections](#backend-collections)). Band naming can differ subtly between backends (e.g. `B8` vs. `B08`) — always check the collection description. +Before loading a collection, confirm the collection ID and band names ([see backend collections](#backend-collections)). We will load the green, red and blue bands (B02, B03, B04) from Sentinel-2 Level 2A. @@ -480,7 +485,7 @@ var s2_rgb = builder.load_collection( ::: {.callout-note collapse="true"} # filtering -It is possible to filter the data once the collection is loaded, using the `filter_bbox` and `filter_temporal`, processes. However, it is recommended to filter as early as possible; preferably directly in `load_collection` to avoid loading unnecessary data. +Alternatively, it is possible to filter the data once the collection is loaded using the `filter_bbox` and `filter_temporal` processes. However, it is recommended to filter as early as possible; preferably directly in `load_collection` to avoid loading unnecessary data. ::: @@ -488,7 +493,7 @@ It is possible to filter the data once the collection is loaded, using the `filt ### 2.2 Apply cloud masking -Sentinel-2 L2A includes a Scene Classification Layer (SCL) band that can be used to mask clouds and other non-surface pixels. We load the SCL band separately, build a mask, resample it to match the spatial resolution of the RGB bands (10 m vs 20 m), and apply it. +Sentinel-2 L2A includes a Scene Classification Layer (SCL) band that can be used to mask cloud pixels. We load the SCL band separately, build a mask, resample it to match the spatial resolution of the RGB bands (10 m vs 20 m), and apply it. ::: {.panel-tabset} @@ -565,7 +570,7 @@ var s2_rgb_masked = builder.mask(s2_rgb, mask); ### 2.3 Reduce the data to a single image -As we are only interested in a single RGB image, we can reduce the time dimension of the datacube to a single image. We will use the `max_time` process to select the maximum value for each pixel over time. Alternatively, we can also use `reduce_dimension` with a `max` reducer to achieve the same result. +Since here we are interested in a single RGB image, we can reduce the datacube's time dimension to a single image. We will use the `max_time` process to select the maximum value for each pixel over time. Alternatively, we can also use `reduce_dimension` with a `max` reducer to achieve the same result. ::: {.panel-tabset} @@ -601,18 +606,16 @@ var s2_composite = builder.reduce_dimension(s2_rgb_masked, max_reducer, "t"); ::: {.callout-tip collapse="true"} # Child Processes -Here, we used a child process: A function that is called by (or passed to) another function, and then works on a subset of the datacube (somewhat similar to the concept of callbacks in JavaScript). In this case: We want `reduce_dimension` to use the `max` function to select the maximum value for each pixel over time. Not any function can be used like this, it must be defined by openEO, of course. +Here, we used a child process: A function that is called by (or passed to) another function, and then works on a subset of the datacube (somewhat similar to the concept of callbacks in JavaScript). In this case, we want `reduce_dimension` to use the `max` function to select the maximum value for each pixel over time. -All clients have more or less different specifics when defining a child process. As you can observe directly below, one way to define one is to define the function directly inside the parent process. - -**Note:** In python, the child process can be a string; In R, we can select a child process from the `p` helper object; In JavaScript, arrow functions can be used as child processes. +**Note:** In Python, the child process can be a string; In R, we can select a child process from the `p` helper object; In JavaScript, arrow functions can be used as child processes. ::: --- ### 2.4 Save the data to a GeoTIFF -For users who want to download the data for further analysis, we can save the result as a GeoTIFF file. The openEO API supports various output formats as mentioned in [section 1.4](#backend-output-formats). In this example, we will save as the GeoTIFF file. +The openEO API supports various output formats as mentioned in [section 1.4](#backend-output-formats). In this example, we will save the GeoTIFF file to a local folder. The openEO workflow is triggered for execution when the method to save the result is called. The result can be downloaded once the job is finished. There are two ways of executing an openEO workflow: either as a synchronous job or as an asynchronous job. For more information on the difference between synchronous and asynchronous jobs, please refer to the [Batch Job Execution](cube_operations/execute_jobs.qmd) page. ::: {.panel-tabset} @@ -763,15 +766,9 @@ var datacube = builder.load_collection( ### 3.2 Perform NDVI calculation -Band math is a common operation in remote sensing, here we calculate NDVI (Normalized Difference Vegetation Index) using the red and near-infrared bands. In other words, it refers to computations that involve multiple bands, like indices (Normalized Difference Vegetation Index, Normalized Burn Ratio etc.). - -In openEO, this goes along with using for example `reduce_dimension` over the `bands` dimension. In this process, a new pixel value is calculated from the values of different bands using a given formula (the actual bandmath), to then eliminate the `bands` dimension alltogether. If e.g. a cube contains a `red` and a `nir` band in its `bands` dimension and we reduce said dimension with a formula for the NDVI, that cube afterwards contains NDVI values, but no `bands` dimension anymore. - -Given that it is _the_ most common use case, openEO has predefined processes that cover the math for us and only need to be given the correct input. There even is a function `ndvi` that masks all details and only takes a datacube and the bandnames as input. +Band math is a common operation in remote sensing. Using this concept here, calculate NDVI (Normalised Difference Vegetation Index) from the red and near-infrared bands. In openEO, this goes along with using, for example, `reduce_dimension` over the `bands` dimension. In this process, a new pixel value is calculated from the values of different bands using a given formula (the actual bandmath), to eliminate the `bands` dimension. If, e.g. a cube contains a `red` and a `nir` band in its `bands` dimension and we reduce said dimension with a formula for the NDVI, that cube afterwards contains NDVI values, but no `bands` dimension anymore. -In this example, we will use the `ndvi` process to calculate NDVI for each image in the datacube. - -The process can detect the red and near-infrared band based on metadata and doesn't need bandname input (but band names can be passed to calculate other normalized differences). Also, by supplying the optional parameter `target_band` we can decide if we want to get a reduced cube with NDVI values and no `bands` dimension as result, or if we want to append the new NDVI band to the existing bands of our input cube. If we choose the latter, we only need to supply a name for that new NDVI band. +Given that it is one of the most common usecase, openEO has predefined processes called `ndvi` that cover the band math. In this example, we will use the `ndvi` process to calculate NDVI for each image in the datacube. ::: {.panel-tabset} @@ -794,21 +791,21 @@ var ndvi_cube = builder.ndvi(datacube, "B08", "B04"); ### 3.3 Apply threshold -In this scenario we want an image that contains all NDVI values below 0.2 (non-vegetated areas). We will use the `mask` process to apply the threshold. +In this scenario, we want an image that contains all NDVI values below 0.2 (non-vegetated areas). We will use the `mask` process to apply the threshold. ::: {.panel-tabset} #### Python ```python -ndvi_masked = ndvi.mask(ndvi < 0.2) +ndvi_masked = ndvi_cube.mask(ndvi_cube < 0.2) ``` #### R ```r ndvi_masked <- p$apply( - data = ndvi, + data = ndvi_cube, process = function(data, context) { p$if_( condition = p$lt(x = data, y = 0.2), @@ -822,7 +819,7 @@ ndvi_masked <- p$apply( #### JavaScript ```js -var ndvi_masked = builder.apply(ndvi, function(data) { +var ndvi_masked = builder.apply(ndvi_cube, function(data) { return this.if_(this.lt(data, 0.2), null, data); }); ``` @@ -832,7 +829,7 @@ var ndvi_masked = builder.apply(ndvi, function(data) { ### 3.4 Spatially aggregate the data -To aggregate over certain geometries, we use the process `aggregate_spatial`. It takes valid GeoJSON as input. We can pass a GeoJSON `FeatureCollection` in Python and JavaScript, but we need to introduce two packages in R, `sf` and `geojsonsf`, to convert the `FeatureCollection` `string` to a `simple feature collection`. +To aggregate over specific geometries, we use the `aggregate_spatial` process. It takes valid GeoJSON as input. We can pass a GeoJSON `FeatureCollection` in Python and JavaScript, but in R, we need to install two packages, `sf` and `geojsonsf`, to convert the `FeatureCollection` `string` to a `simple feature collection`. ::: {.panel-tabset} @@ -880,7 +877,8 @@ var ndvi_ts = builder.aggregate_spatial(ndvi_masked, aoi, mean_reducer); ::: ### 3.5 Export as JSON or CSV -Alternative to directly downloading the result using the `download` method, we can use the `save_result` process to save the result in a specific format. This method gives us more flexibility in terms of output formats and options. In this example, we will save the result as a JSON file. + +Next, is to export the results as JSON or CSV. The openEO API supports various output formats as discussed in [section 1.4](#backend-output-formats). In this example, we will save the results as JSON. ::: {.panel-tabset} @@ -922,9 +920,7 @@ await job.downloadResults({ folder: "./results" }); This chapter demonstrates a full end-to-end example: calculating the Enhanced Vegetation Index (EVI) from Sentinel-2 as band math, applying a vegetation-only cloud/class mask, reducing the time dimension, and downloading the result. -The formula for the Enhanced Vegetation Index is a bit more complicated than the NDVI one and contains constants. But we also don't necessarily need an openEO defined function and can concentrate on implementing a more complex formula. Here's the most efficient way to do this, per client. - -Below we'll observe a thorough explanation of how to calculate an EVI. +The formula for the Enhanced Vegetation Index is slightly more advanced than the NDVI formula and includes constants. Though we can use `compute_indices()` openEO process, the example below shows a simple band math: EVI = 2.5 × (NIR − Red) / (NIR + 6 × Red − 7.5 × Blue + 1) @@ -1149,7 +1145,7 @@ await con.downloadResult(result, "evi-composite.tiff"); ## 5. User-Defined Functions (UDFs) {#cookbook-udfs} -While openEO supports a wide range of pre-defined processes and allows to build more complex user-defined processes from them, you sometimes need operations or algorithms that are not (yet) available or standardized as openEO processes. **User-Defined Functions (UDF)** is an openEO feature (through the [run_udf](https://processes.openeo.org/#run_udf) process) that aims to fill that gap by allowing a user to express (a part of) an algorithm as a Python/R/… script to be run back-end side. +While openEO supports a wide range of pre-defined processes and allows building more advanced user-defined-processes from them, you may need to define a custom workflow. These are where the concept of **User-Defined Functions (UDF)** are used as an openEO feature (through the [run_udf](https://processes.openeo.org/#run_udf) process) that aims to fill that gap by allowing a user to express (part of) an algorithm as a Python/R/… script to be run on the backend. Though several types of algorithms can be used as UDF applications, in this example, we showcase a simple example of how to work with UDF. @@ -1339,9 +1335,7 @@ await job.downloadResults({ folder: "./results" }); ::: -Ideally, it allows you to embed existing Python/R/… implementations in an openEO workflow (with some necessary “glue code”). However, it is recommended to try to do as much pre- or postprocessing with pre-defined processes before blindly copy-pasting source code snippets as UDFs. Pre-defined processes are typically well-optimized by the backend, while UDFs can come with a performance penalty and higher development/debug/maintenance costs. For more information, see the [UDF documentation](https://open-eo.github.io/openeo-python-client/udf.html). - - +Ideally, it allows you to embed existing Python, R, and other implementations into an openEO workflow. However, it is recommended to perform as much preprocessing and postprocessing as possible using predefined processes before using source code snippets as UDFs. Predefined processes are typically well optimised by the backend, whereas UDFs can incur a performance penalty and higher development/debug/ maintenance costs. For more information, see the [UDF documentation](https://open-eo.github.io/openeo-python-client/udf.html). You have feedback or noticed an error? Feel free to open an issue in the [GitHub repository](https://github.com/Open-EO/openeo-docs/issues) or use the other communication channels. From 36a12601049e4aa61f9dd0d9010f08c1c4a708ff Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Mon, 31 Aug 2026 16:57:03 +0200 Subject: [PATCH 05/14] finalised backend --- documentation/key_concepts/backend.qmd | 30 +++++++++++++------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/documentation/key_concepts/backend.qmd b/documentation/key_concepts/backend.qmd index e9532e3..fc8f08d 100644 --- a/documentation/key_concepts/backend.qmd +++ b/documentation/key_concepts/backend.qmd @@ -2,9 +2,9 @@ title: "openEO Backends" --- -An **openEO backend** is a server-side implementation of the openEO API. It exposes Earth Observation data, processing capabilities, authentication, and execution infrastructure through a standard interface so that the client-side workflow can run against different providers with minimal changes. +An **openEO backend** is a server-side implementation of the openEO API. It exposes Earth Observation data, processing capabilities, authentication, and execution infrastructure through a standard interface, enabling the client-side workflow to run across different providers with minimal changes. -In practice, a backend is the system that receives your process graph, validates it, executes it near the data, and returns results or job metadata. This is what makes openEO workflow interoperable. +In practice, a backend is the system that receives your process graph, validates it, executes it near the data, and returns results or job metadata. This is what makes the openEO workflow interoperable. ![openEO backend overview](images/backend-overview.png) @@ -14,7 +14,7 @@ Most openEO backends provide some or all of the following: * **Collection discovery** so users can inspect available datasets and metadata. * **Process discovery** so users can see which predefined processes are supported. -* **Data processing** through synchronous requests for smaller jobs and batch jobs for larger workloads with the available set of processes in the sepecific backend. +* **Data processing** through synchronous requests for smaller jobs and batch jobs for larger workloads with the available set of processes in the specific backend. * **Result export** in one or more output formats such as GeoTIFF, NetCDF, or PNG. * **Optional advanced features** such as user-defined functions (UDFs), user-defined processes (UDPs), file storage, etc. @@ -35,16 +35,14 @@ For users, this means that openEO offers a common way of working, while backend Backend availability evolves over time. Always use the hub as the current source of truth for supported services and their exact capabilities. -The authoritative live overview of publicly indexed openEO services is the [openEO Hub](https://hub.openeo.org/). The hub crawls backend metadata and lets you compare services based on what they expose. +The authoritative live overview of publicly indexed openEO services is the [openEO Hub](https://hub.openeo.org/). The hub provides a detailed view on the backend metadata and lets you compare services based on what they expose. -openEO Hub is especially useful when you want to answer practical questions such as: +This interface allows you to answer questions such as: -* Which backends support **basic functionality**, **synchronous processing**, or **batch processing**? -* Which backends expose a specific **collection** or **process**? -* Which services support certain **input formats**, **output formats**, or **UDF runtimes**? -* Which providers offer **file storage**, **additional web services**, **UDPs**, or **cost estimation**? -* Which backends have a **free plan** or meet other operational constraints? +* What are the available backends? +* Which collections and processes are supported by each backend? +* What are the supported export formats and runtimes? You can explore the live catalogue directly here: @@ -64,17 +62,19 @@ If the embedded view does not load in your browser, open the hub directly at [ht ::: {.callout-note} ## Note -The hub data shown in the embedded view is updated on each crawl, which may take a few days. For the most up-to-date information, always check the hub directly. +The openEO hub data shown in the embedded view above is updated with each crawl, which may take a few days. For the most up-to-date information, always check the openEO hub directly. ::: ## Choosing a backend When selecting a backend for your work, start with these checks: -1. Does it provide the **collections** you need? -2. Does it support the **processes** and **execution mode** your workflow requires? -3. Does it offer the right **export formats**, **authentication model**, and **quota or billing model**? -4. Does it support advanced features you rely on, such as **UDFs**, **web services**, or **federated access**? + +1. What are the **collections** and **processes** you need for your workflow? +2. Does it provide the **collections** you need? +3. Does it support the **processes** and **execution mode** your workflow requires? +4. Does it offer the right **export formats**, **authentication model**, and **quota or billing model**? +5. Does it support advanced features you rely on, such as **UDFs**, **web services**, or **federated access**? For a hands-on example of connecting to a backend and exploring its capabilities, see the [Setup](../setup.qmd) and [Cookbook](../cookbook.qmd) sections. From 2723a0b09679dee0022fc77fb3ab24c9c964b90b Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Tue, 1 Sep 2026 11:22:21 +0200 Subject: [PATCH 06/14] finalised datacube --- documentation/key_concepts/datacube.qmd | 62 +++++++++---------------- 1 file changed, 21 insertions(+), 41 deletions(-) diff --git a/documentation/key_concepts/datacube.qmd b/documentation/key_concepts/datacube.qmd index a4bb91b..4e7665f 100644 --- a/documentation/key_concepts/datacube.qmd +++ b/documentation/key_concepts/datacube.qmd @@ -2,30 +2,27 @@ title: "openEO Datacubes" --- -An **openEO datacube** is the main way Earth Observation data is represented in openEO. In simple terms, it is a structured multi-dimensional array with metadata that describes what each axis means. +An **openEO datacube** is the main way Earth Observation data is represented in openEO. In simple terms, it is a structured, multidimensional array with metadata describing what each axis represents. -That sounds technical, but the idea is straightforward: instead of thinking in separate image files, dates, and bands, you work with one consistent data object that can be filtered, transformed, combined, and analyzed. +That sounds technical, but the idea is straightforward: instead of thinking in terms of separate image files, dates, and bands, you work with a single consistent data object that can be filtered, transformed, combined, and analysed. -As described in the [Glossary](../glossary.qmd), a spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions. In openEO, datacubes can represent both raster and vector-oriented Earth Observation data. +As described in the [Glossary](../glossary.qmd), a spatiotemporal datacube is a multidimensional array with one or more spatial or temporal dimensions. In openEO, datacubes can represent both raster and vector-based Earth Observation data. ## What is a datacube? -A datacube is a way of organizing data along multiple dimensions. - -For Earth Observation, the most common dimensions are: +A datacube is a way of organising data along multiple dimensions. For Earth Observation, the most common dimensions are: * **x** and **y** for space, * **t** for time, and * **bands** for spectral channels such as red, green, blue, or near-infrared. -So instead of treating satellite data as a folder full of individual scenes, openEO lets you work with one coherent structure that answers questions like: +So instead of treating satellite data as a folder full of individual scenes, openEO lets users work with one coherent structure that answers questions like: -* what happened at this location, +* where it happened, * when it happened, * in which band it was observed, and * how that value changes when processes are applied. - In practice, a single value in the cube is identified by its position along these dimensions. For example, one pixel value may correspond to: * one x coordinate, @@ -37,19 +34,18 @@ In practice, a single value in the cube is identified by its position along thes ## Raster and vector datacubes -The most common openEO datacubes are: +The common openEO datacubes are: -* **Raster datacubes**: usually built from gridded imagery such as Sentinel or Landsat products. These typically have at least the spatial dimensions `x` and `y`, and often also `t` and `bands`. +* **Raster datacubes**: usually built from gridded imagery such as Sentinel products or similar. These typically have at least the spatial dimensions `x` and `y ', and often also `t` and `bands`. * **Vector datacubes**: built around geometries such as points, lines, or polygons, often combined with time and attributes. -For most users, the raster case is the one they encounter first. But vector datacubes are equally important when you want to work with field boundaries, administrative regions, sampling points, or spatial aggregates. +For most users, the raster case is the first one they encounter. But vector datacubes are equally important when you want to work with field boundaries, administrative regions, sampling points, or spatial aggregates. ![Vector datacube example](images/datacube-vector-example.png) ## Dimensions and metadata -A datacube is more than a block of numbers. Each dimension carries meaning. - +A datacube is more than a block of numbers, each dimension carries meaning. Typical dimension properties include: * **name**, @@ -68,7 +64,7 @@ Here is a simplified example of a raster datacube structure: | `bands` | bands | `blue`, `green`, `red`, `nir` | spectral channels | | `t` | temporal | `2020-10-01`, `2020-10-13`, `2020-10-25` | observation dates | -Dimension labels are usually numeric or textual. Temporal labels are typically encoded as date or datetime strings, while geometry labels may be represented by geometries or geometry identifiers. +Dimension labels are usually numeric or textual. Temporal labels are typically encoded as date or datetime strings, while geometries or geometry identifiers may represent geometry labels. Dimensions with a natural order, such as spatial and temporal axes, are normally ordered. Dimensions without a natural order, such as bands, keep the order defined by metadata or by user operations. @@ -76,9 +72,8 @@ Values inside the cube are usually scalar values such as numbers, booleans, or s ## Why datacubes matter in openEO -Datacubes are central to openEO because they give users one common way to work with many kinds of Earth Observation data. - -This matters for several reasons: +Datacubes are central to openEO because they provide users with a common way to work with the available Earth Observation data. +The main reasons for handling EO data as a datacube in openEO are: * **Consistency**: different collections can be accessed through a similar model. * **Subsetting**: users can request only the area, time range, and bands they need. @@ -86,7 +81,7 @@ This matters for several reasons: * **Interoperability**: the same workflow idea can often be reused across backends. * **Reproducibility**: the cube and the operations on it are described explicitly in the process graph. -For cloud platforms, datacubes also help hide file-level complexity. Users do not have to manually stitch tiles, sort scenes, or reorganize raw assets before starting analysis. +Furthermore, the datacubes concept also helps hide file-level complexity. Users do not have to manually stack tiles, sort scenes, or reorganise raw assets before starting analysis. In many workflows, values are sampled either as: @@ -95,9 +90,7 @@ In many workflows, values are sampled either as: ## Resolution and reference systems -Each dimension has a notion of spacing or granularity. - -For example: +Each dimension gives an idea of spacing or granularity. For example: * spatial resolution describes pixel spacing, * temporal resolution describes the interval between observations, and @@ -105,7 +98,7 @@ For example: For spatial raster dimensions, the coordinate reference system (CRS) is also crucial. It defines how pixel coordinates relate to real-world locations. -If data from different coordinate reference systems must be combined, some form of resampling or reprojection is often needed. This is useful, but it can also be computationally expensive and may introduce small changes to the data. +If data from different coordinate reference systems must be combined, resampling or reprojection is often required. This is useful, but it can also be computationally expensive and may introduce small changes to the data. ## How users build datacubes in openEO @@ -133,7 +126,7 @@ cube = connection.load_collection( ) ``` -The important idea is that creating or modifying a datacube usually does **not** execute the processing immediately. Instead, you are building a process graph that describes what should happen once the job is run. +openEO uses a lazy evaluation technique, meaning that creating or modifying a datacube usually **does not** execute processing immediately. Instead, in openEO, users combine datacube with processes, creating a process chain called a process graph that describes what should happen once the job runs. ## Working with datacubes @@ -148,13 +141,13 @@ Datacubes become useful when processes are applied to them. The main patterns ar | Aggregate | Groups values and summarizes them by time or geometry | `aggregate_temporal`, `aggregate_temporal_period`, `aggregate_spatial` | | Reshape | Changes cube structure without necessarily changing meaning | `merge_cubes`, `rename_dimension`, `rename_labels`, `add_dimension`, `drop_dimension` | -If you want the full process-centered explanation, see the [Processes](processes.qmd) page. For more practical workflow examples, see [openEO Cube Operations](../cube_operations.qmd). +If you want the full process-centred explanation, see the [Processes](processes.qmd) page. For more practical workflow examples, see [openEO Cube Operations](../cube_operations.qmd). ![Datacube filter process behavior](images/datacube-process-filter.png) ## Datacubes, backends, and advanced use -Datacubes are exposed through openEO backends, but backend support is not identical. +Datacubes are exposed via openEO backends, but backend support can vary. Differences may include: @@ -162,24 +155,11 @@ Differences may include: * which dimensions and metadata are available, * which processes can be applied, * which file formats can be exported, and -* which advanced capabilities such as UDFs or STAC loading are supported. +* which advanced capabilities, such as UDFs or STAC loading, are supported? This means the datacube model is shared, but the exact data and capabilities depend on the backend you choose. For more on that, see [Backends](backend.qmd). -For advanced users, datacubes are also important inside user-defined functions (UDFs). In Python-based UDF tooling, a datacube is commonly represented in an xarray-like structure together with dimension definitions and coordinates. - -You do not need to understand the internal implementation to use openEO effectively, but this is useful context if you are writing custom server-side logic. It explains why dimensions, labels, and metadata are treated so carefully: they are part of the contract between the openEO process graph and the runtime that executes it. - -## For newcomers - -If you are just starting, the easiest way to think about a datacube is this: - -1. Start with a data collection. -2. Turn it into a datacube by loading only the area, dates, and bands you need. -3. Apply openEO processes to that cube. -4. Export or visualize the result. - -You do not need to master all the technical details of dimensions and metadata before using openEO productively. But understanding the datacube idea will make the rest of the documentation much easier to follow. +For advanced usecases, datacubes are also important inside user-defined functions (UDFs). In Python-based UDF tooling, a datacube is commonly represented as an xarray-like structure, along with dimension definitions and coordinates. ## What to do next From 2b494ab2b8c382344e409c8b52806015e525c8b0 Mon Sep 17 00:00:00 2001 From: Pratichhya Sharma Date: Tue, 1 Sep 2026 11:44:28 +0200 Subject: [PATCH 07/14] finalised processes --- documentation/key_concepts/processes.qmd | 52 ++++++++++++------------ 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/documentation/key_concepts/processes.qmd b/documentation/key_concepts/processes.qmd index cce720c..ebfb067 100644 --- a/documentation/key_concepts/processes.qmd +++ b/documentation/key_concepts/processes.qmd @@ -2,9 +2,9 @@ title: "openEO Processes" --- -An **openEO process** is a named operation that takes one or more inputs, performs a task, and returns a result. In simple terms, processes are the building blocks of an openEO workflow. +An **openEO process** is an operation that takes one or more inputs, performs a task, and returns a result. In simple terms, processes are the building blocks of an openEO workflow. -Some processes load data, some filter it, some transform it, and others summarize or export it. By combining them, users can describe Earth Observation workflows in a portable way. +Some processes load data, some filter it, some transform it, or some export it. By combining them, users can describe an Earth Observation (EO) workflow in openEO. As described in the [Glossary](../glossary.qmd), a process is an operation that performs a specific task on a set of parameters and returns a result. @@ -16,18 +16,17 @@ Examples include: * aggregating data over time or space, and * exporting the final result as a file. -In openEO, processes are combined into a **process graph**. A process graph is the machine-readable description of your workflow: it tells the backend what to do, in which order, and with which parameters. +In openEO, processes are combined into a **process graph**. A process graph is the machine-readable description of a workflow: it tells the backend what to do, in which order, and with which parameters. ![openEO process workflow overview](images/processes-overview.png) ## What openEO offers -openEO offers a broad catalogue of standardized processes that cover the most common parts of EO analysis. These processes are grouped into categories such as: +openEO offers a broad catalogue of standardised and a few non-standardised processes that cover most EO analysis tasks. These processes can be further identified as processes for data discovery, for applying operations on the cubes, or for simply exporting the results. Such as: * **Import** processes to load collections, STAC resources, uploaded files, or URLs. -* **Filter** processes to limit data by time, space, bands, labels, or metadata. -* **Cube** processes to manipulate multi-dimensional EO data cubes. -* **Reducer and aggregate** processes to compute summaries such as mean, median, sum, or zonal statistics. +* **Filter** processes applied to a datacube to limit data by time, space, bands, labels, or metadata. +* **Reducer and aggregate** processes to compute summaries such as mean, median, sum, or zonal statistics of a datacube * **Math and logic** processes for calculations, conditions, and comparisons. * **Reproject and resample** processes to align data spatially or temporally. * **Masking** processes to exclude invalid or unwanted data. @@ -45,8 +44,7 @@ The openEO process reference lists the processes defined by the openEO project. ## Embedded process reference -To keep this documentation page useful even as older mirrors are phased out, the maintained process reference is embedded below. - +The standardised openEO processes are embedded below: ```{=html}

mu-Un5J~hxFoDA&3--K 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 GxBnN4i|_LQ literal 0 HcmV?d00001 diff --git a/documentation/key_concepts/images/datacube-overview-timeseries.png b/documentation/key_concepts/images/datacube-overview-timeseries.png new file mode 100644 index 0000000000000000000000000000000000000000..674e06c67b471f57f51a67810a25b63fcb354874 GIT binary patch literal 82520 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%0AZMVmni>k^idRv~ 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