From 54aeadcb113fc5495969ee154c21be5f3351cc37 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 5 Feb 2024 16:12:46 +0100 Subject: [PATCH 01/24] First implementation of job splitter and started job manager --- pyproject.toml | 3 +- src/openeo_gfmap/manager/__init__.py | 6 + src/openeo_gfmap/manager/job_manager.py | 170 ++++++++++++++++++ src/openeo_gfmap/manager/job_splitters.py | 67 +++++++ .../resources/wc_extraction_dataset.gpkg | Bin 0 -> 794624 bytes tests/test_openeo_gfmap/test_managers.py | 23 +++ 6 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 src/openeo_gfmap/manager/__init__.py create mode 100644 src/openeo_gfmap/manager/job_manager.py create mode 100644 src/openeo_gfmap/manager/job_splitters.py create mode 100644 tests/test_openeo_gfmap/resources/wc_extraction_dataset.gpkg create mode 100644 tests/test_openeo_gfmap/test_managers.py diff --git a/pyproject.toml b/pyproject.toml index 4145b12..64749f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,8 @@ dependencies = [ "openeo[localprocessing]", "cftime", "pyarrow", - "fastparquet" + "fastparquet", + "h3", ] [project.urls] diff --git a/src/openeo_gfmap/manager/__init__.py b/src/openeo_gfmap/manager/__init__.py new file mode 100644 index 0000000..4e6c070 --- /dev/null +++ b/src/openeo_gfmap/manager/__init__.py @@ -0,0 +1,6 @@ +"""OpenEO GFMAP Manager submodule. Implements the logic of splitting the jobs into subjobs and +managing the subjobs. +""" +import logging + +_log = logging.getLogger(__name__) diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py new file mode 100644 index 0000000..4849343 --- /dev/null +++ b/src/openeo_gfmap/manager/job_manager.py @@ -0,0 +1,170 @@ +import json +import logging +import queue +import threading +from enum import Enum +from pathlib import Path +from typing import Callable, Union + +import pandas as pd +from openeo.extra.job_management import MultiBackendJobManager +from openeo.rest.job import BatchJob + +from openeo_gfmap.manager import _log + + +class PostJobStatus(Enum): + """Indicates the workers if the job finished as sucessful or with an error.""" + + FINISHED = "finished" + ERROR = "error" + + +class GFMAPJobManager(MultiBackendJobManager): + """A job manager for the GFMAP backend.""" + + def __init__( + self, + output_dir: Path, + post_job_action: Callable, + poll_sleep: int = 5, + n_threads: int = 1, + post_job_params: dict = {}, + ): + self._output_dir = output_dir + + # Setup the threads to work on the on_job_done and on_job_error methods + self._finished_job_queue = queue.Queue() + self._n_threads = n_threads + + self._threads = [] + + self._post_job_action = post_job_action + self._post_job_params = post_job_params + super().__init__(poll_sleep) + + def _post_job_worker(self): + """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` + methods.""" + while True: + status, job, row = self._finished_job_queue.get() + if status == PostJobStatus.ERROR: + self.on_job_error(job, row) + elif status == PostJobStatus.FINISHED: + self.on_job_done(job, row) + else: + raise ValueError(f"Unknown status: {status}") + self.on_job_done(job, row) + self.job_done_queue.task_done() + + def _update_statuses(self, df: pd.DataFrame): + """Updates the statues of the jobs in the dataframe from the backend. If a job is finished + or failed, it will be queued to the `on_job_done` or `on_job_error` methods. + + The method is executed every `poll_sleep` seconds. + """ + active = df[df.status.isin(["created", "queued", "running"])] + _log.info(f"Updating status. {len(active)} on {len(df)} active jobs...") + for idx, row in active.iterrows(): + # Parses the backend from the csv + connection = self._get_connection(row.backend_name) + job = connection.job(row.job_id) + job_metadata = job.describe_job() + _log.log( + level=logging.DEBUG, + msg=f"Status of job {job.job_id} is {job_metadata} (on backend {row.backend_name}).", + ) + + # Update the status if the job finished since last check + # Case is which it finished sucessfully + if (df.loc[idx, "status"] in ["created", "queued", "running"]) and ( + job_metadata["status"] == "finished" + ): + _log.info( + f"Job {job.job_id} finished successfully, queueing on_job_done..." + ) + self._finished_job_queue.put((PostJobStatus.FINISHED, job, row)) + df.loc[idx, "description"] = job_metadata["description"] + + # Case in which it failed + if (df.loc[idx, "status"] != "error") and ( + job_metadata["status"] == "error" + ): + _log.info( + f"Job {job.job_id} finished with error, queueing on_job_error..." + ) + self._finished_job_queue.put((PostJobStatus.ERROR, job, row)) + df.loc[idx, "description"] = job_metadata["description"] + + df.loc[idx, "status"] = job_metadata["status"] + + # Additional parameters + self._update_status(job, row) + + def on_job_error(self, job: BatchJob, row: pd.Series): + """Method called when a job finishes with an error. + + Parameters + ---------- + job: BatchJob + The job that finished with an error. + row: pd.Series + The row in the dataframe that contains the job relative information. + """ + logs = job.logs() + error_logs = [log for log in logs if log.level.lower() == "error"] + + # TODO figure out how to handle output file structures. + # job_metadata = job.describe_job() + # title = job_metadata["title"] + output_file = "/temp/error.log" + if len(error_logs > 0): + Path(output_file).write_text(json.dumps(error_logs, indent=2)) + else: + Path(output_file).write_text( + f"Couldn't find any error logs. Please check the error manually on job ID: {job.job_id}." + ) + + def on_job_done(self, job: BatchJob, row: pd.Series): + """Method called when a job finishes successfully. It will first download the results of + the job and then call the `post_job_action` method. + """ + output_folder = self._output_dir / row.job_id + output_folder.mkdir(parents=True, exist_ok=True) + + for idx, asset in enumerate(job.results().get_assets()): + # file_name = f"{row.output_prefix}_{idx}.{asset.file_extension}" + asset.download(output_folder / asset.filename) + + # TODO trigger post-job action and write STAC metadata + + def run_jobs( + self, df: pd.DataFrame, start_job: Callable, output_file: Union[str, Path] + ): + """Starts the jobs defined in the dataframe and runs the `start_job` function on each job. + + Parameters + ---------- + df: pd.DataFrame + The dataframe containing the jobs to be started. The dataframe expects the following columns: + + * `output_folder`: Folder in which the results of the job will be stored. + * `output_prefix`: Prefix to be used in the output files. + * `file_extension`: Extension of the output files. + * `backend_name`: Name of the backend to use. + * `task_id`: ID of the task to be executed, will be used to retrieve geometry from + another dataset. + + start_job: Callable + Callable function that will take in argument the rows of each job and that will + create a datacube. + output_file: Union[str, Path] + The file to track the results of the jobs. + """ + super(MultiBackendJobManager).run_jobs(df, start_job, output_file) + + # Starts the thread pool to work on the on_job_done and on_job_error methods + for _ in range(self._n_threads): + thread = threading.Thread(target=self._post_job_worker) + thread.start() + self._threads.append(thread) diff --git a/src/openeo_gfmap/manager/job_splitters.py b/src/openeo_gfmap/manager/job_splitters.py new file mode 100644 index 0000000..0b82cca --- /dev/null +++ b/src/openeo_gfmap/manager/job_splitters.py @@ -0,0 +1,67 @@ +"""Job splitter functionalities, except input points/polygons to extract in the +form of a GeoDataFrames. +""" +from typing import List + +import geopandas as gpd +import h3 + + +def _resplit_group( + polygons: gpd.GeoDataFrame, max_points: int +) -> List[gpd.GeoDataFrame]: + """Performs re-splitting of a dataset of polygons in a list of datasets""" + for i in range(0, len(polygons), max_points): + yield polygons.iloc[i : i + max_points] + + +def split_job( + polygons: gpd.GeoDataFrame, max_points: int = 500, grid_resolution: int = 4 +) -> List[gpd.GeoDataFrame]: + """Split a job into multiple jobs from the position of the polygons/points. The centroid of + the geometries to extract are used to select a hexagon in the H3 grid. Using the H3 grid + allows to split jobs in equal areas, which is useful for parallel processing while taking into + account OpenEO's limitations. + + Parameters + ---------- + polygons: gpd.GeoDataFrae + Dataset containing the polygons to split the job by with a `geometry` column. + max_points: int + The maximum number of points to be included in each job. + grid_resolution: int + The scale to use in the H3 hexagonal grid to split jobs to, default is 4. Changing the + grid scale will drastically increase/decrease the area on which jobs will work. + More information on the H3 grid can be found at + https://h3geo.org/docs/core-library/restable + Returns: + -------- + split_polygons: list + List of jobs, split by the GeoDataFrame. + """ + + if "geometry" not in polygons.columns: + raise ValueError("The GeoDataFrame must contain a 'geometry' column.") + + if polygons.crs is None: + raise ValueError("The GeoDataFrame must contain a CRS") + + # Project to lat/lon positions + polygons = polygons.to_crs(epsg=4326) + + # Split the polygons into multiple jobs + polygons["h3index"] = polygons.geometry.centroid.apply( + lambda pt: h3.geo_to_h3(pt.y, pt.x, grid_resolution) + ) + + split_datasets = [] + for _, sub_gdf in polygons.groupby("h3index"): + if len(sub_gdf) > max_points: + # Performs another split + split_datasets.extend( + _resplit_group(sub_gdf, max_points).reset_index(drop=True) + ) + else: + split_datasets.append(sub_gdf.reset_index(drop=True)) + + return split_datasets diff --git a/tests/test_openeo_gfmap/resources/wc_extraction_dataset.gpkg b/tests/test_openeo_gfmap/resources/wc_extraction_dataset.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..0136a4acb499728042f6858ad3815d655ae95d04 GIT binary patch literal 794624 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

^`tdJ$#95-w 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


e8tlC8N^pp{Gu{8c{%IPSbA>&@L+ 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
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
backend_nameout_prefixout_extensionstart_dateend_dategeometry
0cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
1cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
2cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
3cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
4cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
.....................
88cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
89cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
90cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
91cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
92cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
\n", + "

93 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "4 cdse S2 .nc 2020-08-30 2022-03-03 \n", + ".. ... ... ... ... ... \n", + "88 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "89 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "90 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "91 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "92 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "\n", + " geometry \n", + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "4 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + ".. ... \n", + "88 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "89 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "90 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "91 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "92 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "\n", + "[93 rows x 6 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from openeo_gfmap import Backend\n", + "from typing import List\n", + "import pandas as pd\n", + "\n", + "def create_job_dataframe_s2(backend: Backend, split_jobs: List[gpd.GeoDataFrame]) -> pd.DataFrame:\n", + " \"\"\"Create a dataframe from the split jobs, containg all the necessary information to run the job.\"\"\"\n", + " columns = ['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date', 'geometry']\n", + " rows = []\n", + " for job in split_jobs:\n", + " # Compute the average in the valid date and make a buffer of 1.5 year around\n", + " median_time = pd.to_datetime(job.valid_date).mean()\n", + " start_date = median_time - pd.Timedelta(days=275) # A bit more than 9 months\n", + " end_date = median_time + pd.Timedelta(days=275) # A bit more than 9 months\n", + " \n", + " rows.append(\n", + " pd.Series(\n", + " dict(zip(columns, [backend.value, 'S2', '.nc', start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d'), job.to_json()]))\n", + " )\n", + " )\n", + "\n", + " return pd.DataFrame(rows)\n", + "\n", + "job_df = create_job_dataframe_s2(Backend.CDSE, split_jobs)\n", + "\n", + "job_df" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
backend_nameout_prefixout_extensionstart_dateend_dategeometry
0cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
1cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
2cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
3cdseS2.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
\n", + "
" + ], + "text/plain": [ + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "\n", + " geometry \n", + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run a subset of the jobs to test the manager, the selected jobs have a fair amount of geometries to extract\n", + "job_df = job_df.iloc[[0, 2, 3, -6]].reset_index(drop=True)\n", + "job_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Third step: implement the datacube creator function.\n", + "\n", + "Implement a function to create, from the additional rows provided before, an `openeo.BatchJob` that will be used to run the job.\n", + "\n", + "In this case we extract Sentinel-2 data, and we remove the polygons with `extract=False` (although we keep them in the row for the post-job action.)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "import openeo\n", + "\n", + "import pandas as pd\n", + "import geojson\n", + "\n", + "from openeo_gfmap import TemporalContext, Backend, BackendContext, FetchType\n", + "from openeo_gfmap.fetching import build_sentinel2_l2a_extractor\n", + "\n", + "\n", + "def create_datacube_s2(row: pd.Series, connection: openeo.DataCube, provider=None, connection_provider=None) -> openeo.BatchJob:\n", + "\n", + " def buffer_geometry(geometry: geojson.FeatureCollection, buffer: float) -> str:\n", + " gdf = gpd.GeoDataFrame.from_features(geometry).set_crs(epsg=4326)\n", + " utm = gdf.estimate_utm_crs()\n", + " gdf = gdf.to_crs(utm)\n", + " gdf['geometry'] = gdf.centroid.buffer(distance=buffer, cap_style=3)\n", + "\n", + " gdf = gdf.to_crs(epsg=4326)\n", + " return geojson.loads(gdf.to_json())\n", + "\n", + "\n", + " def filter_extractonly_geometries(collection: geojson.FeatureCollection):\n", + " # Filter out geometries that do not have the field extract=True\n", + " features = [f for f in collection.features if f.properties.get('extract', False)]\n", + " return geojson.FeatureCollection(features)\n", + "\n", + " start_date = row.start_date\n", + " end_date = row.end_date\n", + " temporal_context = TemporalContext(start_date, end_date)\n", + "\n", + " # Get the feature collection containing the geometry to the job\n", + " geometry = geojson.loads(row.geometry)\n", + " assert isinstance(geometry, geojson.FeatureCollection)\n", + "\n", + " # Filter the geometry to the rows with the extract only flag\n", + " geometry = filter_extractonly_geometries(geometry)\n", + " assert len(geometry.features) > 0, \"No geometries with the extract flag found\"\n", + "\n", + " # Performs a buffer of 64 px around the geometry\n", + " geometry = buffer_geometry(geometry, 319)\n", + "\n", + " # Backend name and fetching type\n", + " backend = Backend(row.backend_name)\n", + " backend_context = BackendContext(backend)\n", + "\n", + " fetch_type = FetchType.POLYGON\n", + " bands_to_download = ['S2-B01', 'S2-B02', 'S2-B03', 'S2-B04', 'S2-B05', 'S2-B06', 'S2-B07', 'S2-B08', 'S2-B8A', 'S2-B09', 'S2-B11', 'S2-B12', 'S2-SCL']\n", + "\n", + " # Create the job to extract S2\n", + " extraction_parameters = {\n", + " \"target_resolution\": 10\n", + " }\n", + " extractor = build_sentinel2_l2a_extractor(\n", + " backend_context, bands=bands_to_download, fetch_type=fetch_type.POLYGON, **extraction_parameters \n", + " )\n", + "\n", + " cube = extractor.get_cube(connection, geometry, temporal_context)\n", + "\n", + " # Get the h3index to use in the tile\n", + " h3index = geometry.features[0].properties['h3index']\n", + " valid_date = geometry.features[0].properties['valid_date']\n", + "\n", + " # Increase the memory of the jobs\n", + " job_options = {\n", + " \"executor-memory\": \"5G\",\n", + " \"executor-memoryOverhead\": \"2G\",\n", + " }\n", + "\n", + " return cube.create_job(\n", + " out_format=\"NetCDF\",\n", + " title=f\"GFMAP_Extraction_S2_{h3index}_{valid_date}\",\n", + " sample_by_feature=True,\n", + " job_options=job_options\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fourth step: create output paths\n", + "\n", + "Implement a function that from a temporary path containing a job result, from the job dataframe row and the root folder will choose the output path where to save that job result." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CPU times: user 4.62 s, sys: 40.8 ms, total: 4.67 s\n", + "Wall time: 4.67 s\n" + ] + } + ], + "source": [ + "%%time\n", + "\n", + "# Load the S2 grid\n", + "s2_grid = gpd.read_file('./s2grid_bounds.geojson')" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import xarray as xr\n", + "from pyproj import Transformer, CRS\n", + "from shapely.geometry import box, Point\n", + "\n", + "def generate_output_path_s2(root_folder: Path, tmp_path: Path, geometry_index: int, row: pd.Series):\n", + " features = geojson.loads(row.geometry)\n", + " sample_id = features[geometry_index].properties['sample_id']\n", + " ref_id = features[geometry_index].properties['ref_id']\n", + " \n", + " # Loads the array lazily in-memory\n", + " try:\n", + " inds = xr.open_dataset(tmp_path, chunks='auto')\n", + " \n", + " source_crs = CRS.from_wkt(inds.crs.attrs['crs_wkt'])\n", + " dst_crs = CRS.from_epsg(4326)\n", + " \n", + " transformer = Transformer.from_crs(source_crs, dst_crs, always_xy=True)\n", + " bounds = inds.x.min().item(), inds.y.min().item(), inds.x.max().item(), inds.y.max().item()\n", + " bbox = box(*bounds)\n", + "\n", + " # Get the center of the box\n", + " centroid = bbox.centroid\n", + " lon, lat = transformer.transform(centroid.x, centroid.y)\n", + " centroid_pt = Point(lon, lat)\n", + "\n", + " # Intersecting with the s2 grid\n", + " intersecting = s2_grid.geometry.intersects(centroid_pt)\n", + "\n", + " # Select the intersecting cell that has a centroid the closest from the point\n", + " intersecting_cells = s2_grid[intersecting]\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + " s2_tile = intersecting_cells.iloc[0]\n", + "\n", + " s2_tile_id = s2_tile.tile\n", + "\n", + " subfolder = root_folder / ref_id / str(source_crs.to_epsg()) / s2_tile_id / sample_id\n", + " except Exception:\n", + " # TODO: _log.error('Could not find S2 tile for file, setting up a dummy path')\n", + " subfolder = root_folder / 'unsortable'\n", + "\n", + " return subfolder / f'{row.out_prefix}_{sample_id}_{source_crs.to_epsg()}_{row.start_date}_{row.end_date}{row.out_extension}'\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fifth step: Define the post-job action\n", + "\n", + "The post-job action will be called once the job resut was downloaded and saved to a specific path.\n", + "\n", + "A post-job action function must receive 3 parameters:\n", + "* `result_paths`: Paths to the downloaded job result files.\n", + "* `row`: The current job dataframe row.\n", + "* `parameters`: User-defined parameters set in the `GFMAPJobManager` constructor.\n", + "\n", + "The post-job action must return a list of paths containing the results from that job. For example, if no file is created/deleted in the post-job action, then the user can simply return the list of paths it has received as input `result_paths`. If instead files are added or removed, then the user will need to modify this list accordingly before returning it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "from rasterio.features import rasterize\n", + "from rasterio.transform import from_bounds\n", + "import json\n", + "\n", + "def post_job_action(result_paths: list, row: pd.Series, parameters: dict = {}) -> list:\n", + " base_gpd = gpd.GeoDataFrame.from_features(json.loads(row.geometry)).set_crs(epsg=4326)\n", + " assert len(base_gpd[base_gpd.extract == True]) == len(result_paths), \"The number of result paths should be the same as the number of geometries\"\n", + " extracted_gpd = base_gpd[base_gpd.extract == True].reset_index(drop=True)\n", + " # In this case we want to burn the metadata in a new file in the same folder as the S2 product\n", + " for idx, result_path in enumerate(result_paths.copy()):\n", + " sample_id = extracted_gpd.iloc[idx].sample_id\n", + " ref_id = extracted_gpd.iloc[idx].ref_id\n", + " lc_label = extracted_gpd.iloc[idx].landcover_label\n", + " confidence = extracted_gpd.iloc[idx].confidence\n", + " valid_date = extracted_gpd.iloc[idx].valid_date\n", + "\n", + " result_ds = xr.open_dataset(result_path, chunks='auto')\n", + "\n", + " target_crs = CRS.from_wkt(result_ds.crs.attrs['crs_wkt'])\n", + "\n", + " # Get the surrounding polygons around our extracted center geometry to rastetize them\n", + " bounds = (result_ds.x.min().item(), result_ds.y.min().item(), result_ds.x.max().item(), result_ds.y.max().item())\n", + " bbox = box(*bounds)\n", + " surround_gpd = base_gpd.to_crs(target_crs).clip(bbox)\n", + "\n", + " # Burn the polygon croptypes\n", + " transform = from_bounds(*bounds, result_ds.x.size, result_ds.y.size)\n", + " croptype_shapes = list(zip(surround_gpd.geometry, surround_gpd.croptype_label))\n", + " croptype = rasterize(croptype_shapes, out_shape=(result_ds.y.size, result_ds.x.size), transform=transform, all_touched=True, fill=0, default_value=65535, dtype='uint16')\n", + "\n", + " # Create the attributes to add to the metadata\n", + " crs_layer = result_ds['crs']\n", + " attributes = {\n", + " 'ref_id': ref_id,\n", + " 'sample_id': sample_id,\n", + " 'landcover_label': lc_label,\n", + " 'confidence': str(confidence),\n", + " 'valid_date': valid_date\n", + " }\n", + " attributes.update(result_ds.attrs)\n", + "\n", + " aux_dataset = xr.Dataset({'CROPTYPE': (('y', 'x'), croptype)}, coords={'y': result_ds.y, 'x': result_ds.x}, attrs=attributes)\n", + "\n", + " # Include the CRS layer from OpenEO\n", + " aux_dataset['crs'] = crs_layer\n", + " aux_dataset.attrs.update(result_ds.attrs)\n", + "\n", + " # Save the metadata in the same folder as the S2 product\n", + " metadata_path = result_path.parent / f'AUX_{sample_id}_{target_crs.to_epsg()}_{valid_date}.nc'\n", + " aux_dataset.to_netcdf(metadata_path, format='NETCDF4', engine='h5netcdf')\n", + " result_paths.append(metadata_path)\n", + "\n", + " return result_paths\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sixth and last step: Running the manager\n", + "\n", + "Let's initialize and execute the Job Manager as defined the GFMAP, and then run it using the functions defined previously" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", + "from openeo_gfmap.backend import cdse_connection\n", + "\n", + "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions/')\n", + "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", + "\n", + "manager = GFMAPJobManager(\n", + " output_dir=base_output_dir,\n", + " output_path_generator=generate_output_path_s2,\n", + " post_job_action=post_job_action,\n", + " poll_sleep=60,\n", + " n_threads=2,\n", + " post_job_params={}\n", + ")\n", + "\n", + "manager.add_backend(\n", + " Backend.CDSE.value, cdse_connection, parallel_jobs=2\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-12 09:37:32,563|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-02-12 09:37:32,575|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-02-12 09:37:32,610|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", + " 'description', 'costs'],\n", + " dtype='object')\n", + "2024-02-12 09:37:32,612|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authenticated using refresh token.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-12 09:37:33,882|openeo_gfmap.manager|DEBUG: Status of job j-2402124f58244715803a335628079b9a is finished (on backend cdse).\n", + "2024-02-12 09:37:33,883|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a finished successfully, queueing on_job_done...\n", + "2024-02-12 09:37:33,888|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-12 09:37:38,861|openeo_gfmap.manager|DEBUG: Status of job j-24021279e49745e9a3806584fe0e8c9a is finished (on backend cdse).\n", + "2024-02-12 09:37:38,863|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a finished successfully, queueing on_job_done...\n", + "2024-02-12 09:37:38,867|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataCube()\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-12 09:37:43,664|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp91ksct_n\n", + "2024-02-12 09:37:45,148|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp_4v2t_f0\n", + "2024-02-12 09:37:52,138|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:37:52,672|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:53,429|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:53,432|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmpw01mu9qf\n", + "2024-02-12 09:37:54,746|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:37:54,905|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:55,842|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:55,847|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpgdkcbiqo\n", + "2024-02-12 09:37:58,579|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:37:58,765|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:59,373|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:37:59,378|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp9wfpr2qu\n", + "2024-02-12 09:38:05,003|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:38:05,194|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataCube()\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-12 09:38:05,385|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:05,390|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpkew_9hyq\n", + "2024-02-12 09:38:08,255|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:38:08,439|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:08,747|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:08,749|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124f58244715803a335628079b9a...\n", + "2024-02-12 09:38:09,559|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a and post job action finished successfully.\n", + "2024-02-12 09:38:15,092|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:38:15,307|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:15,516|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:15,519|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpvahpjkqn\n", + "2024-02-12 09:38:22,615|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:38:22,788|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:22,969|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:22,973|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp9qq2f6m9\n", + "2024-02-12 09:38:29,854|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 09:38:30,027|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:30,148|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-12 09:38:30,150|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24021279e49745e9a3806584fe0e8c9a...\n", + "2024-02-12 09:38:31,352|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a and post job action finished successfully.\n", + "2024-02-12 09:39:29,274|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:39:29,492|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:39:30,816|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:40:30,968|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:40:33,929|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:40:34,269|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:41:34,440|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:41:34,695|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:41:35,280|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:42:35,462|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:42:36,041|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:42:36,485|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:43:36,626|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:43:36,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:43:38,638|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:44:38,795|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:44:39,048|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:44:41,675|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:45:41,861|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:45:42,175|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:45:44,476|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:46:44,671|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:46:44,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:46:47,272|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:47:47,411|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:47:47,719|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:47:48,098|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:48:48,231|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:48:48,650|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:48:50,196|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:49:50,520|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:49:50,827|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:49:52,613|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:50:52,803|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:50:54,202|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:50:54,794|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:51:54,958|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:51:56,063|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:51:56,289|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:52:56,486|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:52:56,866|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:52:57,592|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:53:57,737|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:53:58,210|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:54:01,194|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:55:01,369|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:55:05,199|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:55:05,437|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:56:05,605|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:56:06,025|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:56:08,011|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:57:08,220|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:57:08,685|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:57:12,111|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:58:12,249|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:58:12,658|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:58:14,530|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 09:59:14,656|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 09:59:14,954|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 09:59:15,242|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 10:00:15,353|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 10:00:15,947|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:00:29,066|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 10:01:29,230|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 10:01:29,528|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:01:30,633|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", + "2024-02-12 10:02:30,836|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-12 10:02:32,780|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:02:46,801|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is finished (on backend cdse).\n", + "2024-02-12 10:02:46,803|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 finished successfully, queueing on_job_done...\n", + "2024-02-12 10:02:46,809|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-12 10:02:51,114|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp_gibcv9i\n", + "2024-02-12 10:02:58,022|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:02:58,509|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:02:58,693|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:02:58,697|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp710760kb\n", + "2024-02-12 10:03:05,950|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:06,320|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:06,478|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:06,483|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpx_uhw6jb\n", + "2024-02-12 10:03:13,646|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:14,059|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:14,188|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:14,193|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpnmy5v_v0\n", + "2024-02-12 10:03:18,924|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:19,242|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:19,358|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:19,363|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp2sgwj7iq\n", + "2024-02-12 10:03:24,044|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:24,459|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:24,666|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:24,670|openeo_gfmap.manager|DEBUG: Downloading asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpt61g6d34\n", + "2024-02-12 10:03:30,997|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:31,312|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:31,513|openeo_gfmap.manager|INFO: Downloaded asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:31,518|openeo_gfmap.manager|DEBUG: Downloading asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp9viznwne\n", + "2024-02-12 10:03:38,362|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:38,880|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:38,989|openeo_gfmap.manager|INFO: Downloaded asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:38,993|openeo_gfmap.manager|DEBUG: Downloading asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpvp3hzxc5\n", + "2024-02-12 10:03:44,408|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", + "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-12 10:03:44,747|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:44,946|openeo_gfmap.manager|INFO: Downloaded asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-12 10:03:44,948|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124d03ab4e718bef6ce4e8185348...\n", + "2024-02-12 10:03:46,982|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:03:47,304|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 and post job action finished successfully.\n", + "2024-02-12 10:03:47,374|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:04:47,471|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:04:48,400|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:05:48,513|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:05:48,775|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:06:48,987|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:06:49,580|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:07:49,782|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:07:50,229|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:08:50,385|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:08:50,823|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:09:50,944|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:09:51,455|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:10:51,598|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:11:17,145|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:12:17,315|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:12:17,688|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:13:17,805|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:13:18,499|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:14:18,608|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:14:18,986|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:15:19,116|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:15:19,564|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:16:19,716|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:16:19,975|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:17:20,142|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:17:20,525|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:18:20,697|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:18:20,959|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:19:21,184|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:19:21,544|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:20:21,695|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:20:26,767|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:21:26,916|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:21:27,696|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:22:27,831|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:22:28,087|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:23:28,237|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:23:28,481|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:24:28,627|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:24:29,027|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:25:29,137|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:25:29,855|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:26:30,003|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:26:31,146|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:27:31,306|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:27:31,531|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:28:31,696|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:28:32,167|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:29:32,318|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:29:32,643|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:30:32,852|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:30:33,161|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:31:33,313|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:31:34,064|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:32:34,293|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:32:34,630|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:33:34,773|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:33:34,997|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:34:35,180|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:34:35,697|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", + "2024-02-12 10:35:35,827|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-12 10:35:36,174|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is error (on backend cdse).\n", + "2024-02-12 10:35:36,176|openeo_gfmap.manager|INFO: Job j-2402128d377942dfa41b8b075936fa95 finished with error, queueing on_job_error...\n", + "2024-02-12 10:35:36,179|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.ERROR.\n", + "Exception in thread Thread-4:\n", + "Traceback (most recent call last):\n", + " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 980, in _bootstrap_inner\n", + " self.run()\n", + " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 917, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 64, in _post_job_worker\n", + " if status == PostJobStatus.ERROR:\n", + " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 137, in on_job_error\n", + " output_log_path = (\n", + "TypeError: '>' not supported between instances of 'list' and 'int'\n" + ] + } + ], + "source": [ + "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "gfmap", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.18" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 2d34b24b14c87053be7ea1e77c0ca1d826c924e1 Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Thu, 22 Feb 2024 10:44:10 +0100 Subject: [PATCH 07/24] First version of a creating a STAC collection after feature extraction #18 --- .../S2_extraction_example.ipynb | 1047 ++++++++++++----- src/openeo_gfmap/manager/job_manager.py | 43 +- 2 files changed, 775 insertions(+), 315 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 934a84a..4e36202 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -56,20 +56,20 @@ "metadata": {}, "outputs": [ { - "name": "stderr", + "name": "stdout", "output_type": "stream", "text": [ - "/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_splitters.py:53: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " polygons[\"h3index\"] = polygons.geometry.centroid.apply(\n" + "137 jobs before filtering empty one (no extraction)\n", + "93 jobs after filtering empty one (no extraction)\n" ] }, { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "137 jobs before filtering empty one (no extraction)\n", - "93 jobs after filtering empty one (no extraction)\n" + "/home/vverelst/openeo/openeo-gfmap/src/openeo_gfmap/manager/job_splitters.py:53: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " polygons[\"h3index\"] = polygons.geometry.centroid.apply(\n" ] } ], @@ -78,7 +78,7 @@ "import geopandas as gpd\n", "from openeo_gfmap.manager.job_splitters import split_job_hex\n", "\n", - "base_df_path = Path('/vitodata/worldcereal/tmp/kristof/GFMAP/2021_EUR_DEMO_POLY_110.gpkg')\n", + "base_df_path = Path('./2021_EUR_DEMO_POLY_110.gpkg')\n", "base_df = gpd.read_file(base_df_path)\n", "# Splits the job using GFMAP\n", "split_jobs = split_job_hex(\n", @@ -424,7 +424,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -515,15 +515,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.62 s, sys: 40.8 ms, total: 4.67 s\n", - "Wall time: 4.67 s\n" + "CPU times: user 2.27 s, sys: 14.6 ms, total: 2.29 s\n", + "Wall time: 2.29 s\n" ] } ], @@ -536,7 +536,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -612,7 +612,7 @@ "from rasterio.transform import from_bounds\n", "import json\n", "\n", - "def post_job_action(result_paths: list, row: pd.Series, parameters: dict = {}) -> list:\n", + "def post_job_action(result_paths: dict, row: pd.Series, parameters: dict = {}) -> list:\n", " base_gpd = gpd.GeoDataFrame.from_features(json.loads(row.geometry)).set_crs(epsg=4326)\n", " assert len(base_gpd[base_gpd.extract == True]) == len(result_paths), \"The number of result paths should be the same as the number of geometries\"\n", " extracted_gpd = base_gpd[base_gpd.extract == True].reset_index(drop=True)\n", @@ -681,13 +681,13 @@ "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", "from openeo_gfmap.backend import cdse_connection\n", "\n", - "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions/')\n", + "base_output_dir = Path('/data/users/Public/vincent.verelst/world_cereal/extractions/')\n", "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", "\n", "manager = GFMAPJobManager(\n", " output_dir=base_output_dir,\n", " output_path_generator=generate_output_path_s2,\n", - " post_job_action=post_job_action,\n", + " # post_job_action=post_job_action,\n", " poll_sleep=60,\n", " n_threads=2,\n", " post_job_params={}\n", @@ -700,520 +700,949 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:32,563|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", - "2024-02-12 09:37:32,575|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", - "2024-02-12 09:37:32,610|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + "2024-02-21 15:53:45,820|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-02-21 15:53:45,823|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-02-21 15:53:45,869|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", " 'description', 'costs'],\n", " dtype='object')\n", - "2024-02-12 09:37:32,612|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n" + "2024-02-21 15:53:45,875|openeo_gfmap.manager|DEBUG: Updating status. 0 on 4 active jobs...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Authenticated using refresh token.\n" + "Authenticated using refresh token.\n", + "DataCube()\n", + "DataCube()\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:33,882|openeo_gfmap.manager|DEBUG: Status of job j-2402124f58244715803a335628079b9a is finished (on backend cdse).\n", - "2024-02-12 09:37:33,883|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a finished successfully, queueing on_job_done...\n", - "2024-02-12 09:37:33,888|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-12 09:37:38,861|openeo_gfmap.manager|DEBUG: Status of job j-24021279e49745e9a3806584fe0e8c9a is finished (on backend cdse).\n", - "2024-02-12 09:37:38,863|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a finished successfully, queueing on_job_done...\n", - "2024-02-12 09:37:38,867|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n" + "2024-02-21 15:55:39,376|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 15:55:39,988|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is queued (on backend cdse).\n", + "2024-02-21 15:55:49,204|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is queued (on backend cdse).\n", + "2024-02-21 15:56:52,344|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 15:56:53,306|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is queued (on backend cdse).\n", + "2024-02-21 15:56:53,819|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is queued (on backend cdse).\n", + "2024-02-21 15:57:56,919|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 15:58:00,891|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 15:58:01,711|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 15:59:05,274|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 15:59:05,813|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 15:59:08,578|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:00:12,303|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:00:13,090|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:00:21,385|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:01:23,503|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:01:24,362|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:01:24,873|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:02:26,539|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:02:26,928|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:02:27,366|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:03:29,304|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:03:30,023|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:03:30,417|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:04:32,484|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:04:33,395|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:04:33,904|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:05:35,862|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:05:36,574|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:05:36,985|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:06:39,146|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:06:39,961|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:06:40,472|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:07:45,840|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:07:46,316|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:07:46,743|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:08:48,659|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:08:49,190|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:08:50,316|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:09:52,043|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:09:53,193|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:09:53,601|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:10:55,280|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:10:55,757|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:10:58,627|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:12:00,256|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:12:02,522|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:12:02,933|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:13:05,282|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:13:05,704|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:13:06,318|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:14:07,984|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:14:08,374|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:14:08,885|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:15:10,701|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:15:12,721|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:15:13,398|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:16:15,115|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:16:15,759|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:16:18,026|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:17:20,648|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:17:21,092|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:17:21,603|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:18:24,074|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:18:24,581|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:18:26,025|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:19:28,686|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:19:29,298|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", + "2024-02-21 16:19:30,526|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:20:32,962|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:20:33,513|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is finished (on backend cdse).\n", + "2024-02-21 16:20:33,516|openeo_gfmap.manager|INFO: Job j-2402214ea45249c791438fb985ddccb3 finished successfully, queueing on_job_done...\n", + "2024-02-21 16:20:33,520|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-21 16:20:34,733|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:20:37,892|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmpkmx20rz6\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "DataCube()\n" + "DataCube()\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:43,664|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp91ksct_n\n", - "2024-02-12 09:37:45,148|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp_4v2t_f0\n", - "2024-02-12 09:37:52,138|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:52,672|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:53,429|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:53,432|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmpw01mu9qf\n", - "2024-02-12 09:37:54,746|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:20:46,219|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:54,905|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:55,842|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:55,847|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpgdkcbiqo\n", - "2024-02-12 09:37:58,579|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:20:46,840|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:08,124|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:08,129|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmpgp2nuas_\n", + "2024-02-21 16:21:15,945|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:58,765|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:59,373|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:59,378|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp9wfpr2qu\n", - "2024-02-12 09:38:05,003|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:21:16,015|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:38,911|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:38,916|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmp65_zmdlt\n", + "2024-02-21 16:21:45,426|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:05,194|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n" + "2024-02-21 16:21:45,497|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:58,128|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:21:58,129|openeo_gfmap.manager|INFO: Job j-2402214ea45249c791438fb985ddccb3 and post job action finished successfully.\n", + "2024-02-21 16:22:07,988|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:22:08,634|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", + "2024-02-21 16:22:09,470|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:23:12,017|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:23:13,455|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is finished (on backend cdse).\n", + "2024-02-21 16:23:13,457|openeo_gfmap.manager|INFO: Job j-2402216dc08841f3af50c3e0bec9b516 finished successfully, queueing on_job_done...\n", + "2024-02-21 16:23:13,462|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-21 16:23:14,069|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "DataCube()\n" + "DataCube()\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:38:05,385|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:05,390|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpkew_9hyq\n", - "2024-02-12 09:38:08,255|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:23:19,140|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpbd96uf75\n", + "2024-02-21 16:23:26,619|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:08,439|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:08,747|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:08,749|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124f58244715803a335628079b9a...\n", - "2024-02-12 09:38:09,559|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a and post job action finished successfully.\n", - "2024-02-12 09:38:15,092|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:23:26,657|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:23:38,222|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:23:38,227|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmp1b00sl28\n", + "2024-02-21 16:23:45,660|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:15,307|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:15,516|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:15,519|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpvahpjkqn\n", - "2024-02-12 09:38:22,615|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:23:45,697|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:23:53,680|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:23:53,684|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpc38xzptl\n", + "2024-02-21 16:24:01,081|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:22,788|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:22,969|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:22,973|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp9qq2f6m9\n", - "2024-02-12 09:38:29,854|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:24:01,118|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:24:10,890|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:24:10,894|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpsomd01lb\n", + "2024-02-21 16:24:18,080|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:30,027|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:30,148|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:30,150|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24021279e49745e9a3806584fe0e8c9a...\n", - "2024-02-12 09:38:31,352|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a and post job action finished successfully.\n", - "2024-02-12 09:39:29,274|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:39:29,492|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:39:30,816|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:40:30,968|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:40:33,929|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:40:34,269|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:41:34,440|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:41:34,695|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:41:35,280|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:42:35,462|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:42:36,041|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:42:36,485|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:43:36,626|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:43:36,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:43:38,638|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:44:38,795|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:44:39,048|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:44:41,675|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:45:41,861|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:45:42,175|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:45:44,476|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:46:44,671|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:46:44,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:46:47,272|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:47:47,411|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:47:47,719|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:47:48,098|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:48:48,231|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:48:48,650|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:48:50,196|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:49:50,520|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:49:50,827|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:49:52,613|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:50:52,803|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:50:54,202|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:50:54,794|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:51:54,958|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:51:56,063|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:51:56,289|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:52:56,486|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:52:56,866|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:52:57,592|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:53:57,737|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:53:58,210|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:54:01,194|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:55:01,369|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:55:05,199|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:55:05,437|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:56:05,605|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:56:06,025|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:56:08,011|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:57:08,220|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:57:08,685|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:57:12,111|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:58:12,249|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:58:12,658|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:58:14,530|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:59:14,656|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:59:14,954|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:59:15,242|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:00:15,353|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:00:15,947|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:00:29,066|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:01:29,230|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:01:29,528|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:01:30,633|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:02:30,836|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:02:32,780|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:02:46,801|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is finished (on backend cdse).\n", - "2024-02-12 10:02:46,803|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 finished successfully, queueing on_job_done...\n", - "2024-02-12 10:02:46,809|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-12 10:02:51,114|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp_gibcv9i\n", - "2024-02-12 10:02:58,022|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:24:18,120|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:24:28,218|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:24:28,222|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpz16ppxki\n", + "2024-02-21 16:24:37,594|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:24:38,189|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:24:38,575|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:24:46,766|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:02:58,509|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:02:58,693|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:02:58,697|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp710760kb\n", - "2024-02-12 10:03:05,950|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 16:24:46,807|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:25:01,711|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", + "2024-02-21 16:25:01,714|openeo_gfmap.manager|INFO: Job j-2402216dc08841f3af50c3e0bec9b516 and post job action finished successfully.\n", + "2024-02-21 16:25:42,567|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:25:43,346|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:25:50,641|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:26:59,438|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:26:59,966|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:27:00,702|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:28:10,002|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:28:10,622|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:28:18,302|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:29:22,379|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:29:24,145|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:29:24,759|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:30:36,070|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:30:36,510|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:30:36,918|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:31:42,906|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:31:43,514|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:31:44,025|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:32:47,872|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:32:54,376|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:32:54,990|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:34:01,272|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:34:01,735|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:34:02,676|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:35:08,417|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:35:09,032|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:35:10,055|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:36:21,239|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:36:22,043|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:36:22,452|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:37:30,485|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:37:31,266|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:37:32,920|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:38:36,806|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:38:37,315|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:38:38,133|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:39:40,870|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:39:41,537|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:39:41,872|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:40:50,006|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:40:50,640|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:40:51,256|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:41:53,865|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:41:54,333|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:41:54,743|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:42:56,911|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:42:58,231|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:42:58,743|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:44:02,995|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:44:03,564|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:44:03,900|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:45:05,987|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:45:06,335|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:45:07,153|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:46:09,256|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:46:09,722|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:46:10,130|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:47:11,711|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:47:12,082|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:47:12,492|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:48:15,304|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:48:15,776|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:48:16,287|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:49:18,311|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:49:18,754|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:49:19,573|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:50:21,669|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:50:22,343|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:50:22,957|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:51:24,625|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:51:25,116|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:51:25,831|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:52:27,841|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:52:28,296|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:52:28,910|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:53:31,844|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:53:32,668|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:53:33,218|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:54:36,611|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:54:37,218|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:54:38,038|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:55:40,924|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:55:41,527|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:55:42,039|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:56:44,306|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:56:44,810|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:56:45,526|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:57:48,503|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:57:49,425|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:57:50,551|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:58:53,861|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:58:54,653|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 16:58:55,370|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 16:59:59,394|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 16:59:59,782|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:00:00,190|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:01:03,729|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:01:04,088|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:01:04,581|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:02:07,464|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:02:07,884|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:02:08,600|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:03:11,364|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:03:11,885|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:03:12,517|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:04:15,204|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:04:16,704|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:04:17,728|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:05:19,543|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:05:19,987|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:05:20,398|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:06:23,208|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:06:23,988|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:06:24,735|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:07:27,417|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:07:27,888|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:07:28,398|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:08:30,407|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:08:30,862|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:08:33,117|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:09:35,045|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:09:35,681|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:09:36,295|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:10:38,140|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:10:38,761|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:10:41,423|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:11:43,315|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:11:43,786|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:11:44,313|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:12:46,919|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:12:47,529|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:12:48,809|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:13:50,420|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:13:53,134|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:13:55,779|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:14:58,454|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:14:59,575|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:15:01,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:16:04,070|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:16:04,577|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:16:06,341|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:17:08,408|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:17:08,909|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:17:09,421|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:18:12,057|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:18:12,497|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:18:13,726|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:19:15,850|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:19:16,499|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:19:17,010|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:20:18,843|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:20:19,270|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:20:19,582|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:21:21,332|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:21:21,941|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:21:22,348|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:22:24,197|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:22:24,610|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:22:28,909|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:23:31,260|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:23:31,990|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:23:32,311|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:24:33,987|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:24:34,350|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", + "2024-02-21 17:24:35,989|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:25:37,675|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", + "2024-02-21 17:25:38,248|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is error (on backend cdse).\n", + "2024-02-21 17:25:38,250|openeo_gfmap.manager|INFO: Job j-240221553e964ca5b8058e8ea5518c8c finished with error, queueing on_job_error...\n", + "2024-02-21 17:25:38,255|openeo_gfmap.manager|DEBUG: Worker thread Thread-6: polled finished job with status PostJobStatus.ERROR.\n", + "2024-02-21 17:25:38,570|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:26:44,461|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:26:44,910|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:27:47,940|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:27:48,399|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:28:51,720|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:28:52,318|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:29:55,606|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:29:57,528|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:30:59,620|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:31:00,095|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:32:02,673|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:32:03,274|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:33:06,885|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:33:07,583|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:34:10,327|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:34:12,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:35:15,752|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:35:16,197|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:36:18,806|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:36:19,082|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:37:23,239|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:37:25,222|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:38:29,046|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:38:29,423|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:39:33,707|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:39:35,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:40:40,163|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:40:40,603|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:41:43,737|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:41:44,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:42:46,614|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:42:47,068|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:43:49,675|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:43:50,146|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:44:55,183|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:44:55,888|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:45:59,171|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:46:00,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:47:03,726|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:47:04,297|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:48:07,365|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:48:07,888|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:49:10,185|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:49:10,661|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:50:13,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:50:14,046|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:51:16,867|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:51:17,330|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:52:20,631|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:52:21,684|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:53:24,678|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:53:25,025|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:54:27,233|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:54:27,795|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:55:29,640|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:55:30,157|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:56:32,067|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:56:33,877|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:57:35,637|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:57:37,670|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:58:39,258|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:58:42,379|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 17:59:44,160|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 17:59:44,524|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:00:46,757|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:00:49,135|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:01:50,823|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:01:53,135|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:02:55,250|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:02:56,931|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:03:58,888|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:04:00,317|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:05:02,124|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:05:02,678|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:06:04,354|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:06:04,940|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:07:07,321|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:07:07,710|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:08:12,717|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:08:13,144|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:09:14,878|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:09:15,609|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:10:17,583|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:10:18,278|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:11:20,358|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:11:20,845|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:12:23,113|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:12:23,514|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:13:25,488|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:13:25,876|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:14:28,383|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:14:28,723|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:15:32,488|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:15:33,160|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:16:39,572|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:16:40,028|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:17:45,943|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:17:46,383|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:19:06,197|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:19:06,827|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:20:15,664|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:20:17,221|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:21:20,075|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:21:20,746|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:22:23,735|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:22:24,299|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:23:27,863|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:23:28,402|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:24:31,593|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:24:31,923|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:25:40,509|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:25:41,114|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:26:46,194|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:26:46,752|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:27:55,816|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:27:56,384|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:29:04,022|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:29:04,482|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:30:08,109|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:30:08,685|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:31:11,006|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:31:11,559|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:32:13,909|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:32:14,433|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:33:18,707|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:33:20,508|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:34:25,149|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:34:25,711|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:35:27,777|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:35:28,484|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:36:36,111|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:36:36,783|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:37:43,928|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:37:44,573|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:38:50,356|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:38:50,766|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:39:59,820|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:40:00,356|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:41:09,375|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:41:10,091|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:42:16,326|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:42:16,856|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:43:20,176|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:43:20,754|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:44:40,275|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:44:41,037|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:45:53,590|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:45:54,457|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:47:05,604|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:47:06,139|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:48:09,823|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:48:10,344|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:49:12,725|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:49:13,320|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:50:18,400|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:50:19,267|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:51:21,200|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:51:21,730|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:52:25,064|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:52:25,834|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:53:28,754|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:53:29,526|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:54:34,833|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:54:35,472|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:55:42,845|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:55:43,212|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:56:52,409|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:56:52,999|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:57:57,211|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:58:01,810|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 18:59:05,291|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 18:59:09,702|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:00:11,523|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:00:11,963|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:01:13,593|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:01:14,117|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:02:15,909|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:02:16,378|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:03:17,959|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:03:18,332|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:04:19,835|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:04:20,282|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:05:21,969|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:05:22,952|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:06:25,816|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:06:26,237|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:07:29,437|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:07:29,928|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:08:32,858|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:08:33,736|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:09:36,448|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:09:36,906|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:10:38,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:10:39,369|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:11:41,084|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:11:41,527|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:12:43,355|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:12:43,786|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:13:45,352|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:13:45,841|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:14:47,407|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:14:47,793|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:15:49,308|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:15:49,848|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:16:51,988|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:16:52,636|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:17:54,136|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:17:54,674|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:18:56,498|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:18:57,139|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:19:58,765|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:19:59,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:21:01,351|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:21:01,761|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:22:03,700|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:22:04,327|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:23:06,375|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:23:06,894|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:24:08,664|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:24:09,564|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:25:11,785|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:25:12,233|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:26:14,371|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:26:14,800|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:27:16,434|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:27:16,854|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:28:18,395|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:28:18,909|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:29:20,940|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:29:21,476|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:30:23,497|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:30:25,839|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:31:27,425|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:31:27,855|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:32:29,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:32:29,894|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:33:31,428|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:33:31,948|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:34:33,720|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:34:34,003|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:35:35,745|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:35:36,161|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:36:37,960|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:36:38,419|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:37:40,509|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:37:41,089|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:38:42,892|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:38:43,451|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:39:46,395|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:39:46,941|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:40:49,805|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:40:50,427|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:41:52,709|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:41:53,097|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:42:54,927|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:42:55,665|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:43:57,411|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:43:58,026|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:44:59,795|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:45:00,490|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:46:02,024|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:46:02,545|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:47:04,032|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:47:04,498|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:48:06,579|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:48:12,788|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:49:15,213|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:49:15,812|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:50:17,417|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:50:17,829|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:51:19,715|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:51:20,192|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:52:21,832|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:52:22,247|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:53:24,026|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:53:24,507|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:54:26,197|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:54:26,561|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:55:29,137|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:55:29,643|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:56:31,398|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:56:31,901|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:57:33,728|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:57:34,159|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:58:36,036|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:58:36,523|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 19:59:38,240|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 19:59:38,781|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 20:00:40,680|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 20:00:41,450|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 20:01:43,045|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 20:01:43,506|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 20:02:45,441|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 20:02:45,867|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 20:03:47,786|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 20:03:48,230|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", + "2024-02-21 20:04:49,726|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", + "2024-02-21 20:04:57,657|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is finished (on backend cdse).\n", + "2024-02-21 20:04:57,659|openeo_gfmap.manager|INFO: Job j-240221b194a840ee8f3e9b710bbfb1f5 finished successfully, queueing on_job_done...\n", + "2024-02-21 20:04:57,662|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-21 20:05:02,462|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpyo00o4uv\n", + "2024-02-21 20:05:08,949|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:06,320|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:06,478|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:06,483|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpx_uhw6jb\n", - "2024-02-12 10:03:13,646|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:05:09,182|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:16,482|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:16,487|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmphvqjm2ob\n", + "2024-02-21 20:05:23,433|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:14,059|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:14,188|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:14,193|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpnmy5v_v0\n", - "2024-02-12 10:03:18,924|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:05:23,543|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:29,689|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:29,694|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpge2mgcve\n", + "2024-02-21 20:05:37,951|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:19,242|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:19,358|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:19,363|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp2sgwj7iq\n", - "2024-02-12 10:03:24,044|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:05:38,081|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:46,422|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:05:46,426|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp1c95wv6l\n", + "2024-02-21 20:05:53,327|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:24,459|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:24,666|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:24,670|openeo_gfmap.manager|DEBUG: Downloading asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpt61g6d34\n", - "2024-02-12 10:03:30,997|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:05:53,556|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-21 20:06:00,362|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:00,366|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp4f46h51c\n", + "2024-02-21 20:06:06,935|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-21 20:06:07,040|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:13,189|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:13,195|openeo_gfmap.manager|DEBUG: Downloading asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpsgyzafff\n", + "2024-02-21 20:06:19,856|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:31,312|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:31,513|openeo_gfmap.manager|INFO: Downloaded asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:31,518|openeo_gfmap.manager|DEBUG: Downloading asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp9viznwne\n", - "2024-02-12 10:03:38,362|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:06:19,979|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:24,440|openeo_gfmap.manager|INFO: Downloaded asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:24,444|openeo_gfmap.manager|DEBUG: Downloading asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpgeqbn314\n", + "2024-02-21 20:06:31,421|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:38,880|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:38,989|openeo_gfmap.manager|INFO: Downloaded asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:38,993|openeo_gfmap.manager|DEBUG: Downloading asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpvp3hzxc5\n", - "2024-02-12 10:03:44,408|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-02-21 20:06:31,624|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:39,130|openeo_gfmap.manager|INFO: Downloaded asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:39,135|openeo_gfmap.manager|DEBUG: Downloading asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp00of56z5\n", + "2024-02-21 20:06:46,039|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", + "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:44,747|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:44,946|openeo_gfmap.manager|INFO: Downloaded asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:44,948|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124d03ab4e718bef6ce4e8185348...\n", - "2024-02-12 10:03:46,982|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:03:47,304|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 and post job action finished successfully.\n", - "2024-02-12 10:03:47,374|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:04:47,471|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:04:48,400|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:05:48,513|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:05:48,775|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:06:48,987|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:06:49,580|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:07:49,782|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:07:50,229|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:08:50,385|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:08:50,823|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:09:50,944|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:09:51,455|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:10:51,598|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:11:17,145|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:12:17,315|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:12:17,688|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:13:17,805|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:13:18,499|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:14:18,608|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:14:18,986|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:15:19,116|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:15:19,564|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:16:19,716|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:16:19,975|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:17:20,142|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:17:20,525|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:18:20,697|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:18:20,959|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:19:21,184|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:19:21,544|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:20:21,695|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:20:26,767|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:21:26,916|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:21:27,696|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:22:27,831|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:22:28,087|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:23:28,237|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:23:28,481|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:24:28,627|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:24:29,027|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:25:29,137|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:25:29,855|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:26:30,003|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:26:31,146|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:27:31,306|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:27:31,531|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:28:31,696|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:28:32,167|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:29:32,318|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:29:32,643|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:30:32,852|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:30:33,161|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:31:33,313|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:31:34,064|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:32:34,293|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:32:34,630|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:33:34,773|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:33:34,997|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:34:35,180|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:34:35,697|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:35:35,827|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:35:36,174|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is error (on backend cdse).\n", - "2024-02-12 10:35:36,176|openeo_gfmap.manager|INFO: Job j-2402128d377942dfa41b8b075936fa95 finished with error, queueing on_job_error...\n", - "2024-02-12 10:35:36,179|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.ERROR.\n", - "Exception in thread Thread-4:\n", - "Traceback (most recent call last):\n", - " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 980, in _bootstrap_inner\n", - " self.run()\n", - " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 917, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 64, in _post_job_worker\n", - " if status == PostJobStatus.ERROR:\n", - " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 137, in on_job_error\n", - " output_log_path = (\n", - "TypeError: '>' not supported between instances of 'list' and 'int'\n" + "2024-02-21 20:06:46,144|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:51,344|openeo_gfmap.manager|INFO: Downloaded asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", + "2024-02-21 20:06:51,347|openeo_gfmap.manager|INFO: Job j-240221b194a840ee8f3e9b710bbfb1f5 and post job action finished successfully.\n" ] } ], "source": [ "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Write the STAC collection to file." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "manager.create_stac()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "gfmap", + "display_name": "openeo-dev", "language": "python", - "name": "python3" + "name": "openeo-dev" }, "language_info": { "codemirror_mode": { diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index d8051bf..7243f7a 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -1,9 +1,11 @@ import json +import pystac import queue import shutil import threading from enum import Enum from pathlib import Path +from pystac import CatalogType from tempfile import NamedTemporaryFile from typing import Callable, Optional, Union @@ -28,14 +30,14 @@ def __init__( self, output_dir: Path, output_path_generator: Callable, - post_job_action: Optional[Callable], + post_job_action: Optional[Callable] = None, poll_sleep: int = 5, n_threads: int = 1, post_job_params: dict = {}, ): self._output_dir = output_dir - self._downloaded_products = [] + self._downloaded_products = {} # Setup the threads to work on the on_job_done and on_job_error methods self._finished_job_queue = queue.Queue() @@ -52,6 +54,11 @@ def __init__( # geometry column MultiBackendJobManager._normalize_df = self._normalize_df + # Generate the root STAC collection + self._root_collection = pystac.Collection(id="Root collection", + description="Root collection of the feature extraction", + extent=None) #TODO: make the collection richer + def _post_job_worker(self): """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` methods.""" @@ -150,7 +157,7 @@ def on_job_done(self, job: BatchJob, row: pd.Series): """Method called when a job finishes successfully. It will first download the results of the job and then call the `post_job_action` method. """ - job_products = [] + job_products = {} for idx, asset in enumerate(job.get_results().get_assets()): temp_file = NamedTemporaryFile(delete=False) try: @@ -172,7 +179,7 @@ def on_job_done(self, job: BatchJob, row: pd.Series): # Move the temporary file to the final location shutil.move(temp_file.name, output_path) # Add to the list of downloaded products - job_products.append(output_path) + job_products[asset.name] = [output_path] _log.info( f"Downloaded asset {asset.name} from job {job.job_id} -> {output_path}" ) @@ -184,6 +191,21 @@ def on_job_done(self, job: BatchJob, row: pd.Series): finally: shutil.rmtree(temp_file.name, ignore_errors=True) + # TODO: add try-except in the for loop to log all assets that were failed to be added to STAC collection. + # First update the STAC collection with the assets directly resulting from the OpenEO batch job + job_metadata = pystac.Collection.from_dict(job.get_results().get_metadata()) + for item_metadata in job_metadata.get_all_items(): + item = pystac.read_file(item_metadata.get_self_href()) + asset_path = job_products[item.id][0] + + assert len(item.assets.values()) == 1, "Each item should only contain one asset" + for asset in item.assets.values(): + asset.href = str(asset_path) # Update the asset href to the output location set by the output_path_generator + + # Add the item to the root_collection + self._root_collection.add_item(item) + + # TODO: post_job_action should return dict with Asset STAC metadata, then add that metadata to the correct STAC items # Call the post job action if self._post_job_action is not None: _log.debug(f"Calling post job action for job {job.job_id}...") @@ -191,9 +213,9 @@ def on_job_done(self, job: BatchJob, row: pd.Series): job_products, row, self._post_job_params ) - self._downloaded_products.extend(job_products) + self._downloaded_products.update(job_products) + - # TODO STAC metadata _log.info(f"Job {job.job_id} and post job action finished successfully.") @@ -264,3 +286,12 @@ def run_jobs( _log.info("Workers started, creating and running jobs.") super().run_jobs(df, start_job, output_file) + + # TODO: immediately make create_stac optional in 'run_jobs'? + def create_stac(self): + """Method to be called after run_jobs to create a STAC catalog + and write it to self._output_dir + """ + self._root_collection.update_extent_from_items() + self._root_collection.normalize_hrefs(str(self._output_dir / "stac")) + self._root_collection.save(catalog_type=CatalogType.SELF_CONTAINED) \ No newline at end of file From 020885655b1b302623ecec293652ba0fddc67296 Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Thu, 22 Feb 2024 15:50:21 +0100 Subject: [PATCH 08/24] added CDSE staging backend for Sentinel 1 and 2 #18 --- src/openeo_gfmap/backend.py | 10 ++++++++++ src/openeo_gfmap/fetching/s1.py | 6 ++++++ src/openeo_gfmap/fetching/s2.py | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/src/openeo_gfmap/backend.py b/src/openeo_gfmap/backend.py index f63e054..ad261e7 100644 --- a/src/openeo_gfmap/backend.py +++ b/src/openeo_gfmap/backend.py @@ -19,6 +19,7 @@ class Backend(Enum): TERRASCOPE = "terrascope" EODC = "eodc" # Dask implementation. Do not test on this yet. CDSE = "cdse" # Terrascope implementation (pyspark) #URL: openeo.dataspace.copernicus.eu (need to register) + CDSE_STAGING = "cdse-staging" LOCAL = "local" # Based on the same components of EODc @@ -86,6 +87,14 @@ def cdse_connection() -> openeo.Connection: ) +def cdse_staging_connection() -> openeo.Connection: + """Performs a connection to the CDSE backend using oidc authentication.""" + return _create_connection( + url="openeo-staging.dataspace.copernicus.eu", + env_var_suffix="CDSE_STAGING", + ) + + def eodc_connection() -> openeo.Connection: """Perfroms a connection to the EODC backend using the oidc authentication.""" return _create_connection( @@ -97,4 +106,5 @@ def eodc_connection() -> openeo.Connection: BACKEND_CONNECTIONS: Dict[Backend, Callable] = { Backend.TERRASCOPE: vito_connection, Backend.CDSE: cdse_connection, + Backend.CDSE_STAGING: cdse_staging_connection } diff --git a/src/openeo_gfmap/fetching/s1.py b/src/openeo_gfmap/fetching/s1.py index 2f65079..678e8f0 100644 --- a/src/openeo_gfmap/fetching/s1.py +++ b/src/openeo_gfmap/fetching/s1.py @@ -136,6 +136,12 @@ def s1_grd_default_processor(cube: openeo.DataCube, **params): get_s1_grd_default_processor, collection_name="SENTINEL1_GRD" ), }, + Backend.CDSE_STAGING: { + "default": partial(get_s1_grd_default_fetcher, collection_name="SENTINEL1_GRD"), + "preprocessor": partial( + get_s1_grd_default_processor, collection_name="SENTINEL1_GRD" + ), + }, } diff --git a/src/openeo_gfmap/fetching/s2.py b/src/openeo_gfmap/fetching/s2.py index c9c7487..2aa785d 100644 --- a/src/openeo_gfmap/fetching/s2.py +++ b/src/openeo_gfmap/fetching/s2.py @@ -194,6 +194,12 @@ def s2_l2a_default_processor(cube: openeo.DataCube, **params): get_s2_l2a_default_processor, collection_name="SENTINEL2_L2A" ), }, + Backend.CDSE_STAGING: { + "fetch": partial(get_s2_l2a_default_fetcher, collection_name="SENTINEL2_L2A"), + "preprocessor": partial( + get_s2_l2a_default_processor, collection_name="SENTINEL2_L2A" + ), + }, } From 46c5ea9e593f9292ea9ce6718efd79494458e820 Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Fri, 23 Feb 2024 10:58:39 +0100 Subject: [PATCH 09/24] generated STAC metadata with item for netcdfs with time series #18 --- .../S2_extraction_example.ipynb | 961 +----------------- src/openeo_gfmap/manager/job_manager.py | 6 +- 2 files changed, 32 insertions(+), 935 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 4e36202..158abf5 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -355,33 +355,6 @@ " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", " \n", - " \n", - " 1\n", - " cdse\n", - " S2\n", - " .nc\n", - " 2020-08-30\n", - " 2022-03-03\n", - " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " \n", - " \n", - " 2\n", - " cdse\n", - " S2\n", - " .nc\n", - " 2020-08-30\n", - " 2022-03-03\n", - " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " \n", - " \n", - " 3\n", - " cdse\n", - " S2\n", - " .nc\n", - " 2020-08-30\n", - " 2022-03-03\n", - " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " \n", " \n", "\n", "" @@ -389,15 +362,9 @@ "text/plain": [ " backend_name out_prefix out_extension start_date end_date \\\n", "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", "\n", " geometry \n", - "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... " + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... " ] }, "execution_count": 4, @@ -407,7 +374,7 @@ ], "source": [ "# Run a subset of the jobs to test the manager, the selected jobs have a fair amount of geometries to extract\n", - "job_df = job_df.iloc[[0, 2, 3, -6]].reset_index(drop=True)\n", + "job_df = job_df.iloc[[0]].reset_index(drop=True)\n", "job_df" ] }, @@ -424,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -515,15 +482,15 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.27 s, sys: 14.6 ms, total: 2.29 s\n", - "Wall time: 2.29 s\n" + "CPU times: user 2.23 s, sys: 23.9 ms, total: 2.25 s\n", + "Wall time: 2.26 s\n" ] } ], @@ -536,7 +503,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -679,7 +646,7 @@ "outputs": [], "source": [ "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", - "from openeo_gfmap.backend import cdse_connection\n", + "from openeo_gfmap.backend import cdse_staging_connection\n", "\n", "base_output_dir = Path('/data/users/Public/vincent.verelst/world_cereal/extractions/')\n", "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", @@ -694,919 +661,49 @@ ")\n", "\n", "manager.add_backend(\n", - " Backend.CDSE.value, cdse_connection, parallel_jobs=2\n", + " Backend.CDSE_STAGING.value, cdse_staging_connection, parallel_jobs=2\n", ")" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-21 15:53:45,820|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", - "2024-02-21 15:53:45,823|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", - "2024-02-21 15:53:45,869|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + "2024-02-22 15:32:37,095|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-02-22 15:32:37,098|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-02-22 15:32:37,342|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", " 'description', 'costs'],\n", " dtype='object')\n", - "2024-02-21 15:53:45,875|openeo_gfmap.manager|DEBUG: Updating status. 0 on 4 active jobs...\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authenticated using refresh token.\n", - "DataCube()\n", - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-02-21 15:55:39,376|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 15:55:39,988|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is queued (on backend cdse).\n", - "2024-02-21 15:55:49,204|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is queued (on backend cdse).\n", - "2024-02-21 15:56:52,344|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 15:56:53,306|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is queued (on backend cdse).\n", - "2024-02-21 15:56:53,819|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is queued (on backend cdse).\n", - "2024-02-21 15:57:56,919|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 15:58:00,891|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 15:58:01,711|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 15:59:05,274|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 15:59:05,813|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 15:59:08,578|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:00:12,303|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:00:13,090|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:00:21,385|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:01:23,503|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:01:24,362|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:01:24,873|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:02:26,539|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:02:26,928|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:02:27,366|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:03:29,304|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:03:30,023|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:03:30,417|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:04:32,484|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:04:33,395|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:04:33,904|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:05:35,862|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:05:36,574|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:05:36,985|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:06:39,146|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:06:39,961|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:06:40,472|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:07:45,840|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:07:46,316|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:07:46,743|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:08:48,659|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:08:49,190|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:08:50,316|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:09:52,043|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:09:53,193|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:09:53,601|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:10:55,280|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:10:55,757|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:10:58,627|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:12:00,256|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:12:02,522|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:12:02,933|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:13:05,282|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:13:05,704|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:13:06,318|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:14:07,984|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:14:08,374|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:14:08,885|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:15:10,701|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:15:12,721|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:15:13,398|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:16:15,115|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:16:15,759|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:16:18,026|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:17:20,648|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:17:21,092|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:17:21,603|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:18:24,074|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:18:24,581|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:18:26,025|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:19:28,686|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:19:29,298|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is running (on backend cdse).\n", - "2024-02-21 16:19:30,526|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:20:32,962|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:20:33,513|openeo_gfmap.manager|DEBUG: Status of job j-2402214ea45249c791438fb985ddccb3 is finished (on backend cdse).\n", - "2024-02-21 16:20:33,516|openeo_gfmap.manager|INFO: Job j-2402214ea45249c791438fb985ddccb3 finished successfully, queueing on_job_done...\n", - "2024-02-21 16:20:33,520|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-21 16:20:34,733|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:20:37,892|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmpkmx20rz6\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-02-21 16:20:46,219|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:20:46,840|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:08,124|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:08,129|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmpgp2nuas_\n", - "2024-02-21 16:21:15,945|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:21:16,015|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:38,911|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:38,916|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /tmp/tmp65_zmdlt\n", - "2024-02-21 16:21:45,426|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:21:45,497|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:58,128|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402214ea45249c791438fb985ddccb3 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:21:58,129|openeo_gfmap.manager|INFO: Job j-2402214ea45249c791438fb985ddccb3 and post job action finished successfully.\n", - "2024-02-21 16:22:07,988|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:22:08,634|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is running (on backend cdse).\n", - "2024-02-21 16:22:09,470|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:23:12,017|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:23:13,455|openeo_gfmap.manager|DEBUG: Status of job j-2402216dc08841f3af50c3e0bec9b516 is finished (on backend cdse).\n", - "2024-02-21 16:23:13,457|openeo_gfmap.manager|INFO: Job j-2402216dc08841f3af50c3e0bec9b516 finished successfully, queueing on_job_done...\n", - "2024-02-21 16:23:13,462|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-21 16:23:14,069|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n" + "2024-02-22 15:32:37,346|openeo_gfmap.manager|DEBUG: Updating status. 0 on 1 active jobs...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "DataCube()\n" + "Authenticated using refresh token.\n" ] }, { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-02-21 16:23:19,140|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpbd96uf75\n", - "2024-02-21 16:23:26,619|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:23:26,657|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:23:38,222|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:23:38,227|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmp1b00sl28\n", - "2024-02-21 16:23:45,660|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:23:45,697|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:23:53,680|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:23:53,684|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpc38xzptl\n", - "2024-02-21 16:24:01,081|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:24:01,118|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:24:10,890|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:24:10,894|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpsomd01lb\n", - "2024-02-21 16:24:18,080|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:24:18,120|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:24:28,218|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:24:28,222|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /tmp/tmpz16ppxki\n", - "2024-02-21 16:24:37,594|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:24:38,189|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:24:38,575|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:24:46,766|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 16:24:46,807|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:25:01,711|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-2402216dc08841f3af50c3e0bec9b516 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-21 16:25:01,714|openeo_gfmap.manager|INFO: Job j-2402216dc08841f3af50c3e0bec9b516 and post job action finished successfully.\n", - "2024-02-21 16:25:42,567|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:25:43,346|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:25:50,641|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:26:59,438|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:26:59,966|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:27:00,702|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:28:10,002|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:28:10,622|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:28:18,302|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:29:22,379|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:29:24,145|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:29:24,759|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:30:36,070|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:30:36,510|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:30:36,918|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:31:42,906|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:31:43,514|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:31:44,025|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:32:47,872|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:32:54,376|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:32:54,990|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:34:01,272|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:34:01,735|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:34:02,676|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:35:08,417|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:35:09,032|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:35:10,055|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:36:21,239|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:36:22,043|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:36:22,452|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:37:30,485|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:37:31,266|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:37:32,920|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:38:36,806|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:38:37,315|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:38:38,133|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:39:40,870|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:39:41,537|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:39:41,872|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:40:50,006|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:40:50,640|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:40:51,256|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:41:53,865|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:41:54,333|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:41:54,743|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:42:56,911|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:42:58,231|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:42:58,743|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:44:02,995|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:44:03,564|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:44:03,900|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:45:05,987|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:45:06,335|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:45:07,153|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:46:09,256|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:46:09,722|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:46:10,130|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:47:11,711|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:47:12,082|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:47:12,492|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:48:15,304|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:48:15,776|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:48:16,287|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:49:18,311|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:49:18,754|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:49:19,573|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:50:21,669|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:50:22,343|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:50:22,957|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:51:24,625|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:51:25,116|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:51:25,831|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:52:27,841|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:52:28,296|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:52:28,910|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:53:31,844|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:53:32,668|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:53:33,218|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:54:36,611|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:54:37,218|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:54:38,038|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:55:40,924|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:55:41,527|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:55:42,039|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:56:44,306|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:56:44,810|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:56:45,526|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:57:48,503|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:57:49,425|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:57:50,551|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:58:53,861|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:58:54,653|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 16:58:55,370|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 16:59:59,394|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 16:59:59,782|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:00:00,190|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:01:03,729|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:01:04,088|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:01:04,581|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:02:07,464|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:02:07,884|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:02:08,600|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:03:11,364|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:03:11,885|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:03:12,517|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:04:15,204|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:04:16,704|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:04:17,728|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:05:19,543|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:05:19,987|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:05:20,398|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:06:23,208|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:06:23,988|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:06:24,735|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:07:27,417|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:07:27,888|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:07:28,398|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:08:30,407|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:08:30,862|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:08:33,117|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:09:35,045|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:09:35,681|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:09:36,295|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:10:38,140|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:10:38,761|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:10:41,423|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:11:43,315|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:11:43,786|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:11:44,313|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:12:46,919|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:12:47,529|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:12:48,809|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:13:50,420|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:13:53,134|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:13:55,779|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:14:58,454|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:14:59,575|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:15:01,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:16:04,070|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:16:04,577|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:16:06,341|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:17:08,408|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:17:08,909|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:17:09,421|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:18:12,057|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:18:12,497|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:18:13,726|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:19:15,850|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:19:16,499|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:19:17,010|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:20:18,843|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:20:19,270|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:20:19,582|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:21:21,332|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:21:21,941|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:21:22,348|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:22:24,197|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:22:24,610|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:22:28,909|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:23:31,260|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:23:31,990|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:23:32,311|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:24:33,987|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:24:34,350|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is running (on backend cdse).\n", - "2024-02-21 17:24:35,989|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:25:37,675|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-21 17:25:38,248|openeo_gfmap.manager|DEBUG: Status of job j-240221553e964ca5b8058e8ea5518c8c is error (on backend cdse).\n", - "2024-02-21 17:25:38,250|openeo_gfmap.manager|INFO: Job j-240221553e964ca5b8058e8ea5518c8c finished with error, queueing on_job_error...\n", - "2024-02-21 17:25:38,255|openeo_gfmap.manager|DEBUG: Worker thread Thread-6: polled finished job with status PostJobStatus.ERROR.\n", - "2024-02-21 17:25:38,570|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:26:44,461|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:26:44,910|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:27:47,940|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:27:48,399|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:28:51,720|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:28:52,318|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:29:55,606|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:29:57,528|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:30:59,620|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:31:00,095|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:32:02,673|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:32:03,274|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:33:06,885|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:33:07,583|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:34:10,327|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:34:12,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:35:15,752|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:35:16,197|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:36:18,806|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:36:19,082|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:37:23,239|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:37:25,222|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:38:29,046|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:38:29,423|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:39:33,707|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:39:35,623|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:40:40,163|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:40:40,603|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:41:43,737|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:41:44,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:42:46,614|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:42:47,068|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:43:49,675|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:43:50,146|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:44:55,183|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:44:55,888|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:45:59,171|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:46:00,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:47:03,726|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:47:04,297|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:48:07,365|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:48:07,888|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:49:10,185|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:49:10,661|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:50:13,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:50:14,046|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:51:16,867|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:51:17,330|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:52:20,631|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:52:21,684|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:53:24,678|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:53:25,025|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:54:27,233|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:54:27,795|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:55:29,640|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:55:30,157|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:56:32,067|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:56:33,877|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:57:35,637|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:57:37,670|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:58:39,258|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:58:42,379|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 17:59:44,160|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 17:59:44,524|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:00:46,757|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:00:49,135|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:01:50,823|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:01:53,135|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:02:55,250|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:02:56,931|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:03:58,888|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:04:00,317|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:05:02,124|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:05:02,678|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:06:04,354|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:06:04,940|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:07:07,321|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:07:07,710|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:08:12,717|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:08:13,144|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:09:14,878|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:09:15,609|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:10:17,583|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:10:18,278|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:11:20,358|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:11:20,845|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:12:23,113|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:12:23,514|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:13:25,488|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:13:25,876|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:14:28,383|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:14:28,723|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:15:32,488|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:15:33,160|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:16:39,572|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:16:40,028|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:17:45,943|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:17:46,383|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:19:06,197|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:19:06,827|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:20:15,664|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:20:17,221|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:21:20,075|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:21:20,746|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:22:23,735|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:22:24,299|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:23:27,863|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:23:28,402|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:24:31,593|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:24:31,923|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:25:40,509|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:25:41,114|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:26:46,194|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:26:46,752|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:27:55,816|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:27:56,384|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:29:04,022|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:29:04,482|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:30:08,109|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:30:08,685|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:31:11,006|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:31:11,559|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:32:13,909|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:32:14,433|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:33:18,707|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:33:20,508|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:34:25,149|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:34:25,711|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:35:27,777|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:35:28,484|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:36:36,111|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:36:36,783|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:37:43,928|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:37:44,573|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:38:50,356|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:38:50,766|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:39:59,820|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:40:00,356|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:41:09,375|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:41:10,091|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:42:16,326|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:42:16,856|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:43:20,176|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:43:20,754|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:44:40,275|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:44:41,037|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:45:53,590|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:45:54,457|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:47:05,604|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:47:06,139|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:48:09,823|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:48:10,344|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:49:12,725|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:49:13,320|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:50:18,400|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:50:19,267|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:51:21,200|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:51:21,730|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:52:25,064|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:52:25,834|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:53:28,754|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:53:29,526|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:54:34,833|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:54:35,472|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:55:42,845|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:55:43,212|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:56:52,409|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:56:52,999|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:57:57,211|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:58:01,810|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 18:59:05,291|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 18:59:09,702|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:00:11,523|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:00:11,963|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:01:13,593|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:01:14,117|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:02:15,909|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:02:16,378|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:03:17,959|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:03:18,332|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:04:19,835|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:04:20,282|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:05:21,969|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:05:22,952|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:06:25,816|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:06:26,237|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:07:29,437|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:07:29,928|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:08:32,858|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:08:33,736|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:09:36,448|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:09:36,906|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:10:38,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:10:39,369|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:11:41,084|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:11:41,527|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:12:43,355|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:12:43,786|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:13:45,352|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:13:45,841|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:14:47,407|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:14:47,793|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:15:49,308|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:15:49,848|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:16:51,988|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:16:52,636|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:17:54,136|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:17:54,674|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:18:56,498|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:18:57,139|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:19:58,765|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:19:59,194|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:21:01,351|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:21:01,761|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:22:03,700|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:22:04,327|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:23:06,375|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:23:06,894|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:24:08,664|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:24:09,564|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:25:11,785|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:25:12,233|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:26:14,371|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:26:14,800|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:27:16,434|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:27:16,854|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:28:18,395|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:28:18,909|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:29:20,940|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:29:21,476|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:30:23,497|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:30:25,839|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:31:27,425|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:31:27,855|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:32:29,485|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:32:29,894|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:33:31,428|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:33:31,948|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:34:33,720|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:34:34,003|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:35:35,745|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:35:36,161|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:36:37,960|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:36:38,419|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:37:40,509|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:37:41,089|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:38:42,892|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:38:43,451|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:39:46,395|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:39:46,941|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:40:49,805|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:40:50,427|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:41:52,709|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:41:53,097|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:42:54,927|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:42:55,665|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:43:57,411|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:43:58,026|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:44:59,795|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:45:00,490|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:46:02,024|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:46:02,545|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:47:04,032|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:47:04,498|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:48:06,579|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:48:12,788|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:49:15,213|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:49:15,812|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:50:17,417|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:50:17,829|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:51:19,715|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:51:20,192|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:52:21,832|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:52:22,247|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:53:24,026|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:53:24,507|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:54:26,197|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:54:26,561|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:55:29,137|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:55:29,643|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:56:31,398|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:56:31,901|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:57:33,728|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:57:34,159|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:58:36,036|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:58:36,523|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 19:59:38,240|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 19:59:38,781|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 20:00:40,680|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 20:00:41,450|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 20:01:43,045|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 20:01:43,506|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 20:02:45,441|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 20:02:45,867|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 20:03:47,786|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 20:03:48,230|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is running (on backend cdse).\n", - "2024-02-21 20:04:49,726|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-21 20:04:57,657|openeo_gfmap.manager|DEBUG: Status of job j-240221b194a840ee8f3e9b710bbfb1f5 is finished (on backend cdse).\n", - "2024-02-21 20:04:57,659|openeo_gfmap.manager|INFO: Job j-240221b194a840ee8f3e9b710bbfb1f5 finished successfully, queueing on_job_done...\n", - "2024-02-21 20:04:57,662|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-21 20:05:02,462|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpyo00o4uv\n", - "2024-02-21 20:05:08,949|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:05:09,182|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:16,482|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:16,487|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmphvqjm2ob\n", - "2024-02-21 20:05:23,433|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:05:23,543|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:29,689|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:29,694|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpge2mgcve\n", - "2024-02-21 20:05:37,951|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:05:38,081|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:46,422|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:05:46,426|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp1c95wv6l\n", - "2024-02-21 20:05:53,327|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:05:53,556|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-02-21 20:06:00,362|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:00,366|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp4f46h51c\n", - "2024-02-21 20:06:06,935|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:06:07,040|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:13,189|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:13,195|openeo_gfmap.manager|DEBUG: Downloading asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpsgyzafff\n", - "2024-02-21 20:06:19,856|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:06:19,979|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:24,440|openeo_gfmap.manager|INFO: Downloaded asset openEO_5.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:24,444|openeo_gfmap.manager|DEBUG: Downloading asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmpgeqbn314\n", - "2024-02-21 20:06:31,421|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:06:31,624|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:39,130|openeo_gfmap.manager|INFO: Downloaded asset openEO_6.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:39,135|openeo_gfmap.manager|DEBUG: Downloading asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /tmp/tmp00of56z5\n", - "2024-02-21 20:06:46,039|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5...\n", - "/tmp/ipykernel_50885/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_50885/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-21 20:06:46,144|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:51,344|openeo_gfmap.manager|INFO: Downloaded asset openEO_7.nc from job j-240221b194a840ee8f3e9b710bbfb1f5 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-21 20:06:51,347|openeo_gfmap.manager|INFO: Job j-240221b194a840ee8f3e9b710bbfb1f5 and post job action finished successfully.\n" + "ename": "TypeError", + "evalue": "'NoneType' object is not subscriptable", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_jobs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mjob_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_datacube_s2\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtracking_job_csv\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/openeo/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py:288\u001b[0m, in \u001b[0;36mGFMAPJobManager.run_jobs\u001b[0;34m(self, df, start_job, output_file)\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads\u001b[38;5;241m.\u001b[39mappend(thread)\n\u001b[1;32m 287\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWorkers started, creating and running jobs.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 288\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_jobs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstart_job\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_file\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/openeo/openeo-python-client/openeo/extra/job_management.py:296\u001b[0m, in \u001b[0;36mMultiBackendJobManager.run_jobs\u001b[0;34m(self, df, start_job, output_file)\u001b[0m\n\u001b[1;32m 294\u001b[0m to_launch \u001b[38;5;241m=\u001b[39m df[df\u001b[38;5;241m.\u001b[39mstatus \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot_started\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39miloc[\u001b[38;5;241m0\u001b[39m:to_add]\n\u001b[1;32m 295\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m to_launch\u001b[38;5;241m.\u001b[39mindex:\n\u001b[0;32m--> 296\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_launch_job\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstart_job\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbackend_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_persists(df, output_file)\n\u001b[1;32m 299\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpoll_sleep)\n", + "File \u001b[0;32m~/openeo/openeo-python-client/openeo/extra/job_management.py:331\u001b[0m, in \u001b[0;36mMultiBackendJobManager._launch_job\u001b[0;34m(self, start_job, df, i, backend_name)\u001b[0m\n\u001b[1;32m 328\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStarting job on backend \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbackend_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrow\u001b[38;5;241m.\u001b[39mto_dict()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 329\u001b[0m connection \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_connection(backend_name, resilient\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 331\u001b[0m job \u001b[38;5;241m=\u001b[39m \u001b[43mstart_job\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 333\u001b[0m \u001b[43m \u001b[49m\u001b[43mconnection_provider\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_connection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 334\u001b[0m \u001b[43m \u001b[49m\u001b[43mconnection\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconnection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 335\u001b[0m \u001b[43m \u001b[49m\u001b[43mprovider\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbackend_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mConnectionError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 338\u001b[0m _log\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFailed to start job for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrow\u001b[38;5;241m.\u001b[39mto_dict()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", + "Cell \u001b[0;32mIn[5], line 53\u001b[0m, in \u001b[0;36mcreate_datacube_s2\u001b[0;34m(row, connection, provider, connection_provider)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;66;03m# Create the job to extract S2\u001b[39;00m\n\u001b[1;32m 50\u001b[0m extraction_parameters \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 51\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget_resolution\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m10\u001b[39m\n\u001b[1;32m 52\u001b[0m }\n\u001b[0;32m---> 53\u001b[0m extractor \u001b[38;5;241m=\u001b[39m \u001b[43mbuild_sentinel2_l2a_extractor\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43mbackend_context\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbands\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbands_to_download\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfetch_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfetch_type\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPOLYGON\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mextraction_parameters\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 55\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m cube \u001b[38;5;241m=\u001b[39m extractor\u001b[38;5;241m.\u001b[39mget_cube(connection, geometry, temporal_context)\n\u001b[1;32m 59\u001b[0m \u001b[38;5;66;03m# Get the h3index to use in the tile\u001b[39;00m\n", + "File \u001b[0;32m~/openeo/openeo-gfmap/src/openeo_gfmap/fetching/s2.py:207\u001b[0m, in \u001b[0;36mbuild_sentinel2_l2a_extractor\u001b[0;34m(backend_context, bands, fetch_type, **params)\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Creates a S2 L2A extractor adapted to the given backend.\"\"\"\u001b[39;00m\n\u001b[1;32m 204\u001b[0m backend_functions \u001b[38;5;241m=\u001b[39m SENTINEL2_L2A_BACKEND_MAP\u001b[38;5;241m.\u001b[39mget(backend_context\u001b[38;5;241m.\u001b[39mbackend)\n\u001b[1;32m 206\u001b[0m fetcher, preprocessor \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m--> 207\u001b[0m \u001b[43mbackend_functions\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfetch\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m(fetch_type\u001b[38;5;241m=\u001b[39mfetch_type),\n\u001b[1;32m 208\u001b[0m backend_functions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpreprocessor\u001b[39m\u001b[38;5;124m\"\u001b[39m](fetch_type\u001b[38;5;241m=\u001b[39mfetch_type),\n\u001b[1;32m 209\u001b[0m )\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m CollectionFetcher(backend_context, bands, fetcher, preprocessor, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n", + "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" ] } ], @@ -1623,7 +720,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 7243f7a..995af70 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -179,7 +179,7 @@ def on_job_done(self, job: BatchJob, row: pd.Series): # Move the temporary file to the final location shutil.move(temp_file.name, output_path) # Add to the list of downloaded products - job_products[asset.name] = [output_path] + job_products[f"{job.job_id}_{asset.name}"] = [output_path] _log.info( f"Downloaded asset {asset.name} from job {job.job_id} -> {output_path}" ) @@ -196,12 +196,12 @@ def on_job_done(self, job: BatchJob, row: pd.Series): job_metadata = pystac.Collection.from_dict(job.get_results().get_metadata()) for item_metadata in job_metadata.get_all_items(): item = pystac.read_file(item_metadata.get_self_href()) - asset_path = job_products[item.id][0] + asset_path = job_products[f"{job.job_id}_{item.id}"][0] assert len(item.assets.values()) == 1, "Each item should only contain one asset" for asset in item.assets.values(): asset.href = str(asset_path) # Update the asset href to the output location set by the output_path_generator - + item.id = f"{job.job_id}_{item.id}" # Add the item to the root_collection self._root_collection.add_item(item) From 9b7d853c5e0683d24277f1d9ab866dad636c873b Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Fri, 23 Feb 2024 12:00:46 +0100 Subject: [PATCH 10/24] formatting --- src/openeo_gfmap/manager/job_manager.py | 62 ++++++++++++++++--------- 1 file changed, 39 insertions(+), 23 deletions(-) diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 995af70..b15a080 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -1,17 +1,17 @@ import json -import pystac import queue import shutil import threading from enum import Enum from pathlib import Path -from pystac import CatalogType from tempfile import NamedTemporaryFile from typing import Callable, Optional, Union import pandas as pd +import pystac from openeo.extra.job_management import MultiBackendJobManager from openeo.rest.job import BatchJob +from pystac import CatalogType from openeo_gfmap.manager import _log @@ -55,9 +55,11 @@ def __init__( MultiBackendJobManager._normalize_df = self._normalize_df # Generate the root STAC collection - self._root_collection = pystac.Collection(id="Root collection", - description="Root collection of the feature extraction", - extent=None) #TODO: make the collection richer + self._root_collection = pystac.Collection( + id="Root collection", + description="Root collection of the feature extraction", + extent=None, + ) # TODO: make the collection richer def _post_job_worker(self): """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` @@ -191,20 +193,33 @@ def on_job_done(self, job: BatchJob, row: pd.Series): finally: shutil.rmtree(temp_file.name, ignore_errors=True) - # TODO: add try-except in the for loop to log all assets that were failed to be added to STAC collection. # First update the STAC collection with the assets directly resulting from the OpenEO batch job job_metadata = pystac.Collection.from_dict(job.get_results().get_metadata()) for item_metadata in job_metadata.get_all_items(): - item = pystac.read_file(item_metadata.get_self_href()) - asset_path = job_products[f"{job.job_id}_{item.id}"][0] - - assert len(item.assets.values()) == 1, "Each item should only contain one asset" - for asset in item.assets.values(): - asset.href = str(asset_path) # Update the asset href to the output location set by the output_path_generator - item.id = f"{job.job_id}_{item.id}" - # Add the item to the root_collection - self._root_collection.add_item(item) - + try: + item = pystac.read_file(item_metadata.get_self_href()) + asset_path = job_products[f"{job.job_id}_{item.id}"][0] + + assert ( + len(item.assets.values()) == 1 + ), "Each item should only contain one asset" + for asset in item.assets.values(): + asset.href = str( + asset_path + ) # Update the asset href to the output location set by the output_path_generator + item.id = f"{job.job_id}_{item.id}" + # Add the item to the root_collection + self._root_collection.add_item(item) + _log.info( + f"Added asset {asset.name} from job {job.job_id} to STAC collection" + ) + except Exception as e: + _log.exception( + f"Error failed to add asset {asset.name} from job {job.job_id} to STAC collection", + e, + ) + raise e + # TODO: post_job_action should return dict with Asset STAC metadata, then add that metadata to the correct STAC items # Call the post job action if self._post_job_action is not None: @@ -215,8 +230,6 @@ def on_job_done(self, job: BatchJob, row: pd.Series): self._downloaded_products.update(job_products) - - _log.info(f"Job {job.job_id} and post job action finished successfully.") def _normalize_df(self, df: pd.DataFrame) -> pd.DataFrame: @@ -286,12 +299,15 @@ def run_jobs( _log.info("Workers started, creating and running jobs.") super().run_jobs(df, start_job, output_file) - + # TODO: immediately make create_stac optional in 'run_jobs'? - def create_stac(self): + def create_stac(self, output_path: Optional[Union[str, Path]] = None): """Method to be called after run_jobs to create a STAC catalog - and write it to self._output_dir + and write it to self._output_dir """ + if output_path is None: + output_path = self._output_dir / "stac" + self._root_collection.update_extent_from_items() - self._root_collection.normalize_hrefs(str(self._output_dir / "stac")) - self._root_collection.save(catalog_type=CatalogType.SELF_CONTAINED) \ No newline at end of file + self._root_collection.normalize_hrefs(str(output_path)) + self._root_collection.save(catalog_type=CatalogType.SELF_CONTAINED) From 2c3c9f53a09a1aae593a2bd283fcbb2c492c6a99 Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Tue, 27 Feb 2024 16:47:33 +0100 Subject: [PATCH 11/24] enriched the STAC collection metadata #18 --- .../S2_extraction_example.ipynb | 241 +++++++++++----- src/openeo_gfmap/manager/job_manager.py | 21 +- src/openeo_gfmap/stac/__init__.py | 2 + src/openeo_gfmap/stac/constants.py | 259 ++++++++++++++++++ 4 files changed, 452 insertions(+), 71 deletions(-) create mode 100644 src/openeo_gfmap/stac/__init__.py create mode 100644 src/openeo_gfmap/stac/constants.py diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 158abf5..f10d82d 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -111,7 +111,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -146,7 +146,7 @@ " \n", " \n", " 0\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -155,7 +155,7 @@ " \n", " \n", " 1\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -164,7 +164,7 @@ " \n", " \n", " 2\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -173,7 +173,7 @@ " \n", " \n", " 3\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -182,7 +182,7 @@ " \n", " \n", " 4\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -200,7 +200,7 @@ " \n", " \n", " 88\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -209,7 +209,7 @@ " \n", " \n", " 89\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -218,7 +218,7 @@ " \n", " \n", " 90\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -227,7 +227,7 @@ " \n", " \n", " 91\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -236,7 +236,7 @@ " \n", " \n", " 92\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -249,18 +249,18 @@ "" ], "text/plain": [ - " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "4 cdse S2 .nc 2020-08-30 2022-03-03 \n", - ".. ... ... ... ... ... \n", - "88 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "89 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "90 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "91 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "92 cdse S2 .nc 2020-08-30 2022-03-03 \n", + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "1 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "2 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "3 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "4 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + ".. ... ... ... ... ... \n", + "88 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "89 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "90 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "91 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", + "92 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", "\n", " geometry \n", "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", @@ -278,7 +278,7 @@ "[93 rows x 6 columns]" ] }, - "execution_count": 3, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -306,14 +306,14 @@ "\n", " return pd.DataFrame(rows)\n", "\n", - "job_df = create_job_dataframe_s2(Backend.CDSE, split_jobs)\n", + "job_df = create_job_dataframe_s2(Backend.CDSE_STAGING, split_jobs)\n", "\n", "job_df" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -348,7 +348,7 @@ " \n", " \n", " 0\n", - " cdse\n", + " cdse-staging\n", " S2\n", " .nc\n", " 2020-08-30\n", @@ -360,14 +360,14 @@ "" ], "text/plain": [ - " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse-staging S2 .nc 2020-08-30 2022-03-03 \n", "\n", " geometry \n", "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... " ] }, - "execution_count": 4, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -391,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -482,15 +482,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 2.23 s, sys: 23.9 ms, total: 2.25 s\n", - "Wall time: 2.26 s\n" + "CPU times: user 2.25 s, sys: 13.8 ms, total: 2.27 s\n", + "Wall time: 2.27 s\n" ] } ], @@ -503,7 +503,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -571,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -641,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -667,43 +667,159 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-22 15:32:37,095|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", - "2024-02-22 15:32:37,098|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", - "2024-02-22 15:32:37,342|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + "2024-02-27 16:05:44,792|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-02-27 16:05:44,792|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-02-27 16:05:44,794|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-02-27 16:05:44,794|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-02-27 16:05:44,833|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", + " 'description', 'costs'],\n", + " dtype='object')\n", + "2024-02-27 16:05:44,833|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", " 'description', 'costs'],\n", " dtype='object')\n", - "2024-02-22 15:32:37,346|openeo_gfmap.manager|DEBUG: Updating status. 0 on 1 active jobs...\n" + "2024-02-27 16:05:44,836|openeo_gfmap.manager|DEBUG: Updating status. 0 on 1 active jobs...\n", + "2024-02-27 16:05:44,836|openeo_gfmap.manager|DEBUG: Updating status. 0 on 1 active jobs...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "Authenticated using refresh token.\n" + "Authenticated using refresh token.\n", + "DataCube()\n" ] }, { - "ename": "TypeError", - "evalue": "'NoneType' object is not subscriptable", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[10], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mmanager\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_jobs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mjob_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_datacube_s2\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtracking_job_csv\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/openeo/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py:288\u001b[0m, in \u001b[0;36mGFMAPJobManager.run_jobs\u001b[0;34m(self, df, start_job, output_file)\u001b[0m\n\u001b[1;32m 285\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_threads\u001b[38;5;241m.\u001b[39mappend(thread)\n\u001b[1;32m 287\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mWorkers started, creating and running jobs.\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m--> 288\u001b[0m \u001b[38;5;28;43msuper\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_jobs\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstart_job\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_file\u001b[49m\u001b[43m)\u001b[49m\n", - "File \u001b[0;32m~/openeo/openeo-python-client/openeo/extra/job_management.py:296\u001b[0m, in \u001b[0;36mMultiBackendJobManager.run_jobs\u001b[0;34m(self, df, start_job, output_file)\u001b[0m\n\u001b[1;32m 294\u001b[0m to_launch \u001b[38;5;241m=\u001b[39m df[df\u001b[38;5;241m.\u001b[39mstatus \u001b[38;5;241m==\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnot_started\u001b[39m\u001b[38;5;124m\"\u001b[39m]\u001b[38;5;241m.\u001b[39miloc[\u001b[38;5;241m0\u001b[39m:to_add]\n\u001b[1;32m 295\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m to_launch\u001b[38;5;241m.\u001b[39mindex:\n\u001b[0;32m--> 296\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_launch_job\u001b[49m\u001b[43m(\u001b[49m\u001b[43mstart_job\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbackend_name\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 297\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_persists(df, output_file)\n\u001b[1;32m 299\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mpoll_sleep)\n", - "File \u001b[0;32m~/openeo/openeo-python-client/openeo/extra/job_management.py:331\u001b[0m, in \u001b[0;36mMultiBackendJobManager._launch_job\u001b[0;34m(self, start_job, df, i, backend_name)\u001b[0m\n\u001b[1;32m 328\u001b[0m _log\u001b[38;5;241m.\u001b[39minfo(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mStarting job on backend \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mbackend_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrow\u001b[38;5;241m.\u001b[39mto_dict()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 329\u001b[0m connection \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_connection(backend_name, resilient\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 331\u001b[0m job \u001b[38;5;241m=\u001b[39m \u001b[43mstart_job\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 332\u001b[0m \u001b[43m \u001b[49m\u001b[43mrow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mrow\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 333\u001b[0m \u001b[43m \u001b[49m\u001b[43mconnection_provider\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_get_connection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 334\u001b[0m \u001b[43m \u001b[49m\u001b[43mconnection\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mconnection\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 335\u001b[0m \u001b[43m \u001b[49m\u001b[43mprovider\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbackend_name\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 336\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 337\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m requests\u001b[38;5;241m.\u001b[39mexceptions\u001b[38;5;241m.\u001b[39mConnectionError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[1;32m 338\u001b[0m _log\u001b[38;5;241m.\u001b[39mwarning(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mFailed to start job for \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mrow\u001b[38;5;241m.\u001b[39mto_dict()\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m, exc_info\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n", - "Cell \u001b[0;32mIn[5], line 53\u001b[0m, in \u001b[0;36mcreate_datacube_s2\u001b[0;34m(row, connection, provider, connection_provider)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[38;5;66;03m# Create the job to extract S2\u001b[39;00m\n\u001b[1;32m 50\u001b[0m extraction_parameters \u001b[38;5;241m=\u001b[39m {\n\u001b[1;32m 51\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtarget_resolution\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;241m10\u001b[39m\n\u001b[1;32m 52\u001b[0m }\n\u001b[0;32m---> 53\u001b[0m extractor \u001b[38;5;241m=\u001b[39m \u001b[43mbuild_sentinel2_l2a_extractor\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 54\u001b[0m \u001b[43m \u001b[49m\u001b[43mbackend_context\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mbands\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mbands_to_download\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mfetch_type\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mfetch_type\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mPOLYGON\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mextraction_parameters\u001b[49m\u001b[43m \u001b[49m\n\u001b[1;32m 55\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 57\u001b[0m cube \u001b[38;5;241m=\u001b[39m extractor\u001b[38;5;241m.\u001b[39mget_cube(connection, geometry, temporal_context)\n\u001b[1;32m 59\u001b[0m \u001b[38;5;66;03m# Get the h3index to use in the tile\u001b[39;00m\n", - "File \u001b[0;32m~/openeo/openeo-gfmap/src/openeo_gfmap/fetching/s2.py:207\u001b[0m, in \u001b[0;36mbuild_sentinel2_l2a_extractor\u001b[0;34m(backend_context, bands, fetch_type, **params)\u001b[0m\n\u001b[1;32m 203\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Creates a S2 L2A extractor adapted to the given backend.\"\"\"\u001b[39;00m\n\u001b[1;32m 204\u001b[0m backend_functions \u001b[38;5;241m=\u001b[39m SENTINEL2_L2A_BACKEND_MAP\u001b[38;5;241m.\u001b[39mget(backend_context\u001b[38;5;241m.\u001b[39mbackend)\n\u001b[1;32m 206\u001b[0m fetcher, preprocessor \u001b[38;5;241m=\u001b[39m (\n\u001b[0;32m--> 207\u001b[0m \u001b[43mbackend_functions\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mfetch\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m]\u001b[49m(fetch_type\u001b[38;5;241m=\u001b[39mfetch_type),\n\u001b[1;32m 208\u001b[0m backend_functions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mpreprocessor\u001b[39m\u001b[38;5;124m\"\u001b[39m](fetch_type\u001b[38;5;241m=\u001b[39mfetch_type),\n\u001b[1;32m 209\u001b[0m )\n\u001b[1;32m 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m CollectionFetcher(backend_context, bands, fetcher, preprocessor, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mparams)\n", - "\u001b[0;31mTypeError\u001b[0m: 'NoneType' object is not subscriptable" + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-02-27 16:07:07,061|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:07:07,061|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:07:07,428|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:07:07,428|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:08:07,667|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:08:07,667|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:08:08,026|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:08:08,026|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:09:08,250|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:09:08,250|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:09:08,471|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:09:08,471|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:10:08,771|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:10:08,771|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:10:29,051|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:10:29,051|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:11:29,268|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:11:29,268|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:11:29,712|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:11:29,712|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:12:29,938|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:12:29,938|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:12:31,014|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:12:31,014|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:13:31,205|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:13:31,205|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:13:32,004|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:13:32,004|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:14:32,246|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:14:32,246|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:14:34,205|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:14:34,205|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:15:34,551|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:15:34,551|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:15:35,131|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:15:35,131|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is running (on backend cdse-staging).\n", + "2024-02-27 16:16:35,369|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:16:35,369|openeo_gfmap.manager|DEBUG: Updating status. 1 on 1 active jobs...\n", + "2024-02-27 16:16:35,931|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is finished (on backend cdse-staging).\n", + "2024-02-27 16:16:35,931|openeo_gfmap.manager|DEBUG: Status of job j-2402271caa2647f79d54a51caddf1388 is finished (on backend cdse-staging).\n", + "2024-02-27 16:16:35,933|openeo_gfmap.manager|INFO: Job j-2402271caa2647f79d54a51caddf1388 finished successfully, queueing on_job_done...\n", + "2024-02-27 16:16:35,933|openeo_gfmap.manager|INFO: Job j-2402271caa2647f79d54a51caddf1388 finished successfully, queueing on_job_done...\n", + "2024-02-27 16:16:35,937|openeo_gfmap.manager|DEBUG: Worker thread Thread-7: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-27 16:16:35,937|openeo_gfmap.manager|DEBUG: Worker thread Thread-7: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-02-27 16:16:37,248|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmptvay9e8n\n", + "2024-02-27 16:16:37,248|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmptvay9e8n\n", + "2024-02-27 16:16:50,232|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "2024-02-27 16:16:50,232|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "/tmp/ipykernel_40766/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_40766/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-27 16:16:50,617|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:16:50,617|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:16:52,422|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:16:52,422|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:16:52,428|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmplpt96uvh\n", + "2024-02-27 16:16:52,428|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmplpt96uvh\n", + "2024-02-27 16:17:06,168|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "2024-02-27 16:17:06,168|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "/tmp/ipykernel_40766/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_40766/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-27 16:17:06,235|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:06,235|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:07,647|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:07,647|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:07,653|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmpgty_rrsp\n", + "2024-02-27 16:17:07,653|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /tmp/tmpgty_rrsp\n", + "2024-02-27 16:17:18,496|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "2024-02-27 16:17:18,496|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388...\n", + "/tmp/ipykernel_40766/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + "/home/vverelst/anaconda3/envs/openeo-dev/lib/python3.9/site-packages/geopandas/geodataframe.py:1525: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_40766/1596858655.py:33: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-02-27 16:17:18,547|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:18,547|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:19,835|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:19,835|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 -> /data/users/Public/vincent.verelst/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-02-27 16:17:25,452|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:25,452|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_0.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:27,674|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:27,674|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_1.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:30,851|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:30,851|openeo_gfmap.manager|INFO: Added item j-2402271caa2647f79d54a51caddf1388_openEO_2.nc from job j-2402271caa2647f79d54a51caddf1388 to STAC collection\n", + "2024-02-27 16:17:30,856|openeo_gfmap.manager|INFO: Job j-2402271caa2647f79d54a51caddf1388 and post job action finished successfully.\n", + "2024-02-27 16:17:30,856|openeo_gfmap.manager|INFO: Job j-2402271caa2647f79d54a51caddf1388 and post job action finished successfully.\n" ] } ], @@ -720,19 +836,12 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "manager.create_stac()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index b15a080..ef6d9a7 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -14,6 +14,7 @@ from pystac import CatalogType from openeo_gfmap.manager import _log +from openeo_gfmap.stac import constants class PostJobStatus(Enum): @@ -56,10 +57,10 @@ def __init__( # Generate the root STAC collection self._root_collection = pystac.Collection( - id="Root collection", - description="Root collection of the feature extraction", + id=constants.ID, + description=constants.DESCRIPTION, extent=None, - ) # TODO: make the collection richer + ) def _post_job_worker(self): """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` @@ -211,11 +212,11 @@ def on_job_done(self, job: BatchJob, row: pd.Series): # Add the item to the root_collection self._root_collection.add_item(item) _log.info( - f"Added asset {asset.name} from job {job.job_id} to STAC collection" + f"Added item {item.id} from job {job.job_id} to STAC collection" ) except Exception as e: _log.exception( - f"Error failed to add asset {asset.name} from job {job.job_id} to STAC collection", + f"Error failed to add item {item.id} from job {job.job_id} to STAC collection", e, ) raise e @@ -307,6 +308,16 @@ def create_stac(self, output_path: Optional[Union[str, Path]] = None): """ if output_path is None: output_path = self._output_dir / "stac" + + self._root_collection.license = constants.LICENSE + self._root_collection.add_link(constants.LICENSE_LINK) + self._root_collection.stac_extensions = constants.STAC_EXTENSIONS + + datacube_extension = pystac.extensions.datacube.DatacubeExtension.ext(self._root_collection, add_if_missing=True) + datacube_extension.apply(constants.CUBE_DIMENSIONS) + + item_asset_extension = pystac.extensions.item_assets.ItemAssetsExtension.ext(self._root_collection, add_if_missing=True) + item_asset_extension.item_assets = constants.ITEM_ASSETS self._root_collection.update_extent_from_items() self._root_collection.normalize_hrefs(str(output_path)) diff --git a/src/openeo_gfmap/stac/__init__.py b/src/openeo_gfmap/stac/__init__.py new file mode 100644 index 0000000..5269453 --- /dev/null +++ b/src/openeo_gfmap/stac/__init__.py @@ -0,0 +1,2 @@ +"""Definitions of the constants in the STAC collection +""" diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py new file mode 100644 index 0000000..864736d --- /dev/null +++ b/src/openeo_gfmap/stac/constants.py @@ -0,0 +1,259 @@ +""" +Constants in the STAC collection generated after a series of batch jobs +""" +import pystac + +TITLE = "WorldCereal Level 1 cache" +ID = "L1-CACHE" +DESCRIPTION = "The Level 1 input data cache contains extracted samples of EO data. It's main use is model calibration, allowing faster iterations by providing a cache." +LICENSE = "CC-BY-4.0" +LICENSE_LINK = pystac.Link( + rel="license", + target="https://spdx.org/licenses/CC-BY-4.0.html", + media_type=pystac.MediaType.HTML, + title="Creative Commons Attribution 4.0 International License", +) +STAC_EXTENSIONS = [ + "https://stac-extensions.github.io/eo/v1.1.0/schema.json", + "https://stac-extensions.github.io/file/v2.1.0/schema.json", + "https://stac-extensions.github.io/processing/v1.1.0/schema.json", + "https://stac-extensions.github.io/projection/v1.1.0/schema.json" + ] +CONSTELLATION = ["sentinel-2"] +PLATFORM = ["sentinel-2a", "sentinel-2b"] +INSTRUMENTS = ["msi"] +GSD = [10, 20, 60] +SUMMARIES = pystac.Summaries( + { + "constellation": CONSTELLATION, + "platform": PLATFORM, + "instruments": INSTRUMENTS, + "gsd": GSD, + } +) + + +def create_spatial_dimension(name: str) -> pystac.extensions.datacube.HorizontalSpatialDimension: + return pystac.extensions.datacube.HorizontalSpatialDimension( +{ + "axis": name, + "step": 10, + "reference_system": { + "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json", + "area": "World", + "bbox": { + "east_longitude": 180, + "north_latitude": 90, + "south_latitude": -90, + "west_longitude": -180 + }, + "coordinate_system": { + "axis": [ + { + "abbreviation": "Lat", + "direction": "north", + "name": "Geodetic latitude", + "unit": "degree" + }, + { + "abbreviation": "Lon", + "direction": "east", + "name": "Geodetic longitude", + "unit": "degree" + } + ], + "subtype": "ellipsoidal" + }, + "datum": { + "ellipsoid": { + "inverse_flattening": 298.257223563, + "name": "WGS 84", + "semi_major_axis": 6378137 + }, + "name": "World Geodetic System 1984", + "type": "GeodeticReferenceFrame" + }, + "id": { + "authority": "OGC", + "code": "Auto42001", + "version": "1.3" + }, + "name": "AUTO 42001 (Universal Transverse Mercator)", + "type": "GeodeticCRS" + } + } +) +TEMPORAL_DIMENSION = pystac.extensions.datacube.TemporalDimension( + {'extent': ["2015-06-23T00:00:00Z", "2019-07-10T13:44:56Z"], + 'step':"P5D"} +) + +BANDS_DIMENSION = pystac.extensions.datacube.AdditionalDimension( + {'values':[ + "SCL", + "B01", + "B02", + "B03", + "B04", + "B05", + "B06", + "B07", + "B08", + "B8A", + "B09", + "B10", + "B11", + "B12", + "CROPTYPE" + ] + } +) + +CUBE_DIMENSIONS = { + "x": create_spatial_dimension("x"), + "y": create_spatial_dimension("y"), + "time": TEMPORAL_DIMENSION, + "spectral": BANDS_DIMENSION +} + +SENTINEL2 = pystac.extensions.item_assets.AssetDefinition( + { + "gsd": 10, + "title": "Sentinel2", + "description": "Sentinel-2 bands", + "type": "application/x-netcdf", + "roles": [ + "data" + ], + "proj:shape": [ + 64, + 64 + ], + "raster:bands": [ + { + "name": "B01" + }, + { + "name": "B02" + } + ], + "cube:variables": { + "B01": {"dimensions": ["time","y","x"],"type": "data"}, + "B02": {"dimensions": ["time","y","x"],"type": "data"}, + "B03": {"dimensions": ["time","y","x"],"type": "data"}, + "B04": {"dimensions": ["time","y","x"],"type": "data"}, + "B05": {"dimensions": ["time","y","x"],"type": "data"}, + "B06": {"dimensions": ["time","y","x"],"type": "data"}, + "B07": {"dimensions": ["time","y","x"],"type": "data"}, + "B8A": {"dimensions": ["time","y","x"],"type": "data"}, + "B08": {"dimensions": ["time","y","x"],"type": "data"}, + "B11": {"dimensions": ["time","y","x"],"type": "data"}, + "B12": {"dimensions": ["time","y","x"],"type": "data"}, + "SCL": {"dimensions": ["time","y","x"],"type": "data"} + }, + "eo:bands": [ + { + "name": "B01", + "common_name": "coastal", + "center_wavelength": 0.443, + "full_width_half_max": 0.027 + }, + { + "name": "B02", + "common_name": "blue", + "center_wavelength": 0.49, + "full_width_half_max": 0.098 + }, + { + "name": "B03", + "common_name": "green", + "center_wavelength": 0.56, + "full_width_half_max": 0.045 + }, + { + "name": "B04", + "common_name": "red", + "center_wavelength": 0.665, + "full_width_half_max": 0.038 + }, + { + "name": "B05", + "common_name": "rededge", + "center_wavelength": 0.704, + "full_width_half_max": 0.019 + }, + { + "name": "B06", + "common_name": "rededge", + "center_wavelength": 0.74, + "full_width_half_max": 0.018 + }, + { + "name": "B07", + "common_name": "rededge", + "center_wavelength": 0.783, + "full_width_half_max": 0.028 + }, + { + "name": "B08", + "common_name": "nir", + "center_wavelength": 0.842, + "full_width_half_max": 0.145 + }, + { + "name": "B8A", + "common_name": "nir08", + "center_wavelength": 0.865, + "full_width_half_max": 0.033 + }, + { + "name": "B11", + "common_name": "swir16", + "center_wavelength": 1.61, + "full_width_half_max": 0.143 + }, + { + "name": "B12", + "common_name": "swir22", + "center_wavelength": 2.19, + "full_width_half_max": 0.242 + } + ] + } +) + +AUXILIARY = pystac.extensions.item_assets.AssetDefinition( + { + "title": "ground truth data", + "description": "This asset contains the crop type codes.", + "type": "application/x-netcdf", + "roles": [ + "data" + ], + "proj:shape": [ + 64, + 64 + ], + "raster:bands": [ + { + "name": "CROPTYPE", + "data_type": "uint16", + "bits_per_sample": 16 + } + ] + } +) + +SENTINEL1 = pystac.extensions.item_assets.AssetDefinition( + {} +) + +AGERA5 = pystac.extensions.item_assets.AssetDefinition( + {} +) +ITEM_ASSETS = { + "sentinel2": SENTINEL2, + "auxiliary": AUXILIARY, + "sentinel1": SENTINEL1, + "agera5": AGERA5 +} \ No newline at end of file From fd050b5596820ef97a099e12b20909c72d34bf71 Mon Sep 17 00:00:00 2001 From: Vincent Verelst Date: Tue, 27 Feb 2024 16:49:25 +0100 Subject: [PATCH 12/24] formatting --- src/openeo_gfmap/manager/job_manager.py | 12 +- src/openeo_gfmap/stac/constants.py | 365 +++++++++++------------- 2 files changed, 178 insertions(+), 199 deletions(-) diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index ef6d9a7..5ad0215 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -308,15 +308,19 @@ def create_stac(self, output_path: Optional[Union[str, Path]] = None): """ if output_path is None: output_path = self._output_dir / "stac" - + self._root_collection.license = constants.LICENSE self._root_collection.add_link(constants.LICENSE_LINK) self._root_collection.stac_extensions = constants.STAC_EXTENSIONS - - datacube_extension = pystac.extensions.datacube.DatacubeExtension.ext(self._root_collection, add_if_missing=True) + + datacube_extension = pystac.extensions.datacube.DatacubeExtension.ext( + self._root_collection, add_if_missing=True + ) datacube_extension.apply(constants.CUBE_DIMENSIONS) - item_asset_extension = pystac.extensions.item_assets.ItemAssetsExtension.ext(self._root_collection, add_if_missing=True) + item_asset_extension = pystac.extensions.item_assets.ItemAssetsExtension.ext( + self._root_collection, add_if_missing=True + ) item_asset_extension.item_assets = constants.ITEM_ASSETS self._root_collection.update_extent_from_items() diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index 864736d..204e5c8 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -17,8 +17,8 @@ "https://stac-extensions.github.io/eo/v1.1.0/schema.json", "https://stac-extensions.github.io/file/v2.1.0/schema.json", "https://stac-extensions.github.io/processing/v1.1.0/schema.json", - "https://stac-extensions.github.io/projection/v1.1.0/schema.json" - ] + "https://stac-extensions.github.io/projection/v1.1.0/schema.json", +] CONSTELLATION = ["sentinel-2"] PLATFORM = ["sentinel-2a", "sentinel-2b"] INSTRUMENTS = ["msi"] @@ -33,79 +33,79 @@ ) -def create_spatial_dimension(name: str) -> pystac.extensions.datacube.HorizontalSpatialDimension: +def create_spatial_dimension( + name: str, +) -> pystac.extensions.datacube.HorizontalSpatialDimension: return pystac.extensions.datacube.HorizontalSpatialDimension( -{ - "axis": name, - "step": 10, - "reference_system": { - "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json", - "area": "World", - "bbox": { - "east_longitude": 180, - "north_latitude": 90, - "south_latitude": -90, - "west_longitude": -180 - }, - "coordinate_system": { - "axis": [ - { - "abbreviation": "Lat", - "direction": "north", - "name": "Geodetic latitude", - "unit": "degree" + { + "axis": name, + "step": 10, + "reference_system": { + "$schema": "https://proj.org/schemas/v0.2/projjson.schema.json", + "area": "World", + "bbox": { + "east_longitude": 180, + "north_latitude": 90, + "south_latitude": -90, + "west_longitude": -180, + }, + "coordinate_system": { + "axis": [ + { + "abbreviation": "Lat", + "direction": "north", + "name": "Geodetic latitude", + "unit": "degree", + }, + { + "abbreviation": "Lon", + "direction": "east", + "name": "Geodetic longitude", + "unit": "degree", + }, + ], + "subtype": "ellipsoidal", + }, + "datum": { + "ellipsoid": { + "inverse_flattening": 298.257223563, + "name": "WGS 84", + "semi_major_axis": 6378137, + }, + "name": "World Geodetic System 1984", + "type": "GeodeticReferenceFrame", + }, + "id": {"authority": "OGC", "code": "Auto42001", "version": "1.3"}, + "name": "AUTO 42001 (Universal Transverse Mercator)", + "type": "GeodeticCRS", }, - { - "abbreviation": "Lon", - "direction": "east", - "name": "Geodetic longitude", - "unit": "degree" - } - ], - "subtype": "ellipsoidal" - }, - "datum": { - "ellipsoid": { - "inverse_flattening": 298.257223563, - "name": "WGS 84", - "semi_major_axis": 6378137 - }, - "name": "World Geodetic System 1984", - "type": "GeodeticReferenceFrame" - }, - "id": { - "authority": "OGC", - "code": "Auto42001", - "version": "1.3" - }, - "name": "AUTO 42001 (Universal Transverse Mercator)", - "type": "GeodeticCRS" - } - } -) + } + ) + + TEMPORAL_DIMENSION = pystac.extensions.datacube.TemporalDimension( - {'extent': ["2015-06-23T00:00:00Z", "2019-07-10T13:44:56Z"], - 'step':"P5D"} + {"extent": ["2015-06-23T00:00:00Z", "2019-07-10T13:44:56Z"], "step": "P5D"} ) BANDS_DIMENSION = pystac.extensions.datacube.AdditionalDimension( - {'values':[ - "SCL", - "B01", - "B02", - "B03", - "B04", - "B05", - "B06", - "B07", - "B08", - "B8A", - "B09", - "B10", - "B11", - "B12", - "CROPTYPE" - ] + { + "values": [ + "SCL", + "B01", + "B02", + "B03", + "B04", + "B05", + "B06", + "B07", + "B08", + "B8A", + "B09", + "B10", + "B11", + "B12", + "CROPTYPE", + ] } ) @@ -113,147 +113,122 @@ def create_spatial_dimension(name: str) -> pystac.extensions.datacube.Horizontal "x": create_spatial_dimension("x"), "y": create_spatial_dimension("y"), "time": TEMPORAL_DIMENSION, - "spectral": BANDS_DIMENSION + "spectral": BANDS_DIMENSION, } SENTINEL2 = pystac.extensions.item_assets.AssetDefinition( { - "gsd": 10, - "title": "Sentinel2", - "description": "Sentinel-2 bands", - "type": "application/x-netcdf", - "roles": [ - "data" - ], - "proj:shape": [ - 64, - 64 - ], - "raster:bands": [ - { - "name": "B01" + "gsd": 10, + "title": "Sentinel2", + "description": "Sentinel-2 bands", + "type": "application/x-netcdf", + "roles": ["data"], + "proj:shape": [64, 64], + "raster:bands": [{"name": "B01"}, {"name": "B02"}], + "cube:variables": { + "B01": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B02": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B03": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B04": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B05": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B06": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B07": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B8A": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B08": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B11": {"dimensions": ["time", "y", "x"], "type": "data"}, + "B12": {"dimensions": ["time", "y", "x"], "type": "data"}, + "SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, }, - { - "name": "B02" - } - ], - "cube:variables": { - "B01": {"dimensions": ["time","y","x"],"type": "data"}, - "B02": {"dimensions": ["time","y","x"],"type": "data"}, - "B03": {"dimensions": ["time","y","x"],"type": "data"}, - "B04": {"dimensions": ["time","y","x"],"type": "data"}, - "B05": {"dimensions": ["time","y","x"],"type": "data"}, - "B06": {"dimensions": ["time","y","x"],"type": "data"}, - "B07": {"dimensions": ["time","y","x"],"type": "data"}, - "B8A": {"dimensions": ["time","y","x"],"type": "data"}, - "B08": {"dimensions": ["time","y","x"],"type": "data"}, - "B11": {"dimensions": ["time","y","x"],"type": "data"}, - "B12": {"dimensions": ["time","y","x"],"type": "data"}, - "SCL": {"dimensions": ["time","y","x"],"type": "data"} - }, - "eo:bands": [ - { - "name": "B01", - "common_name": "coastal", - "center_wavelength": 0.443, - "full_width_half_max": 0.027 - }, - { - "name": "B02", - "common_name": "blue", - "center_wavelength": 0.49, - "full_width_half_max": 0.098 - }, - { - "name": "B03", - "common_name": "green", - "center_wavelength": 0.56, - "full_width_half_max": 0.045 - }, - { - "name": "B04", - "common_name": "red", - "center_wavelength": 0.665, - "full_width_half_max": 0.038 - }, - { - "name": "B05", - "common_name": "rededge", - "center_wavelength": 0.704, - "full_width_half_max": 0.019 - }, - { - "name": "B06", - "common_name": "rededge", - "center_wavelength": 0.74, - "full_width_half_max": 0.018 - }, - { - "name": "B07", - "common_name": "rededge", - "center_wavelength": 0.783, - "full_width_half_max": 0.028 - }, - { - "name": "B08", - "common_name": "nir", - "center_wavelength": 0.842, - "full_width_half_max": 0.145 - }, - { - "name": "B8A", - "common_name": "nir08", - "center_wavelength": 0.865, - "full_width_half_max": 0.033 - }, - { - "name": "B11", - "common_name": "swir16", - "center_wavelength": 1.61, - "full_width_half_max": 0.143 - }, - { - "name": "B12", - "common_name": "swir22", - "center_wavelength": 2.19, - "full_width_half_max": 0.242 - } - ] + "eo:bands": [ + { + "name": "B01", + "common_name": "coastal", + "center_wavelength": 0.443, + "full_width_half_max": 0.027, + }, + { + "name": "B02", + "common_name": "blue", + "center_wavelength": 0.49, + "full_width_half_max": 0.098, + }, + { + "name": "B03", + "common_name": "green", + "center_wavelength": 0.56, + "full_width_half_max": 0.045, + }, + { + "name": "B04", + "common_name": "red", + "center_wavelength": 0.665, + "full_width_half_max": 0.038, + }, + { + "name": "B05", + "common_name": "rededge", + "center_wavelength": 0.704, + "full_width_half_max": 0.019, + }, + { + "name": "B06", + "common_name": "rededge", + "center_wavelength": 0.74, + "full_width_half_max": 0.018, + }, + { + "name": "B07", + "common_name": "rededge", + "center_wavelength": 0.783, + "full_width_half_max": 0.028, + }, + { + "name": "B08", + "common_name": "nir", + "center_wavelength": 0.842, + "full_width_half_max": 0.145, + }, + { + "name": "B8A", + "common_name": "nir08", + "center_wavelength": 0.865, + "full_width_half_max": 0.033, + }, + { + "name": "B11", + "common_name": "swir16", + "center_wavelength": 1.61, + "full_width_half_max": 0.143, + }, + { + "name": "B12", + "common_name": "swir22", + "center_wavelength": 2.19, + "full_width_half_max": 0.242, + }, + ], } ) AUXILIARY = pystac.extensions.item_assets.AssetDefinition( { - "title": "ground truth data", - "description": "This asset contains the crop type codes.", - "type": "application/x-netcdf", - "roles": [ - "data" - ], - "proj:shape": [ - 64, - 64 - ], - "raster:bands": [ - { - "name": "CROPTYPE", - "data_type": "uint16", - "bits_per_sample": 16 - } - ] + "title": "ground truth data", + "description": "This asset contains the crop type codes.", + "type": "application/x-netcdf", + "roles": ["data"], + "proj:shape": [64, 64], + "raster:bands": [ + {"name": "CROPTYPE", "data_type": "uint16", "bits_per_sample": 16} + ], } ) -SENTINEL1 = pystac.extensions.item_assets.AssetDefinition( - {} -) +SENTINEL1 = pystac.extensions.item_assets.AssetDefinition({}) -AGERA5 = pystac.extensions.item_assets.AssetDefinition( - {} -) +AGERA5 = pystac.extensions.item_assets.AssetDefinition({}) ITEM_ASSETS = { "sentinel2": SENTINEL2, "auxiliary": AUXILIARY, "sentinel1": SENTINEL1, - "agera5": AGERA5 -} \ No newline at end of file + "agera5": AGERA5, +} From 3dab8b40e8e7ac13b48d58387f0faeff4aa61393 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 4 Mar 2024 13:39:41 +0100 Subject: [PATCH 13/24] Mulitple fixes on the pipeline --- .../S2_extraction_example.ipynb | 1887 +++++++++++++---- src/openeo_gfmap/fetching/commons.py | 25 +- src/openeo_gfmap/manager/job_manager.py | 3 +- src/openeo_gfmap/spatial.py | 2 +- 4 files changed, 1465 insertions(+), 452 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 934a84a..49fc86d 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -68,9 +68,133 @@ "name": "stdout", "output_type": "stream", "text": [ - "137 jobs before filtering empty one (no extraction)\n", - "93 jobs after filtering empty one (no extraction)\n" + "334 jobs before filtering empty one (no extraction)\n", + "236 jobs after filtering empty one (no extraction)\n" ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
sample_idlandcover_labelcroptype_labelirrigation_labelconfidenceextractvalid_dateref_idgeometry
02021_LV_LPIS_POLY_110-125531701115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((22.64240 57.42064, 22.64241 57...
1at2021lpis2076941115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((15.87727 48.72497, 15.87735 48...
22021_LV_LPIS_POLY_110-127658891115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((27.14266 56.73090, 27.14278 56...
32021_LV_LPIS_POLY_110-125586901115200NoneTrue2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((25.47958 57.88641, 25.47956 57...
4at2021lpis7786551115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((14.72080 48.40937, 14.72020 48...
\n", + "
" + ], + "text/plain": [ + " sample_id landcover_label croptype_label \\\n", + "0 2021_LV_LPIS_POLY_110-12553170 11 1520 \n", + "1 at2021lpis207694 11 1520 \n", + "2 2021_LV_LPIS_POLY_110-12765889 11 1520 \n", + "3 2021_LV_LPIS_POLY_110-12558690 11 1520 \n", + "4 at2021lpis778655 11 1520 \n", + "\n", + " irrigation_label confidence extract valid_date ref_id \\\n", + "0 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", + "1 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", + "2 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", + "3 0 None True 2021-06-01 2021_EUR_DEMO_POLY_110 \n", + "4 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", + "\n", + " geometry \n", + "0 MULTIPOLYGON (((22.64240 57.42064, 22.64241 57... \n", + "1 MULTIPOLYGON (((15.87727 48.72497, 15.87735 48... \n", + "2 MULTIPOLYGON (((27.14266 56.73090, 27.14278 56... \n", + "3 MULTIPOLYGON (((25.47958 57.88641, 25.47956 57... \n", + "4 MULTIPOLYGON (((14.72080 48.40937, 14.72020 48... " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -82,7 +206,7 @@ "base_df = gpd.read_file(base_df_path)\n", "# Splits the job using GFMAP\n", "split_jobs = split_job_hex(\n", - " base_df, max_points=500, grid_resolution=4\n", + " base_df, max_points=60, grid_resolution=4\n", ")\n", "\n", "print(f'{len(split_jobs)} jobs before filtering empty one (no extraction)')\n", @@ -91,7 +215,9 @@ "split_jobs = [\n", " job for job in split_jobs if job.extract.any()\n", "]\n", - "print(f'{len(split_jobs)} jobs after filtering empty one (no extraction)')\n" + "print(f'{len(split_jobs)} jobs after filtering empty one (no extraction)')\n", + "\n", + "base_df.head()\n" ] }, { @@ -147,7 +273,7 @@ " \n", " 0\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -156,7 +282,7 @@ " \n", " 1\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -165,7 +291,7 @@ " \n", " 2\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -174,7 +300,7 @@ " \n", " 3\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -183,7 +309,7 @@ " \n", " 4\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -199,45 +325,45 @@ " ...\n", " \n", " \n", - " 88\n", + " 231\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", " \n", " \n", - " 89\n", + " 232\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", " \n", " \n", - " 90\n", + " 233\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", " \n", " \n", - " 91\n", + " 234\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", " \n", " \n", - " 92\n", + " 235\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -245,37 +371,37 @@ " \n", " \n", "\n", - "

93 rows × 6 columns

\n", + "

236 rows × 6 columns

\n", "" ], "text/plain": [ - " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "4 cdse S2 .nc 2020-08-30 2022-03-03 \n", - ".. ... ... ... ... ... \n", - "88 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "89 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "90 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "91 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "92 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "\n", - " geometry \n", - "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "4 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - ".. ... \n", - "88 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "89 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "90 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "91 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "92 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "\n", - "[93 rows x 6 columns]" + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "1 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "2 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "4 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + ".. ... ... ... ... ... \n", + "231 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "232 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "233 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "234 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "235 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "\n", + " geometry \n", + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "4 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + ".. ... \n", + "231 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "232 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "233 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "234 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "235 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", + "\n", + "[236 rows x 6 columns]" ] }, "execution_count": 3, @@ -300,7 +426,7 @@ " \n", " rows.append(\n", " pd.Series(\n", - " dict(zip(columns, [backend.value, 'S2', '.nc', start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d'), job.to_json()]))\n", + " dict(zip(columns, [backend.value, 'S2_10m', '.nc', start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d'), job.to_json()]))\n", " )\n", " )\n", "\n", @@ -349,7 +475,7 @@ " \n", " 0\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -358,7 +484,7 @@ " \n", " 1\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -367,7 +493,7 @@ " \n", " 2\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -376,7 +502,7 @@ " \n", " 3\n", " cdse\n", - " S2\n", + " S2_10m\n", " .nc\n", " 2020-08-30\n", " 2022-03-03\n", @@ -388,10 +514,10 @@ ], "text/plain": [ " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2 .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2 .nc 2020-08-30 2022-03-03 \n", + "0 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "1 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "2 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", "\n", " geometry \n", "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", @@ -411,6 +537,116 @@ "job_df" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
backend_nameout_prefixout_extensionstart_dateend_dategeometrynb_polygons
0cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...50
1cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...60
2cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...20
3cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...38
\n", + "
" + ], + "text/plain": [ + " backend_name out_prefix out_extension start_date end_date \\\n", + "0 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "1 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "2 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", + "\n", + " geometry nb_polygons \n", + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 50 \n", + "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 60 \n", + "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 20 \n", + "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 38 " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import geojson\n", + "\n", + "def get_job_nb_polygons(row: pd.Series) -> int:\n", + " \"\"\"Get the number of polygons in the geometry.\"\"\"\n", + " return len(filter(lambda feat: feat.properties.get(\"extract\"), geojson.loads(row.geometry)['features']))\n", + "\n", + "job_df['nb_polygons'] = job_df.apply(get_job_nb_polygons, axis=1)\n", + "job_df" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -424,30 +660,57 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import openeo\n", "\n", + "import requests\n", + "from tempfile import NamedTemporaryFile\n", + "import os\n", "import pandas as pd\n", "import geojson\n", + "from shapely.geometry import Point\n", "\n", - "from openeo_gfmap import TemporalContext, Backend, BackendContext, FetchType\n", + "from openeo_gfmap import TemporalContext, Backend, BackendContext, FetchType, SpatialContext\n", "from openeo_gfmap.fetching import build_sentinel2_l2a_extractor\n", "\n", + "def upload_geoparquet_artifactory(gdf: gpd.GeoDataFrame, row_id: int) -> str:\n", + " # Save the dataframe as geoparquet to upload it to artifactory\n", + " temporary_file = NamedTemporaryFile()\n", + " gdf.to_parquet(temporary_file.name)\n", + " \n", + " artifactory_username = os.getenv('ARTIFACTORY_USERNAME')\n", + " artifactory_password = os.getenv('ARTIFACTORY_PASSWORD')\n", + "\n", + " headers = {\n", + " \"Content-Type\": \"application/octet-stream\"\n", + " }\n", + "\n", + " upload_url = f\"https://artifactory.vgt.vito.be/artifactory/auxdata-public/gfmap-temp/openeogfmap_dataframe_{row_id}.parquet\"\n", + "\n", + " with open(temporary_file.name, 'rb') as f:\n", + " response = requests.put(upload_url, headers=headers, data=f, auth=(artifactory_username, artifactory_password))\n", + "\n", + " assert response.status_code == 201, f\"Error uploading the dataframe to artifactory: {response.text}\"\n", + "\n", + " return upload_url\n", + "\n", "\n", "def create_datacube_s2(row: pd.Series, connection: openeo.DataCube, provider=None, connection_provider=None) -> openeo.BatchJob:\n", "\n", - " def buffer_geometry(geometry: geojson.FeatureCollection, buffer: float) -> str:\n", + " def buffer_geometry(geometry: geojson.FeatureCollection, buffer: int) -> gpd.GeoDataFrame:\n", " gdf = gpd.GeoDataFrame.from_features(geometry).set_crs(epsg=4326)\n", " utm = gdf.estimate_utm_crs()\n", " gdf = gdf.to_crs(utm)\n", - " gdf['geometry'] = gdf.centroid.buffer(distance=buffer, cap_style=3)\n", "\n", - " gdf = gdf.to_crs(epsg=4326)\n", - " return geojson.loads(gdf.to_json())\n", + " gdf['geometry'] = gdf.centroid.apply(\n", + " # Clips the point to the closest 20m from the S2 grid\n", + " lambda point: Point(round(point.x / 20.0) * 20.0, round(point.y / 20.0) * 20.0)\n", + " ).buffer(distance=buffer, cap_style=3)\n", "\n", + " return gdf\n", "\n", " def filter_extractonly_geometries(collection: geojson.FeatureCollection):\n", " # Filter out geometries that do not have the field extract=True\n", @@ -467,7 +730,8 @@ " assert len(geometry.features) > 0, \"No geometries with the extract flag found\"\n", "\n", " # Performs a buffer of 64 px around the geometry\n", - " geometry = buffer_geometry(geometry, 319)\n", + " geometry_df = buffer_geometry(geometry, 320)\n", + " spatial_extent_url = upload_geoparquet_artifactory(geometry_df, row.name)\n", "\n", " # Backend name and fetching type\n", " backend = Backend(row.backend_name)\n", @@ -478,19 +742,40 @@ "\n", " # Create the job to extract S2\n", " extraction_parameters = {\n", - " \"target_resolution\": 10\n", + " \"target_resolution\": 10,\n", + " \"load_collection\": {\n", + " \"eo:cloud_cover\": lambda val: val <= 95.0,\n", + " },\n", " }\n", " extractor = build_sentinel2_l2a_extractor(\n", " backend_context, bands=bands_to_download, fetch_type=fetch_type.POLYGON, **extraction_parameters \n", " )\n", "\n", - " cube = extractor.get_cube(connection, geometry, temporal_context)\n", + " cube = extractor.get_cube(connection, spatial_extent_url, temporal_context)\n", + "\n", + " # Compute the SCL dilation and add it to the cube\n", + " scl_dilated_mask = cube.process(\n", + " \"to_scl_dilation_mask\",\n", + " data=cube,\n", + " scl_band_name=\"S2-SCL\",\n", + " kernel1_size=17, # 17px dilation on a 20m layer\n", + " kernel2_size=77, # 77px dilation on a 20m layer\n", + " mask1_values=[2, 4, 5, 6, 7],\n", + " mask2_values=[3, 8, 9, 10, 11],\n", + " erosion_kernel_size=3\n", + " ).rename_labels(\"bands\", [\"S2-SCL_DILATED_MASK\"])\n", + "\n", + " cube = cube.merge_cubes(scl_dilated_mask)\n", + " cube = cube.linear_scale_range(0, 65534, 0, 65534)\n", "\n", " # Get the h3index to use in the tile\n", " h3index = geometry.features[0].properties['h3index']\n", " valid_date = geometry.features[0].properties['valid_date']\n", "\n", - " # Increase the memory of the jobs\n", + " # Increase the memory of the jobs depending on the number of polygons to extract\n", + " number_polygons = get_job_nb_polygons(row)\n", + " _log.debug(f\"Number of polygons to extract: {number_polygons}\")\n", + "\n", " job_options = {\n", " \"executor-memory\": \"5G\",\n", " \"executor-memoryOverhead\": \"2G\",\n", @@ -515,15 +800,15 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.62 s, sys: 40.8 ms, total: 4.67 s\n", - "Wall time: 4.67 s\n" + "CPU times: user 4.51 s, sys: 48 ms, total: 4.56 s\n", + "Wall time: 4.56 s\n" ] } ], @@ -536,7 +821,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -558,20 +843,19 @@ " dst_crs = CRS.from_epsg(4326)\n", " \n", " transformer = Transformer.from_crs(source_crs, dst_crs, always_xy=True)\n", - " bounds = inds.x.min().item(), inds.y.min().item(), inds.x.max().item(), inds.y.max().item()\n", - " bbox = box(*bounds)\n", "\n", - " # Get the center of the box\n", - " centroid = bbox.centroid\n", - " lon, lat = transformer.transform(centroid.x, centroid.y)\n", - " centroid_pt = Point(lon, lat)\n", + " # Get the center point of the tile\n", + " centroid_utm = box(\n", + " inds.x.min().item(), inds.y.min().item(), inds.x.max().item(), inds.y.max().item()\n", + " ).centroid\n", + " centroid_latlon = Point(*transformer.transform(centroid_utm.x, centroid_utm.y))\n", "\n", " # Intersecting with the s2 grid\n", - " intersecting = s2_grid.geometry.intersects(centroid_pt)\n", + " intersecting = s2_grid.geometry.intersects(centroid_latlon)\n", "\n", " # Select the intersecting cell that has a centroid the closest from the point\n", " intersecting_cells = s2_grid[intersecting]\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", " intersecting_cells.sort_values('distance', inplace=True)\n", " s2_tile = intersecting_cells.iloc[0]\n", "\n", @@ -579,7 +863,6 @@ "\n", " subfolder = root_folder / ref_id / str(source_crs.to_epsg()) / s2_tile_id / sample_id\n", " except Exception:\n", - " # TODO: _log.error('Could not find S2 tile for file, setting up a dummy path')\n", " subfolder = root_folder / 'unsortable'\n", "\n", " return subfolder / f'{row.out_prefix}_{sample_id}_{source_crs.to_epsg()}_{row.start_date}_{row.end_date}{row.out_extension}'\n", @@ -604,7 +887,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -620,7 +903,6 @@ " for idx, result_path in enumerate(result_paths.copy()):\n", " sample_id = extracted_gpd.iloc[idx].sample_id\n", " ref_id = extracted_gpd.iloc[idx].ref_id\n", - " lc_label = extracted_gpd.iloc[idx].landcover_label\n", " confidence = extracted_gpd.iloc[idx].confidence\n", " valid_date = extracted_gpd.iloc[idx].valid_date\n", "\n", @@ -636,27 +918,30 @@ " # Burn the polygon croptypes\n", " transform = from_bounds(*bounds, result_ds.x.size, result_ds.y.size)\n", " croptype_shapes = list(zip(surround_gpd.geometry, surround_gpd.croptype_label))\n", - " croptype = rasterize(croptype_shapes, out_shape=(result_ds.y.size, result_ds.x.size), transform=transform, all_touched=True, fill=0, default_value=65535, dtype='uint16')\n", + "\n", + " fill_value = 0\n", + " croptype = rasterize(croptype_shapes, out_shape=(result_ds.y.size, result_ds.x.size), transform=transform, all_touched=False, fill=fill_value, default_value=0, dtype='int64')\n", "\n", " # Create the attributes to add to the metadata\n", - " crs_layer = result_ds['crs']\n", " attributes = {\n", " 'ref_id': ref_id,\n", " 'sample_id': sample_id,\n", - " 'landcover_label': lc_label,\n", " 'confidence': str(confidence),\n", - " 'valid_date': valid_date\n", + " 'valid_date': valid_date,\n", + " '_FillValue': fill_value,\n", + " 'Conventions': 'CF-1.9',\n", " }\n", - " attributes.update(result_ds.attrs)\n", - "\n", - " aux_dataset = xr.Dataset({'CROPTYPE': (('y', 'x'), croptype)}, coords={'y': result_ds.y, 'x': result_ds.x}, attrs=attributes)\n", "\n", - " # Include the CRS layer from OpenEO\n", - " aux_dataset['crs'] = crs_layer\n", - " aux_dataset.attrs.update(result_ds.attrs)\n", + " aux_dataset = xr.Dataset(\n", + " {'LABEL': (('y', 'x'), croptype), 'crs': result_ds['crs']},\n", + " coords={'y': result_ds.y, 'x': result_ds.x},\n", + " attrs=attributes\n", + " )\n", + " # Required to map the 'crs' layer as geo-reference for the 'LABEL' layer.\n", + " aux_dataset['LABEL'].attrs['grid_mapping'] = 'crs'\n", "\n", " # Save the metadata in the same folder as the S2 product\n", - " metadata_path = result_path.parent / f'AUX_{sample_id}_{target_crs.to_epsg()}_{valid_date}.nc'\n", + " metadata_path = result_path.parent / f'WORLDCEREAL_10m_{sample_id}_{target_crs.to_epsg()}_{valid_date}.nc'\n", " aux_dataset.to_netcdf(metadata_path, format='NETCDF4', engine='h5netcdf')\n", " result_paths.append(metadata_path)\n", "\n", @@ -674,14 +959,14 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", "from openeo_gfmap.backend import cdse_connection\n", "\n", - "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions/')\n", + "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions_4/')\n", "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", "\n", "manager = GFMAPJobManager(\n", @@ -694,26 +979,29 @@ ")\n", "\n", "manager.add_backend(\n", - " Backend.CDSE.value, cdse_connection, parallel_jobs=2\n", + " Backend.CDSE.value, cdse_connection, parallel_jobs=6\n", ")" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:32,563|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", - "2024-02-12 09:37:32,575|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", - "2024-02-12 09:37:32,610|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'status', 'id', 'start_time', 'cpu', 'memory', 'duration',\n", - " 'description', 'costs'],\n", + "2024-03-01 10:09:05,568|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-03-01 10:09:05,574|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-03-01 10:09:06,100|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", " dtype='object')\n", - "2024-02-12 09:37:32,612|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n" + "2024-03-01 10:09:06,106|openeo_gfmap.manager|DEBUG: Updating status. 0 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n" ] }, { @@ -727,486 +1015,1201 @@ "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:33,882|openeo_gfmap.manager|DEBUG: Status of job j-2402124f58244715803a335628079b9a is finished (on backend cdse).\n", - "2024-02-12 09:37:33,883|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a finished successfully, queueing on_job_done...\n", - "2024-02-12 09:37:33,888|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-12 09:37:38,861|openeo_gfmap.manager|DEBUG: Status of job j-24021279e49745e9a3806584fe0e8c9a is finished (on backend cdse).\n", - "2024-02-12 09:37:38,863|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a finished successfully, queueing on_job_done...\n", - "2024-02-12 09:37:38,867|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n" + "2024-03-01 10:09:14,737|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 50\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "DataCube()\n" + "DataCube()\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:37:43,664|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp91ksct_n\n", - "2024-02-12 09:37:45,148|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp_4v2t_f0\n", - "2024-02-12 09:37:52,138|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:52,672|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:53,429|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:53,432|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmpw01mu9qf\n", - "2024-02-12 09:37:54,746|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:54,905|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:55,842|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:55,847|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpgdkcbiqo\n", - "2024-02-12 09:37:58,579|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:37:58,765|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:59,373|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:37:59,378|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /tmp/tmp9wfpr2qu\n", - "2024-02-12 09:38:05,003|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:05,194|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n" + "2024-03-01 10:09:31,864|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 60\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "DataCube()\n" + "DataCube()\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "2024-02-12 09:38:05,385|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:05,390|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpkew_9hyq\n", - "2024-02-12 09:38:08,255|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:08,439|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:08,747|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124f58244715803a335628079b9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:08,749|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124f58244715803a335628079b9a...\n", - "2024-02-12 09:38:09,559|openeo_gfmap.manager|INFO: Job j-2402124f58244715803a335628079b9a and post job action finished successfully.\n", - "2024-02-12 09:38:15,092|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:15,307|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:15,516|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:15,519|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmpvahpjkqn\n", - "2024-02-12 09:38:22,615|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:09:52,061|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 20\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataCube()\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-01 10:10:12,419|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 38\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataCube()\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-01 10:11:45,651|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:11:45,944|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:11:46,650|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:11:47,018|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:11:50,213|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is queued (on backend cdse).\n", + "2024-03-01 10:12:50,870|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:12:51,505|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:12:52,622|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:12:53,297|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:12:56,877|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:14:06,625|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:14:08,894|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:14:10,820|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:14:11,978|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:14:15,830|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:15:20,009|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:15:20,345|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:15:20,887|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:15:21,854|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:15:24,949|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:16:26,046|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:16:26,364|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:16:26,693|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:16:27,207|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:16:30,179|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:17:31,397|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:17:31,842|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:17:32,389|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:17:33,208|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:17:36,131|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:18:36,831|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:18:37,123|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:18:38,568|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:18:38,824|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:18:41,752|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:19:44,162|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:19:44,714|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:19:44,958|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:19:45,420|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:19:48,159|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:20:48,914|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:20:49,725|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:20:50,148|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:20:50,425|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:20:53,342|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:21:53,907|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:21:54,167|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:21:54,509|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:21:54,721|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:21:57,518|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:22:58,527|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:22:59,245|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:22:59,685|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:22:59,919|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:23:02,659|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:24:03,186|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:24:03,620|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:24:04,107|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:24:04,562|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:24:07,524|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:25:08,654|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:25:09,544|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:25:09,968|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:25:11,607|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:25:14,472|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:26:16,056|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:26:16,449|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:26:17,266|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:26:17,759|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:26:20,856|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:27:22,484|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:27:24,240|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:27:25,606|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:27:26,088|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:27:29,390|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:28:31,326|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:28:32,753|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:28:33,167|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:28:33,472|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:28:36,871|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:29:39,824|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:29:40,740|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:29:40,973|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", + "2024-03-01 10:29:41,336|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:29:44,338|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:30:47,088|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:30:47,497|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:30:48,096|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is finished (on backend cdse).\n", + "2024-03-01 10:30:48,098|openeo_gfmap.manager|INFO: Job j-2403019c533442d2a39daa06409bf225 finished successfully, queueing on_job_done...\n", + "2024-03-01 10:30:48,103|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-03-01 10:30:49,187|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmpbq1se34j\n", + "2024-03-01 10:30:49,437|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:30:52,525|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:30:53,724|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:22,788|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:22,969|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1222569/S2_at2021lpis1222569_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:22,973|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /tmp/tmp9qq2f6m9\n", - "2024-02-12 09:38:29,854|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:30:54,442|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_10m_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:02,256|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_10m_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:02,262|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmpge9dgbv0\n", + "2024-03-01 10:31:06,512|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 09:38:30,027|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:30,148|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-24021279e49745e9a3806584fe0e8c9a -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis809720/S2_at2021lpis809720_32633_2020-08-30_2022-03-03.nc\n", - "2024-02-12 09:38:30,150|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24021279e49745e9a3806584fe0e8c9a...\n", - "2024-02-12 09:38:31,352|openeo_gfmap.manager|INFO: Job j-24021279e49745e9a3806584fe0e8c9a and post job action finished successfully.\n", - "2024-02-12 09:39:29,274|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:39:29,492|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:39:30,816|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:40:30,968|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:40:33,929|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:40:34,269|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:41:34,440|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:41:34,695|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:41:35,280|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:42:35,462|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:42:36,041|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:42:36,485|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:43:36,626|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:43:36,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:43:38,638|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:44:38,795|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:44:39,048|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:44:41,675|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:45:41,861|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:45:42,175|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:45:44,476|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:46:44,671|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:46:44,946|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:46:47,272|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:47:47,411|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:47:47,719|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:47:48,098|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:48:48,231|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:48:48,650|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:48:50,196|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:49:50,520|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:49:50,827|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:49:52,613|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:50:52,803|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:50:54,202|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:50:54,794|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:51:54,958|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:51:56,063|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:51:56,289|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:52:56,486|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:52:56,866|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:52:57,592|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:53:57,737|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:53:58,210|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:54:01,194|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:55:01,369|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:55:05,199|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:55:05,437|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:56:05,605|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:56:06,025|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:56:08,011|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:57:08,220|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:57:08,685|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:57:12,111|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:58:12,249|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:58:12,658|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:58:14,530|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 09:59:14,656|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 09:59:14,954|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 09:59:15,242|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:00:15,353|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:00:15,947|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:00:29,066|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:01:29,230|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:01:29,528|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:01:30,633|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is running (on backend cdse).\n", - "2024-02-12 10:02:30,836|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs...\n", - "2024-02-12 10:02:32,780|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:02:46,801|openeo_gfmap.manager|DEBUG: Status of job j-2402124d03ab4e718bef6ce4e8185348 is finished (on backend cdse).\n", - "2024-02-12 10:02:46,803|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 finished successfully, queueing on_job_done...\n", - "2024-02-12 10:02:46,809|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-02-12 10:02:51,114|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp_gibcv9i\n", - "2024-02-12 10:02:58,022|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:31:06,730|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_10m_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:10,378|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_10m_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:10,383|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmp3nvsjpcw\n", + "2024-03-01 10:31:14,156|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:02:58,509|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:02:58,693|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12461808/S2_2021_LV_LPIS_POLY_110-12461808_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:02:58,697|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp710760kb\n", - "2024-02-12 10:03:05,950|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:31:14,322|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_10m_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:21,636|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_10m_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:31:21,639|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2403019c533442d2a39daa06409bf225...\n", + "2024-03-01 10:31:27,588|openeo_gfmap.manager|INFO: Job j-2403019c533442d2a39daa06409bf225 and post job action finished successfully.\n", + "2024-03-01 10:31:54,256|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:31:55,227|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:31:55,513|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:31:58,444|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:32:59,735|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:32:59,928|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:33:00,659|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", + "2024-03-01 10:33:03,584|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:34:05,570|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:34:05,963|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:34:06,940|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is finished (on backend cdse).\n", + "2024-03-01 10:34:06,942|openeo_gfmap.manager|INFO: Job j-24030154ae7f4f79a0e41755c15284d1 finished successfully, queueing on_job_done...\n", + "2024-03-01 10:34:06,944|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-03-01 10:34:09,897|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:34:10,039|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /tmp/tmpyql62246\n", + "2024-03-01 10:34:19,949|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:06,320|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:06,478|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12484602/S2_2021_LV_LPIS_POLY_110-12484602_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:06,483|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpx_uhw6jb\n", - "2024-02-12 10:03:13,646|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:34:20,159|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis438712/S2_10m_at2021lpis438712_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:34:23,947|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis438712/S2_10m_at2021lpis438712_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:34:23,951|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /tmp/tmpd8j0_ziw\n", + "2024-03-01 10:34:29,240|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:14,059|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:14,188|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12710543/S2_2021_LV_LPIS_POLY_110-12710543_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:14,193|openeo_gfmap.manager|DEBUG: Downloading asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpnmy5v_v0\n", - "2024-02-12 10:03:18,924|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:34:29,404|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis929316/S2_10m_at2021lpis929316_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:34:32,680|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis929316/S2_10m_at2021lpis929316_32633_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:34:32,682|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24030154ae7f4f79a0e41755c15284d1...\n", + "2024-03-01 10:34:40,970|openeo_gfmap.manager|INFO: Job j-24030154ae7f4f79a0e41755c15284d1 and post job action finished successfully.\n", + "2024-03-01 10:35:11,174|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:35:11,755|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", + "2024-03-01 10:35:14,759|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:36:15,591|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:36:16,138|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is finished (on backend cdse).\n", + "2024-03-01 10:36:16,139|openeo_gfmap.manager|INFO: Job j-24030178c3b64df896d1924bfeef1ffb finished successfully, queueing on_job_done...\n", + "2024-03-01 10:36:16,143|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-03-01 10:36:17,945|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmp3pmyf_fm\n", + "2024-03-01 10:36:18,933|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:36:22,171|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:19,242|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:19,358|openeo_gfmap.manager|INFO: Downloaded asset openEO_3.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12668906/S2_2021_LV_LPIS_POLY_110-12668906_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:19,363|openeo_gfmap.manager|DEBUG: Downloading asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp2sgwj7iq\n", - "2024-02-12 10:03:24,044|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:36:22,380|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:24,320|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:24,326|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmpd8_1pwec\n", + "2024-03-01 10:36:28,075|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:24,459|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:24,666|openeo_gfmap.manager|INFO: Downloaded asset openEO_4.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12842675/S2_2021_LV_LPIS_POLY_110-12842675_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:24,670|openeo_gfmap.manager|DEBUG: Downloading asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpt61g6d34\n", - "2024-02-12 10:03:30,997|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:36:28,464|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_10m_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:30,159|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_10m_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:30,165|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmpj64nfeoo\n", + "2024-03-01 10:36:33,518|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:31,312|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:31,513|openeo_gfmap.manager|INFO: Downloaded asset openEO_5.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12579669/S2_2021_LV_LPIS_POLY_110-12579669_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:31,518|openeo_gfmap.manager|DEBUG: Downloading asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmp9viznwne\n", - "2024-02-12 10:03:38,362|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:36:33,724|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_10m_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:35,165|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_10m_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:36:35,168|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24030178c3b64df896d1924bfeef1ffb...\n", + "2024-03-01 10:36:38,878|openeo_gfmap.manager|INFO: Job j-24030178c3b64df896d1924bfeef1ffb and post job action finished successfully.\n", + "2024-03-01 10:37:19,439|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:37:40,130|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:38:40,858|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:38:43,743|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:39:45,947|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:39:48,756|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:40:50,092|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:40:53,081|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", + "2024-03-01 10:41:53,587|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n", + "2024-03-01 10:41:56,336|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is finished (on backend cdse).\n", + "2024-03-01 10:41:56,338|openeo_gfmap.manager|INFO: Job j-2403016e5d90427ca54853a4756c7f4b finished successfully, queueing on_job_done...\n", + "2024-03-01 10:41:56,341|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-03-01 10:42:02,403|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /tmp/tmpnj3eszqq\n", + "2024-03-01 10:42:08,565|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:38,880|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:38,989|openeo_gfmap.manager|INFO: Downloaded asset openEO_6.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12483998/S2_2021_LV_LPIS_POLY_110-12483998_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:38,993|openeo_gfmap.manager|DEBUG: Downloading asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /tmp/tmpvp3hzxc5\n", - "2024-02-12 10:03:44,408|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348...\n", - "/tmp/ipykernel_23450/1596858655.py:32: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "2024-03-01 10:42:08,782|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12659485/S2_10m_2021_LV_LPIS_POLY_110-12659485_32634_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:42:10,823|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12659485/S2_10m_2021_LV_LPIS_POLY_110-12659485_32634_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:42:10,830|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /tmp/tmpqvkiquhy\n", + "2024-03-01 10:42:17,007|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b...\n", + "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_pt)\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super().__setitem__(key, value)\n", - "/tmp/ipykernel_23450/1596858655.py:33: SettingWithCopyWarning: \n", + "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-02-12 10:03:44,747|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:44,946|openeo_gfmap.manager|INFO: Downloaded asset openEO_7.nc from job j-2402124d03ab4e718bef6ce4e8185348 -> /data/users/Public/couchard/world_cereal/extractions/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12308263/S2_2021_LV_LPIS_POLY_110-12308263_32634_2020-08-30_2022-03-03.nc\n", - "2024-02-12 10:03:44,948|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2402124d03ab4e718bef6ce4e8185348...\n", - "2024-02-12 10:03:46,982|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:03:47,304|openeo_gfmap.manager|INFO: Job j-2402124d03ab4e718bef6ce4e8185348 and post job action finished successfully.\n", - "2024-02-12 10:03:47,374|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:04:47,471|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:04:48,400|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:05:48,513|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:05:48,775|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:06:48,987|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:06:49,580|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:07:49,782|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:07:50,229|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:08:50,385|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:08:50,823|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:09:50,944|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:09:51,455|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:10:51,598|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:11:17,145|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:12:17,315|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:12:17,688|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:13:17,805|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:13:18,499|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:14:18,608|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:14:18,986|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:15:19,116|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:15:19,564|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:16:19,716|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:16:19,975|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:17:20,142|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:17:20,525|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:18:20,697|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:18:20,959|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:19:21,184|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:19:21,544|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:20:21,695|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:20:26,767|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:21:26,916|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:21:27,696|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:22:27,831|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:22:28,087|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:23:28,237|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:23:28,481|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:24:28,627|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:24:29,027|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:25:29,137|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:25:29,855|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:26:30,003|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:26:31,146|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:27:31,306|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:27:31,531|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:28:31,696|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:28:32,167|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:29:32,318|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:29:32,643|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:30:32,852|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:30:33,161|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:31:33,313|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:31:34,064|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:32:34,293|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:32:34,630|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:33:34,773|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:33:34,997|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:34:35,180|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:34:35,697|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is running (on backend cdse).\n", - "2024-02-12 10:35:35,827|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs...\n", - "2024-02-12 10:35:36,174|openeo_gfmap.manager|DEBUG: Status of job j-2402128d377942dfa41b8b075936fa95 is error (on backend cdse).\n", - "2024-02-12 10:35:36,176|openeo_gfmap.manager|INFO: Job j-2402128d377942dfa41b8b075936fa95 finished with error, queueing on_job_error...\n", - "2024-02-12 10:35:36,179|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.ERROR.\n", - "Exception in thread Thread-4:\n", - "Traceback (most recent call last):\n", - " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 980, in _bootstrap_inner\n", - " self.run()\n", - " File \"/home/couchard/miniconda3/envs/gfmap/lib/python3.9/threading.py\", line 917, in run\n", - " self._target(*self._args, **self._kwargs)\n", - " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 64, in _post_job_worker\n", - " if status == PostJobStatus.ERROR:\n", - " File \"/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_manager.py\", line 137, in on_job_error\n", - " output_log_path = (\n", - "TypeError: '>' not supported between instances of 'list' and 'int'\n" + "2024-03-01 10:42:17,200|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12319250/S2_10m_2021_LV_LPIS_POLY_110-12319250_32634_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:42:18,735|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12319250/S2_10m_2021_LV_LPIS_POLY_110-12319250_32634_2020-08-30_2022-03-03.nc\n", + "2024-03-01 10:42:18,737|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2403016e5d90427ca54853a4756c7f4b...\n", + "2024-03-01 10:42:20,437|openeo_gfmap.manager|INFO: Job j-2403016e5d90427ca54853a4756c7f4b and post job action finished successfully.\n" ] } ], "source": [ "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)" ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
geometrysample_idlandcover_labelcroptype_labelirrigation_labelconfidenceextractvalid_dateref_idh3index
0POLYGON ((638120.000 5289160.000, 638120.000 5...at2021lpis3907131143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
1POLYGON ((649000.000 5284840.000, 649000.000 5...at2021lpis20312991143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
2POLYGON ((651040.000 5285480.000, 651040.000 5...at2021lpis11508531143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
\n", + "
" + ], + "text/plain": [ + " geometry sample_id \\\n", + "0 POLYGON ((638120.000 5289160.000, 638120.000 5... at2021lpis390713 \n", + "1 POLYGON ((649000.000 5284840.000, 649000.000 5... at2021lpis2031299 \n", + "2 POLYGON ((651040.000 5285480.000, 651040.000 5... at2021lpis1150853 \n", + "\n", + " landcover_label croptype_label irrigation_label confidence extract \\\n", + "0 11 4380 0 None True \n", + "1 11 4380 0 None True \n", + "2 11 4380 0 None True \n", + "\n", + " valid_date ref_id h3index \n", + "0 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff \n", + "1 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff \n", + "2 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff " + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Loads a geoparquet file from an artifactory public url\n", + "import fsspec\n", + "\n", + "with fsspec.open(\"https://artifactory.vgt.vito.be/artifactory/auxdata-public/gfmap-temp/openeogfmap_dataframe_1.parquet\") as file:\n", + " gdf = gpd.read_parquet(file)\n", + "\n", + "gdf.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "Name: WGS 84 / UTM zone 33N\n", + "Axis Info [cartesian]:\n", + "- E[east]: Easting (metre)\n", + "- N[north]: Northing (metre)\n", + "Area of Use:\n", + "- name: Between 12°E and 18°E, northern hemisphere between equator and 84°N, onshore and offshore. Austria. Bosnia and Herzegovina. Cameroon. Central African Republic. Chad. Congo. Croatia. Czechia. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard. Sweden. Vatican City State.\n", + "- bounds: (12.0, 0.0, 18.0, 84.0)\n", + "Coordinate Operation:\n", + "- name: UTM zone 33N\n", + "- method: Transverse Mercator\n", + "Datum: World Geodetic System 1984 ensemble\n", + "- Ellipsoid: WGS 84\n", + "- Prime Meridian: Greenwich" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "gdf.crs" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authenticated using refresh token.\n" + ] + } + ], + "source": [ + "from tempfile import NamedTemporaryFile\n", + "\n", + "connection = cdse_connection()\n", + "job = connection.job('j-24022945a4e5492dbb40a61fca0cc91f')\n", + "tempfile = NamedTemporaryFile()\n", + "for asset in job.get_results().get_assets():\n", + " asset.download(tempfile.name)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
<xarray.Dataset>\n",
+       "Dimensions:              (t: 167, x: 64, y: 64)\n",
+       "Coordinates:\n",
+       "  * t                    (t) datetime64[ns] 2020-09-01 2020-09-06 ... 2022-03-02\n",
+       "  * x                    (x) float64 5.05e+05 5.051e+05 ... 5.057e+05 5.057e+05\n",
+       "  * y                    (y) float64 6.361e+06 6.361e+06 ... 6.361e+06 6.361e+06\n",
+       "Data variables: (12/15)\n",
+       "    crs                  |S1 ...\n",
+       "    S2-B01               (t, y, x) float32 ...\n",
+       "    S2-B02               (t, y, x) float32 ...\n",
+       "    S2-B03               (t, y, x) float32 ...\n",
+       "    S2-B04               (t, y, x) float32 ...\n",
+       "    S2-B05               (t, y, x) float32 ...\n",
+       "    ...                   ...\n",
+       "    S2-B8A               (t, y, x) float32 ...\n",
+       "    S2-B09               (t, y, x) float32 ...\n",
+       "    S2-B11               (t, y, x) float32 ...\n",
+       "    S2-B12               (t, y, x) float32 ...\n",
+       "    S2-SCL               (t, y, x) float32 ...\n",
+       "    S2-SCL_DILATED_MASK  (t, y, x) float32 ...\n",
+       "Attributes:\n",
+       "    Conventions:  CF-1.9\n",
+       "    institution:  openEO platform - Geotrellis backend: 0.27.1a1\n",
+       "    description:  \n",
+       "    title:        
" + ], + "text/plain": [ + "\n", + "Dimensions: (t: 167, x: 64, y: 64)\n", + "Coordinates:\n", + " * t (t) datetime64[ns] 2020-09-01 2020-09-06 ... 2022-03-02\n", + " * x (x) float64 5.05e+05 5.051e+05 ... 5.057e+05 5.057e+05\n", + " * y (y) float64 6.361e+06 6.361e+06 ... 6.361e+06 6.361e+06\n", + "Data variables: (12/15)\n", + " crs |S1 ...\n", + " S2-B01 (t, y, x) float32 ...\n", + " S2-B02 (t, y, x) float32 ...\n", + " S2-B03 (t, y, x) float32 ...\n", + " S2-B04 (t, y, x) float32 ...\n", + " S2-B05 (t, y, x) float32 ...\n", + " ... ...\n", + " S2-B8A (t, y, x) float32 ...\n", + " S2-B09 (t, y, x) float32 ...\n", + " S2-B11 (t, y, x) float32 ...\n", + " S2-B12 (t, y, x) float32 ...\n", + " S2-SCL (t, y, x) float32 ...\n", + " S2-SCL_DILATED_MASK (t, y, x) float32 ...\n", + "Attributes:\n", + " Conventions: CF-1.9\n", + " institution: openEO platform - Geotrellis backend: 0.27.1a1\n", + " description: \n", + " title: " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import xarray as xr\n", + "\n", + "inopt = xr.open_dataset(tempfile.name)\n", + "inopt" + ] } ], "metadata": { diff --git a/src/openeo_gfmap/fetching/commons.py b/src/openeo_gfmap/fetching/commons.py index 898c86d..06680c5 100644 --- a/src/openeo_gfmap/fetching/commons.py +++ b/src/openeo_gfmap/fetching/commons.py @@ -3,6 +3,7 @@ from typing import Optional, Union import openeo +from openeo.rest.vectorcube import VectorCube from geojson import GeoJSON from rasterio import CRS from rasterio.errors import CRSError @@ -111,12 +112,18 @@ def load_collection( properties=load_collection_parameters, ) elif fetch_type == FetchType.POLYGON: - assert isinstance( - spatial_extent, GeoJSON - ), "Please provide only a GeoJSON FeatureCollection for point based fetching." - assert ( - spatial_extent["type"] == "FeatureCollection" - ), "Please provide a FeatureCollection type of GeoJSON" + if isinstance(spatial_extent, GeoJSON): + assert ( + spatial_extent["type"] == "FeatureCollection" + ), "Please provide a FeatureCollection type of GeoJSON" + elif isinstance(spatial_extent, str): + assert ( + spatial_extent.startswith('https://') or spatial_extent.startswith('http://') + ), "Please provide a valid URL or a path to a GeoJSON file." + else: + raise ValueError( + "Please provide a valid URL to a GeoParquet or GeoJSON file." + ) cube = connection.load_collection( collection_id=collection_name, temporal_extent=[temporal_extent.start_date, temporal_extent.end_date], @@ -133,6 +140,10 @@ def load_collection( cube = cube.mask(pre_mask.resample_cube_spatial(cube)) if fetch_type == FetchType.POLYGON: - cube = cube.filter_spatial(spatial_extent) + if isinstance(spatial_extent, str): + geometry = connection.load_url(spatial_extent, format="Parquet" if ".parquet" in spatial_extent else "GeoJSON") + cube = cube.filter_spatial(geometry) + else: + cube = cube.filter_spatial(spatial_extent) return cube diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index d8051bf..2c8f520 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -46,11 +46,11 @@ def __init__( self._output_path_gen = output_path_generator self._post_job_action = post_job_action self._post_job_params = post_job_params - super().__init__(poll_sleep) # Monkey patching the _normalize_df method to ensure we have no modification on the # geometry column MultiBackendJobManager._normalize_df = self._normalize_df + super().__init__(poll_sleep) def _post_job_worker(self): """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` @@ -83,7 +83,6 @@ def _update_statuses(self, df: pd.DataFrame): The method is executed every `poll_sleep` seconds. """ active = df[df.status.isin(["created", "queued", "running"])] - _log.debug(f"Updating status. {len(active)} on {len(df)} active jobs...") for idx, row in active.iterrows(): # Parses the backend from the csv connection = self._get_connection(row.backend_name) diff --git a/src/openeo_gfmap/spatial.py b/src/openeo_gfmap/spatial.py index 6625120..f4d419f 100644 --- a/src/openeo_gfmap/spatial.py +++ b/src/openeo_gfmap/spatial.py @@ -44,4 +44,4 @@ def to_geometry(self) -> Polygon: return box(self.west, self.south, self.east, self.north) -SpatialContext = Union[GeoJSON, BoundingBoxExtent] +SpatialContext = Union[GeoJSON, BoundingBoxExtent, str] From cff7e1f35753021c4455c7e0c6389ae0dfea0db7 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Thu, 7 Mar 2024 13:19:58 +0100 Subject: [PATCH 14/24] Changed on_job_done function to support post_job_action playing with stac items, updated extraction use case and linked AUXILIARY AssetDefinition inside stac submodule --- .../S2_extraction_example.ipynb | 1373 ++--------------- src/openeo_gfmap/manager/job_manager.py | 25 +- src/openeo_gfmap/stac/__init__.py | 4 + src/openeo_gfmap/stac/constants.py | 74 +- 4 files changed, 159 insertions(+), 1317 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 49fc86d..3b7a462 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -6,22 +6,20 @@ "source": [ "# Example of a GFMAP full-extraction pipeline\n", "\n", - "Designing of GFMAP Job DataFrames and DataCube creators functions, as well as post job-actions.\n", + "Designing a full-extraction pipeline using the openeo-gfmap GFMAPJobManager.\n", "\n", - "Those dataframe should be containing all the necessary infromation to run a job and know where to save it." + "The pipeline consits of the following elements:\n", + "* An input dataframe where each row corresponds to each executed job.\n", + "* An user function defined to create OpenEO BatchJob from input rows of the beforementioned dataframe.\n", + "* An user function defined to generate an output path of each of the Job products\n", + "* An user function executed after the assets are downloaded and saved from a finished job (optional). This **post job action** can do anything and will be executed locally inside the GFMAPJobManager.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### First step: splitting the job\n", - "\n", - "Splitting the dataset of extraction in multiple job based on position is necessary to respect OpenEO limitations.\n", - "\n", - "This script performs a split with the H3 hexagonal grid, yielding a list of sub-geodataframes.\n", - "\n", - "A subtility here is that some polygons are not directly extracted (field with `extract=False`), but should be kept for post-job actions. This requirement is filled by removing sub-dataframes that do not contain any extractable polyons." + "### Setting up the logging module " ] }, { @@ -50,6 +48,21 @@ "stream_handler.addFilter(MyLoggerFilter())\n" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### First step: splitting the job\n", + "\n", + "We load the initial crop-type dataset that will be the base of our extractions.\n", + "\n", + "Splitting the dataset of extraction in multiple job based on position is necessary to respect OpenEO limitations.\n", + "\n", + "This script performs a split with the H3 hexagonal grid, yielding a list of sub-geodataframes.\n", + "\n", + "A subtility here is that some polygons are not directly extracted (field with `extract=False`), but should be kept for post-job actions. This requirement is filled by removing sub-dataframes that do not contain any extractable polyons." + ] + }, { "cell_type": "code", "execution_count": 2, @@ -202,22 +215,20 @@ "import geopandas as gpd\n", "from openeo_gfmap.manager.job_splitters import split_job_hex\n", "\n", - "base_df_path = Path('/vitodata/worldcereal/tmp/kristof/GFMAP/2021_EUR_DEMO_POLY_110.gpkg')\n", + "base_df_path = \"https://artifactory.vgt.vito.be/artifactory/auxdata-public/gfmap/DEMO_CROPTYPE.gpkg\"\n", "base_df = gpd.read_file(base_df_path)\n", "# Splits the job using GFMAP\n", "split_jobs = split_job_hex(\n", " base_df, max_points=60, grid_resolution=4\n", ")\n", "\n", - "print(f'{len(split_jobs)} jobs before filtering empty one (no extraction)')\n", + "print(f'{len(split_jobs)} sub-datasets.')\n", "\n", "# Remove the geometry where there are no points with the \"extract\" flag\n", "split_jobs = [\n", " job for job in split_jobs if job.extract.any()\n", "]\n", - "print(f'{len(split_jobs)} jobs after filtering empty one (no extraction)')\n", - "\n", - "base_df.head()\n" + "print(f'{len(split_jobs)} sub-datasets after filtering sub-datasets with no point to extract.')" ] }, { @@ -437,6 +448,13 @@ "job_df" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Sub-sampling job dataframe to reduce execution time" + ] + }, { "cell_type": "code", "execution_count": 4, @@ -533,8 +551,7 @@ ], "source": [ "# Run a subset of the jobs to test the manager, the selected jobs have a fair amount of geometries to extract\n", - "job_df = job_df.iloc[[0, 2, 3, -6]].reset_index(drop=True)\n", - "job_df" + "job_df = job_df.iloc[[0, 2, 3, -6]].reset_index(drop=True)" ] }, { @@ -581,7 +598,7 @@ " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " 50\n", + " 3\n", " \n", " \n", " 1\n", @@ -591,7 +608,7 @@ " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " 60\n", + " 3\n", " \n", " \n", " 2\n", @@ -601,7 +618,7 @@ " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " 20\n", + " 2\n", " \n", " \n", " 3\n", @@ -611,7 +628,7 @@ " 2020-08-30\n", " 2022-03-03\n", " {\"type\": \"FeatureCollection\", \"features\": [{\"i...\n", - " 38\n", + " 2\n", " \n", " \n", "\n", @@ -625,10 +642,10 @@ "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", "\n", " geometry nb_polygons \n", - "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 50 \n", - "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 60 \n", - "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 20 \n", - "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 38 " + "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 3 \n", + "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 3 \n", + "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 2 \n", + "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 2 " ] }, "execution_count": 5, @@ -641,10 +658,10 @@ "\n", "def get_job_nb_polygons(row: pd.Series) -> int:\n", " \"\"\"Get the number of polygons in the geometry.\"\"\"\n", - " return len(filter(lambda feat: feat.properties.get(\"extract\"), geojson.loads(row.geometry)['features']))\n", + " return len(list(filter(lambda feat: feat.properties.get(\"extract\"), geojson.loads(row.geometry)['features'])))\n", "\n", "job_df['nb_polygons'] = job_df.apply(get_job_nb_polygons, axis=1)\n", - "job_df" + "job_df.nb_polygons.values" ] }, { @@ -655,7 +672,10 @@ "\n", "Implement a function to create, from the additional rows provided before, an `openeo.BatchJob` that will be used to run the job.\n", "\n", - "In this case we extract Sentinel-2 data, and we remove the polygons with `extract=False` (although we keep them in the row for the post-job action.)" + "In this case we extract Sentinel-2 data around a 64x64 pixel square of polygons which have the field `extract=True` (although we keep them in the row for the post-job action.)\n", + "\n", + "Note:\n", + "Because the polygons to extract are specified in UTM dimensions (required to have a specific size), the dataset of polygon cannot be send directly through the openeo process graph (GeoJSON only support lat/lon coordinates). The sub-datasets of polygons are therefore uploaded to a publicly accessible URL so they can be used later by openeo during the execution of the job." ] }, { @@ -807,8 +827,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.51 s, sys: 48 ms, total: 4.56 s\n", - "Wall time: 4.56 s\n" + "CPU times: user 4.55 s, sys: 40.7 ms, total: 4.59 s\n", + "Wall time: 4.59 s\n" ] } ], @@ -816,7 +836,7 @@ "%%time\n", "\n", "# Load the S2 grid\n", - "s2_grid = gpd.read_file('./s2grid_bounds.geojson')" + "s2_grid = gpd.read_file(\"https://artifactory.vgt.vito.be/artifactory/auxdata-public/gfmap/s2grid_bounds.gpkg\")" ] }, { @@ -878,11 +898,14 @@ "The post-job action will be called once the job resut was downloaded and saved to a specific path.\n", "\n", "A post-job action function must receive 3 parameters:\n", - "* `result_paths`: Paths to the downloaded job result files.\n", + "* `job_items`: STAC items containing the currently extracted data for the job.\n", "* `row`: The current job dataframe row.\n", "* `parameters`: User-defined parameters set in the `GFMAPJobManager` constructor.\n", "\n", - "The post-job action must return a list of paths containing the results from that job. For example, if no file is created/deleted in the post-job action, then the user can simply return the list of paths it has received as input `result_paths`. If instead files are added or removed, then the user will need to modify this list accordingly before returning it." + "The post-job action must return back the list of job items. The user is responsible for updating,\n", + "adding and removing the items. For example, in this case the user creates a raster file with\n", + "ground truth data, the user then adds an asset using the predefined `openeo_gfmap.stac.AUXILIARY`\n", + "AssetDefintion to the related item, pointing to the generated NetCDF file." ] }, { @@ -891,27 +914,48 @@ "metadata": {}, "outputs": [], "source": [ + "from openeo_gfmap.stac import AUXILIARY\n", + "\n", "from rasterio.features import rasterize\n", "from rasterio.transform import from_bounds\n", + "import pystac\n", "import json\n", "\n", - "def post_job_action(result_paths: list, row: pd.Series, parameters: dict = {}) -> list:\n", + "def add_item_asset(related_item: pystac.Item, path: Path):\n", + " asset = AUXILIARY.create_asset(\n", + " href=path.as_posix()\n", + " )\n", + " related_item.add_asset('auxiliary', asset)\n", + "\n", + "def post_job_action(job_items: List[pystac.Item], row: pd.Series, parameters: dict = {}) -> list:\n", " base_gpd = gpd.GeoDataFrame.from_features(json.loads(row.geometry)).set_crs(epsg=4326)\n", - " assert len(base_gpd[base_gpd.extract == True]) == len(result_paths), \"The number of result paths should be the same as the number of geometries\"\n", + " assert (\n", + " len(base_gpd[base_gpd.extract == True]) == len(job_items),\n", + " \"The number of result paths should be the same as the number of geometries\"\n", + " )\n", " extracted_gpd = base_gpd[base_gpd.extract == True].reset_index(drop=True)\n", " # In this case we want to burn the metadata in a new file in the same folder as the S2 product\n", - " for idx, result_path in enumerate(result_paths.copy()):\n", + " for idx, item in enumerate(job_items):\n", " sample_id = extracted_gpd.iloc[idx].sample_id\n", " ref_id = extracted_gpd.iloc[idx].ref_id\n", " confidence = extracted_gpd.iloc[idx].confidence\n", " valid_date = extracted_gpd.iloc[idx].valid_date\n", "\n", - " result_ds = xr.open_dataset(result_path, chunks='auto')\n", + " item_asset_path = Path(\n", + " list(item.assets.values())[0].href\n", + " )\n", + " # Read information from the item file (could also read it from the item object metadata)\n", + " result_ds = xr.open_dataset(item_asset_path, chunks='auto')\n", "\n", " target_crs = CRS.from_wkt(result_ds.crs.attrs['crs_wkt'])\n", "\n", " # Get the surrounding polygons around our extracted center geometry to rastetize them\n", - " bounds = (result_ds.x.min().item(), result_ds.y.min().item(), result_ds.x.max().item(), result_ds.y.max().item())\n", + " bounds = (\n", + " result_ds.x.min().item(),\n", + " result_ds.y.min().item(),\n", + " result_ds.x.max().item(),\n", + " result_ds.y.max().item()\n", + " )\n", " bbox = box(*bounds)\n", " surround_gpd = base_gpd.to_crs(target_crs).clip(bbox)\n", "\n", @@ -920,7 +964,15 @@ " croptype_shapes = list(zip(surround_gpd.geometry, surround_gpd.croptype_label))\n", "\n", " fill_value = 0\n", - " croptype = rasterize(croptype_shapes, out_shape=(result_ds.y.size, result_ds.x.size), transform=transform, all_touched=False, fill=fill_value, default_value=0, dtype='int64')\n", + " croptype = rasterize(\n", + " croptype_shapes,\n", + " out_shape=(result_ds.y.size, result_ds.x.size),\n", + " transform=transform,\n", + " all_touched=False,\n", + " fill=fill_value,\n", + " default_value=0,\n", + " dtype='int64'\n", + " )\n", "\n", " # Create the attributes to add to the metadata\n", " attributes = {\n", @@ -941,11 +993,17 @@ " aux_dataset['LABEL'].attrs['grid_mapping'] = 'crs'\n", "\n", " # Save the metadata in the same folder as the S2 product\n", - " metadata_path = result_path.parent / f'WORLDCEREAL_10m_{sample_id}_{target_crs.to_epsg()}_{valid_date}.nc'\n", + " metadata_path = (\n", + " item_asset_path.parent / \n", + " f'WORLDCEREAL_10m_{sample_id}_{target_crs.to_epsg()}_{valid_date}.nc'\n", + " )\n", " aux_dataset.to_netcdf(metadata_path, format='NETCDF4', engine='h5netcdf')\n", - " result_paths.append(metadata_path)\n", + " aux_dataset.close()\n", "\n", - " return result_paths\n" + " # Adds this metadata as a new asset\n", + " add_item_asset(item, metadata_path)\n", + " \n", + " return job_items\n" ] }, { @@ -964,9 +1022,9 @@ "outputs": [], "source": [ "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", - "from openeo_gfmap.backend import cdse_connection\n", + "from openeo_gfmap.backend import cdse_staging_connection\n", "\n", - "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions_4/')\n", + "base_output_dir = Path('./extraction/')\n", "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", "\n", "manager = GFMAPJobManager(\n", @@ -979,1236 +1037,19 @@ ")\n", "\n", "manager.add_backend(\n", - " Backend.CDSE.value, cdse_connection, parallel_jobs=6\n", + " Backend.CDSE_STAGING.value, cdse_staging_connection, parallel_jobs=6\n", ")" ] }, { "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:09:05,568|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", - "2024-03-01 10:09:05,574|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", - "2024-03-01 10:09:06,100|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:09:06,106|openeo_gfmap.manager|DEBUG: Updating status. 0 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authenticated using refresh token.\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:09:14,737|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 50\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:09:31,864|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 60\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:09:52,061|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 20\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:10:12,419|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 38\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "DataCube()\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2024-03-01 10:11:45,651|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:11:45,944|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:11:46,650|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:11:47,018|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:11:50,213|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is queued (on backend cdse).\n", - "2024-03-01 10:12:50,870|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:12:51,505|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:12:52,622|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:12:53,297|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:12:56,877|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:14:06,625|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:14:08,894|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:14:10,820|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:14:11,978|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:14:15,830|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:15:20,009|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:15:20,345|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:15:20,887|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:15:21,854|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:15:24,949|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:16:26,046|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:16:26,364|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:16:26,693|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:16:27,207|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:16:30,179|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:17:31,397|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:17:31,842|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:17:32,389|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:17:33,208|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:17:36,131|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:18:36,831|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:18:37,123|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:18:38,568|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:18:38,824|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:18:41,752|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:19:44,162|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:19:44,714|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:19:44,958|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:19:45,420|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:19:48,159|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:20:48,914|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:20:49,725|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:20:50,148|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:20:50,425|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:20:53,342|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:21:53,907|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:21:54,167|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:21:54,509|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:21:54,721|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:21:57,518|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:22:58,527|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:22:59,245|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:22:59,685|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:22:59,919|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:23:02,659|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:24:03,186|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:24:03,620|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:24:04,107|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:24:04,562|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:24:07,524|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:25:08,654|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:25:09,544|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:25:09,968|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:25:11,607|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:25:14,472|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:26:16,056|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:26:16,449|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:26:17,266|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:26:17,759|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:26:20,856|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:27:22,484|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:27:24,240|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:27:25,606|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:27:26,088|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:27:29,390|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:28:31,326|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:28:32,753|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:28:33,167|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:28:33,472|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:28:36,871|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:29:39,824|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:29:40,740|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:29:40,973|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is running (on backend cdse).\n", - "2024-03-01 10:29:41,336|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:29:44,338|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:30:47,088|openeo_gfmap.manager|DEBUG: Updating status. 4 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:30:47,497|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:30:48,096|openeo_gfmap.manager|DEBUG: Status of job j-2403019c533442d2a39daa06409bf225 is finished (on backend cdse).\n", - "2024-03-01 10:30:48,098|openeo_gfmap.manager|INFO: Job j-2403019c533442d2a39daa06409bf225 finished successfully, queueing on_job_done...\n", - "2024-03-01 10:30:48,103|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-03-01 10:30:49,187|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmpbq1se34j\n", - "2024-03-01 10:30:49,437|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:30:52,525|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:30:53,724|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:30:54,442|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_10m_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:02,256|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1551152/S2_10m_at2021lpis1551152_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:02,262|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmpge9dgbv0\n", - "2024-03-01 10:31:06,512|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:31:06,730|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_10m_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:10,378|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1313057/S2_10m_at2021lpis1313057_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:10,383|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /tmp/tmp3nvsjpcw\n", - "2024-03-01 10:31:14,156|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:31:14,322|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_10m_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:21,636|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-2403019c533442d2a39daa06409bf225 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis1561389/S2_10m_at2021lpis1561389_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:31:21,639|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2403019c533442d2a39daa06409bf225...\n", - "2024-03-01 10:31:27,588|openeo_gfmap.manager|INFO: Job j-2403019c533442d2a39daa06409bf225 and post job action finished successfully.\n", - "2024-03-01 10:31:54,256|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:31:55,227|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:31:55,513|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:31:58,444|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:32:59,735|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:32:59,928|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:33:00,659|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is running (on backend cdse).\n", - "2024-03-01 10:33:03,584|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:34:05,570|openeo_gfmap.manager|DEBUG: Updating status. 3 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:34:05,963|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:34:06,940|openeo_gfmap.manager|DEBUG: Status of job j-24030154ae7f4f79a0e41755c15284d1 is finished (on backend cdse).\n", - "2024-03-01 10:34:06,942|openeo_gfmap.manager|INFO: Job j-24030154ae7f4f79a0e41755c15284d1 finished successfully, queueing on_job_done...\n", - "2024-03-01 10:34:06,944|openeo_gfmap.manager|DEBUG: Worker thread Thread-4: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-03-01 10:34:09,897|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:34:10,039|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /tmp/tmpyql62246\n", - "2024-03-01 10:34:19,949|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:34:20,159|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis438712/S2_10m_at2021lpis438712_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:34:23,947|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis438712/S2_10m_at2021lpis438712_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:34:23,951|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /tmp/tmpd8j0_ziw\n", - "2024-03-01 10:34:29,240|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:34:29,404|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis929316/S2_10m_at2021lpis929316_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:34:32,680|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24030154ae7f4f79a0e41755c15284d1 -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32633/33TXN/at2021lpis929316/S2_10m_at2021lpis929316_32633_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:34:32,682|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24030154ae7f4f79a0e41755c15284d1...\n", - "2024-03-01 10:34:40,970|openeo_gfmap.manager|INFO: Job j-24030154ae7f4f79a0e41755c15284d1 and post job action finished successfully.\n", - "2024-03-01 10:35:11,174|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:35:11,755|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is running (on backend cdse).\n", - "2024-03-01 10:35:14,759|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:36:15,591|openeo_gfmap.manager|DEBUG: Updating status. 2 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:36:16,138|openeo_gfmap.manager|DEBUG: Status of job j-24030178c3b64df896d1924bfeef1ffb is finished (on backend cdse).\n", - "2024-03-01 10:36:16,139|openeo_gfmap.manager|INFO: Job j-24030178c3b64df896d1924bfeef1ffb finished successfully, queueing on_job_done...\n", - "2024-03-01 10:36:16,143|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-03-01 10:36:17,945|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmp3pmyf_fm\n", - "2024-03-01 10:36:18,933|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:36:22,171|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:36:22,380|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:24,320|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:24,326|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmpd8_1pwec\n", - "2024-03-01 10:36:28,075|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:36:28,464|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_10m_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:30,159|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12525751/S2_10m_2021_LV_LPIS_POLY_110-12525751_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:30,165|openeo_gfmap.manager|DEBUG: Downloading asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /tmp/tmpj64nfeoo\n", - "2024-03-01 10:36:33,518|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:36:33,724|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_10m_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:35,165|openeo_gfmap.manager|INFO: Downloaded asset openEO_2.nc from job j-24030178c3b64df896d1924bfeef1ffb -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32635/35VND/2021_LV_LPIS_POLY_110-12440159/S2_10m_2021_LV_LPIS_POLY_110-12440159_32635_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:36:35,168|openeo_gfmap.manager|DEBUG: Calling post job action for job j-24030178c3b64df896d1924bfeef1ffb...\n", - "2024-03-01 10:36:38,878|openeo_gfmap.manager|INFO: Job j-24030178c3b64df896d1924bfeef1ffb and post job action finished successfully.\n", - "2024-03-01 10:37:19,439|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:37:40,130|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:38:40,858|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:38:43,743|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:39:45,947|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:39:48,756|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:40:50,092|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:40:53,081|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is running (on backend cdse).\n", - "2024-03-01 10:41:53,587|openeo_gfmap.manager|DEBUG: Updating status. 1 on 4 active jobs... -> DF columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", - " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", - " 'memory', 'duration', 'description', 'costs'],\n", - " dtype='object')\n", - "2024-03-01 10:41:56,336|openeo_gfmap.manager|DEBUG: Status of job j-2403016e5d90427ca54853a4756c7f4b is finished (on backend cdse).\n", - "2024-03-01 10:41:56,338|openeo_gfmap.manager|INFO: Job j-2403016e5d90427ca54853a4756c7f4b finished successfully, queueing on_job_done...\n", - "2024-03-01 10:41:56,341|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", - "2024-03-01 10:42:02,403|openeo_gfmap.manager|DEBUG: Downloading asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /tmp/tmpnj3eszqq\n", - "2024-03-01 10:42:08,565|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:42:08,782|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12659485/S2_10m_2021_LV_LPIS_POLY_110-12659485_32634_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:42:10,823|openeo_gfmap.manager|INFO: Downloaded asset openEO_0.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12659485/S2_10m_2021_LV_LPIS_POLY_110-12659485_32634_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:42:10,830|openeo_gfmap.manager|DEBUG: Downloading asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /tmp/tmpqvkiquhy\n", - "2024-03-01 10:42:17,007|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b...\n", - "/tmp/ipykernel_7091/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", - "\n", - " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", - "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super().__setitem__(key, value)\n", - "/tmp/ipykernel_7091/3116825532.py:32: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " intersecting_cells.sort_values('distance', inplace=True)\n", - "2024-03-01 10:42:17,200|openeo_gfmap.manager|DEBUG: Generated path for asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12319250/S2_10m_2021_LV_LPIS_POLY_110-12319250_32634_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:42:18,735|openeo_gfmap.manager|INFO: Downloaded asset openEO_1.nc from job j-2403016e5d90427ca54853a4756c7f4b -> /data/users/Public/couchard/world_cereal/extractions_4/2021_EUR_DEMO_POLY_110/32634/34VEH/2021_LV_LPIS_POLY_110-12319250/S2_10m_2021_LV_LPIS_POLY_110-12319250_32634_2020-08-30_2022-03-03.nc\n", - "2024-03-01 10:42:18,737|openeo_gfmap.manager|DEBUG: Calling post job action for job j-2403016e5d90427ca54853a4756c7f4b...\n", - "2024-03-01 10:42:20,437|openeo_gfmap.manager|INFO: Job j-2403016e5d90427ca54853a4756c7f4b and post job action finished successfully.\n" - ] - } - ], - "source": [ - "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
geometrysample_idlandcover_labelcroptype_labelirrigation_labelconfidenceextractvalid_dateref_idh3index
0POLYGON ((638120.000 5289160.000, 638120.000 5...at2021lpis3907131143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
1POLYGON ((649000.000 5284840.000, 649000.000 5...at2021lpis20312991143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
2POLYGON ((651040.000 5285480.000, 651040.000 5...at2021lpis11508531143800NoneTrue2021-06-012021_EUR_DEMO_POLY_110841e025ffffffff
\n", - "
" - ], - "text/plain": [ - " geometry sample_id \\\n", - "0 POLYGON ((638120.000 5289160.000, 638120.000 5... at2021lpis390713 \n", - "1 POLYGON ((649000.000 5284840.000, 649000.000 5... at2021lpis2031299 \n", - "2 POLYGON ((651040.000 5285480.000, 651040.000 5... at2021lpis1150853 \n", - "\n", - " landcover_label croptype_label irrigation_label confidence extract \\\n", - "0 11 4380 0 None True \n", - "1 11 4380 0 None True \n", - "2 11 4380 0 None True \n", - "\n", - " valid_date ref_id h3index \n", - "0 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff \n", - "1 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff \n", - "2 2021-06-01 2021_EUR_DEMO_POLY_110 841e025ffffffff " - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Loads a geoparquet file from an artifactory public url\n", - "import fsspec\n", - "\n", - "with fsspec.open(\"https://artifactory.vgt.vito.be/artifactory/auxdata-public/gfmap-temp/openeogfmap_dataframe_1.parquet\") as file:\n", - " gdf = gpd.read_parquet(file)\n", - "\n", - "gdf.head()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "\n", - "Name: WGS 84 / UTM zone 33N\n", - "Axis Info [cartesian]:\n", - "- E[east]: Easting (metre)\n", - "- N[north]: Northing (metre)\n", - "Area of Use:\n", - "- name: Between 12°E and 18°E, northern hemisphere between equator and 84°N, onshore and offshore. Austria. Bosnia and Herzegovina. Cameroon. Central African Republic. Chad. Congo. Croatia. Czechia. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard. Sweden. Vatican City State.\n", - "- bounds: (12.0, 0.0, 18.0, 84.0)\n", - "Coordinate Operation:\n", - "- name: UTM zone 33N\n", - "- method: Transverse Mercator\n", - "Datum: World Geodetic System 1984 ensemble\n", - "- Ellipsoid: WGS 84\n", - "- Prime Meridian: Greenwich" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "gdf.crs" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Authenticated using refresh token.\n" - ] - } - ], - "source": [ - "from tempfile import NamedTemporaryFile\n", - "\n", - "connection = cdse_connection()\n", - "job = connection.job('j-24022945a4e5492dbb40a61fca0cc91f')\n", - "tempfile = NamedTemporaryFile()\n", - "for asset in job.get_results().get_assets():\n", - " asset.download(tempfile.name)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "
<xarray.Dataset>\n",
-       "Dimensions:              (t: 167, x: 64, y: 64)\n",
-       "Coordinates:\n",
-       "  * t                    (t) datetime64[ns] 2020-09-01 2020-09-06 ... 2022-03-02\n",
-       "  * x                    (x) float64 5.05e+05 5.051e+05 ... 5.057e+05 5.057e+05\n",
-       "  * y                    (y) float64 6.361e+06 6.361e+06 ... 6.361e+06 6.361e+06\n",
-       "Data variables: (12/15)\n",
-       "    crs                  |S1 ...\n",
-       "    S2-B01               (t, y, x) float32 ...\n",
-       "    S2-B02               (t, y, x) float32 ...\n",
-       "    S2-B03               (t, y, x) float32 ...\n",
-       "    S2-B04               (t, y, x) float32 ...\n",
-       "    S2-B05               (t, y, x) float32 ...\n",
-       "    ...                   ...\n",
-       "    S2-B8A               (t, y, x) float32 ...\n",
-       "    S2-B09               (t, y, x) float32 ...\n",
-       "    S2-B11               (t, y, x) float32 ...\n",
-       "    S2-B12               (t, y, x) float32 ...\n",
-       "    S2-SCL               (t, y, x) float32 ...\n",
-       "    S2-SCL_DILATED_MASK  (t, y, x) float32 ...\n",
-       "Attributes:\n",
-       "    Conventions:  CF-1.9\n",
-       "    institution:  openEO platform - Geotrellis backend: 0.27.1a1\n",
-       "    description:  \n",
-       "    title:        
" - ], - "text/plain": [ - "\n", - "Dimensions: (t: 167, x: 64, y: 64)\n", - "Coordinates:\n", - " * t (t) datetime64[ns] 2020-09-01 2020-09-06 ... 2022-03-02\n", - " * x (x) float64 5.05e+05 5.051e+05 ... 5.057e+05 5.057e+05\n", - " * y (y) float64 6.361e+06 6.361e+06 ... 6.361e+06 6.361e+06\n", - "Data variables: (12/15)\n", - " crs |S1 ...\n", - " S2-B01 (t, y, x) float32 ...\n", - " S2-B02 (t, y, x) float32 ...\n", - " S2-B03 (t, y, x) float32 ...\n", - " S2-B04 (t, y, x) float32 ...\n", - " S2-B05 (t, y, x) float32 ...\n", - " ... ...\n", - " S2-B8A (t, y, x) float32 ...\n", - " S2-B09 (t, y, x) float32 ...\n", - " S2-B11 (t, y, x) float32 ...\n", - " S2-B12 (t, y, x) float32 ...\n", - " S2-SCL (t, y, x) float32 ...\n", - " S2-SCL_DILATED_MASK (t, y, x) float32 ...\n", - "Attributes:\n", - " Conventions: CF-1.9\n", - " institution: openEO platform - Geotrellis backend: 0.27.1a1\n", - " description: \n", - " title: " - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "import xarray as xr\n", - "\n", - "inopt = xr.open_dataset(tempfile.name)\n", - "inopt" + "# Run the jobs and create the STAC catalogue\n", + "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)\n", + "manager.create_stac() # By default the STAC catalogue will be saved in the stac subfolder of the base_output_dir folder." ] } ], diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 5924b5d..8c08fae 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -38,8 +38,6 @@ def __init__( ): self._output_dir = output_dir - self._downloaded_products = {} - # Setup the threads to work on the on_job_done and on_job_error methods self._finished_job_queue = queue.Queue() self._n_threads = n_threads @@ -195,6 +193,8 @@ def on_job_done(self, job: BatchJob, row: pd.Series): # First update the STAC collection with the assets directly resulting from the OpenEO batch job job_metadata = pystac.Collection.from_dict(job.get_results().get_metadata()) + job_items = [] + for item_metadata in job_metadata.get_all_items(): try: item = pystac.read_file(item_metadata.get_self_href()) @@ -208,11 +208,9 @@ def on_job_done(self, job: BatchJob, row: pd.Series): asset_path ) # Update the asset href to the output location set by the output_path_generator item.id = f"{job.job_id}_{item.id}" - # Add the item to the root_collection - self._root_collection.add_item(item) - _log.info( - f"Added item {item.id} from job {job.job_id} to STAC collection" - ) + # Add the item to the the current job items. + job_items.append(item) + _log.info(f"Parsed item {item.id} from job {job.job_id}") except Exception as e: _log.exception( f"Error failed to add item {item.id} from job {job.job_id} to STAC collection", @@ -220,15 +218,15 @@ def on_job_done(self, job: BatchJob, row: pd.Series): ) raise e - # TODO: post_job_action should return dict with Asset STAC metadata, then add that metadata to the correct STAC items - # Call the post job action + # _post_job_action returns an updated list of stac items. Post job action can therefore + # update the stac items and access their products through the HREF. It is also the + # reponsible of adding the appropriate metadata/assets to the items. if self._post_job_action is not None: _log.debug(f"Calling post job action for job {job.job_id}...") - job_products = self._post_job_action( - job_products, row, self._post_job_params - ) + job_items = self._post_job_action(job_items, row, self._post_job_params) - self._downloaded_products.update(job_products) + self._root_collection.add_items(job_items) + _log.info(f"Added {len(job_items)} items to the STAC collection.") _log.info(f"Job {job.job_id} and post job action finished successfully.") @@ -300,7 +298,6 @@ def run_jobs( _log.info("Workers started, creating and running jobs.") super().run_jobs(df, start_job, output_file) - # TODO: immediately make create_stac optional in 'run_jobs'? def create_stac(self, output_path: Optional[Union[str, Path]] = None): """Method to be called after run_jobs to create a STAC catalog and write it to self._output_dir diff --git a/src/openeo_gfmap/stac/__init__.py b/src/openeo_gfmap/stac/__init__.py index 5269453..a0b68a1 100644 --- a/src/openeo_gfmap/stac/__init__.py +++ b/src/openeo_gfmap/stac/__init__.py @@ -1,2 +1,6 @@ """Definitions of the constants in the STAC collection """ + +from openeo_gfmap.stac.constants import AUXILIARY + +__all__ = ["AUXILIARY"] diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index 204e5c8..ef1b9bc 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -90,20 +90,20 @@ def create_spatial_dimension( BANDS_DIMENSION = pystac.extensions.datacube.AdditionalDimension( { "values": [ - "SCL", - "B01", - "B02", - "B03", - "B04", - "B05", - "B06", - "B07", - "B08", - "B8A", - "B09", - "B10", - "B11", - "B12", + "S2-SCL", + "S2-B01", + "S2-B02", + "S2-B03", + "S2-B04", + "S2-B05", + "S2-B06", + "S2-B07", + "S2-B08", + "S2-B8A", + "S2-B09", + "S2-B10", + "S2-B11", + "S2-B12", "CROPTYPE", ] } @@ -124,84 +124,84 @@ def create_spatial_dimension( "type": "application/x-netcdf", "roles": ["data"], "proj:shape": [64, 64], - "raster:bands": [{"name": "B01"}, {"name": "B02"}], + "raster:bands": [{"name": "S2-B01"}, {"name": "S2-B02"}], "cube:variables": { - "B01": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B02": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B03": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B04": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B05": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B06": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B07": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B8A": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B08": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B11": {"dimensions": ["time", "y", "x"], "type": "data"}, - "B12": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B01": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B02": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B03": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B04": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B05": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B06": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B07": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B8A": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B08": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B11": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-B12": {"dimensions": ["time", "y", "x"], "type": "data"}, "SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, }, "eo:bands": [ { - "name": "B01", + "name": "S2-B01", "common_name": "coastal", "center_wavelength": 0.443, "full_width_half_max": 0.027, }, { - "name": "B02", + "name": "S2-B02", "common_name": "blue", "center_wavelength": 0.49, "full_width_half_max": 0.098, }, { - "name": "B03", + "name": "S2-B03", "common_name": "green", "center_wavelength": 0.56, "full_width_half_max": 0.045, }, { - "name": "B04", + "name": "S2-B04", "common_name": "red", "center_wavelength": 0.665, "full_width_half_max": 0.038, }, { - "name": "B05", + "name": "S2-B05", "common_name": "rededge", "center_wavelength": 0.704, "full_width_half_max": 0.019, }, { - "name": "B06", + "name": "S2-B06", "common_name": "rededge", "center_wavelength": 0.74, "full_width_half_max": 0.018, }, { - "name": "B07", + "name": "S2-B07", "common_name": "rededge", "center_wavelength": 0.783, "full_width_half_max": 0.028, }, { - "name": "B08", + "name": "S2-B08", "common_name": "nir", "center_wavelength": 0.842, "full_width_half_max": 0.145, }, { - "name": "B8A", + "name": "S2-B8A", "common_name": "nir08", "center_wavelength": 0.865, "full_width_half_max": 0.033, }, { - "name": "B11", + "name": "S2-B11", "common_name": "swir16", "center_wavelength": 1.61, "full_width_half_max": 0.143, }, { - "name": "B12", + "name": "S2-B12", "common_name": "swir22", "center_wavelength": 2.19, "full_width_half_max": 0.242, From 0b54d35bcd8f87195566f730f5172de9bf388753 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Thu, 7 Mar 2024 13:28:47 +0100 Subject: [PATCH 15/24] Fix isort --- src/openeo_gfmap/fetching/commons.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/openeo_gfmap/fetching/commons.py b/src/openeo_gfmap/fetching/commons.py index 06680c5..3fc2bda 100644 --- a/src/openeo_gfmap/fetching/commons.py +++ b/src/openeo_gfmap/fetching/commons.py @@ -3,7 +3,6 @@ from typing import Optional, Union import openeo -from openeo.rest.vectorcube import VectorCube from geojson import GeoJSON from rasterio import CRS from rasterio.errors import CRSError @@ -117,8 +116,8 @@ def load_collection( spatial_extent["type"] == "FeatureCollection" ), "Please provide a FeatureCollection type of GeoJSON" elif isinstance(spatial_extent, str): - assert ( - spatial_extent.startswith('https://') or spatial_extent.startswith('http://') + assert spatial_extent.startswith("https://") or spatial_extent.startswith( + "http://" ), "Please provide a valid URL or a path to a GeoJSON file." else: raise ValueError( @@ -141,7 +140,10 @@ def load_collection( if fetch_type == FetchType.POLYGON: if isinstance(spatial_extent, str): - geometry = connection.load_url(spatial_extent, format="Parquet" if ".parquet" in spatial_extent else "GeoJSON") + geometry = connection.load_url( + spatial_extent, + format="Parquet" if ".parquet" in spatial_extent else "GeoJSON", + ) cube = cube.filter_spatial(geometry) else: cube = cube.filter_spatial(spatial_extent) From 1642244586f4a900f4f6079277c9899bc62ad47f Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Thu, 7 Mar 2024 13:33:30 +0100 Subject: [PATCH 16/24] Fix black --- src/openeo_gfmap/backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openeo_gfmap/backend.py b/src/openeo_gfmap/backend.py index ad261e7..caf4c3f 100644 --- a/src/openeo_gfmap/backend.py +++ b/src/openeo_gfmap/backend.py @@ -106,5 +106,5 @@ def eodc_connection() -> openeo.Connection: BACKEND_CONNECTIONS: Dict[Backend, Callable] = { Backend.TERRASCOPE: vito_connection, Backend.CDSE: cdse_connection, - Backend.CDSE_STAGING: cdse_staging_connection + Backend.CDSE_STAGING: cdse_staging_connection, } From 1388d542d0b85198c72ac581f3ad0171c5508476 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Thu, 7 Mar 2024 13:35:52 +0100 Subject: [PATCH 17/24] Blackified according to main branch --- src/openeo_gfmap/fetching/commons.py | 4 +- src/openeo_gfmap/fetching/s1.py | 4 +- src/openeo_gfmap/fetching/s2.py | 4 +- src/openeo_gfmap/manager/job_manager.py | 44 +++++-------------- src/openeo_gfmap/manager/job_splitters.py | 4 +- src/openeo_gfmap/preprocessing/compositing.py | 17 ++----- src/openeo_gfmap/stac/constants.py | 4 +- 7 files changed, 20 insertions(+), 61 deletions(-) diff --git a/src/openeo_gfmap/fetching/commons.py b/src/openeo_gfmap/fetching/commons.py index 3fc2bda..69dc65f 100644 --- a/src/openeo_gfmap/fetching/commons.py +++ b/src/openeo_gfmap/fetching/commons.py @@ -120,9 +120,7 @@ def load_collection( "http://" ), "Please provide a valid URL or a path to a GeoJSON file." else: - raise ValueError( - "Please provide a valid URL to a GeoParquet or GeoJSON file." - ) + raise ValueError("Please provide a valid URL to a GeoParquet or GeoJSON file.") cube = connection.load_collection( collection_id=collection_name, temporal_extent=[temporal_extent.start_date, temporal_extent.end_date], diff --git a/src/openeo_gfmap/fetching/s1.py b/src/openeo_gfmap/fetching/s1.py index 5d714ee..b67d3c8 100644 --- a/src/openeo_gfmap/fetching/s1.py +++ b/src/openeo_gfmap/fetching/s1.py @@ -132,9 +132,7 @@ def s1_grd_default_processor(cube: openeo.DataCube, **params): }, Backend.CDSE_STAGING: { "default": partial(get_s1_grd_default_fetcher, collection_name="SENTINEL1_GRD"), - "preprocessor": partial( - get_s1_grd_default_processor, collection_name="SENTINEL1_GRD" - ), + "preprocessor": partial(get_s1_grd_default_processor, collection_name="SENTINEL1_GRD"), }, } diff --git a/src/openeo_gfmap/fetching/s2.py b/src/openeo_gfmap/fetching/s2.py index aaa7fbc..52fd5b6 100644 --- a/src/openeo_gfmap/fetching/s2.py +++ b/src/openeo_gfmap/fetching/s2.py @@ -188,9 +188,7 @@ def s2_l2a_default_processor(cube: openeo.DataCube, **params): }, Backend.CDSE_STAGING: { "fetch": partial(get_s2_l2a_default_fetcher, collection_name="SENTINEL2_L2A"), - "preprocessor": partial( - get_s2_l2a_default_processor, collection_name="SENTINEL2_L2A" - ), + "preprocessor": partial(get_s2_l2a_default_processor, collection_name="SENTINEL2_L2A"), }, } diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 8c08fae..1ea1e75 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -79,9 +79,7 @@ def _post_job_worker(self): except queue.Empty: continue except KeyboardInterrupt: - _log.debug( - f"Worker thread {threading.current_thread().name} interrupted." - ) + _log.debug(f"Worker thread {threading.current_thread().name} interrupted.") return def _update_statuses(self, df: pd.DataFrame): @@ -106,19 +104,13 @@ def _update_statuses(self, df: pd.DataFrame): if (df.loc[idx, "status"] in ["created", "queued", "running"]) and ( job_metadata["status"] == "finished" ): - _log.info( - f"Job {job.job_id} finished successfully, queueing on_job_done..." - ) + _log.info(f"Job {job.job_id} finished successfully, queueing on_job_done...") self._finished_job_queue.put((PostJobStatus.FINISHED, job, row)) df.loc[idx, "costs"] = job_metadata["costs"] # Case in which it failed - if (df.loc[idx, "status"] != "error") and ( - job_metadata["status"] == "error" - ): - _log.info( - f"Job {job.job_id} finished with error, queueing on_job_error..." - ) + if (df.loc[idx, "status"] != "error") and (job_metadata["status"] == "error"): + _log.info(f"Job {job.job_id} finished with error, queueing on_job_error...") self._finished_job_queue.put((PostJobStatus.ERROR, job, row)) df.loc[idx, "costs"] = job_metadata["costs"] @@ -141,9 +133,7 @@ def on_job_error(self, job: BatchJob, row: pd.Series): title = job_metadata["title"] job_id = job_metadata["id"] - output_log_path = ( - Path(self._output_dir) / "failed_jobs" / f"{title}_{job_id}.log" - ) + output_log_path = Path(self._output_dir) / "failed_jobs" / f"{title}_{job_id}.log" output_log_path.parent.mkdir(parents=True, exist_ok=True) if len(error_logs) > 0: @@ -168,9 +158,7 @@ def on_job_done(self, job: BatchJob, row: pd.Series): _log.debug( f"Generating output path for asset {asset.name} from job {job.job_id}..." ) - output_path = self._output_path_gen( - self._output_dir, temp_file.name, idx, row - ) + output_path = self._output_path_gen(self._output_dir, temp_file.name, idx, row) _log.debug( f"Generated path for asset {asset.name} from job {job.job_id} -> {output_path}" ) @@ -180,13 +168,9 @@ def on_job_done(self, job: BatchJob, row: pd.Series): shutil.move(temp_file.name, output_path) # Add to the list of downloaded products job_products[f"{job.job_id}_{asset.name}"] = [output_path] - _log.info( - f"Downloaded asset {asset.name} from job {job.job_id} -> {output_path}" - ) + _log.info(f"Downloaded asset {asset.name} from job {job.job_id} -> {output_path}") except Exception as e: - _log.exception( - f"Error downloading asset {asset.name} from job {job.job_id}", e - ) + _log.exception(f"Error downloading asset {asset.name} from job {job.job_id}", e) raise e finally: shutil.rmtree(temp_file.name, ignore_errors=True) @@ -200,9 +184,7 @@ def on_job_done(self, job: BatchJob, row: pd.Series): item = pystac.read_file(item_metadata.get_self_href()) asset_path = job_products[f"{job.job_id}_{item.id}"][0] - assert ( - len(item.assets.values()) == 1 - ), "Each item should only contain one asset" + assert len(item.assets.values()) == 1, "Each item should only contain one asset" for asset in item.assets.values(): asset.href = str( asset_path @@ -249,18 +231,14 @@ def _normalize_df(self, df: pd.DataFrame) -> pd.DataFrame: ("description", None), ("costs", None), ] - new_columns = { - col: val for (col, val) in required_with_default if col not in df.columns - } + new_columns = {col: val for (col, val) in required_with_default if col not in df.columns} df = df.assign(**new_columns) _log.debug(f"Normalizing dataframe. Columns: {df.columns}") return df - def run_jobs( - self, df: pd.DataFrame, start_job: Callable, output_file: Union[str, Path] - ): + def run_jobs(self, df: pd.DataFrame, start_job: Callable, output_file: Union[str, Path]): """Starts the jobs defined in the dataframe and runs the `start_job` function on each job. Parameters diff --git a/src/openeo_gfmap/manager/job_splitters.py b/src/openeo_gfmap/manager/job_splitters.py index 87dc061..aae2db7 100644 --- a/src/openeo_gfmap/manager/job_splitters.py +++ b/src/openeo_gfmap/manager/job_splitters.py @@ -7,9 +7,7 @@ import h3 -def _resplit_group( - polygons: gpd.GeoDataFrame, max_points: int -) -> List[gpd.GeoDataFrame]: +def _resplit_group(polygons: gpd.GeoDataFrame, max_points: int) -> List[gpd.GeoDataFrame]: """Performs re-splitting of a dataset of polygons in a list of datasets""" for i in range(0, len(polygons), max_points): yield polygons.iloc[i : i + max_points].reset_index(drop=True) diff --git a/src/openeo_gfmap/preprocessing/compositing.py b/src/openeo_gfmap/preprocessing/compositing.py index ade3c7c..a0b12f2 100644 --- a/src/openeo_gfmap/preprocessing/compositing.py +++ b/src/openeo_gfmap/preprocessing/compositing.py @@ -7,26 +7,17 @@ import openeo -def median_compositing( - cube: openeo.DataCube, period: Union[str, list] -) -> openeo.DataCube: +def median_compositing(cube: openeo.DataCube, period: Union[str, list]) -> openeo.DataCube: """Perfrom median compositing on the given datacube.""" if isinstance(period, str): - return cube.aggregate_temporal_period( - period=period, reducer="median", dimension="t" - ) + return cube.aggregate_temporal_period(period=period, reducer="median", dimension="t") elif isinstance(period, list): - return cube.aggregate_temporal( - intervals=period, reducer="median", dimension="t" - ) - + return cube.aggregate_temporal(intervals=period, reducer="median", dimension="t") def mean_compositing(cube: openeo.DataCube, period: str) -> openeo.DataCube: """Perfrom mean compositing on the given datacube.""" if isinstance(period, str): - return cube.aggregate_temporal_period( - period=period, reducer="mean", dimension="t" - ) + return cube.aggregate_temporal_period(period=period, reducer="mean", dimension="t") elif isinstance(period, list): return cube.aggregate_temporal(intervals=period, reducer="mean", dimension="t") diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index ef1b9bc..ecf871a 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -217,9 +217,7 @@ def create_spatial_dimension( "type": "application/x-netcdf", "roles": ["data"], "proj:shape": [64, 64], - "raster:bands": [ - {"name": "CROPTYPE", "data_type": "uint16", "bits_per_sample": 16} - ], + "raster:bands": [{"name": "CROPTYPE", "data_type": "uint16", "bits_per_sample": 16}], } ) From 08096233712440d65058fc68a28f2268f5acdc23 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Thu, 7 Mar 2024 17:20:30 +0100 Subject: [PATCH 18/24] Added metadata on post-job action --- .../S2_extraction_example.ipynb | 441 ++++++------------ src/openeo_gfmap/extractions/__init__.py | 11 - src/openeo_gfmap/extractions/commons.py | 41 -- src/openeo_gfmap/extractions/extraction.py | 78 ---- src/openeo_gfmap/extractions/s2.py | 129 ----- 5 files changed, 133 insertions(+), 567 deletions(-) delete mode 100644 src/openeo_gfmap/extractions/__init__.py delete mode 100644 src/openeo_gfmap/extractions/commons.py delete mode 100644 src/openeo_gfmap/extractions/extraction.py delete mode 100644 src/openeo_gfmap/extractions/s2.py diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index 3b7a462..c231fcd 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -72,7 +72,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_splitters.py:53: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_splitters.py:51: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " polygons[\"h3index\"] = polygons.geometry.centroid.apply(\n" ] @@ -81,133 +81,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "334 jobs before filtering empty one (no extraction)\n", - "236 jobs after filtering empty one (no extraction)\n" + "334 sub-datasets.\n", + "236 sub-datasets after filtering sub-datasets with no point to extract.\n" ] - }, - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sample_idlandcover_labelcroptype_labelirrigation_labelconfidenceextractvalid_dateref_idgeometry
02021_LV_LPIS_POLY_110-125531701115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((22.64240 57.42064, 22.64241 57...
1at2021lpis2076941115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((15.87727 48.72497, 15.87735 48...
22021_LV_LPIS_POLY_110-127658891115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((27.14266 56.73090, 27.14278 56...
32021_LV_LPIS_POLY_110-125586901115200NoneTrue2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((25.47958 57.88641, 25.47956 57...
4at2021lpis7786551115200NoneFalse2021-06-012021_EUR_DEMO_POLY_110MULTIPOLYGON (((14.72080 48.40937, 14.72020 48...
\n", - "
" - ], - "text/plain": [ - " sample_id landcover_label croptype_label \\\n", - "0 2021_LV_LPIS_POLY_110-12553170 11 1520 \n", - "1 at2021lpis207694 11 1520 \n", - "2 2021_LV_LPIS_POLY_110-12765889 11 1520 \n", - "3 2021_LV_LPIS_POLY_110-12558690 11 1520 \n", - "4 at2021lpis778655 11 1520 \n", - "\n", - " irrigation_label confidence extract valid_date ref_id \\\n", - "0 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", - "1 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", - "2 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", - "3 0 None True 2021-06-01 2021_EUR_DEMO_POLY_110 \n", - "4 0 None False 2021-06-01 2021_EUR_DEMO_POLY_110 \n", - "\n", - " geometry \n", - "0 MULTIPOLYGON (((22.64240 57.42064, 22.64241 57... \n", - "1 MULTIPOLYGON (((15.87727 48.72497, 15.87735 48... \n", - "2 MULTIPOLYGON (((27.14266 56.73090, 27.14278 56... \n", - "3 MULTIPOLYGON (((25.47958 57.88641, 25.47956 57... \n", - "4 MULTIPOLYGON (((14.72080 48.40937, 14.72020 48... " - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -459,96 +335,7 @@ "cell_type": "code", "execution_count": 4, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
backend_nameout_prefixout_extensionstart_dateend_dategeometry
0cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
1cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
2cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
3cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...
\n", - "
" - ], - "text/plain": [ - " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "\n", - " geometry \n", - "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... \n", - "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... " - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Run a subset of the jobs to test the manager, the selected jobs have a fair amount of geometries to extract\n", "job_df = job_df.iloc[[0, 2, 3, -6]].reset_index(drop=True)" @@ -561,91 +348,8 @@ "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
backend_nameout_prefixout_extensionstart_dateend_dategeometrynb_polygons
0cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...3
1cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...3
2cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...2
3cdseS2_10m.nc2020-08-302022-03-03{\"type\": \"FeatureCollection\", \"features\": [{\"i...2
\n", - "
" - ], "text/plain": [ - " backend_name out_prefix out_extension start_date end_date \\\n", - "0 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "1 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "2 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "3 cdse S2_10m .nc 2020-08-30 2022-03-03 \n", - "\n", - " geometry nb_polygons \n", - "0 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 3 \n", - "1 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 3 \n", - "2 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 2 \n", - "3 {\"type\": \"FeatureCollection\", \"features\": [{\"i... 2 " + "array([3])" ] }, "execution_count": 5, @@ -827,8 +531,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.55 s, sys: 40.7 ms, total: 4.59 s\n", - "Wall time: 4.59 s\n" + "CPU times: user 4.62 s, sys: 85.2 ms, total: 4.71 s\n", + "Wall time: 5.03 s\n" ] } ], @@ -912,10 +616,23 @@ "cell_type": "code", "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "<>:16: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n", + "<>:16: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n", + "/tmp/ipykernel_4054/2115750546.py:16: SyntaxWarning: assertion is always true, perhaps remove parentheses?\n", + " assert (\n" + ] + } + ], "source": [ - "from openeo_gfmap.stac import AUXILIARY\n", + "from importlib.metadata import version\n", + "from datetime import datetime\n", "\n", + "from openeo_gfmap.stac import AUXILIARY\n", "from rasterio.features import rasterize\n", "from rasterio.transform import from_bounds\n", "import pystac\n", @@ -947,6 +664,20 @@ " # Read information from the item file (could also read it from the item object metadata)\n", " result_ds = xr.open_dataset(item_asset_path, chunks='auto')\n", "\n", + " # Add some metadata to the result_df netcdf file\n", + " result_ds.attrs.update({\n", + " 'start_date': row.start_date,\n", + " 'end_date': row.end_date,\n", + " 'valid_date': valid_date,\n", + " 'GFMAP_version': version('openeo_gfmap'),\n", + " 'creation_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),\n", + " 'description': f'Sentinel2 L2A observations for sample: {sample_id}, unprocessed.',\n", + " 'title': f'Sentinel2 L2A - {sample_id}',\n", + " 'sample_id': sample_id,\n", + " 'spatial_resolution': '10m'\n", + " })\n", + " result_ds.to_netcdf(item_asset_path, format='NETCDF4', engine='h5netcdf')\n", + "\n", " target_crs = CRS.from_wkt(result_ds.crs.attrs['crs_wkt'])\n", "\n", " # Get the surrounding polygons around our extracted center geometry to rastetize them\n", @@ -982,6 +713,11 @@ " 'valid_date': valid_date,\n", " '_FillValue': fill_value,\n", " 'Conventions': 'CF-1.9',\n", + " 'GFMAP_version': version('openeo_gfmap'),\n", + " 'creation_date': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),\n", + " 'description': f'Contains rasterized WorldCereal labels for sample: {sample_id}.',\n", + " 'title': f'WORLDCEREAL Auxiliary file for sample: {sample_id}',\n", + " 'spatial_resolution': '10m'\n", " }\n", "\n", " aux_dataset = xr.Dataset(\n", @@ -1024,7 +760,8 @@ "from openeo_gfmap.manager.job_manager import GFMAPJobManager\n", "from openeo_gfmap.backend import cdse_staging_connection\n", "\n", - "base_output_dir = Path('./extraction/')\n", + "\n", + "base_output_dir = Path('/data/users/Public/couchard/world_cereal/extractions_5/')\n", "tracking_job_csv = base_output_dir / 'job_tracker.csv'\n", "\n", "manager = GFMAPJobManager(\n", @@ -1043,9 +780,97 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-07 14:32:38,392|openeo_gfmap.manager|INFO: Starting job manager using 2 worker threads.\n", + "2024-03-07 14:32:38,395|openeo_gfmap.manager|INFO: Workers started, creating and running jobs.\n", + "2024-03-07 14:32:38,592|openeo_gfmap.manager|DEBUG: Normalizing dataframe. Columns: Index(['backend_name', 'out_prefix', 'out_extension', 'start_date', 'end_date',\n", + " 'geometry', 'nb_polygons', 'status', 'id', 'start_time', 'cpu',\n", + " 'memory', 'duration', 'description', 'costs'],\n", + " dtype='object')\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Authenticated using refresh token.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-07 14:32:40,375|openeo_gfmap.manager|DEBUG: Number of polygons to extract: 3\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DataCube()\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2024-03-07 14:34:05,989|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:35:06,713|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:36:07,149|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:37:08,393|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:38:08,991|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:39:09,497|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:40:11,296|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:41:12,353|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:42:13,100|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:43:13,535|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:44:14,023|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:45:14,444|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:46:14,884|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:47:15,338|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:48:15,855|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:49:18,136|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:50:19,075|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:51:19,412|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:52:19,838|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:53:21,069|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:54:21,621|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:55:22,007|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:56:22,363|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is running (on backend cdse-staging).\n", + "2024-03-07 14:57:23,108|openeo_gfmap.manager|DEBUG: Status of job j-240307f2186344ee9bed9c649679dc92 is finished (on backend cdse-staging).\n", + "2024-03-07 14:57:23,110|openeo_gfmap.manager|INFO: Job j-240307f2186344ee9bed9c649679dc92 finished successfully, queueing on_job_done...\n", + "2024-03-07 14:57:23,115|openeo_gfmap.manager|DEBUG: Worker thread Thread-5: polled finished job with status PostJobStatus.FINISHED.\n", + "2024-03-07 14:57:24,650|openeo_gfmap.manager|DEBUG: Downloading asset openEO.nc from job j-240307f2186344ee9bed9c649679dc92 -> /tmp/tmpyu7z9urd\n", + "2024-03-07 14:57:43,859|openeo_gfmap.manager|DEBUG: Generating output path for asset openEO.nc from job j-240307f2186344ee9bed9c649679dc92...\n", + "/tmp/ipykernel_4054/3116825532.py:31: UserWarning: Geometry is in a geographic CRS. Results from 'distance' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " intersecting_cells['distance'] = intersecting_cells.distance(centroid_latlon)\n", + "/home/couchard/miniconda3/envs/gfmap/lib/python3.9/site-packages/geopandas/geodataframe.py:1543: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super().__setitem__(key, value)\n", + "/tmp/ipykernel_4054/3116825532.py:32: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " intersecting_cells.sort_values('distance', inplace=True)\n", + "2024-03-07 14:57:44,390|openeo_gfmap.manager|DEBUG: Generated path for asset openEO.nc from job j-240307f2186344ee9bed9c649679dc92 -> /data/users/Public/couchard/world_cereal/extractions_5/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-07 14:57:48,864|openeo_gfmap.manager|INFO: Downloaded asset openEO.nc from job j-240307f2186344ee9bed9c649679dc92 -> /data/users/Public/couchard/world_cereal/extractions_5/2021_EUR_DEMO_POLY_110/32635/35VMD/2021_LV_LPIS_POLY_110-12880341/S2_10m_2021_LV_LPIS_POLY_110-12880341_32635_2020-08-30_2022-03-03.nc\n", + "2024-03-07 14:57:54,824|openeo_gfmap.manager|INFO: Parsed item j-240307f2186344ee9bed9c649679dc92_openEO.nc from job j-240307f2186344ee9bed9c649679dc92\n", + "2024-03-07 14:57:54,826|openeo_gfmap.manager|DEBUG: Calling post job action for job j-240307f2186344ee9bed9c649679dc92...\n", + "2024-03-07 14:57:55,644|openeo_gfmap.manager|INFO: Added 1 items to the STAC collection.\n", + "2024-03-07 14:57:55,646|openeo_gfmap.manager|INFO: Job j-240307f2186344ee9bed9c649679dc92 and post job action finished successfully.\n" + ] + } + ], "source": [ "# Run the jobs and create the STAC catalogue\n", "manager.run_jobs(job_df, create_datacube_s2, tracking_job_csv)\n", diff --git a/src/openeo_gfmap/extractions/__init__.py b/src/openeo_gfmap/extractions/__init__.py deleted file mode 100644 index 543009c..0000000 --- a/src/openeo_gfmap/extractions/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Extraction sub-module. - -Logic behind the extraction of training or inference data. Different backends -are supported in order to obtain a very similar result at the end of this -component. -""" - -from .extraction import CollectionExtractor -from .s2 import build_sentinel2_l2a_extractor - -__all__ = ["build_sentinel2_l2a_extractor", "CollectionExtractor"] diff --git a/src/openeo_gfmap/extractions/commons.py b/src/openeo_gfmap/extractions/commons.py deleted file mode 100644 index d43d523..0000000 --- a/src/openeo_gfmap/extractions/commons.py +++ /dev/null @@ -1,41 +0,0 @@ -""" Common operations within collection extraction logic, such as reprojection. -""" -from typing import Optional, Union - -import openeo -from rasterio import CRS -from rasterio.errors import CRSError - - -def resample_reproject( - datacube: openeo.DataCube, resolution: float, epsg_code: Optional[Union[str, int]] -) -> openeo.DataCube: - """Reprojects the given datacube to the target epsg code, if the provided - epsg code is not None. Also performs checks on the give code to check - its validity. - """ - if epsg_code is not None: - # Checks that the code is valid - try: - CRS.from_epsg(int(epsg_code)) - except (CRSError, ValueError) as exc: - raise ValueError( - f"Specified target_crs: {epsg_code} is not a valid " "EPSG code." - ) from exc - return datacube.resample_spatial(resolution=resolution, projection=epsg_code) - return datacube.resample_spatial(resolution=resolution) - - -def rename_bands(datacube: openeo.DataCube, mapping: dict) -> openeo.DataCube: - """Rename the bands from the given mapping scheme""" - # Filter out bands that are not part of the datacube - print(datacube.dimension_labels("bands")) - - def filter_condition(band_name, _): - return band_name in datacube.dimension_labels("bands") - - mapping = {k: v for k, v in mapping.items() if filter_condition(k, v)} - - return datacube.rename_labels( - dimension="bands", target=list(mapping.values()), source=list(mapping.keys()) - ) diff --git a/src/openeo_gfmap/extractions/extraction.py b/src/openeo_gfmap/extractions/extraction.py deleted file mode 100644 index 902dc57..0000000 --- a/src/openeo_gfmap/extractions/extraction.py +++ /dev/null @@ -1,78 +0,0 @@ -""" Main file for extractions and pre-processing of data through OpenEO -""" - -from typing import Callable - -import openeo - -from openeo_gfmap import BackendContext -from openeo_gfmap.spatial import SpatialContext -from openeo_gfmap.temporal import TemporalContext - - -class CollectionExtractor: - """Base class to extract a particolar collection. - - Parameters - ---------- - backend_context: BackendContext - Information about the backend in use, useful in certain cases. - bands: list - List of band names to load from that collection. - collection_fetch: Callable - Function defining how to fetch a collection for a specific backend, - the function accepts the following parameters: connection, - spatial extent, temporal extent, bands and additional parameters. - collection_preprocessing: Callable - Function defining how to harmonize the data of a collection in a - backend. For example, this function could rename the bands as they - can be different for every backend/collection (SENTINEL2_L2A or - SENTINEL2_L2A_SENTINELHUB). Accepts the following parameters: - datacube (of pre-fetched collection) and additional parameters. - colection_params: dict - Additional parameters encoded within a dictionnary that will be - passed in the fetch and preprocessing function. - """ - - def __init__( - self, - backend_context: BackendContext, - bands: list, - collection_fetch: Callable, - collection_preprocessing: Callable, - **collection_params, - ): - self.backend_contect = backend_context - self.bands = bands - self.fetcher = collection_fetch - self.processing = collection_preprocessing - self.params = collection_params - - def get_cube( - self, - connection: openeo.Connection, - spatial_context: SpatialContext, - temporal_context: TemporalContext, - ) -> openeo.DataCube: - """Retrieve a data cube from the given spatial and temporal context. - - Parameters - ---------- - connection: openeo.Connection - A connection to an OpenEO backend. The backend provided must be the - same as the one this extractor class is configured for. - spatial_extent: SpatialContext - Either a GeoJSON collection on which spatial filtering will be - applied or a bounding box with an EPSG code. If a bounding box is - provided, no filtering is applied and the entirety of the data is - fetched for that region. - temporal_extent: TemporalContext - The begin and end date of the extraction. - """ - collection_data = self.fetcher( - connection, spatial_context, temporal_context, self.bands, **self.params - ) - - preprocessed_data = self.processing(collection_data, **self.params) - - return preprocessed_data diff --git a/src/openeo_gfmap/extractions/s2.py b/src/openeo_gfmap/extractions/s2.py deleted file mode 100644 index 342f963..0000000 --- a/src/openeo_gfmap/extractions/s2.py +++ /dev/null @@ -1,129 +0,0 @@ -""" Extraction of S2 features, depending on the backend. -""" -from typing import Callable - -import openeo -from geojson import GeoJSON - -from openeo_gfmap.backend import Backend, BackendContext -from openeo_gfmap.spatial import BoundingBoxExtent, SpatialContext -from openeo_gfmap.temporal import TemporalContext - -from .commons import rename_bands, resample_reproject -from .extraction import CollectionExtractor - -BASE_SENTINEL2_L2A_MAPPING = { - "B01": "S2-B01", - "B02": "S2-B02", - "B03": "S2-B03", - "B04": "S2-B04", - "B05": "S2-B05", - "B06": "S2-B06", - "B07": "S2-B07", - "B08": "S2-B08", - "B8A": "S2-B8A", - "B09": "S2-B09", - "B11": "S2-B11", - "B12": "S2-B12", - "AOT": "S2-AOT", - "SCL": "S2-SCL", - "SNW": "S2-SNW", - "CLD": "S2-CLD", - "CLP": "s2cloudless-CLP", - "CLM": "s2clodless-CLM", -} - - -BAND_MAPPINGS = { - "SENTINEL2_L2A": BASE_SENTINEL2_L2A_MAPPING, -} - - -def get_s2_l2a_default_fetcher(collection_name: str) -> Callable: - """Builds the fetch function from the collection name as it stored in the - target backend. - """ - - def s2_l2a_fetch_default( - connection: openeo.Connection, - spatial_extent: SpatialContext, - temporal_extent: TemporalContext, - bands: list, - **params, - ) -> openeo.DataCube: - """Default collection fetcher for Sentinel_L2A collections. - Parameters - ---------- - connection: openeo.Connection - Connection to a general backend. - spatial_extent: SpatialContext - Either a GeoJSON collection or a bounding box of locations. - Performs spatial filtering if the spatial context is a GeoJSON - collection, as it implies sparse data. - temporal_extent: TemporalContexct - A time range, defined by a start and end date. - bands: list - The name of the bands to load from that collection - Returns - ------- - openeo.DataCube: a datacube containing the collection raw products. - """ - if isinstance(spatial_extent, BoundingBoxExtent): - spatial_extent = dict(spatial_extent) - elif isinstance(spatial_extent, GeoJSON): - assert ( - spatial_extent.get("crs", None) is not None - ), "CRS not defined within GeoJSON collection." - spatial_extent = dict(spatial_extent) - - cube = connection.load_collection(collection_name, spatial_extent, temporal_extent, bands) - - # Apply if the collection is a GeoJSON Feature collection - if isinstance(spatial_extent, GeoJSON): - cube = cube.filter_spatial(spatial_extent) - - return cube - - return s2_l2a_fetch_default - - -def get_s2_l2a_default_processor(collection_name: str) -> Callable: - """Builds the preprocessing function from the collection name as it stored - in the target backend. - """ - - def s2_l2a_default_processor(cube: openeo.DataCube, **params): - """Default collection preprocessing method. - This method performs reprojection if specified, upsampling of bands - at 10m resolution as well as band reprojection. - """ - # Reproject collection data to target CRS, if specified so - cube = resample_reproject(cube, 10.0, params.get("target_crs", None)) - - cube = rename_bands(cube, BAND_MAPPINGS.get(collection_name)) - - return cube - - return s2_l2a_default_processor - - -SENTINEL2_L2A_BACKEND_MAP = { - Backend.TERRASCOPE: { - "fetch": get_s2_l2a_default_fetcher("SENTINEL2_L2A"), - "preprocessor": get_s2_l2a_default_processor("SENTINEL2_L2A"), - } -} - - -def build_sentinel2_l2a_extractor( - backend_context: BackendContext, bands: list, **params -) -> CollectionExtractor: - """Creates a S2 L2A extractor adapted to the given backend.""" - backend_functions = SENTINEL2_L2A_BACKEND_MAP.get(backend_context.backend) - - fetcher, preprocessor = ( - backend_functions["fetch"], - backend_functions["preprocessor"], - ) - - return CollectionExtractor(backend_context, bands, fetcher, preprocessor, **params) From 5b775ea6bee6150954acb0e02541f508ce1910a7 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Fri, 8 Mar 2024 14:29:15 +0100 Subject: [PATCH 19/24] Removed hardcoded title and ID for STAC catalogue in GFMAP manager for user parameters instead --- examples/extraction_pipelines/S2_extraction_example.ipynb | 8 +++++++- src/openeo_gfmap/manager/job_manager.py | 6 ++++-- src/openeo_gfmap/manager/job_splitters.py | 2 +- src/openeo_gfmap/stac/constants.py | 5 +---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index c231fcd..dedbf85 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -748,7 +748,9 @@ "source": [ "### Sixth and last step: Running the manager\n", "\n", - "Let's initialize and execute the Job Manager as defined the GFMAP, and then run it using the functions defined previously" + "Let's initialize and execute the Job Manager as defined the GFMAP, and then run it using the functions defined previously\n", + "\n", + "STAC related parameters such as `collection_id` and `collection_description` are also required." ] }, { @@ -767,6 +769,10 @@ "manager = GFMAPJobManager(\n", " output_dir=base_output_dir,\n", " output_path_generator=generate_output_path_s2,\n", + " collection_id='SENTINEL-EXTRACTION',\n", + " collection_description=(\n", + " \"Sentinel-2 and Auxiliary data extraction example.\"\n", + " ),\n", " post_job_action=post_job_action,\n", " poll_sleep=60,\n", " n_threads=2,\n", diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 1ea1e75..6021cb2 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -31,6 +31,8 @@ def __init__( self, output_dir: Path, output_path_generator: Callable, + collection_id: str, + collection_description: str = "", post_job_action: Optional[Callable] = None, poll_sleep: int = 5, n_threads: int = 1, @@ -55,8 +57,8 @@ def __init__( # Generate the root STAC collection self._root_collection = pystac.Collection( - id=constants.ID, - description=constants.DESCRIPTION, + id=collection_id, + description=collection_description, extent=None, ) diff --git a/src/openeo_gfmap/manager/job_splitters.py b/src/openeo_gfmap/manager/job_splitters.py index aae2db7..a696b5c 100644 --- a/src/openeo_gfmap/manager/job_splitters.py +++ b/src/openeo_gfmap/manager/job_splitters.py @@ -14,7 +14,7 @@ def _resplit_group(polygons: gpd.GeoDataFrame, max_points: int) -> List[gpd.GeoD def split_job_hex( - polygons: gpd.GeoDataFrame, max_points: int = 500, grid_resolution: int = 4 + polygons: gpd.GeoDataFrame, max_points: int = 500, grid_resolution: int = 3 ) -> List[gpd.GeoDataFrame]: """Split a job into multiple jobs from the position of the polygons/points. The centroid of the geometries to extract are used to select a hexagon in the H3 grid. Using the H3 grid diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index ecf871a..3739bca 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -3,9 +3,6 @@ """ import pystac -TITLE = "WorldCereal Level 1 cache" -ID = "L1-CACHE" -DESCRIPTION = "The Level 1 input data cache contains extracted samples of EO data. It's main use is model calibration, allowing faster iterations by providing a cache." LICENSE = "CC-BY-4.0" LICENSE_LINK = pystac.Link( rel="license", @@ -137,7 +134,7 @@ def create_spatial_dimension( "S2-B08": {"dimensions": ["time", "y", "x"], "type": "data"}, "S2-B11": {"dimensions": ["time", "y", "x"], "type": "data"}, "S2-B12": {"dimensions": ["time", "y", "x"], "type": "data"}, - "SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, }, "eo:bands": [ { From 03aa686ff195ebefcd4bf5651e46a4172ef10d73 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Fri, 8 Mar 2024 14:35:13 +0100 Subject: [PATCH 20/24] Added processing level to S2 --- .../S2_extraction_example.ipynb | 6 +- .../quantile_feature_extractor.py | 30 ++++---- src/openeo_gfmap/fetching/s2.py | 60 +++++++-------- .../preprocessing/cloudmasking.py | 10 +-- src/openeo_gfmap/preprocessing/udf_rank.py | 2 +- src/openeo_gfmap/stac/constants.py | 76 +++++++++---------- src/openeo_gfmap/utils/build_df.py | 2 +- src/openeo_gfmap/utils/tile_processing.py | 2 +- tests/test_openeo_gfmap/test_cloud_masking.py | 14 ++-- .../test_feature_extractors.py | 6 +- tests/test_openeo_gfmap/test_s2_fetchers.py | 25 +++--- 11 files changed, 120 insertions(+), 113 deletions(-) diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb index dedbf85..35e05ab 100644 --- a/examples/extraction_pipelines/S2_extraction_example.ipynb +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -462,7 +462,7 @@ " backend_context = BackendContext(backend)\n", "\n", " fetch_type = FetchType.POLYGON\n", - " bands_to_download = ['S2-B01', 'S2-B02', 'S2-B03', 'S2-B04', 'S2-B05', 'S2-B06', 'S2-B07', 'S2-B08', 'S2-B8A', 'S2-B09', 'S2-B11', 'S2-B12', 'S2-SCL']\n", + " bands_to_download = ['S2-L2A-B01', 'S2-L2A-B02', 'S2-L2A-B03', 'S2-L2A-B04', 'S2-L2A-B05', 'S2-L2A-B06', 'S2-L2A-B07', 'S2-L2A-B08', 'S2-L2A-B8A', 'S2-L2A-B09', 'S2-L2A-B11', 'S2-L2A-B12', 'S2-L2A-SCL']\n", "\n", " # Create the job to extract S2\n", " extraction_parameters = {\n", @@ -481,13 +481,13 @@ " scl_dilated_mask = cube.process(\n", " \"to_scl_dilation_mask\",\n", " data=cube,\n", - " scl_band_name=\"S2-SCL\",\n", + " scl_band_name=\"S2-L2A-SCL\",\n", " kernel1_size=17, # 17px dilation on a 20m layer\n", " kernel2_size=77, # 77px dilation on a 20m layer\n", " mask1_values=[2, 4, 5, 6, 7],\n", " mask2_values=[3, 8, 9, 10, 11],\n", " erosion_kernel_size=3\n", - " ).rename_labels(\"bands\", [\"S2-SCL_DILATED_MASK\"])\n", + " ).rename_labels(\"bands\", [\"S2-L2A-SCL_DILATED_MASK\"])\n", "\n", " cube = cube.merge_cubes(scl_dilated_mask)\n", " cube = cube.linear_scale_range(0, 65534, 0, 65534)\n", diff --git a/examples/feature_extractors/quantile_feature_extractor.py b/examples/feature_extractors/quantile_feature_extractor.py index aafd8b1..8e2f9e3 100644 --- a/examples/feature_extractors/quantile_feature_extractor.py +++ b/examples/feature_extractors/quantile_feature_extractor.py @@ -42,13 +42,13 @@ def output_labels(self) -> list: def execute(self, inarr: xr.DataArray) -> xr.DataArray: # compute indices - b03 = inarr.sel(bands="S2-B03") - b04 = inarr.sel(bands="S2-B04") - b05 = inarr.sel(bands="S2-B05") - b06 = inarr.sel(bands="S2-B06") - b08 = inarr.sel(bands="S2-B08") - b11 = inarr.sel(bands="S2-B11") - b12 = inarr.sel(bands="S2-B12") + b03 = inarr.sel(bands="S2-L2A-B03") + b04 = inarr.sel(bands="S2-L2A-B04") + b05 = inarr.sel(bands="S2-L2A-B05") + b06 = inarr.sel(bands="S2-L2A-B06") + b08 = inarr.sel(bands="S2-L2A-B08") + b11 = inarr.sel(bands="S2-L2A-B11") + b12 = inarr.sel(bands="S2-L2A-B12") ndvi = (b08 - b04) / (b08 + b04) ndwi = (b03 - b08) / (b03 + b08) @@ -100,14 +100,14 @@ def execute(self, inarr: xr.DataArray) -> xr.DataArray: # The bands that you can extract are defined in the code openeo_gfmap.fetching.s2.BASE_SENTINEL2_L2A_MAPPING bands = [ - "S2-B03", - "S2-B04", - "S2-B05", - "S2-B06", - "S2-B08", - "S2-B11", - "S2-B12", - "S2-SCL", + "S2-L2A-B03", + "S2-L2A-B04", + "S2-L2A-B05", + "S2-L2A-B06", + "S2-L2A-B08", + "S2-L2A-B11", + "S2-L2A-B12", + "S2-L2A-SCL", ] # Use the base feching diff --git a/src/openeo_gfmap/fetching/s2.py b/src/openeo_gfmap/fetching/s2.py index 52fd5b6..d513fba 100644 --- a/src/openeo_gfmap/fetching/s2.py +++ b/src/openeo_gfmap/fetching/s2.py @@ -20,39 +20,39 @@ from .fetching import CollectionFetcher, FetchType BASE_SENTINEL2_L2A_MAPPING = { - "B01": "S2-B01", - "B02": "S2-B02", - "B03": "S2-B03", - "B04": "S2-B04", - "B05": "S2-B05", - "B06": "S2-B06", - "B07": "S2-B07", - "B08": "S2-B08", - "B8A": "S2-B8A", - "B09": "S2-B09", - "B11": "S2-B11", - "B12": "S2-B12", - "AOT": "S2-AOT", - "SCL": "S2-SCL", - "SNW": "S2-SNW", + "B01": "S2-L2A-B01", + "B02": "S2-L2A-B02", + "B03": "S2-L2A-B03", + "B04": "S2-L2A-B04", + "B05": "S2-L2A-B05", + "B06": "S2-L2A-B06", + "B07": "S2-L2A-B07", + "B08": "S2-L2A-B08", + "B8A": "S2-L2A-B8A", + "B09": "S2-L2A-B09", + "B11": "S2-L2A-B11", + "B12": "S2-L2A-B12", + "AOT": "S2-L2A-AOT", + "SCL": "S2-L2A-SCL", + "SNW": "S2-L2A-SNW", } ELEMENT84_SENTINEL2_L2A_MAPPING = { - "coastal": "S2-B01", - "blue": "S2-B02", - "green": "S2-B03", - "red": "S2-B04", - "rededge1": "S2-B05", - "rededge2": "S2-B06", - "rededge3": "S2-B07", - "nir": "S2-B08", - "nir08": "S2-B8A", - "nir09": "S2-B09", - "cirrus": "S2-B10", - "swir16": "S2-B11", - "swir22": "S2-B12", - "scl": "S2-SCL", - "aot": "S2-AOT", + "coastal": "S2-L2A-B01", + "blue": "S2-L2A-B02", + "green": "S2-L2A-B03", + "red": "S2-L2A-B04", + "rededge1": "S2-L2A-B05", + "rededge2": "S2-L2A-B06", + "rededge3": "S2-L2A-B07", + "nir": "S2-L2A-B08", + "nir08": "S2-L2A-B8A", + "nir09": "S2-L2A-B09", + "cirrus": "S2-L2A-B10", + "swir16": "S2-L2A-B11", + "swir22": "S2-L2A-B12", + "scl": "S2-L2A-SCL", + "aot": "S2-L2A-AOT", } diff --git a/src/openeo_gfmap/preprocessing/cloudmasking.py b/src/openeo_gfmap/preprocessing/cloudmasking.py index e605689..93289d3 100644 --- a/src/openeo_gfmap/preprocessing/cloudmasking.py +++ b/src/openeo_gfmap/preprocessing/cloudmasking.py @@ -6,8 +6,8 @@ import openeo from openeo.processes import if_, is_nan -SCL_HARMONIZED_NAME: str = "S2-SCL" -BAPSCORE_HARMONIZED_NAME: str = "S2-BAPSCORE" +SCL_HARMONIZED_NAME: str = "S2-L2A-SCL" +BAPSCORE_HARMONIZED_NAME: str = "S2-L2A-BAPSCORE" def mask_scl_dilation(cube: openeo.DataCube, **params: dict) -> openeo.DataCube: @@ -91,7 +91,7 @@ def get_bap_score(cube: openeo.DataCube, **params: dict) -> openeo.DataCube: Returns ------- openeo.DataCube - A 4D datacube containing the BAP score as name 'S2-BAPSCORE'. + A 4D datacube containing the BAP score as name 'S2-L2A-BAPSCORE'. """ udf_path = Path(__file__).parent / "udf_score.py" @@ -159,7 +159,7 @@ def get_bap_mask(cube: openeo.DataCube, period: Union[str, list], **params: dict openeo.DataCube The datacube with the BAP mask applied. """ - # Checks if the S2-SCL band is present in the datacube + # Checks if the S2-L2A-SCL band is present in the datacube assert ( SCL_HARMONIZED_NAME in cube.metadata.band_names ), f"The {SCL_HARMONIZED_NAME} band is not present in the datacube." @@ -196,7 +196,7 @@ def max_score_selection(score): f"'period' must be a string or a list of dates (in YYYY-mm-dd format), got {period}." ) - return rank_mask.rename_labels("bands", ["S2-BAPMASK"]) + return rank_mask.rename_labels("bands", ["S2-L2A-BAPMASK"]) def bap_masking(cube: openeo.DataCube, period: Union[str, list], **params: dict): diff --git a/src/openeo_gfmap/preprocessing/udf_rank.py b/src/openeo_gfmap/preprocessing/udf_rank.py index 7271b61..043712d 100644 --- a/src/openeo_gfmap/preprocessing/udf_rank.py +++ b/src/openeo_gfmap/preprocessing/udf_rank.py @@ -16,7 +16,7 @@ def apply_datacube(cube: XarrayDataCube, context: dict) -> XarrayDataCube: intervals = context.get("intervals", None) array = cube.get_array().transpose("t", "bands", "y", "x") - bap_score = array.sel(bands="S2-BAPSCORE") + bap_score = array.sel(bands="S2-L2A-BAPSCORE") def select_maximum(score: xr.DataArray): max_score = score.max(dim="t") diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index 3739bca..a8b88f9 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -87,20 +87,20 @@ def create_spatial_dimension( BANDS_DIMENSION = pystac.extensions.datacube.AdditionalDimension( { "values": [ - "S2-SCL", - "S2-B01", - "S2-B02", - "S2-B03", - "S2-B04", - "S2-B05", - "S2-B06", - "S2-B07", - "S2-B08", - "S2-B8A", - "S2-B09", - "S2-B10", - "S2-B11", - "S2-B12", + "S2-L2A-SCL", + "S2-L2A-B01", + "S2-L2A-B02", + "S2-L2A-B03", + "S2-L2A-B04", + "S2-L2A-B05", + "S2-L2A-B06", + "S2-L2A-B07", + "S2-L2A-B08", + "S2-L2A-B8A", + "S2-L2A-B09", + "S2-L2A-B10", + "S2-L2A-B11", + "S2-L2A-B12", "CROPTYPE", ] } @@ -121,84 +121,84 @@ def create_spatial_dimension( "type": "application/x-netcdf", "roles": ["data"], "proj:shape": [64, 64], - "raster:bands": [{"name": "S2-B01"}, {"name": "S2-B02"}], + "raster:bands": [{"name": "S2-L2A-B01"}, {"name": "S2-L2A-B02"}], "cube:variables": { - "S2-B01": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B02": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B03": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B04": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B05": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B06": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B07": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B8A": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B08": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B11": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-B12": {"dimensions": ["time", "y", "x"], "type": "data"}, - "S2-SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B01": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B02": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B03": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B04": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B05": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B06": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B07": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B8A": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B08": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B11": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-B12": {"dimensions": ["time", "y", "x"], "type": "data"}, + "S2-L2A-SCL": {"dimensions": ["time", "y", "x"], "type": "data"}, }, "eo:bands": [ { - "name": "S2-B01", + "name": "S2-L2A-B01", "common_name": "coastal", "center_wavelength": 0.443, "full_width_half_max": 0.027, }, { - "name": "S2-B02", + "name": "S2-L2A-B02", "common_name": "blue", "center_wavelength": 0.49, "full_width_half_max": 0.098, }, { - "name": "S2-B03", + "name": "S2-L2A-B03", "common_name": "green", "center_wavelength": 0.56, "full_width_half_max": 0.045, }, { - "name": "S2-B04", + "name": "S2-L2A-B04", "common_name": "red", "center_wavelength": 0.665, "full_width_half_max": 0.038, }, { - "name": "S2-B05", + "name": "S2-L2A-B05", "common_name": "rededge", "center_wavelength": 0.704, "full_width_half_max": 0.019, }, { - "name": "S2-B06", + "name": "S2-L2A-B06", "common_name": "rededge", "center_wavelength": 0.74, "full_width_half_max": 0.018, }, { - "name": "S2-B07", + "name": "S2-L2A-B07", "common_name": "rededge", "center_wavelength": 0.783, "full_width_half_max": 0.028, }, { - "name": "S2-B08", + "name": "S2-L2A-B08", "common_name": "nir", "center_wavelength": 0.842, "full_width_half_max": 0.145, }, { - "name": "S2-B8A", + "name": "S2-L2A-B8A", "common_name": "nir08", "center_wavelength": 0.865, "full_width_half_max": 0.033, }, { - "name": "S2-B11", + "name": "S2-L2A-B11", "common_name": "swir16", "center_wavelength": 1.61, "full_width_half_max": 0.143, }, { - "name": "S2-B12", + "name": "S2-L2A-B12", "common_name": "swir22", "center_wavelength": 2.19, "full_width_half_max": 0.242, diff --git a/src/openeo_gfmap/utils/build_df.py b/src/openeo_gfmap/utils/build_df.py index 7627189..8302b30 100644 --- a/src/openeo_gfmap/utils/build_df.py +++ b/src/openeo_gfmap/utils/build_df.py @@ -27,7 +27,7 @@ def load_json(input_file: Path, bands: list) -> pd.DataFrame: A `pandas.DataFrame` containing a combination of the band names and the timestamps as column names. For example, the Sentinel-2 green band on the 1st October 2020 is will - have the column name `S2-B02:2020-10-01` + have the column name `S2-L2A-B02:2020-10-01` """ df = pd.read_json(input_file) diff --git a/src/openeo_gfmap/utils/tile_processing.py b/src/openeo_gfmap/utils/tile_processing.py index fa1efab..5986eda 100644 --- a/src/openeo_gfmap/utils/tile_processing.py +++ b/src/openeo_gfmap/utils/tile_processing.py @@ -20,7 +20,7 @@ def normalize_array(inarr: xr.DataArray, percentile: float = 0.99) -> xr.DataArr def select_optical_bands(inarr: xr.DataArray) -> xr.DataArray: """Filters and keep only the optical bands for a given array.""" return inarr.sel( - bands=[band for band in inarr.coords["bands"].to_numpy() if band.startswith("S2-B")] + bands=[band for band in inarr.coords["bands"].to_numpy() if band.startswith("S2-L2A-B")] ) diff --git a/tests/test_openeo_gfmap/test_cloud_masking.py b/tests/test_openeo_gfmap/test_cloud_masking.py index 2328f9d..d8b88dc 100644 --- a/tests/test_openeo_gfmap/test_cloud_masking.py +++ b/tests/test_openeo_gfmap/test_cloud_masking.py @@ -42,7 +42,7 @@ def test_bap_score(backend: Backend): # Fetch the datacube s2_extractor = build_sentinel2_l2a_extractor( backend_context=backend_context, - bands=["S2-B04", "S2-B08", "S2-SCL"], + bands=["S2-L2A-B04", "S2-L2A-B08", "S2-L2A-SCL"], fetch_type=FetchType.TILE, **fetching_parameters, ) @@ -51,9 +51,9 @@ def test_bap_score(backend: Backend): # Compute the BAP score bap_score = get_bap_score(cube, **preprocessing_parameters) - ndvi = cube.ndvi(nir="S2-B08", red="S2-B04") + ndvi = cube.ndvi(nir="S2-L2A-B08", red="S2-L2A-B04") - cube = bap_score.merge_cubes(ndvi).rename_labels("bands", ["S2-BAPSCORE", "S2-NDVI"]) + cube = bap_score.merge_cubes(ndvi).rename_labels("bands", ["S2-L2A-BAPSCORE", "S2-L2A-NDVI"]) job = cube.create_job( title="BAP score unittest", @@ -78,7 +78,7 @@ def test_bap_masking(backend: Backend): # Fetch the datacube s2_extractor = build_sentinel2_l2a_extractor( backend_context=backend_context, - bands=["S2-B04", "S2-B03", "S2-B02", "S2-SCL"], + bands=["S2-L2A-B04", "S2-L2A-B03", "S2-L2A-B02", "S2-L2A-SCL"], fetch_type=FetchType.TILE, **fetching_parameters, ) @@ -96,7 +96,7 @@ def test_bap_masking(backend: Backend): cube = cube.linear_scale_range(0, 65535, 0, 65535) # Remove SCL - cube = cube.filter_bands([band for band in cube.metadata.band_names if band != "S2-SCL"]) + cube = cube.filter_bands([band for band in cube.metadata.band_names if band != "S2-L2A-SCL"]) job = cube.create_job( title="BAP compositing unittest", @@ -122,7 +122,7 @@ def test_bap_quintad(backend: Backend): # Fetch the datacube s2_extractor = build_sentinel2_l2a_extractor( backend_context=backend_context, - bands=["S2-SCL"], + bands=["S2-L2A-SCL"], fetch_type=FetchType.TILE, **fetching_parameters, ) @@ -171,7 +171,7 @@ def test_bap_quintad(backend: Backend): s2_extractor = build_sentinel2_l2a_extractor( backend_context=backend_context, - bands=["S2-B04", "S2-B03", "S2-B02", "S2-B08", "S2-SCL"], + bands=["S2-L2A-B04", "S2-L2A-B03", "S2-L2A-B02", "S2-L2A-B08", "S2-L2A-SCL"], fetch_type=FetchType.TILE, **fetching_parameters, ) diff --git a/tests/test_openeo_gfmap/test_feature_extractors.py b/tests/test_openeo_gfmap/test_feature_extractors.py index 621c010..8fe91e4 100644 --- a/tests/test_openeo_gfmap/test_feature_extractors.py +++ b/tests/test_openeo_gfmap/test_feature_extractors.py @@ -34,7 +34,7 @@ def execute(self, inarr: xr.DataArray): from scipy.ndimage import gaussian_filter # Performs some gaussian filtering to blur the RGB bands - rgb_bands = inarr.sel(bands=["S2-B04", "S2-B03", "S2-B02"]) + rgb_bands = inarr.sel(bands=["S2-L2A-B04", "S2-L2A-B03", "S2-L2A-B02"]) for band in rgb_bands.bands: for timestamp in rgb_bands.t: @@ -78,7 +78,7 @@ def test_patch_feature_udf(backend: Backend, connection_fn: Callable): connection = connection_fn() output_path = Path(__file__).parent / f"results/patch_features_{backend.value}.nc/" - bands_to_extract = ["S2-B04", "S2-B03", "S2-B02"] + bands_to_extract = ["S2-L2A-B04", "S2-L2A-B03", "S2-L2A-B02"] # Setup the RGB cube extraction extractor = build_sentinel2_l2a_extractor(backend_context, bands_to_extract, FetchType.TILE) @@ -120,7 +120,7 @@ def test_latlon_extractor(backend: Backend, connection_fn: Callable): REDUCED_TEMPORAL_CONTEXT = TemporalContext(start_date="2023-06-01", end_date="2023-06-30") - bands_to_extract = ["S2-B04"] + bands_to_extract = ["S2-L2A-B04"] extractor = build_sentinel2_l2a_extractor(backend_context, bands_to_extract, FetchType.TILE) diff --git a/tests/test_openeo_gfmap/test_s2_fetchers.py b/tests/test_openeo_gfmap/test_s2_fetchers.py index c6bbfe7..0e18672 100644 --- a/tests/test_openeo_gfmap/test_s2_fetchers.py +++ b/tests/test_openeo_gfmap/test_s2_fetchers.py @@ -86,14 +86,21 @@ def sentinel2_l2a( country = spatial_extent["country"] # Fetch a variety of spatial resolution and metadata from different # providers. - bands = ["S2-B01", "S2-B04", "S2-B08", "S2-B11", "S2-SCL", "S2-AOT"] + bands = [ + "S2-L2A-B01", + "S2-L2A-B04", + "S2-L2A-B08", + "S2-L2A-B11", + "S2-L2A-SCL", + "S2-L2A-AOT", + ] expected_harmonized_names = [ - "S2-B01", - "S2-B04", - "S2-B08", - "S2-B11", - "S2-SCL", - "S2-AOT", + "S2-L2A-B01", + "S2-L2A-B04", + "S2-L2A-B08", + "S2-L2A-B11", + "S2-L2A-SCL", + "S2-L2A-AOT", ] fetching_parameters = ( {"target_resolution": 10.0, "target_crs": 3035} if country == "Belgium" else {} @@ -190,7 +197,7 @@ def sentinel2_l2a_point_based( given polygons. """ context = BackendContext(backend) - bands = ["S2-B01", "S2-B04", "S2-B08", "S2-B11"] + bands = ["S2-L2A-B01", "S2-L2A-B04", "S2-L2A-B08", "S2-L2A-B11"] # Because it it tested in malawi, and this is the EPSG code for the # UTM projection for that zone @@ -234,7 +241,7 @@ def sentinel2_l2a_polygon_based( connection: openeo.Connection, ): context = BackendContext(backend) - bands = ["S2-B02", "S2-B03", "S2-B04"] + bands = ["S2-L2A-B02", "S2-L2A-B03", "S2-L2A-B04"] fetching_parameters = {"target_crs": 3035} # Location in Europe extractor = build_sentinel2_l2a_extractor( From ca7b90f3a9a83d2267ce604550039d1643c72640 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Fri, 8 Mar 2024 14:40:09 +0100 Subject: [PATCH 21/24] In STAC band names renamed WORLDCEREAL to more generic LABEL --- src/openeo_gfmap/stac/constants.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openeo_gfmap/stac/constants.py b/src/openeo_gfmap/stac/constants.py index a8b88f9..0213547 100644 --- a/src/openeo_gfmap/stac/constants.py +++ b/src/openeo_gfmap/stac/constants.py @@ -101,7 +101,7 @@ def create_spatial_dimension( "S2-L2A-B10", "S2-L2A-B11", "S2-L2A-B12", - "CROPTYPE", + "LABEL", ] } ) From dbe6116856908c3f894b5bdfb991a2634d262658 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Fri, 8 Mar 2024 15:08:23 +0100 Subject: [PATCH 22/24] Added processing level for S1 too --- src/openeo_gfmap/fetching/s1.py | 8 ++++---- tests/test_openeo_gfmap/test_s1_fetchers.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/openeo_gfmap/fetching/s1.py b/src/openeo_gfmap/fetching/s1.py index b67d3c8..17d8454 100644 --- a/src/openeo_gfmap/fetching/s1.py +++ b/src/openeo_gfmap/fetching/s1.py @@ -19,10 +19,10 @@ from .fetching import CollectionFetcher, FetchType BASE_SENTINEL1_GRD_MAPPING = { - "VH": "S1-VH", - "HH": "S1-HH", - "HV": "S1-HV", - "VV": "S1-VV", + "VH": "S1-SIGMA0-VH", + "HH": "S1-SIGMA0-HH", + "HV": "S1-SIGMA0-HV", + "VV": "S1-SIGMA0-VV", } diff --git a/tests/test_openeo_gfmap/test_s1_fetchers.py b/tests/test_openeo_gfmap/test_s1_fetchers.py index bf1c7d9..d9cde85 100644 --- a/tests/test_openeo_gfmap/test_s1_fetchers.py +++ b/tests/test_openeo_gfmap/test_s1_fetchers.py @@ -46,8 +46,8 @@ def sentinel1_grd( ): context = BackendContext(backend) country = spatial_extent["country"] - bands = ["S1-VV", "S1-VH"] - expected_harmonized_bands = ["S1-VV", "S1-VH"] + bands = ["S1-SIGMA0-VV", "S1-SIGMA0-VH"] + expected_harmonized_bands = ["S1-SIGMA0-VV", "S1-SIGMA0-VH"] fetching_parameters = { "target_resolution": 10.0, @@ -152,7 +152,7 @@ def sentinel1_grd_point_based( given polygons. """ context = BackendContext(backend) - bands = ["S1-VV", "S1-VH"] + bands = ["S1-SIGMA0-VV", "S1-SIGMA0-VH"] # Because it is tested in malawi, and this is the EPSG code for # the UTM projection in that zone @@ -203,7 +203,7 @@ def sentinel1_grd_polygon_based( connection: openeo.Connection, ): context = BackendContext(backend) - bands = ["S1-VV", "S1-VH"] + bands = ["S1-SIGMA0-VV", "S1-SIGMA0-VH"] fetching_parameters = { "target_crs": 3035, # Location in Europe From e7c31be6567338697042b77591434affc5ce2552 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 11 Mar 2024 11:59:49 +0100 Subject: [PATCH 23/24] Changed imports for UDF in feature_extractor.py file --- .../features/feature_extractor.py | 144 ++++++++---------- .../resources/test_optical_cube.nc | Bin 270299 -> 458520 bytes 2 files changed, 64 insertions(+), 80 deletions(-) diff --git a/src/openeo_gfmap/features/feature_extractor.py b/src/openeo_gfmap/features/feature_extractor.py index 28f6b79..fb92a99 100644 --- a/src/openeo_gfmap/features/feature_extractor.py +++ b/src/openeo_gfmap/features/feature_extractor.py @@ -2,6 +2,8 @@ implementation of feature extractors of a UDF. """ +import inspect +import re from abc import ABC, abstractmethod import numpy as np @@ -13,59 +15,10 @@ from pyproj import Transformer from pyproj.crs import CRS -REQUIRED_IMPORTS = """ -from abc import ABC, abstractmethod - -import openeo -from openeo.udf import XarrayDataCube, inspect -from openeo.udf.udf_data import UdfData - -import xarray as xr -import numpy as np -from pyproj import Transformer -from pyproj.crs import CRS - -from typing import Union -""" - - LAT_HARMONIZED_NAME = "GEO-LAT" LON_HARMONIZED_NAME = "GEO-LON" EPSG_HARMONIZED_NAME = "GEO-EPSG" -# To fill in: EPSG_HARMONIZED_NAME, Is it pixel based and Feature Extractor class -APPLY_DATACUBE_SOURCE_CODE = """ -LAT_HARMONIZED_NAME = "{lat_harmonized_name}" -LON_HARMONIZED_NAME = "{lon_harmonized_name}" -EPSG_HARMONIZED_NAME = "{epsg_harmonized_name}" - -from openeo.udf import XarrayDataCube -from openeo.udf.udf_data import UdfData - -IS_PIXEL_BASED = {is_pixel_based} - -def apply_udf_data(udf_data: UdfData) -> XarrayDataCube: - feature_extractor = {feature_extractor_class}() # User-defined, feature extractor class initialized here - - if not IS_PIXEL_BASED: - assert len(udf_data.datacube_list) == 1, "OpenEO GFMAP Feature extractor pipeline only supports single input cubes for the tile." - - cube = udf_data.datacube_list[0] - parameters = udf_data.user_context - - proj = udf_data.proj - if proj is not None: - proj = proj["EPSG"] - - parameters[EPSG_HARMONIZED_NAME] = proj - - cube = feature_extractor._execute(cube, parameters=parameters) - - udf_data.datacube_list = [cube] - - return udf_data -""" - class FeatureExtractor(ABC): """Base class for all feature extractor UDFs. It provides some common @@ -184,12 +137,65 @@ def execute(self, inarr: xr.DataArray) -> xr.DataArray: pass +def apply_udf_data(udf_data: UdfData) -> XarrayDataCube: + feature_extractor_class = "" + + # User-defined, feature extractor class initialized here + feature_extractor = feature_extractor_class() + + is_pixel_based = issubclass(feature_extractor_class, PointFeatureExtractor) + + if not is_pixel_based: + assert ( + len(udf_data.datacube_list) == 1 + ), "OpenEO GFMAP Feature extractor pipeline only supports single input cubes for the tile." + + cube = udf_data.datacube_list[0] + parameters = udf_data.user_context + + proj = udf_data.proj + if proj is not None: + proj = proj["EPSG"] + + parameters[EPSG_HARMONIZED_NAME] = proj + + cube = feature_extractor._execute(cube, parameters=parameters) + + udf_data.datacube_list = [cube] + + return udf_data + + +def _get_imports() -> str: + with open(__file__, "r", encoding="UTF-8") as f: + script_source = f.read() + + lines = script_source.split("\n") + + imports = [] + static_globals = [] + + for line in lines: + if line.strip().startswith(("import ", "from ")): + imports.append(line) + elif re.match("^[A-Z_0-9]+\s*=.*$", line): + static_globals.append(line) + + return "\n".join(imports) + "\n\n" + "\n".join(static_globals) + + +def _get_apply_udf_data(feature_extractor: FeatureExtractor) -> str: + source_lines = inspect.getsource(apply_udf_data) + source = "".join(source_lines) + # replace in the source function the `feature_extractor_class` + return source.replace('""', feature_extractor.__name__) + + def generate_udf_code(feature_extractor_class: FeatureExtractor) -> openeo.UDF: """Generates the udf code by packing imports of this file, the necessary superclass and subclasses as well as the user defined feature extractor class and the apply_datacube function. """ - import inspect # UDF code that will be built here udf_code = "" @@ -198,36 +204,12 @@ class and the apply_datacube function. feature_extractor_class, FeatureExtractor ), "The feature extractor class must be a subclass of FeatureExtractor." - if issubclass(feature_extractor_class, PatchFeatureExtractor): - udf_code += f"{REQUIRED_IMPORTS}\n\n" - udf_code += f"{inspect.getsource(FeatureExtractor)}\n\n" - udf_code += f"{inspect.getsource(PatchFeatureExtractor)}\n\n" - udf_code += f"{inspect.getsource(feature_extractor_class)}\n\n" - udf_code += APPLY_DATACUBE_SOURCE_CODE.format( - lat_harmonized_name=LAT_HARMONIZED_NAME, - lon_harmonized_name=LON_HARMONIZED_NAME, - epsg_harmonized_name=EPSG_HARMONIZED_NAME, - is_pixel_based=False, - feature_extractor_class=feature_extractor_class.__name__, - ) - elif issubclass(feature_extractor_class, PointFeatureExtractor): - udf_code += f"{REQUIRED_IMPORTS}\n\n" - udf_code += f"{inspect.getsource(FeatureExtractor)}\n\n" - udf_code += f"{inspect.getsource(PointFeatureExtractor)}\n\n" - udf_code += f"{inspect.getsource(feature_extractor_class)}\n\n" - udf_code += APPLY_DATACUBE_SOURCE_CODE.format( - lat_harmonized_name=LAT_HARMONIZED_NAME, - lon_harmonized_name=LON_HARMONIZED_NAME, - epsg_harmonized_name=EPSG_HARMONIZED_NAME, - is_pixel_based=True, - feature_extractor_class=feature_extractor_class.__name__, - ) - else: - raise NotImplementedError( - "The feature extractor must be a subclass of either " - "PatchFeatureExtractor or PointFeatureExtractor." - ) - + udf_code += _get_imports() + "\n\n" + udf_code += f"{inspect.getsource(FeatureExtractor)}\n\n" + udf_code += f"{inspect.getsource(PatchFeatureExtractor)}\n\n" + udf_code += f"{inspect.getsource(PointFeatureExtractor)}\n\n" + udf_code += f"{inspect.getsource(feature_extractor_class)}\n\n" + udf_code += _get_apply_udf_data(feature_extractor_class) return udf_code @@ -266,6 +248,8 @@ def apply_feature_extractor_local( """ udf_code = generate_udf_code(feature_extractor_class) + print(udf_code) + udf = openeo.UDF(code=udf_code, context=parameters) cube = XarrayDataCube(cube) diff --git a/tests/test_openeo_gfmap/resources/test_optical_cube.nc b/tests/test_openeo_gfmap/resources/test_optical_cube.nc index ce7f8fb4d86efb9061537dacaadebaf9e8e5c688..8d5e2c0bc82386012caa5a2dd2093e17cf43c5f7 100644 GIT binary patch literal 458520 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

l-neH`)E;l8O|jF?28%!ARb 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

_$T6yoV51 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⋘0jZDg#v&4@`it)p;%}zl);rB zNo!2Yb~7;_)2Y;MqyuWYs*_jB!}@>iUa!qwuOEkt?X18?zF9R+GEpj~0nFwb#mt>{ z%p0Oyy+vIwpAwbg2dm54VC94!4!y|L{j{32>a+&0nmaq>jC#^>RKD7+dgTdvCRiG1 z0+3(J+wgYxWw+WCQa=q+KVx0aU7utwHoli<|3PJ{QSqR7N<1d^Sg%=^grcG6LiHgh zZA)5FT2XM&d&FyYqy9Z!45O6dl+gPWb<1!>R;aCd9dz3J?IFtH$_W#pOg$Y2OtI;u zdZ)rUrLN<1KP&DP^TmJ_XG~rVwTHHZ@ zYAe*xjg*1?)QXqGFr=7H>V>^3sctY4^E9IvbL+7{Rm)Y3$^9ZEj#{sTZVfj0BYu|O z?R9un-g57lTjTBzjJcno#w4tzTyqyhvDM_7C8pBU+I3DhA-0%oDu-8$Q7vCybRe5t;xY&-9uU(}vrj13#lljBE{!bEO8Vq-pwZYA?Ee}oOQ9Jd@ zgM+F^9Z(S*B2Uj$b!wje9qfb}d=L-AKJ?%stiopE_rfx9+6t?KdO)6#C*=zHjy$B^ z(<@b$DxyjgqjtL4u5iaGMJ*GDd0MJ;sotP&l6z#BXSD{$Fv?gLQw+DjI9AYJ&EN4J zOr^_pg}hX5SDrj4o>#-V3g$pUO@qIwcDWUX=nyqiiRpF*of^GIJR^oh6TYNx(%0&l zP)^boc8uEiZfF|Juk5o<%&npXl*0@tfUUAq+$t`WM_C27LJ1x*Jx;!zXR;ti-NSm; zj}FyQpPk{Y$J^ve@ki0)I*ezgDKsBqhk4TOWsgXuJ1AloIem8A$#s&kQ!%klyy0{)+io%6+ViQ~Om%wA zN;8K0z&CHR8abwv(r|@t<~fey2)?Ih=@G8bPW9$yBkde}JtD>F801nB4MuYp%vDzDWb^gvZp2@(E@`QpK1d{q`NYR(o)S|F;Xv zuoc6&NAHAsyN06J##2_J>v1jj^B`=HrQ(dtf+9@tWDLVBeKn-mADi`rG_L3KB+Swe zKnuRgy4yyRom3a;0QZmi0L?0)^7ZR_T+Y>XjP)RtngJ?chJmTDH^2nBOmtwC?tv=W z4mQN0nS3)97vly}p#A=@PiSQ;i>1=ES zG!>>EexS0KIkGj@zsX(n(sg!Au-eOOBQ51+pa<5vXGQ`hSp802BUK z`|N<+&$F8%f2;oS|5_5E99*SKa5o&mGV=kYn<)SPAg!nOaid*sU&vaS2N&w7XqLTl zo4j0x#0&BtGEanM3#8Bp>q@uWBesbWIS(w=C$e-D55V{O6MaVCt1i@aP@~F#U4^=- z(S(g-+Gz@A(`8U0x3O0o6M1r*ny228!|H17=##2Oek^jiR|{YTjH+$2PR`TUzy++L z)74k%kbFvBCrk7s*remIR8{FQt{i3c$tA{y6`?@2h|jI#VoH%M-XayE&a)KsEAS;mF(g zl+)$s;#Com*}9EcnWf8Qs;uDT6&@Jl6tg=$^ z30dtuZOMm3kth+P`ch@|ER|%IC+#*n59aaw=hKz?CD|v=SbIdj9%FSJz)`9&aT?;3 z*~plBYFzh0s_s;!YN6^-XRQ)ZEyl2rYV`H8l50OEda#7{=y&Bh-9cT>Wo8%idxKi8 zcdJ&>E=W$%Q#pH1#!{*^VLNQn>68xZFI0*;sVdbq;svWroZ~4IvOvw|IU45Nwup0E z5xYaBK8hc47LDRLeH`}c{XDa))P8-TZdEtI8u&oR*e%LgKVR1|y?{H>sZ!)GWvdvM zJH!F2o6j;qjmWpuPxZTMw;Wfq**jKoZrdZi(u0^|I(gQo!bNI_Nq9ypzos$T z%+5Oi!+IA!2P?(jEfg){X;Ev%g{9^*W?#zlm_dUwSLfn~xJr7=`2?JV zAtRkp?m{ChgB)ywiF%&8kU2a`Vf!F!x5p~7UQFOTGhl`JnLRQ?&XC8MK`-cC`l$X~ z#dIM*S4r74LLGd=%VeRrMRwsSy%YwZ9?o*Y(Tq z>3KY(&vJ4&$NBcZ#R9dI`#uK`sYVs%-^^8qWfrHF`>AHcKv7dIgzbX?P`-n*QjyMt^aDBvYNy~ zm}Cm^QdJ}Ba{kRtHV1=%yd~&cCirH;S_+7p^!c1PtI=)T*1Ws_;{uNivp;W47 z78pii3k~Z($%Wz>>zLIl`{V@G1GVNe+@YGq647lJxk-BsRnS@7sn4pd%+VM##9`kV z*LNx{8rUJORo}7eFV@A-2mKgfB?;@9qCig6*|Jv@$>Y`%v4;7XP#U|aj27yzczZ}V zRdyBiunvC_3O;~!<;-SsD(1wZyju6&C25WJpiM8;{rKVWUP;Jsj)X&u!o|>Dn4`!SDn5$>; zR%Z8k_@>$<|4X&dpY_Y~GJ$vj-oo$Wxu%C`BUi08z8kiSIf>0<&1lsbx=}{Ca;vU~ zOQ;U_>LIyEqC?ckAnPkK$6H_xUc_fz$2np#XWvwqCSO&Xp`WgHV!SzzVL6nl z3Yi2>1-OC}U=?6OFWpF*b#46a& z`cg_UDuR#X_0qyzC*Q4fqIMg^^)wygjXg=HsEgCf!<;P>Cd2dn++e?-5-bU>@m~(K zIDM?N6`V(k`296>9=yg`cO2K?i;z^`=}cNqGhjNb(lza7gGA6eA4ak9QN@ZHO`JVYT7w9|ClD<^!nVCK#>YB>=d3zRxhPPM0)8S6QZ zjAM=4>XaCl@81#leejK7pZ9}lF}FG$&PLwG#&|F3wr_OSaJK%IsyU^tfJU$0FX2y7 zu#6G!@S+Y(cBXxa zeZVl>@=H4nRP=v!PV@9-F)8pjPgE{H0kCF`X}Bo ziYbYM%<@9>e~K%%oh`{`4b+zV&g+W&U20)TS5@MkmVe4eATb3N9g+kI zm14Oe9k^YH?$M#TT7IPiY@`qK-WF$W9jv46<@W@iYqPA}c3QP{(hhoEzL3KpJy~9q z`LY%~SITO6PhOI9^0GdrCGv#Kkr24li+k*rzsMRs|5V0kGrUVTwP^cRW9&Wn-p}8) zAy#4=?U?P9PsnzUERg4=zdR-n${;u}lW0q*W3jZ;4E<2n%UAL}2-V6dZgztk?c&u< zdt1Kc*oT^65f*9BTZG5J@t!<8NZ#+r5jjt`xuBUMy`+Z>Bzgj8^d-(&8F@=L?chhN z3pB;Ojf0spKsnOpp~+RKDOszn+!xzJmSAb19%~u4%6ju|k=5AO zFyb0@E0>et5k1AG68j_Rk4r@B9%{cCglgq2 zxdPIk!2ButCvJcHty`|tX5FR@KF%9-uO0VEeoV{tw8nvWf4^*H;N0dot(t_I?y*cu z!u>MHZzWzb5d_;DqZ*Hj()-Zr%fwy?3b)y(Hrsl72h@Dn>MbnD8?P|gqJ2V~)d*VhN zJr>?1li37vOST67auy6!a6ZNTxVaQ$3hg%7ci4s#G1BMTa(k2S{fAAoS74BPipTjFJHZXc z>2Vl19Q{*GRl@6h?p_HxdAxSuf{V!e3^n``E=Bo4 z-(^+ariUxwnS~?0Ev0zgSoqh;3hWJH|6mEe8g=)gqg_UIH*}F*+nGiqnnNY4&%V<9!@$iQQ$z_;-uk zlxH*>UetlvB)oJzwTtjWFz^Iegm{;rDo6<}4^0d$4tm0#>pDl@;LaChi)6|s+1m^2{y<2!n-W6Pq%VKp0z z@wNmc+u7$h)C!r3ljqTi`s-qS9v-#8^A>HS!nw>3vHG8S&W8I}sINV4^(ZXQpc_2L zIq!f~60t*rj=^z1YZV^lEjor7>N;r5!mDOWoRmqGoWZ;6@U<`C>==4$-nZu;0{7}97RgOx#(H+sDfB_N3P6jh4ze1}aeg#gK>i@$1_gWuMLqYd|*H!8;)a!gg5E--&Qi21_RvSQcq^_lc z%ZWOGuGUBXAnEcj?|&onWRSi9GY{yi_D>Wy&rafXB{s#A_;wAIxDEbIN8ukw@tjU2EOw;tM?qtdoKZ z-Z{we&-DS_uB~`iKKMOJ1ul7UFep%P=^3o0+Lbut9-S^x@@xA0BH6&a(485v1T^|E zi(FtTE~Cqi^eVEw?BmegG%vAKyf{~5;Xlr*0#lN`*u#Q!P>Bn2f)X^GjsxGor%qDA zZ=^Ha9z(~;W|o|egD=oc78&gG;bh#^yU+uQ>@!>CFIYA%nXHC(w%awW*V0?F&{FRf z^bC@yX@R|D)kGRYoC*4Se)gmPw%0EDlVswyD{zr~OZOr8!YC%R*KHim*Px5-Ejn+6 zUX%nnf3%-Nvoqj#A20L{-0iY&3Yu}}7l}2R7$cbW%Jr{o5J~zqy?7uU{zH1&Fs4WK zt2obgxK>H$8%__I#JeZqp;TeWywL+tc{! zbq!@woybX>xlJvT!Xg~M3{QH(wv)kVc7Rm+%26^IOr9=Fq5S+k!5gdKBp|CpM+W4vuKo)p$%4|nP|5Z zXKSS9Va)iueTVl$tI42QiA%@9^u!*vEYQB*>m=9O6xsAg!)2L4+e5nMTQd~FLE4bkW zI?D){lFE#-SSCoWb|CUw_})bN(wq8c>X<`~r!$S_N*7&b&+1j_hz7df^7pfB52HXg z5tc9Ule{W8p^P2tA#0-Mm*BuQ_LLgy9IR~@6_)P@nXS{UfZbv)F8du*XdX~D^=oB85hF%EXr%rvDIv2sF zVaxyzuy5tc5GK=^5~}&k1|79C`ig)p`KaR}6I2JfX9_i`_wb;B$mKrU(>SY%{*;ER zjfIy9`i%6Z!@bIG(JDikGupbxe3^)Yy@ogJV@|D=W+^~>?7MA_%WgfBy>Kf|ve6po z5HnD71Zs}-AMG?dXg<@x61Ic4(%>$T;i}Vcl3WZ^lU~wiIK1GkM(6vmIA8Q|`m^)y23M%*hT9*YBU#6;u&_cn{4F+(Ppx)1p9+T-bMugcVB6UXL23%Fx}JG0R;$>7n&juYk7*EbzQ-&v1ZAz( zZ`h@NWDlOr(~%x-H&OVHI6w{_Ih9?07xmpFE%JySVslu<43=g|%o3R}BZeF7XVx5z zXU<@n&(_r_ayU3GvnlKrLvQt=8i^zCE;!^=&WIxC9B_-#H&9PDU8(?A&cZ>8Y%of% zqyLW~|5nc1jE9ymac-w)+|OS14qjVnYq?VsH%TJa*C?Y-?!}!qpvyEpBbQL)R#_(v zG7C24pyUd^RcMcpuh|*!E+^;x+LrnM0~dUj#CV(?m=92u=at5J&p97qSV}2H>JZmu zEhWSf#v$a!5QE0DmKx$9Lk)4QHPjl`7(!U$C}k-jR4r>MHH4*%rG_9uLX}d2EK3L> zgy5e=YFt8DV~r&)7($F%w1klT;oP}*zI*w;^PcxP&v~Bn@}xc`sZt`xVtNQxwj(<~jAWn`8>?0)L;uDmO+NsKPD zwH8e7yKGRG68jce#_>Iwyhn6KLo6Jmg2{ha{@}tSPJ1;8%ta=gpX`^b{4y#@k}112 z&1R^=N%@6rl76|UnXL9#s=c2TlBx2az$BcVWLTD+)LC5uKH+5kp=RpSAl$>XcyQ|>f8FfHt2p0vMvqLA$gF`ewmU6x8C)-ebO##GzLbs$@jVH)Ld(X56g&}2P#p- z`G{)XAj>PT@r<6=|I4W@Q>z0#Y30EQT<#EZ8QR-SN6Y@`RG*r6eEow1J?s1@-U`5tu>2^h1bq%>6 z){~kqm1L4A(Hf_-5&;Jf@@%HNNaXGEBXFpaV%f@dw>&4E@(9m;DIdr-_VJRG%R)O! z|0GhqRO_=^yQmdpnF${*P^o>O7bkbpd9TYxdDRuUtuDz0h)>h>oSc)>(kHFlH6r73 zmTcE)6*zWk1w81Gow^#f?YB)}UTih=%Puwb(dDyRB!03;8l;IQkGM3q)S3H*`@+2> z@%n9$Td3dDhxH%WXNFG8BVc~7mcgS^tD}P-AVxKets(Onm=VSbg=FnRNd`1h!a!uF zoOegu11`_?xD)PwT@=0enmjLtmSkwVuGY<{%O1&+DXnFl)q0EHyW|pGpQ)F%1uY1n z|0d|%F?#rh{43b`h#Mm-W!Ck%Wl|vjBJq4Lg%R(|J^B*-egd`KNW36k2T-|GSURa@ zhxMy^MfRh%x3s~|(&uKQ^!OU90pEDtq;pb1m4>95XtQ!k^5Ir4YzSmsKNP1%-y@rP zIDd+IZj(rKv6;0-GzKm|rmxd+L7-h@CB(jr^6jx<&4F=G!E=9jw~6Qm&lbiX00}9 zm#FM7b*l#JDwyy&e)a>c(e>#`WztQYBx_hb&;8HBs-=>1PL6|6k?ktL~gSBd7rvJ5bJi3*Ov zvjkkM2S>|;4`mvGla}f>x_z;IuH!at2Uzu0eh(whY55Glyd_`Jd-QjB=2DH-3-V39 zm%nwO%+qYrOP`KxAuT^jxiwLTgP9Nq{?=W`MVCO)56Sdew z6>@C5cZI7z>lkXZK_11;-lfOk1S=1sL|J&@`+5ys>1D-EvTxQ;@a;KkdhK_N#Lpez^MR#^nP=TMj=3q+T9!iQFRFp9n^lV7vK zI$ZhZtnv|xwA8K=f07+UQNu1v@Phq^{kPqb>mTdi3RkueYf%0TS08be?rD%eCjTto zl{_3G`nG5PN{>>N*X4(3`lx(Q+rZ|E27+r8o?Fh&0(cKtq}S#h@)EobR!QWS#mp#Q zqcWeBt_6D3w=Tq0_6Q+|jF*MaZL)Z$}_pTifTam!5j7=X@ZTZe^u zO&K zUKYm$@;i1ur=_+5eg}KaL{IfXyf*x80_MF)m(OeMtb3Hahuz=d0kN#rfSxXc+Y#_I z2&JbbVGnaS`Wt9hG|JaaAGVNnxm`m;j0x!j z38Xh3(SA(@?;@|u%k@INYj&QI)^ZUZ@KioOj?e1q%NRi$01bnGLZ+`;9 zE8y?i+tbK8YB0~bA*x>|CuCgvxZ@~&Hf3pErB~>Mc>!LAH_ptqTW`r4dBH7rvF?&f z0qK2A4tL|9T`2mb)M^d2OUJR6SOat6x9I#+`V1Kr!uV724AWCEJl|*W-VSezm*d6r zYVrJ;plWc&9k^I3vq3maNRf1&IUp@$Jb`c3=?40FQrFlt^HHc?mwC6{&NN#Kr%>}`oY6;AAN+_x z^QtwLywiC_S*}hJFBn~nV8VM)@76cvS!S9yWC4A)*1}+So)_yyz{M5lW*p24z&X=U z{#-q-|D``-itUjCzO~Wg`KYRo-tVB7w&Lq0e3sxAd-?2=1eE_3S*gFI-o>zEv6tp$ zdg0y-?D1#f3bYsX>-5Q5{fjKe8`^RI9x^el#4nm)MGAMN(cjT1XuN%jLhK{|{rr8o zoT2x+$?PotQ;mjCSt1-9+t^|i`F}c+QF>aA@|8HkXniMZKfMX$a@YA?d0TC z0FMu%ZiVz)iwv=^4U!>0MKivnE`h9G$K)371$s?3A31?pF50Rzn)6aEmD(e#n2Jv^ z1!c(**}^PwlM`PVeHjJ=Cx|oa+TH7JN`_gb2bF2W8$aUCe2_|muNOe(Jhk6y^Jkza z^RqR$@CvdHg=Z!~Fr&o3?2Zaf3Tezc-_)CMZ-5!|vMYAAZrshm{4F3}%X#Y+xIPX_ zm*i#6DOHy4)idvx(z|7x5La70JdeXq0xVnWCD$AGE_p?kt|yox+TihVT%%XMB9FVr z-S6EZ5I+JE4ItuiQd*)*;Dt}`)OjVJq<4E8+cmjC7a|LpfFnU7#{7xB*k+mK??e~#h}{66 zGHo;2x0xS&4~CPy)(&f?nRgywDi3F>pYQ5wdi8!eiONT#nEPFsd)ZA9eH}Zgm1dX| z#3^iA-jw^u{1Q4@0SZAxFNKRSUZf|Ud1FkZd8mG_rqHXkyw;IT4ITK9oO6G18FIIL zj8;~;1b%O2UV4`KbC7CxY6_JelNotZw^BhL?Au26%_iO~xSVE{JRT8KV?_r>YIYc?E@VfUFh-$q=b9dr(% zNt7e+7;75zot9x!Q<}&?T0wScDf~0;Ff$&*5$CIk2;(u;@di`_u;P( z2zD2voT)flHppy253*qUAbQj#FQUDBQPMfi@$0E!x622gd+FHqM4UutelNdaA7|l7 z8q-DxIQQ|sfWMdGcm)=~%vJy{dCZ8}_)4IabLV07`$PQ`nM||SRjd|=!c@tB;>jPN zG=0p_JK0Ym9GsL+z0RwTX|$hn@VH*ZZ_4PJAx>KJj+{$pp1>1Z^;!Lvp64WW7W{gc z^V(7U<+ex*snuONN*B$aX;)K=jVRO;x`#9MIn=WTJsx1z>O^Y~!pKs)Cb3M3V(rY> zkD-&#qX`eAe+M~tcjDZiaDP2JZYHOGdTxx-_&4%>EyNrm$IfoE?`9SXE^b$Ir|hNLezXQbRJ<41ti86p36aLn1;`mK2H1NQn>) zmCD#OHB%yT$&A#L(2&ds%`8nRm5>z8kceD0#gDX<$k5EpaDVXJ=U(*Od*;l?|6|^I ziIRAEMm~^wsg}oOrgYWbdR|iXw2rYyEzlf0qQ#o7dD_F0EX`u=q#o8Vi?c)vbiLda zHqv~|%jQ|CCEEmh&^lWHpOdUv_DX|zYA@}p&5|tz^0OS15;-eH`iGi*tMBV<&DV!@ zx<*+huNZUfdb`g0*;Tg8wh+k>pGC=e zlRPKuB~&}uU)4-vZRX33FaStzTdLUQSRqnwe>dP%&mtVFnc31-}o~|r34}FAQd+J5hh(FqPi)SnO-Mou`e& z_UXX(4 zfg;q&Y57vh>BSuSvj8q9z>Fx{Yn6IZee8bg!6e^hu3`FbaC$;l$#e;kespjQF^@Q3 zI_sV7&iBrpvWRFOf$})MS(7~2u4$N zH$3e}tB2<`R2|)st_X?uAJ|tH1s1IMSIZ_LUvZDrc*++6k0f=|PozE`Ngb9vZD}az%dR z+Fq#wUthq{vvXVDzh>%ig#y~euRR&-$=%F+Uxs+mM86TIjgbv%fDHLSdrX^xiT z;!X8)$SO@MQIkmi`shmTO0&h_`7jC+2EHDm=b6mS+k$Ne_=u*q{rWNAR_a3ioQ~#z zu_%z6MQ{D2Czz>%e;HI));<~gL5slfak&;IT!J^nTpxi#WrO5$@Nhw0^9I>v9jaE! zuV;YxH9A-uWFL550Vdw1H;;m@4RT7l!v@#Z@*ZccB!u>;_I2W~CrZx0!E)~v!x#z%O zh4!|e=#96XA$lKcg4?g!WHhQ-=U6p))S;EFGsgN9~#DP?Rpvm#MJ7)o7ymxj&+> z&7fs6*F)(@vA$0BZ{Q_``ZB80zR{VQ6KtK0|(e^n?V$iV>(qcigZE_WIe~M9w5m zomS~UI8v<7G0P&Z<`B-e-SX zm`88VQjhf>huz*xJRkR~A?^zx#5=puX{Wzvs%xxVJL-YvW2NL-bUb>iy#^X2{ z76lUh>PUk~ej`a2j;g3B2ocL5bQ$W}Q5 zgExbpe#|z(-UNwBxZ-1MLuqynr&(aLZJ_mYL)~%q7Tj@^eWtPiClI<@EjlA zf~M|Ahe~xA-(S#ST7|DY1amvHdktpFk?`dXcBhRz+tdC64H359eB35WcNe=A?0V%^ zZ<9b%8*E%9$+*HqnT)n9#ILr=?ck&kvM@Kutwbx2Qf;36M^bRb?vfy{p{A!Lgm1=xr6$xN5!Gu(Wll;m zPioO-^Kv)YMO$KB>1#G>wh8C?$+Fx;cbl8)uD7Gsf;N23-f+L%f`6ZLzH{mvU%3iD zehFoY)MaE|$i_Gc6#Ik1Sp0B`9fp5#uItWg=c1m+F?*pWiPpu9<$3|}*TCLgwgx5o zQRd1(`QCZkDRsQ?-8Ltg?!L;l63c5mIIAIp&$Npjqw-+#d=^zox2|lEv%q@>{_bxj z^t-#;)y;LMyRGaN*=~z=)1f%IFA*D@9k|dyTzNFRNQu0G^L7H&ziFXW5i!ul;1;v> zD|Xm9OnDz_T*%D5EC;;254Ka?Om~EP4;`W1%b$#7NYjXWz&Ia+2 zU)dT4$W3exWgVNzC)~4>JwE~+jRgrMWID!v<$rzk7+60gg&^h>sHbh#qu-r|VGX zsbIZ{u58fGmS=m+n>mKKE#DPGk^09sa*18`&Z5f{o`DEg2A#vZf=+@cA*chY6}Yq|c#2Ip|^ zDik-`ify+=xkvGcv$hG&mRcdI<_FT-v&=db~bB z--Hn>`FouW(km$DWSpUvv(#k!uPwKw9V}Xl|JR`Ci`wtUJDR}rKf%E{)I82YJ-+ZP z^-OW|IH67C+}Gaauh^o8afX;C?@18u)69;2T2h!(HttZR4*S&%YlS(rR)p48lT|j8 zN`go6%xE^qjnGn$r5>#w-tLo3z=!FTfa(}sErZy;ZUNUj!C@nNokQ$U(2&V%3KKZM zNoAdRy4m1%v+X4BROVB})7wvWBRQW<1KBgROl}1=1-cKkUyG{O!l-WOj z;dmBX`U$5e8{S0tJC;qXN!Vf8F5=iq0$}X{eSou6j(rZcs$pvhv5S~&yDufsnIml9 z5%Mw}4eU7e-G_e9M*-gF#NSK)bUfLpA7N)-3FlggJ&PWuqrSOt;u6Z}4LW9kk+G=S zT06+A#vaE-(wS)s=Yn8)3l}=Y_SOe?8wBR^Iq57R+eEZ77{%ElyU~V)60cX=6)6UZ z!Msw$WxNSeU@MX9EZu#L445bZIhiUJ!3iMv3wY z`mhg8*vx6EfHQ0!r~VwGzeZ2IERLR}p~&aa-vdN0rRz)WdCnD2)9(`cJB{~5&Qrg$ zG5eutHJs6U(2*cc8r8(C04HmRo=$z;J9eWo_P@VyiFxE3X?dWsMaS{)AUr>np6t*G zFywVP21|~&ZwxY9Pl1X|vQDNOlbB~Q%Jv2C8g}YuD$zpo$R{#~3y_M;T1WTCrCGnrd9lRHW+4KQ{a%zO(>en{Ru zz*3ez%WhFXoX%)YH&BsbL(#nV`DP-#o!4;+9mS@!4{xqz&uWGn^{9B5?vTDP{tBoV z4SqPU(1|r2`rb<)CUz|9JBOZBvKbt~mwVBNr|`peWu1-=mg-h^>=?ZUg+7GpM{-9H zdUcTfaIahqhR>jo<*2P{IOdp^tQ+X}xI8nLy!v6tsdZ{*eoE>)$ zWLsVMe|0zKoacGYIrk>HN%NhWnwqMbn3{S;)x<>A#KhE8)hjBhUNtc_Q86_&HB~iL zHBtReO-)TrRZUGyR8&k&OucGqYHDI?s%qcg^Zt5OCB66DbDrn(@7b`^n4)eoYb$P- z-BEX>#ctiK=iD=I(rfaxJPv<`@U@9C~q<{=jomZrW4y42saH z_C;@C`^xl{oh$!dnRI7Ohc_MCh|ESd!aKSF7kElPVZ*kCR=tW{)lGVg%9zF;o$xCB zwjG-=vowrTP{sw5(;3}v7lMcS1}?+A`YK)pdY$7dM^~Digtr;)h*qL&EsHG!(R66n zI%XdeP}CJKVg7|?O6r;(vQ?d>UE2|?dtGkEB&mU&l+Y({-i`38q_07|+3J7$5Zw` z-oYsvr+;bFCT-SidF$RVt>6&8RL{gOr_~v9mYrBM6ZQW8+PRiW%UQ77B=s-&g@W4f z4Eoh)Ii`lNZj`%Di#qH1;ql<6?WQt0rbfT;((c&0S#vAFgkFXc466(AC@|^FIAtdj zEk<>;7R|TB_@^g$2R*apCPHm)O0CJ4@f=qGsmInVAdpbk4fuYJz<8- ztUG9D?Rjw7e1f_vN>8FVb>2G_ry8A!#-iD1p=BY~{XZj-LB>Zpv=C_xy@0D2*H>}b zB>cQvS2_7ajglW+4(?droa-LDZhm2%Hr->>Z5!UEZG}JTK=#N@F&bFonyhoR4};ap3`KR4RW2Fq62v>S(BuFN@>aKX-*etJrCreH6qt~zne4%%tc za4YU4dVp#`o`|Kuv@_;R^J?+vL}Vgbj~qrSk#uy{&xWhfiLl})PHeZg>h5C^lBR6a zCa;flhu*_IJTO%=i%--CbzlZ4le11FSKsGHmgyI`_z%7P7`|0ESjuI zd#iSwsyc7(;;<6%j%Mrv*Z#mPyD5DQ57k?-CLRaoubhO+p&@giE0KSE^Nb)UNvP3>5tf@ zj?_m?>#A+z&UTp*H)~qqw>TCbgbr+(zwxQO1CCb>4biNMihJU*`Ub7~&<@#z{Xso6 zgsnPjR&h(cmcuHJ@8Ax1cUkqT4m`w8jKZ-Qvd7vp2R7w((40IJ59IGa4W1~$T$)rh zcq8Z4DoiqFW8~?p6vsX~gK@f`RXu1PLsm4&5s1S-@=(50uau*vl#eC#P*v&Jq|CZ; z+)S`!i|UJLm6M_s7hzP5@q7Nln%?0%228@vm~~y!X**#*U^~BQ4L$m%zRH}ut9IpA zb;R)(;llq<)M`u*3}R(odXa$!I%D?CJvBYSxCVFBqME`T zGil3EfnjPlJ7!HcSgFz`M-^H%E40ZRYrqre&|DXrhqrP<bbC=PEGVn5teeQKRia->$+ z?~dpz=Iprn$sN9+5#5ZhrIJ-s$6eT>9M`#KCiElvqh6?-dH`MOx!6#St?OlerlB5D zCw);XG9$Yg=PBOTh&slXRHrUJ!w2+j*<^G=x9e`*$9yYb!CkXUtT4xVTo=Kr8}gw{ z%kT0kgYg?tOw)w%qr8aRm~7^f*J!xy+mpP^5WFn>1njF~eX z{GNZww{2#Vo#;^hEsJ7`IsA&ReVJ1~85JuskFRJKPjMPfU(Nj^{5T`npt1u zdcNV@(82c}%eSg7qfliu--k~8O>zB`U11l#b8RZ{p4KSEe!ol^oz>T=4h!7%0UT0F zTn$v5znoEZ6Mm}+u#kcpwd!NMz#G_yMV+L7R9@azo6PWCcmyAz3z90vTzSVVAHZ{Z zOc&@dZ&om6&g?dSF6epIm!$aUh`^)3U)-}5`CfJ7hDyOcHkk!_4QtwWC-s<`mQQ4n zuThCIEu!i-KB9BXLrl%XHR_`V|JFc5+|=v^=I|qJ;xF}G3!smH++>P^^6Ks zgbjHVNV50z(MOzzh8)AH-3T?@UU&eHnTLHUA)Dk6F`*VP!z#4PZ%%WDO0ol;a?MIG zgK_+?Pha_ZEnDTb{4J~8+3#>9PXnGf5GB&aveK7un`-t6JyU<=b=e8ytTs*Rqk05w zFwUuMk9zdF4sr5yZ~*3EO^tz4CxM38k)EnB5~krgJck5+;=Iu&-UnWY1b(OYG-2xc zt?HHYaumPewE6%Y*vpA;hU@n)ufN8e9E2YDtd==Dy=8RWQZLn}sEGo1{vG%0AJ~F- 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%0DA>#0bg8* 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 Date: Mon, 11 Mar 2024 12:04:16 +0100 Subject: [PATCH 24/24] output labels for UDF results are now dynamic and can access the input parameters --- src/openeo_gfmap/features/feature_extractor.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/openeo_gfmap/features/feature_extractor.py b/src/openeo_gfmap/features/feature_extractor.py index fb92a99..b52ffa0 100644 --- a/src/openeo_gfmap/features/feature_extractor.py +++ b/src/openeo_gfmap/features/feature_extractor.py @@ -229,13 +229,16 @@ def apply_feature_extractor( default, the feature extractor expects to receive S1 and S2 data stored in uint16 with the harmonized naming as implemented in the fetching module. """ + feature_extractor = feature_extractor_class() + feature_extractor._parameters = parameters + output_labels = feature_extractor.output_labels() udf_code = generate_udf_code(feature_extractor_class) udf = openeo.UDF(code=udf_code, context=parameters) cube = cube.apply_neighborhood(process=udf, size=size, overlap=overlap) - return cube.rename_labels(dimension="bands", target=feature_extractor_class().output_labels()) + return cube.rename_labels(dimension="bands", target=output_labels) def apply_feature_extractor_local( @@ -246,9 +249,11 @@ def apply_feature_extractor_local( excepts for the cube parameter which expects a `xarray.DataArray` instead of a `openeo.rest.datacube.DataCube` object. """ - udf_code = generate_udf_code(feature_extractor_class) + feature_extractor = feature_extractor_class() + feature_extractor._parameters = parameters + output_labels = feature_extractor.output_labels() - print(udf_code) + udf_code = generate_udf_code(feature_extractor_class) udf = openeo.UDF(code=udf_code, context=parameters) @@ -260,8 +265,4 @@ def apply_feature_extractor_local( assert len(output_cubes) == 1, "UDF should have only a single output cube." - return ( - output_cubes[0] - .get_array() - .assign_coords({"bands": feature_extractor_class().output_labels()}) - ) + return output_cubes[0].get_array().assign_coords({"bands": output_labels})

)G@Od4;EXRk+v z`JUeeH=r(IUqY>jVzO!GbwPQ_oHiS~wM}*JNVbn@<+^k#FQwL<7L8ANeu$9?udjF< zPCEE#C7$9t6U7tSl%sgbe0qS(^#4syzG7!xrl&K!s?K@4&hCzEcod0ec{^_0HEx^( zjC32v^s-Wzua;3nm50fB@k|dgR^5A!bqvfsKV#z^AJej-Qo^Px(vHhcZ zQNIwcOB`I%UKJDVumLG^*`)L;XYQF9$-Sdfzo3}UqVddtTYQ}3{K@=VfjnZj>-vuC zi{e{H%-;A4Eh?u$HKSOax|-{66hG(v$dS%##J>}mbI~)ehn?!DYp3FwnbEka^HgMK zX033&#^)QBW{~dHlWD19U2#plOjopkuHN!|0%IK`$84w`)eG-?u8+Jrs-H5uBVzGf zU5ZlbzYG7H&@-wjjuPEybEiHPj}LyQ$IX9(=$}M3{Z#spBN{PJmMf#$dRZ0E>)V*v zhrUQw!n$i5(aCM`^tE8G@jMZ4vpEsb8RSQ=6V>2^|CipS8+md)^U_1@76*%>id3hO za}sqs+VxT4;oke7j?}W$$`yBKR!)~Yt8b`b6B!kM9~>v8UZzf7>Hz1S?eKP*nnY)Z z^)t`^i7s%Eu9-&Mv#Gi_y;hCqkr$gX^{ti;-n?4WZ?5I@J>L^cvoYmmMra!UYBJk> z`7htp@JBHixjrv!$9rQe(VmFXD(smjdhtd@%lh`5|4)UHF)MT9zQFApzfb68z5dPY zIN<-#^VfV&=BC!{xW{N@)QnYq053Lpe}cy!wYUGToiUFe*_hW}%rpb&RsN0KzgcFm zZ=TD47)67BjH=Z*QPECtS9Rx%I?v1(pXSa_e#aA?FRzcOrjM0d8oa74c~zC^(cmTQ z%OH6$fRxw^b$RBXwk%_=@O{GTPwaox#=PEh$3@ALeUYq){-yJy zjP?hH7JS}^Uky93=SG=2wk%wP!A?D@d83r{mACkLbiRvZ)jd<3oEX)I2%m_`qx%O& z-EyAPhxEP2-%Z+1waT~ayy^LF-#r_Sb-wHS_`P(_eBUzCrm^3O%^9!T^wV>uH#9Q% z>8}pq@fH_vjuTg6_tI#ylK$UA_voo$>tdo$$~raDxhHN^i80)Be6Rbq;`s%uxA50l zel78ic2XODdnPurMpqw<;kT<%I(*M=*4vFoGyM>gXV8DhuB=b{_iAtU&? zCXy7@^7ls62JSrY?S*q-4h!~#@54qq*F)FR{k=g5c7E^89F#1)fw0Zb7A~zI-1W)7 zZFglQdgn_=aIhd)${W7@rj-D`ANJ?CBWrc!$`#xgHAR*FK?*Y2x$PqKRH-KN)# zVk;}HwkId>_gPAo=G||ROfP$*YujM;hf$B|Yi(K@TfCM!3tx1hBk_e4BB;(hs> zUvQ#>c+__eF>*nv>2I3+uhe&ZcY*y1w58V;+-CjLot^UQ(X_r*--2!DO@`d^e#%C6 z5~r!Al)He^%l@U;>ENXvbLH-|Z zpzHi;9H;g&?`V3<^IMRwjib+}oqD%6hW@Ltkb2u}e3yTp^gCtomou+@*j>-we>~L{yPk^o9eTI1pDx^7mpNw6|K#m2_mADv z<@Y6jvroNcZrs&R4Rt`*e19^cKYU+j;~0mD%TvbbxhHH`@i;K^#SSZ3YdyohEF&1u zP_%N4kzL0aZuSV}x%Zd88P}e$U2(39m59oKZ*0x!e7m4y#=ABCZ@ap}>j7rE#=Opx ztamQ?dkt}_=XrqnM~%up$RCj%t4eMD96CECpSs@7i_aYqeN(f4!d?qc)SLMDwa!RW z;eVxR=>i=7>ocKGmwh3K6Yjo{4FhpZ%%5?K`qFDurz1Nhsn?CBh)FwSuj z@3zYR`l~g_E7a@}Zo-|=%&ewQD)q0;=VQlM%u+dMjpv8;aigNLE=6~*(RJsq!uJB| zfitW$t8?pwcca+P8p`?84Dg3O=m1_S^Z~33e=m8v2SfhCeRAcx{)w4ZW@E9K)W4av zu0(7DV%47biSr&CE%x?kK7D3Xw@J}ifjr8O@VmrfV$#3xUiIp+`@700y`iJ#4 z&mYP!B0Jd?gZjPt0YB@J>{O+P{Z@O@3!XyXp|V-2BEO5?)xwOZu<*6hF~-`E#SeBe zJ67PQ->{al8vL*($?Em^uLcj~&wFEH^?FYUd$MpxydEJudHx(r%Yx+-8zXgc?DJEJ zuHP$Yy`QQD^}+8Y&sa$}m>Ss^*&}_`pT=Wj-niud(s|qHKz!y`a%ibuZ8Y}eYSXpz z659!u68mn+&k@B%EARGaZgJhk$N|2(MsV6(X}mYr9NW#^#z(X2^97Dpc(_n+D>5g& z=u#}sjAw|C8)MRaP4yKv(1Dm)U&7vi9ky?ag8H;mh1_W#G%wir)_CLnF5Zt+ z+CB4se6EP#P%J;7w_vMP^%j*R_s)!bQ0rFTdHlWki}xqcH)tlE z*77eeiQyb>vbA5Ti5XKRoWegZmG-Qt?FiC{0x6Kzs7;H;zvI zoitaQdu;wG`nf2zCjH?t&Fq=E)A>CWh8FdTENJ3IcU5wv@9tK8!TawxxWM@c8(G0U z@_WOl8`-ti_)V)X`BbXRm?rn(A3A=qk=|yj{QatHpLF*dyQhsodiqkeJG}k<_lOq1 zL(95oq#mzg=gK%Y-1(%A|Edoub4;5fW7sUVw&eX1S6l85kAE5?-;d2N+mT=5JM~`khgq^EMkmx8t$gRv@~dOv zdj}JzzFVr2P5x#r`i8AL%%me*Ivxvl=@q|_DF=SNQ~XXX85(Pq){pp|9fz#evM$-j zIu&NdhJ5DzMLC9IlYSx#r-w-0x|Kbf zM%NR8w%3kpo49Hj>q31=7qDNt>}W?c&4g#o@6n&<`=!@OrJQK8I0p*vIga zRtNFHy~#6neb+L^SNgrtU1V*%4|&b&q<$}o`Zi2_s)$WjCiSceci2te7k=y~VW7q1 zOBP1F?NU&1v(AbFKkLsT^rQ+*<*ENHVZ|I}q;HLv63Kozs1N98&39)!-jN^idP8sf z8waUqmyi$n{@oZ##r@kGP09#2Sh$9}!?UyIuFhcvFE@Ns%Z*OXI*xgs-!z`fGZhi& z@E|e&noDjxbAp$u?_a5~Wpq`_iH6UOU|b(IM|ArEe}fm8DI@DyOJ*hi%c!gAG%2L- zy&3?8vUxuggB7*^o}XFSE{!BA`pMRt(>QchKXfKPXz@{;zPp-L!VD*4Pfg*rj3-%T zPdqHJ_B+>#w-w{du1Fu_+l>JWYwm33ZrIi4nYsO&tln(g7`fjZqI2`&bH-rY$;+&z z)?hb9D+)@7m{tCi2Qz=qjc$Wq3pOeknb7<-%soBI&*rw;eZtxJ^JB^D4)mPYc&qTZX{29uXa!C>njN?&%{xl0Qp#f@MZMca#V^I@o1%y?{fdDD zRkSSw*5&RYUbB{%dMXu#=g`0VbQW8U_R9bKJN_~7kAZ&-{A1uB1OFKK$G|@Z{xR^6 afqxAAW8fbH{}}kkz&{55G4Owff&T}-<#L_|PDG7?3i-uGzl*_!J4cTIJ5^-NVy57$pxT=D`Y2_^!xoI8hrf`EH^ z2>&?&$`A$0X%(D@pT7@3_ytvz7FR*KV2g-EbqYYn0C3|Zumf9C7<~&+Oe6$EXbtYE z8uLi7v*Ivx5+Cx51|XpoVvmwi{UWV2nBEsZBn?VbFERnIGQhu}^>S+xUG7=)xo{*D|P|iUKoI6hmcq-K+7evQ!$W>!ms~lip2`W!8&LP1qVQ9(~tO!T${;4#d|5D26&z+tD{dnX%fMKNhP__fh~d2N`^s9dMb5VT8uQ>0AEYpxZ&=P~X5jgA!48Sh^05jBg22+AfK?X*YY|3SSF4bl|Wb$usOXv@D` zL9Gyx#Pshy4?16<1x}F(pnBm^ia=C{mYWEi=MgwhAY%v{hd9*JY6L7mdz4eZgkhm) zVx-Ppgi>V0!CO#@fM5+E;Uj(imm~eJdD%Z3eJ7YRK=e_k(>c}aU;Tl49Ml#V2yxsn z8Du~Yq4&c7x_?1^6iWnl@AqWn2!;C8-@7BUExf&D>ys&xzxS!rM*;*2r@!;5O>_ttQhx7K zvf?mg9H7PjU7vFP?o-+30wplb{>>C+B=>qNzX`XLe$66}G80(DoIXTtA3@Fy6&J={}}etGwS-QQ$kaTh`_ zaGyhf1v3BIu>M=Et}3rV9PHmIr_aU_==}v64?zDJ*n;&O&FxMf5ao~)aO)_kD9Vbd zYEx-SsZ#QCQnFC0tI1QkSb>ZvIoK4aZcs`|C`$ct9#SDLs-`Xv!CTo{7($~eLnAv= z14>nAu$_@5u(NY;adX_D z6jfJ~R#cHu)6%ArP*RnmxjZw5be@OdxGwa5f%JE)I4+b}q-6*cLTa5NX%@jZ=q*tWNT_@st`Ni6xcxD!bs0p-vD-bR%SjvKJK3(#`+cz9gXxMQ8&m0 zB7=(+TK+5uh5}jH+C7B9Ugu z!Q*-ObMVjge`J`@=L0m4L&bzX4xkz4=@a7-3N){PWl)d)E7>LM)l-28u`mLSCE*4B z5JvyaL)a1z)`Ak&x6{N8s?C2raohiJ^$q;$e@9Ork!sL0hzJCbwD2;59*`D_eUGb8 zQ>wqFhd{0kWVeu|gFgyXZKx5kZb0S2^FTdy5ZKfNWCTq%p#?f*K>B{l+u7P1K^H}! zce7t-jz2DnsIoKNV&#O!>(GUZzow5+JpdCzlwpLW2NzBw0TamcLeEm)+8T0?hF%@2 z473YyI3!ZAQY4c9@9u2IfM5R`&Nc{49ZI0<&@Ap>b2fq8XI4;K{;K>Ba5j$rl(Tt* zqu&2_ceV%)*vS4H&L%|&6Y=jm8=+x{+pioATK_-5+1US6&gLPx|LwoKvmpYDOaF$m z<(;lEBOv_y&Zcphzwv*#v+@3?oNYTjr5omKkmdRRrZL+nJ8X3S4QIopgo%JV8v@SX zI1ER!6qcllv=Rbz#SiJn7hCW+6~69O0la-WjiaEFU}5Taneew(-z$D`012?Zw}d_5 zDG?A62KnLe0rf7>Ej4LzNR$e}orhE#(&LiB&SF5;cwr?v-K+Byg$6}Idj>&W`7`Q~ zxxJ61Dnu3nych6j3QhrWkg!h)!3lv9!otqD15Xy<6&wPbq75{)+)}$OiGb?iZiJ2? z1ZhBk5QY=Witq?>NQ_Xm_vRh~G=3vS$lQKug3x?=*s59(gphN3NOZhai~xO$K!8x* zf4Lta{Iu4l~Q>J_6)*1q6_<@zw@%a8~|%S>Sa1p;14qzy|ZXL&1jb zyNkm-N|ZAfPX@p)c8>4iA4V51&VH3YFS^74icq&`I?p51my%^3Z8TnN*e{C8l^A zS`UBNogPD2_{16oD&SN2&-L(Y!|T(5`3j%Z@Oro$`0R$)!}0KG4zIrh2!PLbcs*PW zoQG3*J^YafuZPPA-kbcTU(iP?wEP*51*`sE57+0ypX%Y)#r{P-Jk0pBeCT*W3%njK z2M<>Ly&kUr>09d`@Nj*A)q(GLxEz8%$${5H@6XTzzb;%pkobMChvT6>2Q7cb1F`$} zdbmDNUxgMp9xewSGW@w79!J6J;rakE&R^t^!^D5DhvR{0=X*U|9{`R(2_HCk#Th-b zz?lWkEO2IlGYgzq;LHMN7C5uOnFY=)@c)?wpvyPsPLoJvB&2&pK-LY(#-K;gJ%^YG zMW=5CAa9-FYXhDCGi?+sfb9S^2W+RME*Gqq2Jp_pRxbWCt2NMU7iwMj>J2o@{gH=e zw=W~8DJ4}^B@p269uOhR_>+(m2>Y}zS0UtdDB&wjcLBYjQvS0mP0*E$A9aPUVEo8K zS1xd6H0L1XpO>HdLZS(4_@D0!bd~5w-Jz>PKl0F3p_`a_;ZXIk4S~zerq52VyvO5r4eM~6!4AL9}8c<67ZMrcz}&s@P$!0rGzR2De#5Y0AK|W&hHca zeBK0Dse_;I23F$Wya%Ug7OchppTDP57UBWt|DW>!_;|rR0M5fb0M5fb0M5fb0L~l8 zC}96jn;ptZXQoi0OE)fDKmDE&${--x z!Pl}8QQ*xGo#5-th$!%hhUg4mlSV{=za2q_>{o=ptw%%wf-D3y*ak`XOh<%#Cju+5 z6CB?=1=;KR;|ccfy+eV&9)Y#s{oYN;*Oz~^fV|;?_ZO%=BWD&kv%r}J&Ma_dfinyI zV1dEatD;bL8K6jOFrE;g3;-1ds0u)h0qO$KmjI0iXaPW*06GfLb%3I+!>&UDP-cMM z0;mQ+%>e2F&|rWj1GEI7Z2fm_Fu)H0d>_Df1AHgIw*!1Dz&8Q>XMnE<_*#Ik0{9AmF9rBwfG+^}Jb?cQ@L2$# z4xvs_OPyD-5h$@xL=C%6L@uM?RH^B_eW911kBKl&>i*CiQfBfeB<9E5lM3keN&Cj- zXd!L-sxcq4VxcJEEadE-P*{{dc^7@VgGT!mpUeT_SfkZd{0qw;NqWDJlgXiSh z^$lxjlIq-<`dd{IY6BJ{@6jzOH2Pas-Q3#pI(E#A4zNGvE-B;OmD(#{uqe=oK2Y3_ zh8NMCx zgH9Ha+$GDCf#eDkfobUqIswAeo_c?#VwHPk{hiLk8?uoH8r`)yx@i`sZC?&s3%Jbl z^W(v0M&_=nxpP+nxj!`D(6&`BI>;Y(P7c^EXdAmh>a3SNS9;ef!_w|)vTx^IIntg_ z4|IiwBFf)vN8TCQd=Ye9aDu+(e$DZpQ5dF||bwV{_NH=;rFdtE3LAqgZ za#AgU`^@Q6awLd#SuEWCMmWvA%_)x!iXm_&PQLQp^Ulgk9l1;P-JYG223L9F?X{voK?OsRy zgXq|7#!%T|!z0g!JEmHTq2&Q#OvNJ4qw{0R*Abq~%7;S-G=1FiCw;qbC>_6euJs_>&o^!_PXVv{$>LXYAai+gR=^0L$k4JgQFFLZ9};Vv;sp} z&s*KX3O2aGVP;`M;7Jh^r6I;0DfgtMXw5-s97es780Xv(hxUpwU3ro=+Uz^Ua(@Y*lLVgB z$}UNFh4#Fmf;X|;W4*KAEE7Bii(1!Cif0{I7A(z27=xL%G8V%b*QooSQPk^hl`lo) z_G3KI9%k_lD0#E($FXDKSJ({NGfi>#cmLWlJeqqOQI}i^4|4ey$aG~rhwxEm`vk{; z8wWc$dE3?|eo{EU#AM;%gr@?UwkFFG8OnA*z;Flu+hK;E{9EsbpZwdF-J;kCxLByl za^)vaEbEbE(kkATF?HeU*F&y7Y&KKB-6-(x!lC?D@I`{3KtC|*#W1D}*s};BXA0R&+`dGm56M*9It)oAIeqgFz!|)k^{eS01(giSl4bWeJ{2=k?!)t3W{1rej zd<*K&s6V)GbTE&(1>oUZQ~yBx>F5p&9}XA>Sdjh`=noe484M5CAHJ3K55&($Lpd<~ zG$0>X;Qkr(181}d!^5lKTVJ8CMxccmM!v6@1MC?&v%r}J&Ma_dfinx7S>Vh9|1k^v zDu2lPU7!eP#P}L^P!0rsuxR<$>dJqDo%{3;^9Qy=7#;(V|8q3;*X#Jx0r>!c|6Tqt zqYJ~&{KNdAAQ*=K`VaF5ykZ#M^&jRBsq--WJfQ#Y@`qM(SUfHE5Az3VB^aIvh+lt~ zKL|O%@OJ=3e&-hNqF{KBf0#dP)xq#3Kz{-9*MS9UW{+Wb{C}7~AacSyW(ZLHclpCD zLm2+aKg=Iuf?@b{K=I$@57AXHyv;w%ALMpmc(_5%@&~vj&ghv1&Ma_dfinx7S>Vh9 z|FA82-9coHD~{$2i1$OyCGlYf{$ z7;C}s$N%vCgW4k)zV;vH4||C)yyid5AHZEO{5xR00P@#?1#054U>@KJ*dMseFYyF7 zVR*iOm_LwP!|+4@Fn^$qhT#ya!DP7C5uO znFY=)aAtus3;Z9lz_0R$$lnEWfPN)uu!FC_!Y(ZO{k8HTUt#Ai{lom>5-v<)3?LsC zef?TKmnaN>2n3eD%O5_w!0?OzFn_q72*bw$_W9lZCI2rle9%A4A0&`r@$>?K|6Tsj z!3V>?{fGI(!UGr{1lS)Szci@Ia~K|;UjbqGFY#p=FuV>hUO+c~iEo;K;o|^%{?6^h zNMIgd2?+jO{tzMu!v_QS-@Sj(aE0OX0K@!l|I%>^48H>i{$2hMHUz_W0rG#hf5{T- zXAeHhAAaddXD7}qaAtus3!GWt%mQZ?_&;QUU*!+*{nfuyV_pJ=0JbHa{U7IVC zu(R+#=?jY?aDOG?03P1o-{lVtf5QJRfB5z%{O|Gy z1X-Al073X&{y+`@?*U!=UH)JK;NkuKUH&lZ3-hq+fc)R(4>`d141ECpclpE11(aM8zBEIe*g?|M$Rm7W`Q#coLS(^0%sQZzh(iaD5kgi(%N$upVnJd;L<#M z_6%jscTx)XdJ=)w^Vb(;F;v8#-;ijcN_wr5_)MpcBBw~jC8<#QI@Rdc!HYUUqocaG zrV`@b&rk*$?u&gP`FfEG1w&NL8%2ACLoWve3I^5BCG(3bO*TkWf+cT|>j!%_U zG&MBGGze|YR*kOJ)^Dd6qcOEH9BnR?u#prm@NrUY!C(%StaMD{%S1!@=NCg?L^V6= zO62M*v=*m^V!kSr?^HARRz(kDlFC=19lJf?HhsI?P#z;~%l6^RVmitPSp#SSRF<~d z8ddjR-QXVG*bx{DT}{MB!O?hr|8=%4NM-t2f;;#oC(*UG8Co|`{TO~%OMZ&Zz@x$y zS{7e+7DqpQNd`-mYtc`ly88|GyfnQ-$fTa%p}oF=n#WK!%sTcg;URZxiC?t_xgb~d ztEz~*;V1&M&DovTy1wQU-=HzP$IUAoih@NEo-Pw9mMb=iF=G^@n6Gl(T=FCKXX(Lo z+i4Tl_O(0Zt3g2+f-lx0-Y_q|uD2R%yx7l@t@N5@oUmHay9gCTu$hyJClZvR|6pj+ zj|yk|B%AEt7Tcf#fyR3?W5ssRXvbj;8VGHIC=QmRf zx!l!NJahBIliI_s+m~^|`B>d;DH=GY=}falo$iEOCl2<#zi&CJ-hwux(AdU&duBqw zN9xn+5RK;hw?b_hYpoa`>snUCR~v4umWSQ2lTE8jtx+yE7x+BD?h)7|e@r-adC@su ziw2)TR`f&c^NB-G~=cRsJe;7&kP7r`*lftGb(oh_CHm zGc&*w-k<~reC4?kl^5bHwXro9DA6M6)V{?O zj~9)bmEX$r>0}9b*d@h~(JDC+cfnl#{_`VQ2~S#I%l??!!0YLzhgxdyQ9xK8=i|)V z!|oq@?+~>u;>mCbhbk8u9}x8@g;?;9f)3|L#P*LW=Z;?Ys~frB&cEP;Bc zcgKe|6~7OWJmYb`ygMzp(L0zPA(ZVCmZa`V67}!-vAk3BXA>CFKd&&R%g1wF|Kgyt zA|X1QEP}mSfU@n*8Y7DyUg^he-$8oGaGh<({;Lg(%~)*>Zxc!NgXd&+L47+;qoRZt zC+*17QH~q#%_LQcJoZNjI{KO}g0{k4tkrN3ySjc~i&o|!4yDQa+1Mre z;@SF0`W@ybiuXgwT4=7(FUV_R&6=-Aue~@-nN_Cfzq(Esr<$p9;fjD_AcgFcEtMzk zP88GW4AP5nl9!zYtImG-u6045uCXa zjYK-W{AH=s&WPi(Z?~wIz*EsR6*ggu!e%+!DU(j)k;K-x0H)g!SQROT=Y~sTm=%5L zUS8bnLOicF&cIZr;+0AO*5FDdY;*75@oV4^m0Y(I^?LrnzRU2^r2O0d zJe(!>g#>2J_dX7nUFF<$yaH~xs5>0#N~UBgG4kc?y}66y6}M08r1Pjx_-oNkdz52W zr4Gi-nLeW?VFS6wcm9kz9b%buRqJvWEg-kdSHZRCf@{^Yt!hBX7O#t@kur^oteU2@ z>0&jG<(I6pi43b0K8721WaN~+1I@Hn&bG?us8rjRsLm#9G&Hkb@fD>nYSIkoI7H>+ zk+YwdTe%R;V;tg747!W9`!D$J)TJJvxO4f&v#30& z{JKNOVcF0)OOl>dVtG}bjN)U0wt9dC2YPRZ59`OtVdf9+my%;iB(kucQEinDy4Shs zSs$3Za0ii8ngo1!w@jU~7{~ei!A0}- zs(ZqNd_Mbxv(dT-Xp(BBC&-K=cPQvG9p0)*GEbx}6Y~4GwX|3s_WP=fbojn6cYSYx z!xfv<;5%M^-q?;XBe?N$dESN6u(xy)#@grHm#H!};^j7mtwYUy?jK|my}~l%kvT;C z;E2^w8{dK+Zr63ED}2l^Kso!{tlo>JN^z@AydI`*s+$gZ>}KM0+Nh3sIng~6138g8 z>UQ9#ed(%R=MzR$?0WJi929ZNuvED4<`Z8`zr<}N@Yn=fa#^U!jtU96Ik>!U8m=xB zm<6L>5loaqX3e>v@mS}!Px%V>B7GOP6iXS3>)rYOS?=+j>+ak&#oX-fXbXHhI-x1O z!SwD#xgTTAbuUWz&GUk_*9A7L=F(AS`q79|Gea1BUqatx64mGCRij2wIG`?WC z5V2Uj3X#2D+{pf!z{M~4!xqhzuwi`fUh}rpU7mzWZk?jW%=Rx~!>|4Mgc^DCTfS*N zWoVBqwL1}-|H{y=Dm6L7)oVx8KQmv{9DB@QJMH23p1|ERVdY3?q{&@O?Xhsu)Uc{{ zi)H7as7*G~rp~kUk!o)ZHM${L3=PS~iHjfSz&pfEw&V*!ly63s-)*FXpEJ4t@hLdt zez*TIDEsk_jMG5X32T8shu6?-+%ipJY6wZ1thPUigkP%|*UOG9neK$JVYN~{Qp|2q z^doyr0o@NgC?~|$_Q^L$M;MsF%iQD+{&%C|-nfo{P0$Q0$)ALt=iI+ko+#VhBpzk6 zQGrFLp6TFu_&}xAW^l?jOh*mh9oKVttpwYFN7eal6t?X$T9=*FF%BldV*_YH;3=MH zN%ZN{@C*rYqjUp_fl$Ne&rQ-A!8CJ$hBPw4L53MYLFq5bB!km~@`FP^-IejA(b8h1 zZk%tWCN>ue&d;%GZ<6i3vjhsBJc`N<91ANR-H}UQjS)atIpgh^! z7tJ{>O|d!GDJCNqKbMug3KJX&VbJ_`Ygv*oN%JW$(NvnbLq78~$w;wVP;gmTTxp0w z@#|L`#ipjgMRsz!F>Kt|^oc_)8*O%Eb-}m6LRZ~`>jp!+A5DU_SDkLyzeop{XZAd~ z_hqS>j_>uoY@cNnX7T%M$n)p5LNDOT1$(*b5>EOJxHORF@18pZjYi9&wj3?LJwTlM zH2qP0grZ;Wkt3xD-&kX`4%i+MUt(mu(T_}jC#mJp8!w|$g8N~Q#;9c)S=&nt!qi8u2ogS$0u! zy25;E*4=ymNU)V%7zs2y;_FVFC#U4y&(O@o{c>D~>Vef4L!37KViwCf+s-?_MOL(J z<((KF5qQFmm?3P3%JRapSzVWPCOT-}Q>-4oej7H0mR6e0r0|Omlg(&aL3ybCtQu+m~ z+ib|<_AcGf?f{{f3ym8WQOsBgeP()3O83-eP3ESDQ>cnphCXK$r6S4uNBU*v4qEG3 z&&|s5D@&`wkV=?w8(+CTc3fJ$%|;#AM9e8IP5aEiFg(^tqxPuOabhF{-B20-`Er%9 z-+)zhaUzc3<6@jcQceb~g4T;Yugp^vjfnZMwAEF$G-?VO8OrfbP#5)dx%xuNtXQY} zCiP!ctiL83LKi}Fc+_$uq3+5JsYdRYuQMpZiOQ5W@Y*g{UZC&s+AqI2B`lgOwI~z( zqDj?c<#Ui}dJldQ*%p!LLe5sedE2u4msF4#Z$xNYu4b5c1e%ib8^pa1yD33LU#~*f+5+6KuC0H{^AI$YJt++NbKOhbUzSEQF-}=rk26({z5z9KoEK%A?ju!4tZ|Nl?I<{yM%sUgm=h$ zH#&D?r!%EP%c{N^?AN33%G)e95tAoMpR}qRne-1%&mqSXJa7+01(5a*Yf*0UqmgT4{UE zEk(l9bNt*2H$=dd&ubFyci%NEQ7-i<703!;i_T8V=RZUVA&GbPxvS4`eI7Gj;E@7< zQm+{WmiC10)W|1)B#z~At#~Q4jN_30+chHS`%FSSPxCPsU&K#b6|AB3oh#*7ZYsZ^ z_J!8`*#JSl9)>q-Nd#}*cwVE&H*Ce7FLA+i%Jbty?t)LGY@9T0g%S9qQ8TK>Im)+0 zKm$TpEhxw5#F4M=G-E#K@mIZNRnY+aDV>K8HsuCD+ySIz)`aNf|ZB{ad*?k0&nO2jLGSo6-4sknVY&QxGCVUVj4Wf3Bz> z!=jqP)Gr+@rnQ>#d7iW(MpmFlYofw>1&magld|FAY+~2R`-W<@o41E!M^%_ydFad6EclhT5Ec>X)E1e1w~O#s&XKE|Q|z)?*G~Fx zH>~J}E-B<0tI~JBh{jm0@Uo4ycSqcAzh8XIBJY!_h+7NEj@Kf8%@{o%PSr|;o=6N2 zZXbGF(&eH012i{9o6v;wEdy=Np~BlSPE#4WbQxiG90_5S0_jFv3XV_t93^|z?@lgz zv5cD*E0h*%)|}q~`f{3qgb#PGhahOR%47fFt1~$qtg7!Ts3y2HH2Coi_GI zncg2O92pUXu*wMd~yJd_iK{ehQXI!IE?(iz*OU2`r$W@)M%*ejV2QRh0 z4QR(_EPQz)p{d!c%Q--)IWt>;iYvBC&zcpv%N=h(LMqhKbtl@^V(59XZwB^3+qt3T zlAC1MjbF~`;RzHFZePr$(`oez`dWe*#jl!*ZK<}x)6!Vev+}08XT=MTK?tXiz@XVM zV%dWKb0QM~OOWrreW#zSPeEjx(imSG+EDE7+N?nNcpA@(`ip}0Qlon;rK0Qwi}vr9 z%Ix`<*lVyxcA{(h+n-xw&N%oVb1KW#CZFf}O79x0%s21wI4j3SO(&P+OGR9d!@^M@ zGn-5SQ}xu9ON(K0Ikz-N<<$g|`Ei^R4jcm>YiN;cMSIId%tpx-F6f)w%kG)}xb!gL zj?j*<)5+HHb{+)?w^C!_aNm9cUH@&6fL+EjZ66al4yjc;G#s>DcZIMomv2|8&Zc`b zzj|*U0j}_LbKBFY*?&4Fxv-p(>t zis4pa5a!lAfBjQB z3=0qKdi(mlA%SG?t>zh)mHeHCp@gA>St~qA-4K7dxWta+moJ7;6dj|Q97COm26`;} zHMeQZZodl-?B^LEQb$t!M!z;vy4@7xp&4C$*i=CivE~}~c79Z4FYgXF)6mWU8P{%S zMVD^ECgV$qSGhVo>}Fq%IXdJEb#Hl@EA~BSf4_78u(pdg@g}LE#2up+gVz@M8 zW)x~m4;P~DRxgZy7%k~@vv4g3y%ZffKhGocStA*tnCoWfHF>tyukv3;wb5g)o!{sd zyP$q@g;uxLJ-pKDW1L?2`SGm~SH_m`JaUgKo49TdRs*_t5)9YR^-^Vb-?PGgVcEbk z5K}H4qvloqpmd5!drx*(S^UU(Lv>5D+}L>?(dce^WntW$d-IU6_0Ys9`dz<)gE)eT zLSt!l1;;P6Lt<7P9M1_??y=_9Z7|)|jeH{ZQfss&UiEy0Ai_sHAu6?-QM_4S^m>U; zp6-2EW0)AIjgdCq*kS#Dibs_fR#xpYRQvU-hDo6UREcTk;C zkB54@Vr))c@|~d5M;LfJMUlU~ApLreupt5b{9MrGLC|AMs`!gk7x7#IOhZK*w4Y&7 zvA@SEVGq_Mra>nbza1|wo^@503Xkd{a{Ysgo!(C#i(h{J_=cQxu(Ws`VUDyWXvYzo zg=51*c!sZiZ@*HNX5iv|##e59?I}uTNs9c5sttxWlZ`Z<@-ByI=TK!$vW>COGAoC_ za&V@qG>yE{doMhUYv9e;Wa@j5;C7Wbt%w9sK1Mnks!O(rhjEi$Lf2%7-zc-1ObHhW zxdpS+E#!RWt_{6r@hM5UqS;g^(RH1$lwvABaY~Udoza$3D^3roFoJG@hNeL8d zc@*gbs}`FSBi!@NIhcK%i;`7bo9Y-3pMI#A9;E0WHDv4%q0v+{d&e!y_^huu3nLNR zPlo6YUfXDp>q{%lk+jrlKLrdq|Z+{S4u`Q zqC+|@UIlv1Zo%c_eBS^1>j3K{^hD7jp)mA*vLMpVYa{fly4!|&?3)){5szLlYmt0` z++e;a6gR3C-jwC7#Vlq}zb_?f6=a)Dr!Ugfb9uhZL4HMGfhK6=wN)_k#to_>-_C=& z&B)2UaJ}vaT>dBI*(KPuxKaFH4$z|HQ!jf+d`WAtcM*>ner>Q%-ixtExi$D=lx~yv zc~%HD;>hG8%lmtYBIY>fFa#CeS+IGIU#3~3dnO`!-K&-}e2=&ydN^rc z4ZT_jdrYMI_`JO^en^7Lg-NpfhXJ*;^}Wx%g`8ZGb;L62c3hqCOja

z>!r4?}%k$PiW%x&(k$^oUWzKXSlgIfb17#PblMg0mpZy32 zr+y0Ih3{p_XupI@7bQHJ2Ahi=_r3?`x1_fU!$O_cw_Jzc9Y5qG4(D{_g=fHL=kO@a zgta`F*^^TC1qbX-3VWqaQ8OPwbm_-irU~kEnkw@XQh?4u{Pg8St z9)Ujz{xFt?&&`>B#UH-QX4)$Q-}cXqqfv@FY!=SKZ)GEp$ z*No@GldZI)FJ%XL=jI){w7ps60nLT*35oE#aj=2+puRdRc||cV37+Yh%R;Rt|n6d4o$sBl%z8GIWoNzN=c@{h}r+|n0Q?%Tc9b)hj zUIjg7^tW#Y3>QS;+tVu)IN;?BCkKUK1-`Fur@>+@DN)oPR=NjP3BX3vv{cFaypA54 z0dsw}jimllK5^kY`H<|AZRE+((Xgr5jQU%Nmc1&C7GL+hZqz?lPZxbe`6ZbjJ?4UQ zjJ7vShi{rjHc@WhU9N(c1>p2Yc&UCxL*a=F^=OX-G{pGH343TuA3psgH@ z^DpVf(-v@%amvaKu;zs~o2AOPxp24nr7ucwvb)ltApGL?M}I|_ zO~(2R`I($%JQwUysTjxs*FVTgWru~{-x_C!j}9xfv%wvevuepc^(kvu;VqjN+$HZa zimhjYyA8CylRF)2n|~r67cZ^h;)FRmN^8mWTf=$D%z|p(=T*6}H zYr2=OkHXm>?#?Br2WX^?z;QJSv&jr^`9#R38yaVlQ(1>ChTxn{VS`luny)(z$v1_^ z`^bzbKKBM-Rt|xDa+n#XLqBZRTj5B)8W5b*0r$t%u4IEB?>N=^1r8O>PGyBp-;wDd zxBMDWBNr^r52pOKJqub{;Dkf5VqNgY%!-@LaHqSjHu>Y`=ydXwu|=-ku#tv$1`}-E zR@MID`RZc#vee$=DMCrMb#+oznA{+C?$JnrQ{k$#-7KxK4pbdbe58 z{OmW8$cmQ?!x?VJ5vIHoBk8=HpuXZ}2?t!#q^~ zydXB$PWTDy5_9s0G`S@iaDT?0`*i=>;tpB1NVsPxel6Xfm6V~KQ|~|5>w-`4+UE(w!zb7me24E9+|d(+ z&s;WtNA~-?dk+uHCU#rD7yeMxT0VeTd1>0q_7V7H%Vplr@Y-y)w`1^&>6UFx@B)_0 z-{}6mQ}uy@1@O7{l3^N84hLs4pMq!Azfl%~)v6vv_`um;TAn_t-pTdsG~YWf)ZfR1`q%2t8!>?; z@4kI42gmz;;I@TVRXGkXhpiuL#5=)WxfwC*;Gg3QqFmw97n@5rz+0314!OaN-#Qh{ zU@gBTeY@fHt;O!-Y|}M8;aX0*+Q;na}|GGZ@-3h&I;@qYi$~Ud;qj;U-B-z{`r1i1Iu~6^6J+U z*lIG@7Gk6iMp$~z3UvHbOf%p1+l6#-9mdZl9p@9@(fJq|Z5y^~2cV2QFj0W+-- zo^B1dt8w#1!$-ZVkCOx2cP7Wc;&a4VY~cCN+KkV`AGRM}w*}_jmAmi;e9$7g&klZ_ z@3XTMUUOnP*ETq^Am&UNe2>#|0eQ{A$B)ZlnMdC1$%hkPKCgnm29>-cYbP&HtbspW z(K)moKCkg@#RC{OkGR{zH`G$fsJ}{2SU%kWH}>_qy@hLzX2dwa*-fnL+u*dd$Cf(6 zgNrOzeu8I6iZ+sW_{}l>20uI=IqC%8<~)9F5SIRW(P$_9*YWjt(}Ak0vYO`q&FBA5 zVYFr7OvXR|{{253fz!IdZ1}M*(?8xjDaw_b3|&>%6YpD?s+y&)SDH~!YoUPEFaJCH z2wwl^WIF}LiopLSU!_;aX8u=h<1VgaQt-&oC;P+L>bj2CuD+9iwS@$ zI5zAXg6~_akNCs+KjSWR!(BU1FQ@eUc%JgF@Fo@OZb}c`oE!2PmYwaPOP1eod&WDs za3OD!4?J`BjPtMHl+!jAC}s|Z z^_@NYvS9J+j^!b6z^@e@Rp^^d?Wn`&QX!*@L{h5mNPljIzjEueuTl(x@ZyO;Lo zTFTWM2D{8%H0=?rcEgeHB&^D)A>0UG6JD7{w#W$7rTTtfGr)5ep8s^jtrxz#P2&f- zgJVFP?BTC&oB$7OxaR%^mXKylNrBHr$BdEPymr}NB4=7Y?SQ+R1ENyl1xwl%QT)VK zip@!bZ(jBaA+zKzyG-`A8D;N;Z4OlUq{H`X6Z$B9k7IV-Ww`Yb@3c?wru=218St_Q z8U1#cP1SWZIf~=`+mG;K3*%t&H#2_oX4sQ)c5D_r?MS9U6Rf(}>=jx0l=z|-aMZK! zA>`%8aqZ7wnT{8G$QIu5dmh7EQqL%7!W`PeGGup-#5rVn$>`h$I7wrt2^}x*#6zQ6 zSZmPn_Ep%e?oio1_<5{^KRI1?+_(zP8!q{D1wPKi^u7XqvE-EtSw}_RvIM^O>c&^9 zKa*eCE^_ejnWq$=U92}0%iz}IW5+3;)!Ps8)AlC=XVp@?S)}!s-iA9*ORJI>#hT@j zd57a_sC`aLEElMRXRMC>PaClz&wW zygsz*aV*?Df6K#@u#jEU6taEIi>1fl@RElrr{UBthv^}(lUqZ|DcI43Im#bysY>uC zcg;QQun&IVQNNt>Tj_|DNW!j(b`I1Y!bjC~X2PFZ9xSHzT$Q%@jW}%me&6-q?faCi zMGOv?%QU=(bor@Y`ewj$?M1JV&8KLxiomlsPgIhJLv1Pq;0^xzgJe?!*M)4br2UsA zH{ePxFSQZOdMtN4PZYpb<65}tjQ%5N!Bz-YoM`kVi}%S2--0J+$%f6v&&f*CRz{1k zzk9W%JMO{Uj1LZNfkn;-RXm0>hp$E@z!_FCci+R)51pJ!^Fhz3oYDvQ(y1foir^0| zdvjXg!_U3Usr~Dmue&$Heqno;KY>>|A82fXXTP|~KLhh2f1iR)Bh0#YnwJ8sw0c>= zL%6hmlvM?Ok$EGK{59)!wmMv@yl}-MIO?9{=u-HMtm;oH-^DB6w(7$7b$bM#z(;s( zrY?ual9w%i3X85SDPIY*912|b9A+PB@K^{7$4g-aC4o7=Rg7`|7-5SM%l_!!V0l zp@9!9qMMJ~cW|#qL6}hhJh`f^-Q-{u1ZQtL89?bx886)r!@q9Jbq&F@jvC}8z(%%e z8ed_57nks2nER5?n^*7>7ABc;_{W*-B`@J<K*LZ{(;t~`oZyY%1G}HI@K5mTMK06(Eb*RCiBqx z$UZyct^z#YT4N5ahk90pjM8w`7N4WE-tAO-8b1%d$X30P{N>pVPx5Wn$G_LZ89c8_ zq+lNNPok9GsnOao1>RaLVebLIo*ClRhWe%PZ1CL$7u#Gcehlwixz^edc3!s9>pHw= zy71F2aA7>V6xp1?q>kJ!&R>}b2ZT7^*#xKN3H>|^FXLOqLDpKHG*0Iq5t?g-EaAVN zkKjv}42w=YDyhd9dVKou)llRS-kr6C)_{?*P5tB<7dP6`8Y?9{ql#i2`7U=m+0d4= zj_jbbe?6_a{h`ZMkHWDl*gVLLjY|y4O>eC^X^eXKxXFdXqZ%C2wB}s(d-sTZG~{G8 z?N2Yol<_m@2)XSlf< zko%d+8p#cr^2^CH{q``_zyeDcwa9<1@86!Ft1Bw1tNzn3=qmr`2fB`02eWcBoSgc{ zDWpxb%$31AOZAQyL@f2KTB@hn5x4h@Hm&L*Z+A6NwxE}UWlV3>bd&9<-Zh=`xl#?lam0u;xPI#&KlA|}^x#_jeu5dNa zK@Bpe;p`@|=bVaZWSK}U$$jvy{T(Ga@MQFu&x{si!jJ2Btn@*;yLi~KEAX1tE?>Oh zy480xQ{fW@vZu&OUw<4VZ=VR4B^w-O*CsFiv1HC(_-U_{bP9ZzZ-9l$%e*?hG!f=* zU!7(O%ieD5J`2}Zep_V%8+lwxB~LeNHYQuNJN&j7o;$S$R(!|9Md{BP0}M1_!C`^I zSh(bSj=2hKseaLkoMtSzR~f#}yJ9mrHej#Od~!(VbLt(>?U_a-;XC|$&yt;24yTh% z1NX#|BfC@L$TyF_IzwjN?Vdjip6p%L!-trt{T)BN%%^mPfV0uR`$vbl5*@GKbz?Ih z(wz@qttOj|v#C>miX5*Ei-Yga-gck*Tb1sdJhBvjwhkAitJR;3hpQ`w_fh{eRast5 zZdVk|=79Z|>5h^gyz+a*4%;l6w()m7iY`X6!8r>UhRJS6%(k$?A--Eh65t~=r&sWn zTp5NL*(9wfeR32g&WL?;4n7_E-ih-2>1|zp0lwl>?K=UNxd_Q-!3Q%e^cb=KV0mM~ zoA8=}y@#0K#OXTs$bF0xl~du!d;A6k@L$L4-%T&d>Z+Qms+{}`lwqNw`a(se-&t2| z++b(0Vy%gtsmYqnc1lW$nyN~U>h}Nnwl@9j9}|N;14kq44ZQrn@ppW6Fb6k7+@GH~ zt_&*d>=D<{^PI+c&TyuN-bt-*ECKF#=7rNkvDqH~+YDxn^4(3VmpLwhUo{DDoB0E| zv*)Vsih>hGYJQHw3uJEII1SG!-XuWj)28}qorAM4ozW#*ep#$U-Zf;ZL*_Lav?sq1 z&ekV~>N-s%!vkh2x#amjI(J`&gVQz#k)OQwvB`k-5cxDIY(;Z^ccfaH93@-3pq~2J5{)kwboylf+5BBU3vz8_sN>$?*=>u<$v# z5Vk$4Vb%n@7B6|M0rz%B-F*Wajfy8}!43D1IaR{GR}+|Z;c1ZuCD-6`yPYHCQ+B@W znXp3S_BwsofTNS=0{pP?>{RMassYdIqv6Tkm7zIJ`vm2`$=qvzbd%C;+EMWLgTb7O z;pr(U%H*eu_+mYs<1RS`0R(53&P+TBFmX}!Y%tHI;i(I zm7Pd)f<0%hpGyAdHCJajJUKc#9vEF*2G20r<45U3mdzRD2P*sS2f{xFUzBRYirN0N zgJH)p)_isN@Q)+5M_?fxKb=Le@*9t-bo?E;Bh#hfs8yA2;qdB|tb9S(q}_{+;xW!H zZ^j7UT5fJb_3d&yOoZ>+;?_7BOcC7uT) zKR*rH{z_^_bvE3w)L)9sqjAw92iAF8I7+6GU~g7)1hywqQwNi8m$g>*soxOgvE-26-}Jzp~ zTlpYtcHolNIO_W$cQ>CmEd1tD7uA2+4cCv9{_t*zKiOPU?N|V;Q+u6@{MY&U?^Y}| zO(jJ&rGI)ttoWZN)*KZJX6I%&@#hKg^m}RBg(UFg2RROJ?paIm2sh>?XLGzOWqHQ< z0k40a5Nl#Nsp5CKvS21o0RGQhlUrLk^4Vo$D`TgbpAT3ZjOzX zt<_#nMBq7Gr==*p&N^?d09>om=S23*V;$sz%Xu8!Y5y0_oVOoCuV^_uPu&e(biitU z2W&jtQR4yQ##qT$uwiO+%mMh-%U2Br@W9KubyOcV-|+=!;WG!e3LJsQ!&wZ1;5@?* zmJu*R+~ZVFShZ_+W+c4p>`Z4DcsNSS?gV^@``wrgEZ`x2g5taRi;}Pb%;9=#M?9Qu zab`jtK6Cj(CbiEr%YE+`!e%?(#h-_d_a+{i3qPsY?|%_qb2*q<7_Q-$n4bzy_Ii0{ zhbVHy%7=`Ue&F;7dm4P=MiZ+DtSvr#jQsp?fS@_-FSK@B9(-JU)>s(qAbhp59RA$N z^)eUs=v8*Dffw4ds?@=`b8Dg+U`LMU`48X?>-)|;fHz0Ro4kYjA4<(@ghMJm=~Dc4 zG?Fad!nTTO!Zg03RIj$S!G9fZe>**Bs4Fj4`o|}<|Ct^l3A+PuY9d!NZLQbM zebpVd=-{-CfafvzsO^D$HG*@G!C#-e9Ni6H_d1pv2`_ICp6UuSuB&_)1$V4)?{tB4 zh8bRyi)9&%cfw5h^`!%exF@pO)cZo*BuQY%38^9%zFPTsEGpR~1oddV&i2IR$aZF((i;0__BF{g`A}a>lTC<2#d7h@Lo)m>2+~4(_ zy#3JVK4Eyf@SBzxI4?XoKmbCeXJlX0uH@LZ2x4G+3R<)xaCH`sk+rOD1RgG+-;}euNS5_Q2y|c z)j!A|IlktS&r3ENpN5n6p7AE@6t7B(g-ep{>M4GF@_l0QaA#OeTLQdi*>l%(@W_TA z5#$5=cur=)OmFsUQG4vPiPX-6WrFVclhY2TZZ3e=C$##IFT``i6~T3@K8capZR;1% z=rtX_w3zlcIhvDq+Ev8E0pss-ijiJvuINDhA@9eWySL!}6Kle#zj*1{#?$`QM^jHz z|F5kIi@ph;zvLu9&Odu{h{|)LcDV!f->R2ineyR7;uAT?VfKe&{*R5IvzI04XTqDb8hUBIh>Cb~ECy~B5xqt3n!VL33?AFq zRzPN7r~NA!{!n)OxBoi-{M~e^sf62qRQ~C7srEnL|1n%NdYl&WO$>NDG4mjtqZFXDe_`jVY(vPOj z-od}X9$Vd0%46z4?!^qtb8X?sDiaU#NW02&YuMmq;p(sOSxd{=hOk}WBbZ#F>rB;c|SR7_2B3!_-fbj-`h(JR_BMosTX;phLC<; zP$kt9_L0BBJqnxes!$_W*OZBpi!JI(T;RG@p4>lR5A`rLE4VT9cKuIy-QKGehA>}t zW70Sr(R*K889rCUG;abP%nscn4>M>oX_Dn1H|9#h%Yqqi{emC38LXQH^Xs)dqwN`G zW5(Ixh2PTrhv99-eF9VA{&QujfrDKTyf-O(Ge#dKdaO^P5p#7tmY$Fz+IS41Q z^QMxwx_-LV3zycK#gI=$9vo?hhppyVlW*7vd@q4VmOZ#d@e&x{ZJP^cRi^%S9skwx zbl6A8^|wQJi*lWTT^$DJQ~vI*MBW(K0XLwKg>znLyTdxeOf~(myKKsnZ7{Qe&q*>% zXVK0P^iL<_ghRcsb9%SaEx4Y4_u?LS&fWw)XIOvreZOva*lGXgT8x(vWh>=Q_~QzZ z7$-^WE)C}5W;kZ_#~a#)mB#$PWN@lpvP3vn zR#PvaVUGJ8LtL^`FSWP9>z{9E=VQ8(<9uMW4!Io;oxHpNxwdtc6d1vmuJMJ+!@_Rz zV&qlq34vri{gquS;Kjz}zta;N4pbPx-TDd_DgB9|x9~D}{a{HhS-bjVpgwFBy(s4Q z_OGgLYEyofH|NQ1`Gaee;j39PA=2=wJ5oi9;IfE2C+EQ$<=#T%GhvCEJ@MLrXxgGS_ zV207%-jqKsTzG&1mcF-eh&)|j)7=R~)uQK|03C17a)n)F`IA->GVo;7d$tuFA(sWa zsZlGq{5W<+6JEg`CqT!aYz3e6=XX?LRo-0}tdXw!V~Ua=9G^Qk&=S7Up62We_cCqG zFoz#$NVfXGUsVs6o5HG#TgJ$lu1`*r1q~lolcQd0hfaIrH<_)mXQite;@L&7m-whvSO*JLWe>{9t{&T-Ws8}#3hR>fL7YCdwWqr@TL{DR0 z>W;V5@G4p8-?9qVPZIoO3|Iee!$%gwXZUpCSDyctJF4ZHKL@Py#_nP(w*I&)c78YZ zs<3{0`8U{KKVoVheE4eL(;hhRbCmfv`147xDgE$aG5+dL@E+zyiC%cJRMU6f6dHu{ z3@6r^WB-b+a+b4Ds$cR^bFRUq5~lq6aLBrhu3K;{S4Y<}Si@(j85 zKiv;MDUI|Qf-g&+`Q-ucTXS!e%G>MKG;1q-bnC4(eeeP6BBu@T#>^Q?-(m6D9%Y7b ztJL0!F4&~)edlag47ToaSfh*=@ zrq98gQ(?zfMT_Y8c4=zPtneti;PU~vYJ_DPGrVB%%T}_5lz=ID>a&|G$?4l4&L^)~ zJ+PE4q2nq}c8l11i`wVaiDV!0`***>$+ZtQ3$VZ+JPUNlrK5Jo+2F8}cju|T>7Jj( z+2QuJZ*^^ZEyE47 zY3l>$(`I9b@E_mi_r&w})ZJyFM z`1t}iUvgfu9Y;6J5F8^-p0fG$NAjk)q>nvtOX0)D@9?k@en|)CXc~wbM&=AbR7~1{~-WJHQaTtE(eIk{7f~Q4n1TNkkVN9OunLJJw z`tXI5?E544*(fYB-6O6G?!Pzd><`#9Ug}vV?En0D&=|b!k=-$J({>i~ad?TGtQ>jA z(D&KD;P;2NKKTm&+LQQ${B38s4LSH+S?dHmvv+z-2fTcFLNNn+*{2n2*~lK&;z5kC zedDd1FK~;xv&j_rrtl#Gjd5xFcX@ES8b*{dZuyH`*z zX3$bdYuQHv-l@7AgfvlqahnEJe^KDDOrW-G!vV~q@C#@K-@CD>8u=T)kI zf_`7I794vvN}J+m7AJDs5SIV)PKDwx`qSj79en)I(pc(WGgq%&6aZ^6u$H#Lclefy z$HI3+#Ybp77#4{2CBqU;u9DASHG^rRmto1G^z24>a&(u4YP@|6pI_-7Pouq8dx;G> zZPV0h%0JN~v6seUMZf1wvi0#oTXHP7l?(aIr_CnhVS)6UbiBfahO=orv$2ewCfl0_ zijvtiZ}lg^F+aYK(fI%CeDQY+f~KN|+Twq_ApF|KC6r~?p$kmFRrJB*B<{`Iq6hDtx2eGt?pHSp(SbcwLq#{kmu1#`(1tg;mVdH^ zRfK|M$*$4to43KQ&F}VT!4=#RJ&tfR>n?ZlS(DPEJK?5O$*p7=8<&9H@YF3A^2jF_ zN2TnC4ID%4$sBeyow0E38cnYyuxi7tFIV9HJ~5ZYa2lUieI?BQM1MpBj;x81=zz@+ zE{s!yW6FyBhspDMuc*Q{4KG%V!)**NtjLcPhpVQbHFS)!RLNJa59M>h!$U1Q$!)fm z9`ll)SfrA@_ePgagEKBZE+iYo8r=|rrx%3>ljpvVmYxo`Ii4I=ffpnO&6)ul`m;DI z!{TNK1|{G*kMxcx!os`C=P!rzzh$kN30KVP+iwZ4XFc^%5Z=pgf5?W?pWGeihn4GF zr)+`wcAJZkKO26!L4N;My`2{}bJIAq9bQ)4pv4V8nz{ah6D+@AJsTG+zA~+)@OiuUI^xIg}08^MEykX zmA<`SVKp4NbL7Pc?4^BGWf{yW`KEFh=Cd7bQikWx%nTib7qJGdQiOl*<&hx^cd;&9 z0BeO6L=3=rVNY(zz)HJ&?)AejLf_As1M{_aZs>#C%o%gV;E=babv>}0vDbQvca8Eo zpYJdqzuaMJ53Q7Dhi7&zqSz zo!V>Dsl#VG;4v%yOLRPs)yK>}!;hB>CeMahy%IjPz(Pm()v5ezbYE?6gvB3xJ-!fT ztK2O92#@pD_u4#*=FiDhUpy&h7BifCZG6vbq>nz0 zJV^8H+HrnIUToj`egBrJFxS09=Hc*;$dv&+aFNRr|5vc{x^4E;U*JF89DnR*WNL9WK##y|Aj7oX&dq3yE3@m4urn{&&bZtfdBse`!@prM&REF{2PIPBk*qo{*A!@ zKO+$763oZVknrc{Um^>uq{KIA>doJDaQAsDO})pXA5sP6aDPmaO8s5D{&~6G0TCSX zGn>P;8Q(T%eEwuUay{hFz154o?0utJJQuFuDv$aAhdwDSoC#l7(~5rr%Z4%pi^6ZV zn16W)r+=NjSp*KS4BSkfsvonF%&^M*bTz!LB;=eBtQoN_hMdcw=0q;rv_`iI?wT*0 zDG0~soSAY57HNDt@Y|mZ#w+3cxz1zc8K1lq%U}=n?SjJa2D6++(k)Cj4&8(|uKQ3l9e(pJNje*j(z#zk<(GK1LopC$nkynI4M%zv+xx@I$12Ln z6F0-vyx?a?CGX0>)uq+v_QM)u&cozu&+;?f;nPn;7R$m%Cthdlf$RD+gvlP&(Zd$- zA!&Kk9**biS;2VdBX3l^c1P%<$gR^55 zTc|zv4W1I51N&MByUu|ZKai4~4NEsaoFGpz@}HnywIE)ULyBzh^(Fa%Op^pT?e1kW za>x_E4Dw_z{N;Ua!94hkV^TP!D{eh@jl3bX*i-`E_~_zXif^&gfp;_EI-l_j@;2j| z`;sub?;|scU&WA68I?ES<|<)1IPh^+nJnyFJ9{4W*Ce02J`3SzM|QC-fS>hGn@;f> z3w)QV1mC&zX3zls^dUl11GeMrsx*OlWW$eW!J#1o-`2ywuD=!5hLvxg;NJ-M8tIsk z_2Ts&Y=(V3bE?SO=cV!3z}wh9&(?vB@-M1xffqhFyOmraSzc%h-!U=%Ox8K6wZRU) z%+=$d3#SJ*OKpYE*Q89-gCE}h#z+2gLb{Z!e`I?UE-+eq6YBTCIti9{?bE*oh#tuO5QuR!`t@FuU!e>58d193bz{8cddfWo6S}q zhWAYTC^v_P&Rv{)1CB}YvE2y|M?EpT51Un8cG?H~)E{f_fLW94=O2c5<*%3QhdD*n zHiW`zIR~_+V*XJ6ygc~?>{cYq&j&}&*ff3${^XUsUJQ25({GG}4dp~QmQnuj%$--^ z=dO>30^rG6$}QxCYzeI3p0f8Y(rwR;JnDnJeCs91QLdbI$1%ITXEE2Tg3nnOe~W}K zXM9&CTV{PTh=E_MED<7aag6vC2eb5j{CNkSoE<&hMRb#Q+}GHci1hE7it^+)i{)j= zwj24L--g%ioqvox{nffn`CH+nuea0NcM?z*Tce1_#>R|*_A{N;=Zyy4ESTVyL0f%7WxJ6>CfcsTm}InJ4I zSZ~1)#dlkBtJ(zOQB>Yy5dsUjd%3j3vo1SL@qv$p8o#Q5m%62tyTAj73PV%ikMSyJ zw!+g{m+v_SizrxZv4r>U&Gd7J1)JLrt%W~&{n)bw{;KZsnfgoLFI|4(6Oz<>Y#{r@=v=RAY?xfu#H z|M;3=k45UDmBUN)|*-Y^ByL|un7O#755)0#a5HK zU3hLRE`s?y#`e+HGrY&Mb72+!NBIq~qSSJURQNW-#nTUApTrl*M_^IwZS7CskYh`E z_Q5|-K6ZExulRm8$^oADNM+YcSWEwD))x4Cj-b^mSd44K6bslU>Yn>+xZ;7p{B`iA zk2)9Lz)O~#sWpbhdo<0P;G}>MF+Fp9y!|0mVV8r)@I^Xv!ZPcJdP3HwEJ3H*dhF6arAz@FSe%4GY` zM|YBUEw$NCKH#2iK#r;9PavzcC%6>D8|L)5kHJ3=b?l)25vQ)ObsYA(c%Xpxzg}Xk z00VkiA47EG4On&!g9sBGuWp%4e%f?Nkr|e$(_zYkQ{FUvA@klSW+7uy-pB%nn)&;Y zbE{spkdw*f;T=?*{c}X2!tAS@8B1^>3)Z=bSgaJR7bndumR;%9*-$E}UnOEKX*ts*fPs zs;cy?g6I29Ng_|U^>>i>Mkr*FuLNEHO!>9VRO=++?E`#2$roo1HIm1cdFY$NyeXd1 zGH~Ye(|c`U&m&^y@^FM~KpWMM*KG#h0@%Xs_7+FDuPpZFLfFRmh@mIUT(=@!5q`7b z2~P+tsc4EiDbd=@?eHb5 zeASomMMu+D9{d}pM~XPHbHhq;s-H5}k+dVOXLSWWi-a>&~Oi=MA}!48)% z4t21H)86)-=YdxyvfiTom$Ykd7K1;!Gu+!s`CtE-F&}PLJHN*kzF;=&t_ll0;ki%c zpR(~+-fH;Hyc5$m!yDWMF4@Dwy&|(W!s2;(SIF-xbh7>Jwp07zn4TOaig#0By1*$|d*1$U)P5^# zyLY6(XB(3GsJ%H0=7(j&!Vyj%s6QBZRaWJ|I=10KWJZ^}b@}ja$)dEC@Z{>Nmegsm z0&a}wUQX%3_ob?IVBM_G*}1S}<@`~yXWE9S>+s2-UUBN535H+1ufb{K26p830R8kV zc()*YAO?xCEW`mpq#cg>gJPSb9qWpJj;cuNvok$&qP zStWJI;T+6aI4DB>J?696t}}4`m6}atnYe)9lW?N3Zz@^ik!Wu??D$bm-vBm!Wx9iW zWQ+VJ^4AhR$HVYu!3%m+|Lq0qe)_}rbLQ=*_$cJM6z_%YA}i<7cuD@Kleim>a5`8| z@tv{ebiETCv@makwm0I8tlj~CygU0a#jj#?N*y;gVE@9}!+o(7qN(R763kvd$? zWCORTIKQUx{=lA=lzytRAhSXm?Ggqxvru?V>5BBan znyc>rAHJzblqQnOOd<2EB9)MNo`;f$*Q{eg3=eweHI*)?@8`_St8jyVZJ9{=UdcvH7-m3g?0YhJy7i=jeX}BDYeYdM_2h9F^^zkxS zVb}02a-VHS2U*W|{aWge-eNz>$fp-MHIr}MUwV|>-H_Ts<~-Y%OlCV}IlUV`S}9>e z@xEH{k|4G3@X8YRCGdM~ZfkPtgrg&w&;3MnINYH1ID_U7ttdeo^0VvH0_3l63f~05 z2Oou;UIag#wR3GCY?^+3av^;5S=~iHc#*`14K!bsn44|(fIslOTt@RDtGncCSNKL% z&vBYhS1*YRrSZGvco7fH=ayzK`xM|E2hZ@*`lB%C2cI0A6|2cX>yw8r`q~r^6wHru zeT8p6T0cVZVu4#>&?k7SoS+0J9C6!0=pEd#nnjxhUTx7(M(eM|j*P`jaC=J%8@V7+ zSD8F0y6rKo*P1<7=KVta5;e>4dawxrn9r8_Op1=WHn)%2I-SHCSjd~riIkWTQX97O?fnAwm@Bz7x?BkT*`}tAw_ecCapJ9oTt0%~7Cj5G-d{L34 zS!9Pp73W^VrL21^sXPWzPZ6rGDB~RuvaHnTmLd4vD%}@$aM6_+@(#kb!j_ULG`u(Tte??VQ zWySyc?J?Wb{=B=4uK$@Bq8Mi1#;^ZZe$qBaFW_V-@%YDur`TRmuSKj%T1E%;%LHfP zD;ATz0aWU& zPgBb`A^p!@=5-$CC-a3Y2&44X?W3w>jV`W_i(!Vj16iA4{(udi$*-+*a>y4WGAGD$ zXB<9F7PV}gB)>fOtboj!JMoiz^8KDNvg_)u$|dmnQVVHgxTfCTYB}5<=#XFqPvkRL zQGIX!G;6YjS$9u53c~hL&K~w~=$KJ}1YEUJ^oJ+>jkn8D5?0-F*=Gm*@$(KIY50(f z4AX9S&-czK8Tk7eo16YH=Qo*o@-UYv$NgZ~z0>5SB0MOk9kCz2#F+JzoUXR#FZWmO zZcu@3M7#x}k^Z!g>pS@|uliB4?W!RLb$GMg?zkBE+9$=mYvB(qo)t-OyV7o@b?`mQ zrnVH=Ty*IoZMf2;*WozqAlv@a2-e(s_{Mqo_R#wpJJ_s9#Hbm5{Ho~<*?m`OA^EUx zu&N_Gn0xM78~n}rhZR}o;L#=RFz1iEHBPY9JM;VwSlr;$9kQ(F$vfm>k~b=ReG$BHeXb-0+6| z+XIio%*$m4*8^O2FBp)#+r(L}lt z-`IZmsX%Kjy!N^1xhYuU>dHOjpO*xEf56=w!5hi<1f;Kjh55>?*vZ`0Tu(+})nTWg z8n`3Nf8lF*da8q+{Ddt=Zx}u&BVT(N{(9;bOFvwjW?)+l8#~PH?}1Id=9E;yLnm6e zy5aiQJ447%=L&3Shr4TCo>#)-FC9`^;IBs*e92NGL3ehT@h$=T&8Fo*nG1@dl&+4(WBQPOnYB{*NN%0C1S z5tVZ)hXo#($9ch3=eE_B!O1I`$6Voq;~ha4VEe$(J=9-CU#)j5g}Wan1e?K9hvmXb zV990PFO1-%{@XFdaK-kxpVXg@X~l^Y!EFvFV%EVLbr(*Zg&XvDzg34dm$fO301z|(YVD}6-!{^E*KO7gm#FXNHkw}l80DM?D(IOe1 zt6{pD(wi*4ZjFb><=%uWg#}ba&m4x62d^j1fae!$H3Y#t=`3cy5kGz`y}8T}K9T2G z_XExhT$8dBz9aEy^ecRfjoZo#E{hzWJq91-D|@mH7Mmd?@(y+rTyO0HSLpPNjldR6 z5(!Rl=IYBUU%^YHehAR~dtzO5+atK#D?ZE&Ug(rCa}fTb$w)LL?3if)x1>K0y8)Y@X>8DkwLQOCwZXhg_G^&W#M<1u z4jW434(q}D4@=57!Yz5fEy?FZ0`srJU&>$2AxjC>TGhe>x2itr!cX#rB&y-l%v0~k zVsGS%t0;eK#7FWemQI-p_~xBY479!bO}2d$zn!XD1jq_ydKIOxzfPJBc}~E=P%>LX zy)(ILmAOYge5goPnd+ zQTwzLPM#^vMC~WmzU!Jdd`WlLG^KCgV2~zTB+36Ir+Mh`y2I;qIi8c>+%YQL0)KR3 zEF^0^pE7WTg>p3$$PukV7aiacCm$v9GVL=xw(!M}h+lL*<~w@1Si<*)vwu^47p+RU zVh;08yt_dD-M-_!K78fFJvTZ&wudrCdN5<0(04k16P^u$I`GfMLmK3Uqt|^mz)}s% zUsC(Zwss#w4J*oQl=8}=$jUy<)y^2TbpLV_hm(7p1kfHdkju^)~r|wUks7?dJ_KADr!-QRuoQu zKbTQoj`R?oC&K4p>#%3umtafQq@&~_9_J@iUaM6NPboZaN4wlz*mnPkr5E9z!g(HZ zaJ*`~E7#I=W9n90=M4L`6l>SRjO}G&uJGx{{_f=F6Kfj+DSd4~Oatt1WjyyZ%&z@q zss+B?!6VoOujV-sOlN7q6L#fW@Sn3Ly=K;QFT8cJ#R*Dp8@V^o2kWr)a*+dS_RQ#q z&!6F8B;VHX{ng|XFLn)5{vNT#5i~uRxj*zLODE;Njcnm>$!o&xg&nIWVWeM)v1YXTU=Tt;Td=Z$LN{z%drFfm%HLAd0jJ-LY&r}#7JZv_1+E*tUvm&XZ2zo34))o% zDsdm2Yu6P-=krG1#ZKz~zqr=U*afFgiJ|8M)BaPimkf5u1#{QLLk|BV*N-W$D; zlc7fUAGbe7ul&fj%Tm|Uf3Tf%S2lXwtpoGSMmB44efA!$#@~O&>nEsx`Hl18U-9RE=feE{gUh+$g;h?oDZOCnuBgSZ`gQgaa*g-BNqT@`>6Ia@aA069YS#JL+9?Zu$3Om zcM-T?Nn>OIr6+%g5QqI$p0F3fx$;)aB;nHhrP*ZucySqNIE|?_g=}_V?hF+;F!AnP zD$iKLbFK+IUiNhb)z3<_+QbSLZ}2Imu~3_thV%!S7quzemIQe)@R|un%AFvv9bZA@-R(EE_2DISjVn z`M90@lz~Hn{9Uo=Il0o#dt^V{bs$ENwvQ@1YenX2H&#)CIoAl^+XsJmv~Qj&>@yW- zNxoKCn5hBJ+09^0ZuDuK(t`PZM>~-%AKZLF_2-bdwwc_g6L8!Rjvd@-MrQc#I%E!u z-ZEQ9-r*m1p4!VZZ|TRq@I7IN&CYP|)A_r}Rnd2!xxvC~tLj2wQ)3Ml5BO#76eBsW zW4Ae3b4|ra2yC3NC766Y^4d$X-g!o)9q^-rul&e!B)NC)gi9Yyyb6XthL_j*zvrVmKr4R2f~Y;l-ensv+Iy#0Ng)Szn<(rxkY0S?B={?g38|* z&hPFI2MM#RBFl6L$NRw=nI$W|;r#7Jp}XOuKQ4Xpf;kk=IQha$=4|`r37u)bOdyDsT z7ns{ib`km9O(R(+IIPE7#uH`{;jFcXSI@nm8P{TnL*d-TXo3_nE6W4-OeJx1#oR`Dw1t37f9|SxIJ|JLxbB_FpwBPVN7O zAw`D`Zk*m=Kz>p>%Yp?~Dc{OS=c}D@;aVm*Zp9K;a{7xqb`0~zcFhy z*7tCcCkn3xk%M)cXOKNA(j=#0^_5NdDE!S@52CByeuvKrR&-K*WOPgye1&yJs>{f& zQ-|!nz~TO{{;IF^mZuS)VV;iB%aoqd>sEXZu6LBnq4KorhU}Z*R$JFx+TWA4&ffL# zYssc=agdA;}KIJ+^cjygItl^`_vWgYhP;T2;aXZe#sH8O8XT_UQizR#vV48 z%b6hmndMFO4s_A@F$kM{MYFz(l^-*Ww^8-&9F#x$NNYLS(!W!{3BF!hX-VT-#KCEb z_P6S#w+h9J_r8aex4?Thj_)QHw?4W}ZrqP8e`eqIkPK^5UJHu+*VYbBf3Qk$aZ!f)A_ndQ-e!<(IqI7ru3C zr4_~VkfwrdWM^-dJo4lt?W=z9Ppg5OLGXRvPt5_aMH+WTFnqUTxl9Pmf8BkAoTGVy zcOUF0v~P$!w4zBZ4Bl$tae=&TL)+X4*tX0nhy1Iij3EwwyXmDC`65^7=m}W!RKGgy zkI^kj^$aY|Z*iLHvqyPRL=AjaJmRnVcdwI~Y=u>V+YAX3H)8_5{aEX-J8}c-ByVn4$G|`<-?QxC&c^36=zr(xOY5%K7Ul=@u>%;OQ zLt&S4)0t1;aIM>?X?>9S=GpD1lz-l~WLj^WZBBO?h8q)On4@6X7rkE3V2vGHk`BNb zzsG_pJ-sVS;t(uzbiVx}N8pqfMKh^A2J2iW$d`({m(zHRjTp>KfFE61akK)yamD-? zt*07_26~F&n$)iqN$??lqtgZOKIX|w$?(*iW6jk5p^l|_M`25yn@u!66-v&_9)k}s z?>|7!Z5%EoU*h=fNBO&2!V^HR$`Q& z1|M=eH;>#UJJU5CR(6|SNBQfj&MTdOofoC;JPq6MwA~`}*hJOl!7dlHoHJm4@6I{7 zaDwb(?M!&lj*??Ju%rg}L2}@LpC8#Np)#91d$y>_Nw}+we|HwV{N~trHhgzQs9H8W zWv^aO)*8{Bode7E{JKFtbFEdH-2Gz7I@*45_L&p3{=MSC|B~waR`k3ft*1Y7=YOI0 z)KH3CUJM%^VpBf{_aC@#R|3awQ)eiFpIASeSq2B(8Q`G!STVRfqZ0NJ^u0~K6`FXD zyluhEYjpnN+qGJ&;H=b4!D={t_yv)q!!kVN$VmH846Bbh5uZ|XshJjYl8Qr zSDvJF37vJvUcn7l{HDrb$-TEU3N- zhIz++!a5-n0vF&XJAYrEhAl$pemW1Y=j|A#`6xu!W{8eA?bV|rjF`Wo?u92&du&fy zAy4z$()(g(i(s8>>r_g=V%oU(99-$q&P>)_HBv?Gd1c>y51RijvYt9k*Ea%IBKOH_ z@66Yy>lLPBZ^J16ri4~6x<2~FqHW3yZ&WzUOV>|PXC$3wz=54-tm*nHa`O8pntv_g z_wA+Yo4;Sr{io}H6?qkTx&Qjxl(zk!pZ~|o#K3NfU;qC6+XDZ#z`rfmeHHNeaW2-7Jj*v_6*6TyQqHvt@%9XirR>;v|aro0|efy)ZW+bcW zO89PqeaAXjpHm=R4t8z5k{pj(#dN+*)Pd)8tWk@BuUxn>XA^8M@2GnaE-v2_N{)G2 zU3&mNukM&Z4p*q$O#VLe)o1dbqm2FGrmPDeG<1>vYkN(mS$ePmherVU_BG#?M$IoS3P0a4oQ<^P|o( z{IwE(6+TZ!7S1j{8CwNA?W~WMfxr58->-%pB@!p4;kc@g%r)>K*R0{RCZ#M_+API`T#=pDA}e6#nj^_`;T=a_ z)+~qHd2Hj^Vd=-wS>*S}HwKb#=Py&`gDpFoS=r!`l0_v;V1a99Ikfk-lUaP^UJ*70 z@;RP0A9>+FwR`&LQx_|&df}M-ETo@N>C~?1#`~FfaC*;&zuf=eUJ0K*|2c`ghw_%B4to{+ewWYy*=^A3E2ZyD)D~O-`v`VSQF%uq+bziAKYj0?hu!B@q>x{_ zx?2^&M_mk($&c5TT+V?@-~2vER@?D<#y`X>(s5_8LdAx$XbgtxC~*{ zvs@Nb-q#ct4LNvcef|h1EM|}`xD3v{Z|Y9XYgr~!8}YlWPF zD~(E*8NdnZ%noPalspbqvan|e4>?$2o;=x4vSKdv54G}{Rpd%PrwktSSM$PsI(Bf+ zz9AVJFMmeasi;l867VOXGH-jN+oj%IY63TYHTN`z`I7dP?0`2W8@q3U``?z%H~_o% zTGnX7FLwr>ii3yp8+WXMFSbv}(`c68qvO9C{-4pk=9ncNPwQ^xFY!pt3edf-M9#EXGlSAg{3op=;5~** z-%)zmor`8<>#s>~$;H_Zmw3RQ8-=;3{R6clo^OYXg`yrQ!GjqcYi!`B9S;lXe0`XF zpl=2*J~|X758r9Mf5HHE7W~E{2OBp@o9M#>E#r@5;HGI22J$<0XJxYQ3(jg|*tRx< zaRppn?Y*ALOZ>F7Lj<;a(dJBcV#@Iqh9x%$-!_Hq^b zZ{Q+4^<kCx0uImUo1jBq^_v)Cy3{O^9 zM!?Uu`p()4hacR?nE>nitPbA>4{2=LngrXg^B3F+=dlRKo`B6dlt1l(*(YOMOW*?U z;~N9uezgjj^YEeMRjY#FTTh;Kmcqip*Ovyv1Bt;4FTi76ePZOooe4Z--*@v&$yvL) z_{iN%Y(o3th>ShyXYCxw zKSgdWw1JoJ%WV&bJ7+YXbb^`hrW_7~&-AQ)ybb<&p+amw{PLz=qX%to#2dF4=3?TL z^oI2{7cC%1D2Gb#g`Lw_n8?aq2ZLi^j_3#H$dj9AWhTL9F6Eq5p7O^hO{wtH#! z|FdpI51$|}TcQ;S`@b!C{+DmgTSt!E+4A)y(kBuRekJcI)!j+XG%vJ`f{l+|m(PYH zrgu1!PitkUWx>bPJYC4F;#uK&@R@zpO40C@X3=dq@Z&wZaw&azewki9tZy}+mC}D- zxO}Io1U_sQ6a+_0AL5x?ivGo$th^nLnR-9KT83|}ubX~h3>&z@RzNG-t6W zBij}pgL!1_ z@>5{D2P~UXVda8H=M&+xtL48^x{Plze=J<8apFM|e0@jgj)Sm+!Fg^fZ@2V>K@=Qc zvaCCn^3QgujezY|S_F^>#Cns+Pj?wK9)#}=s&|CJjN&36_rR}4Y9mA7mmY;`JK^%4 zpDTjkiSnPr-thEevy?!%&PgJ8H>@10xR}g(?_5O?Jnr0^M!r|7XCDGDRNY-emYj88 zCLAt`9g?Qx`dgq;ysWi_oob@KLE?a^&~J4;|n|pG~I7v&uF;w1YpL+x7SoT$5UJ z)eK(kIK8$4&JJ1-VhX>w5ExJiySEnl8Nz-a^FpY9>V1}5pbxu9?ad>vPq9(egFP}+ zmsi78XFlxKfk!$^wa6+;J>?tW1OuK6lz-oZnKHTkxM?Vrf4OD8!UlM?^_PA+-ruRS zQng^Gx1QzH-ya3L%8^|RBIi^4>|`^RTLT;M&3;<|3#M89SPgGDn4WzOR=F>#NcI{U z3@w4fcMJa1fY-M$N|nRD8$REqbcOF+^7XKi+n4R+(VWf`G@ic(79XeluZ~*nYlZh5 zefUrv_B&pe+77=c#m=AO+W@@7qA**X5S2=PFq1=H;3UIQU7+MH#r=!*kYgc>e(3Z58+t`(!tb zA4Y{0edL$zRSAdTCXMJvWPMBT5gO0G(*%B#9pCZp)JJ?hEp(ibj&JLiqfyIX```9X ziWk=F zg9B~hn@(}xGT|c&OdZlN-yZp~Hog#ct3IULhWWX3WqW%S9Kt1RmH|JOwAfPv8?SUu zIu571#J;EWxolROQ(;#vJ(K+~`|-3>$6!XLgl_8Z!niF02d92ag5JLme+ScZ^a@en0*E`C|Byv>DF_m`UZWn;_i# z&G`Yv@E+@<8p3c*&B)L=e8aerQxx8H;qr?gFzbmX5h=K9UGI%w@By{GBQmgZaKv+F z%t@OPFD6rZNTLJJO!&jg5>9bA_N?1ha)1d}D3u>kD5F6()y&ji4tK|YJx$v)?kWDl z4Tnc&7*P5ArS92t;rKHZv%bR~GiI~RhJV*SHTwd$`)vr~fU9PtaejjTe!TRNSlWVq zb{fcIFWbNE9r9fN#e~U8MT<>ynEO3k8sQS64L^;!6-#Z@H9OXyJav_2fZ8Z>EdAJ8 z_{~)pdD@5aR=*8Y9^>+w4djvo9fFGR5f}DJ%5SQ3H&+49xZoK><^O&EbY3cEI;{3Y zo@d)ku2Q?tdc1Wht)0$%nf;2qzN56<2exHwH=upkylGkH3x5kQT=yBCNF7n!1qW@| zIZW;FNPjIm<-Z=l(M0D>XpYU59Wd+WUZV-P9{(JrB(0Kdi<`#*4xafyoZa^N&lBv+5` zXQTZM>9Dnt)jc1t41?{a?(35?(|POn!39Syg;9A~S0(Sf17LggY zRG)=DInLoQTgCG)RNucJ&q5qyz+Ru0D`#*Wad*0QE%I>hicG45Ees7GlKUji6p@$e zX*?iDCn>C|hlkd3Fl)lY#clh^Suer_$PK0(rQ|0U?25^vst=~G!mD#zd1>DK{pi*X zD(`l(z6W`HH%lw+U&H^@U-RtujNdP7V29IB?@+qFx$M%*a3g2h7?~|YOSb~vS-gM7 zI+#g!py52cwMwIp(hXf&dW+z~RlGsu=`9QR$rhF0*~t7B6SIn87Atm7s$Z3!`FwK7 zgwVs##k;PE68hPNc8gJz}$GApu z&HvMleRF(RgH2QDuMTNiApMY#Laytvl8bM{Ve9kLSHk)4Ijsla-%_p6kgD>_32ai+%5NH5%@xu;iXY{P+yr>7#7$toADFepyYB-2rk$j{P+j_sC@4! zLHOEW6gQI$F1Wj|>671ojlD1%7Lz|+Mh-mq`Uwxb`d)B3Z7;;mutW&nt)m=G<@dj; z+rARM^UA!8_TPQMbH6nF%j1(7)i1d!K}iN4G#J`SR+G&TSArd1Yc!I}&NAnz!^Y=6 z9U?P-Y*?!a=PO@mqVg1fJ*d`#rNo*)(f&e=Z>Ft-<5X<+klWbPZ8yP7zwxaTfUQG* zIglk!s%nzcrZt_&>4pc^k{7M>cm_eZ=CJr*Ch@m!%_(yhF{^H zs5YfyIAURy)oXZaP^PW{ex)w$^#GQB{p@`w{J8ernme#|$Vs7YxKXzJ!c91t4hp&j_cQt2Xol~|`rf$>2MmRqH^C;lLKpktAKanF zjj*%FET8-E5sA{>4e$ky%Q;Wr#{t9h$<1PU=ib3BQP(}lF)U|hZbomGsXg$5wl|)m z({2NM_A<<(@|*Jdvh3lF;qHT!zTEGmh9jKOGW?ykXAwM7LQW2sEx!iOWnGX=Uae7Z zsSZxRzrc;G=byfk9B}txw*#Dcbf$SNJg#cdL*+-zU}d@lb7=L+Q2v=k5!x4F=|!H& zPH^O!=kLnk^emr~&hW5QPZ8PJ*?--3SR}HrfqcePM=2V9>&twPoOfZpX+HcSbz2Mh zaLzTki?H)x>J)jYLDtPGSo>H19kOaz!nr!wI;h8<{83>rxDl2bfAr}*%pBEg+yft9 zvcmifU@8+4Us)m#G=gN{lo-T! z;NnoD)#>n?39n)(4jPNAqwpJo)G6zAi9GQgFaZ4G^zh6g+MW2ca z!F}(**OqExSkK5GV&CHk|BhE&E)Hiey~?l=UiS6kOY&Hgxtu(#v{)-(1+1tfbXpE} zEe;DIzu4oK78y}J73U2E2U)`f%SzNjJ_nwv0gg7eo`+Q`Bjg6BJQ;LIX}QaSjPtDYL= zXW%W|K=&EmE=^7+`-%BVslwd1H|?bD4aPTBlDB9~)NX+9KK7X;+wiF+D8l12+d0(W zQ=hKySOssno#aXWAU0_#0>|+6aMOJkKDDmnLU6gzfC_oLW8SZ2aKk~>B(nG+{b2II z7o`lc$m8F4mco795ogHh-wcnZmm7$(!~1Bp1SN2cJJC=NWDA zn-AX}*6<~>4iryvz$y;z_Y~ozcP+*2@Rz0fMr67Ez9Ve#$$;mYtbGax?Nu6}<2AC}`=SqSy|cK2_80UyEP)*K(fTs^(wbFL zci_>QtQ+Ll3%AYgfgR_>{3H)Z8*$x$Z=^1rMfa_E%C=Xwz{kI{3y@VB4n>id+Rhgw zyScgAH^JV&kBO1Djhva$0Q2#@Q6zKsJLJ{E+P7v}kz+#)hG>26WWaEOoPXi$oB()j z^Nb9-kEA28UUvt)`vcbr@`gg$>s#S<#iirqm9s>6U0~BinS1HJU6wjenw!O`uCLeodxf;6&a%Y znoBj_dbGl&eV%=EpHgm?r$QIZ{6TmYIjZxmX*X=JZT2&|Z~3VvbY?HysLK>Uez|h3 z#eFzxzpLYfm zwOeXUo}uvk^C+z3TLz|zt{IoBCq?x zE;kKN=V}C!6_}PSW78%2PX6?3H3D@1Zqhkh(b!yAW!Bs*# zgREfDQ`Y~qaFsQ4+hP84U6hoZVHDBT$ZrX`7l?xJQ@M# zh$gyIf3Au+?;Hs`s=FSh{(Nf0`x%*0_Pbg$%&lp>DH^UdIHmdoey!P2PWK@P3bjJ0 z{Bqvshcn=A(;uOXs87lvhNNQn`<@&PKKSfH)Ae<*nc&f3NjUYf?2%TO$6?hd9Z&42 zfiB%=;kfd~*#_>A@L2r}{pC8b-Ehy7xw7Q) zX`d&DVO60ySD(TQ4ybun!bj3S&3+7@vKN2Ff%qR&(BDY+T}DJUnd!h*reQ}1;E+V# zHg|ZYLvu_&JiF}PwQ$(qa#*(y?lc_zm<2a%%&@x+3-Ft)I197pHf|(OmJKG6wTAmP zkh_xhrJsX)-1rpezK%=@TNhcJDcyjz;3ww~`MlkJz!m>INGc zuERndPcq15t-|HxGnGH?lHFTATxy2H)l#?2fDJwiENg;QjB{?2z4BQuUxnwi%UIGq zPTj$)-{aslQzEn3;eo{?&mv$mKbt&qYP+Z9%To+8gKbU=kxKclzL}4GpbsP(p9=$ z>go7$7RdLK8!I_p?Swm?n~G9-iCva`)SjMKSROruMyF3FRyz5?N2N7F#7>G`+T$-S#HQoAqE!VXdj~f7ydkD$6;73rr=!#JV$cY zX7a?(Kzmvis~w%SiClTNUxGaG;%fULn9F)(S2-N1AN27c9M<{cI$dT-24|E}|L8~z z6DJ=~PMHdWFWFArrDgXTmrME7UvAkfNWK8ScssU1~fi8+#k6c^ z{h5?O$8$j>QmPm>7?YkG3wvh^%8_3RwH!`_yN-XjUj&OiE_#*<_pD~|BP&RmE1ZC} zBWsSFgW2rGKAwU1zF@MT%P#2&$0H^1{NL+e<->wi!$Diy=-a9Gg%P2@*4Dc9z~ z1L8RX$Kl1v%Db1sXK&>Q(Pd`D4Ubx3_+i_qS0e1E7_dPG7Ktld5(n#K?W<9MpYQJD zKMZr7_^PM~^Q~O};}GR9STmO{qb45S=O^o07EejSkK#my55f+%4dVPT56{zQ(Qvxf z)gPR2_2}6JQLrV?)T}WakKpeT`!M*;TH}|^aN2NxYA|fA@FJJum)bV@e1G^N>(`Cc zUoRGFru)KEo=c4=KD5ZEM0mmOtse?$e81v-kCh<>l3^V?wEaI zoNme;Khd*W6aI6P?&XSUFLGbnz+dV8vi`E#aOuh5U0U9v-lH z+P@E8wy2tm9KwJ04SDMk$0YK@Ow0ZI;gMIhn&j%xf-TfuJ!fWYBP&SnPY8!a7$Tlh z`D=dk%%t`fXg+vrJAC(qqc5GGdv0yXuJGXtKdO$wmY1jBn#0L)sz+%&YD9hbLGiWv z3m(wJ>vD}gl3#yi-b4<*SG$y4xOMj}^0-_?6~*6o^TdT{{11C@^-%oOwLB6@e*2&$ zmAt8(wUivNWQ~*we6?vjk>ZP2)8*IX;lcTRm9Y3^cPz!@3}=NZnlB5M_WalgXSe%J zQG9b4|cIC9KBhP>5d4=5ka7{RQ*Xl05Td-Q+ zwf*Fxh7HTfPj9UF%b)es_{l2CCe-`~+={C%{$wyNP{`zi9Oh24_-(H2BRC4k! zUyn+eNoLDjai7w&tqO)E;cBiOyaVu+h37s>zzymZs`ubxHThVwX6~ zB%I0mv6g>1R9w)BoTTCMmtRWGbtIc6CH>_iCOaI+dpL*wa@YTTGkr<;-SxvLZ%)H` z5xTjqS1u#*48D=$Z$VB}N_2Y;3n44zW48~b2S}{gPQIISID^ca zw#Ji=Co=Gz^DFp5Yo;Q#N7cTw40N0JM``HkRq$$;z145v-|oLpD8u=}!zmx&OQVrp z)W3XrtLs0*W!LtZQ+(L4&)abvPJAb@nARgV<9;Q7g~!~aWGOx*EP3hi4QABB*R#QQ zFBUhF7euIg(EMLq@V%PsKCCVj1v_lsv6C$HAYm8Hmw~$_mC0teqg%-Nui{L}p*tc3 zV&S^*s?JHcw=*Q2=1(qeqy4mhKAA!jilK3;6d(pMnp)PJKNFS1fHjMDyoU zx&1fD46_n)X+Atv_%ep_AJ?rfsfBx@_6CyeqxN)OgSUvrw^9C%GR9hp->h;A^{731 znp0bvU`tgF)4$s1p}Yd6YcEt*AxnP~S8aorj}1_Sd*Gxv zk)xxq{g6!A9rzyG$;S6^*#oyWvNy}Et7QETLo@Hgi5ncE$yIjKE|1`>xR=k#!J-Y4 zPht0h#wjXqyvy-=_cN{>lsu^@-ZSAH9T-(`>9 zo`BUKDz1GCYbgkaQ~S=T^V<6k)-}j-ByTdUoAV7Wex|i|8oq10a`-nanwTxkgvSQW zc}Beqm=7afW@nQ96A!r1^+ovhc{f;KG4}(pY;dXd37(noNp_1HvtZK}hC%X_$+X{W zIAkyT6*l) zf&6O8hntOXKIg#*ZkVIN-G$OK3`4(=yF)$>(fL35==C=qSk-g9o6f&SRHp+kJR0A@ za0|A#R>|Xoa~7tL(fRy(dN#{)_;>}cFrA;Ss@_z3j5Am?6;9_PR@`k4J(fzFEEfI% z?_=2TlRQ1Br}!0CocG#^9upZ~Y>cGi6;-}*lFWCcWG}5pv=rvvB=7Y2?YI~|f3;Ma z9y{f|RQ42vYv;^%AlK+WJVDootnRNKldZ1`*Ga*QiW+O_vDL}hZ`aGg(XJ6eV(^=f zH`c1aqq##L>9O5nsV8ijaGlJhLVB!s-y%g>2bMAUW-S5RCzq!h!$-pT-jOdj{3>&R z`I;(Uk$I=?sceJgJPzlPg_8qUc)|5gPCg?m>pFh-hI2ENeI?=NWoZX@!LA0G!mD7R z^oqTH@cCWoTV&v$Z#~Te;a`Q%{pDb;TLWqPX#2bmOBCQ0Pn_mP!BH-nZ^&U|`?3$f zp}v_5>0zcyzp7yz{O953bK5tGbX)&`b@qA6|08#(Iv=jutQjQ_Gj2+MeF09|yvB<5 z_rN*2gB}xz6rAOig+Cj8*KURd%p&Eb;r2NRuWrDX6n*#5W6{4qCjC#(|CLo0)c*VT z|I7c+>;M1y{6E%H4EXo&&%Z73Zwvg}0{^zazb)`@3;chj1(NNfc{v&K*#7bPu&aij zvKC1xYo)&G8Z%y{tkt-6#8*HCclcjT|F*~9|MU4g9?diC!++&i37JL6?cO5rgmNz^ zPivp`zimBcYITeeR=;bNK> zFB1<}hkKjCQmDS`Tq`}+!ZTQ{>iXcggvJ|M@aqN7dGEpzo6g0qgByyI6z;>}MMtEy z;qirm!Vlo2aIIDAVg9pgg2>Am&bp8}e{GyW?UU=g=ooqW&{o_{l!yzy8{PsC8Jw^DgZm1c*}VLXIm{G)-?b8sDm-(`5{_S+ zZ(9LhkjN6Zg2U_0mzTq(QUfo^-*+S|DTbvY27+wib!A^>kmo#lb%;FKJvoa;)#Ky3 zns)G?QD*aFxh0wB%ZMMP@5)s^K{k7w{E4=I|0E!WMqScTfr1ja`uxc@vOCw_`U~*D zcE7h|u5B6Ts6Ky2sf2=I{i%7++k4bLd`{IRgK$Xu z%njuEHu5#LAgBvN^BGuhH?Ud9w$ zt|C}&4DazSw48>Gv{(+4PdHT=G9VrmO5A=${iCJ(`#esHPcrjwQvYeQY%LG# zHr>vDcpkh%^>z#OH&+S6g%s};K5yk9hn*^75`sr07cHg!nRo0yt2jK$zTKYs_rNNy zW(Bw}GBJ50{3*n4S{3H3^twpnB}o10Of^`Vm7|QjL3QSHb$DW&!H!%tka$xY7K&rK zN8@#i+~;Td@Vs5c_h@`;P4VtDg11&Vd1}IcqBpCY5+}uj&f@KS6wNJWuNPeduQqs< zN%^l$G;)wXj{69c^;C?TR>N)g_|6!@r$eQ3$a`aFI&OxQ2JUVlbDWRo_MI=LtjD-dzQ&EbdGFFBpgvfkf?{j~?!#UscxaZzK?)^O; z_jsJn=ka{3VXwW`d#%0qXMaBXL3}0ZZ_X7v6uduD>Dzmufa~()wvLG1?*w?>IjCj@DP_xWh{q z!u1@Z)^hO5!C%=6VBMf`Q(BMD8PA?h){4Dyh1ToTEQvJoYt@_hbRz0I+PRs^&k1|= zfY$f9MT(+S|HN9iNQ`UoK}(d zg+H+nhi9y;-?9u&`k^2|@xeUWyIv9w``pAL0kb|_Z7u<4#4&4;SBh%$khhfc#8LiG zow!aqe#y_U*iH2&&TV(yZ)Dxl~#~Z_^03hm$jaHT+1KV|IvGpyg7l_zg~YOpk8t9W5W#f z|C#%e<-@n5sHOVNfg~!O=Cr|I~;lhd^Fw3vSGpu2| z68k$HFuUg47INd~w7jqIt-TiY`{8xpF2**)wuVbPY+#?T_&E)5>CY%`J9w=ANZAK? zI3YvA9_D#?q$n3oXEr``3?Bde;$#-g_ucxGD_m=??SBvU2|sYv4Ys|1)bcLeuk$_a zIDB=(b=KRk??L1DCn!B4FC`JaV79maB;0W<%IqfGacGFw174iPFLndwbL^Vy39p&F z8F3B1H|yJqQ?T0F^x;Uj;DY_C({OiU^wkKMSz({H7c5n$su&7io5!`?8`hr~5WfVM z?K&p!12=@2r5}J7`%R==fRC=N+-48!+?pj52;YsE6taQk0|&T*;48+v)%L-RAvQ`E z;R~07f-PbDT%qHa;Hgn(vT*+#47(XmE2Q*Si7ncpaM0nHI4Uo}z~~$X-#GSB*p|}s zW#5Lwy(@SQI>4JFH=c}u#deBwdBLX-+^C6yC8X?P{or06p$F0MhQsGP1K`y>YD=!d zcKoV$FT!u)hNH=k$XDgJxe;{XeIol)%pN=ka=k#c|`fq z?HRC55cjcHFmKACg)H!q_X~5#x9(+j^TV?0BSUrYezvllMX>qKH@OY)w>z4d!m!=7 zx}%LSf8VqXqOej;Cr1-}@KEl?E_>rR^0h^H))l_$^BTZ&W*k}43TOMX#F@bb!_ODB!QqphQdY2~tdm!CR zpI6dWhSU7ww^MtMcw|pkg=3Zkxzhejtt1i2WWlK84PUw4Rg87?4|Wcrn!>mJG{a*IpZvx zy=1NFH@IL?s1kWca_hY|I8yNSA%EEZXrIX!Sm(6DsWb4^^4K$tu-5ggEOOt*JAEHv zLI2(y@-rj-qwnEqPvzCg(jSxJ-@q{^6Q26P7Z%@_sD!6yww01q>fX&MgR`#h`$%>? zc{;raepdd9pURi(eSH&4>717Q=U|3O$-;~95w=>H063h)rN(X9?vG@WDIjO&JiKs zb#l}&gyUBW4^jKVXT9654_74~WuSD`v}Gc?@QgJ@v&fs&s@cg`zAxn_pBwz8xEWR~ zG+RopV*gRM9SPam?Q}yD9Y0MCcJ=&#f7BX(q2ucd)qq9cVZlAQ zY~;7)sg~`q;svMqr{L~}8*E?T6yf{Uo^a-qxSHp1!;<&Sbo_rcV!N&oc8V9)C8z3f zL>IvQEAqGu=Tp-S_gze)!PkV&$qW;VEO)}MPrjc)7IR!yq7QHJ zS@XmZP7eCMOBaq|Fl8a{O4$2!3w-tTX3+yM&*kS)8{kftECUC4fMw-ZLD>Ir!;Jl~ z>8Ev_0`P@_l7rT;6;Bld9S={=sY|ee|9rmqch~>QN=mYd|M>a;3UdGT`k#p*lz}M( z|NGzK&)3~okdwiG(_e0Q#5q~sxu=Fldn&MR|EjK}p|#=dLHY&bAcn6!eR%!r3HMy= z5T}?xV9S5WJynZA4P!?pN)2yWllC69PSvuPYnNRuT=4VuQ>vABqm1N7*u72Q68*k= zk;Cx9FK}*~uXzuA)O+v4PPmCZW&8(xeE3a$H#{INVNCWD$nF|~*_Ucoeut09Rw)05 z4=vvRkbL}g@ca>YQ=yt6*%i$-h|AAkM$g}i0^@@?cIu`(qF?2naXIY$R< zm0_ewR@<_>_mAKA_IuFSg8ZhBuWhH_%jVeda{Cvghdks_rynp4d;NTn?6jp~AQhg- z{>4VUIcl8nm^{_HF+Iy?k|j%(#6Kf_OYOa&1o+SW`F8=SpnwNb{No>_l>3i2q@oY_ zF5qOymiWu?Z!}VoqX#YDR^$$9If+lS8GN)!)4(TkbYm_l;F~#r9sWuTe^^P3>AmCl z{zFoHDSdyl+j?s*IaATjjr@({PErOO5)(d1-xpo;=)y3iduBeKLEkqG-CWO}32WQ5 z{9Xbt)r>dIf}iake$)&aKgv^hhM>mQ;zZc;k!Z;Rq#-JqSHL2KhVwm@eWos z7*Y^`O%!-6>R}i8dHeWb1?jBxR#@jm=-0Wh(TBd4KG=hW%Zt3_0RP1axHLFXmVD66 zh@0&M_HX^R9D454%+TQ-Jg{DpNd&n>o4J@Dwq{nm9tQ&PCVK%X`25#8og5!c!@Ybb~T3qmMLv?;xxK7vNH5**F z_iFHJcx8Bc&kR_iD)g5kJdqM$$^b9+{Zgj{%T>u%OhU#1N z(_hBIY!B68O7V&z?7I-0d;S2J3 z%#BnXxOO0MgvR^0znF<3Jn6m9isE6Cv6jsQ))!nNM;_laz0e$1%Hi>+{6-ct7FxrW z7bK5TeTSQ)6>VTweys-De$?TU4;O>UuMU9{BKYsS*aP9vdxaPZ!(}HXtbsC*MqdNWOn?Q=bT2veh=3eD0!YmK-eGBI&)N; z+B@lPc{>39sAKm>`=118-HL&ae$n)y{JMSzxzl0E;*2b+Fa1~Oz&*IwHz%8HdQ&_< zA1<`)&m(I-#$FcRlh6l^rxGCMbd1dQMcr2r0kkU_11W2EO7x|Cbyn~H|ywwlDmjtZ@ zYG8KBoZ?-uUWLZOYFJyS48H`5&qJp=C%lDg&OI002Io3A_>jdI)cI-LRS8&kIJ=wqEm&v7^WT7vHZSUa5 zz3oyJ@GFjYzE9v=JeS5^!0a2^pC!ZgulSyq!xf)}S0=*ulEQ9~1)RmMMZsr0C;Q9b zOR0~Z?t$kD|9(^q|5j>s*M*}G$aFo2E9-B%(Rxxps?tbisr&TD`eb(Vq8qu;x%&M& zq^nsTH70lIofI3!@k27dO}G%wZ$IqX1NS9OhChL0KGzqu!%oj1Eg|3V{IZ&kr-KpM zOb_9vTlxKiMZ(?`IhNf@6sT`R(ON zEf<)zOU~~B{Q8R141JiHQQ&MY>|dL+YaJXG8C#G8XWnK>o&~eboXF3FC2bO07~$T7 zqTLyAn#1Y!lQ^r`$g#eZ9A9|z&~I3)s$d^^*R#IR0r+%&&~kFF;gQe1aDs64uY2&V z*O%2k!%i#_!sN~M9CA(Yh59I_KYW#8@FVW(Oh#(pB%~Za*FjSR(Zlc0FsfRpu zmX!U)GoQ9UAuYO`(w{Is+e7>Bt!fxa_2Jif-KjsHpV_q|AKv9Bahb;B((dpK`uPZp zFY7PS_&My{wUgS@Z+@JK#-HbiveYx!)30!Z;<1*S;WC-e;AsoRt5k1=1^paFxyam` zRd9GqNLn$xrI5Rm=HI#C)hZ?MSuTdqkMRDP_l>3-w~-6<*3^@~ zuAM%Q+`H?5D-#{>w0|T}`Qv9=`04m>o^aKY+LJE6?kJt#G|h+;d;?b+DhBYtVG=C$$>gD0xUZmIn2yhNC7XN6%2lH3 z-%zc52J|r7*wSk~}(p z&1AagD+TB3Wi!z8SKhslw3COQr)>B{wkw=;RfSnp$M#6VW%ZWTny~fds0H-A6>Y)p z?9DKD=Mo1xe-^BB*4+VT1w6^8=c$Nk?I|>cZ_WO7gPx~id~|?)4}5U?G$uO#7PAR2 z+XtVR%lwVZc)HQt0j|7%Tu>I~X$pDc4A)mz7gG9@FSTB5;e966f*=cyg=KdjaN)7nIN*imVBNDAB=xTcxvi|S5qO@)V?f^5ik?0oTQuv|v#COP=e*Drr}xuqnn zuv$*~|NhUl(EWdA##9DQ#%cL@`Sh7tU*vjTW#c&48y`^QNfr z@B~`Pz20`fJpau6>2K+*@Uv4r?^a%QwJ*R-Fdap4eb3yEm|^ zerZbv9PsY)n-_2bb6HR(oc!t8g<`l`_0t=2kn{nkC-9}M_p8W{u3a+9fYqD1SCacD zZX~6`GuxZ_$QQd!za+q`b}rE*H>U4Px(-iYSl&dApRZhw#*>uV`J*`~+4I?{lDZ=DB5apTb`| zrq|fRh5c*Rmcw5_%wb$_?O!>H%hnJQM2VSY*9Q` z^9)W@%Dc>g@htMcl1uGZ?`GLK2R@J*EPWp~3SLz}@nL5l@+t@ZbA0{X$|WZ+Bda9$ zk5?|`sdp}e*ZB%@GQ=AHWjbtLk|@I)rl65Iy6N4V%ea-P5>mY_52xby>zW7g`roGm zGp52O{Oent7oipLpSjy-hpkx)8?Bhrq=QnYS##Hqgwu_To?ZLk55FobN@0H9TO&u{ zoU6)P55l`Mi<2(G3xvYVY~gu7JaYo!+~&*OhOoM-_YQx!z;DuI8{Apx8|n+6>W~*% z2Cx43Y`z;Tk#6y@1AFnb$^6P**j@Oe^H;cLIisLCTwlkx?G^l;VfVhBuB;Hgm*7?+tm2MZVu zS?@sljc0y-3GhCt$;)PNtMlWnNpPn5yaWdH-vmchRy%B$RQg#59x`07M5Dg(zDlh= zJQW4UcKJV=h3H_8()Y|j`o{&I1=!%w1vVvQ&Nb)e@xb{pOE;3IqUngGZRS1rt^a93 zUZfj+?`BVj^?vh>&4$^;V_MVT7Uv(US>ea2Av{Gr^)M zonqw7b)u7#h&SPz?{uPJ+oX=j3HX}+3~qA67N&|Zm}QesVHA9E3Foh2vSf}N`Q5u+ zABNz^pAvl{VTEWDL$bn~v%^>51N^SOgK#TnmKgco=X@JV*I9V0_%dvF&#Q*~QCQrO zyiiV{@sIS$_MQlsU(9w7`SRYDBjhV5tiDoxhpxMZhQl(2Zr;D(kj@GIFnGmyR_YtL z!#XM53r>nJ3VR06=6Py>$;+x;ox?HtbXqKM)6>HF)jM2j`vqP#X_N zh%J@nhqpT{ctSBJ=~}juEO5hNi2OSB^&+xc{?SyLL(ED#T;!$&vX98kZlBgseN}q4 zL5c9$z1(kjVaJdZ{0PCIqQ4r=%zdH{p015Bk*V8iDI&+*CDfCu(PLOExB$@qDwFA zG2UZLHWaxY{sZ1oe+}Qt#~~_Kzo-iy_!4@R{GNZ$oo{fmlC}bwpGnYx*3gYNSUJh1 zt3|Ba;Kyyz)2O|T1|rI2wX&rTX@B<1v}%(__PB+Rk8$2fA)hL(T1Wdocx0VcJ1is> zKb!i;{V~Tp+Mere-wx_O+5G&W@33z*>pZf?O*a1?c$V9QBlUmL_(H7#Dz7aXLgN)P z+c5t(ygo<2j>eNA`Le}0++vrrhdf!*!pDgI3sinIO5kr(L876FBHF}MV)~^20EFTz)1^OLdf^N2T16_+r*df z`oZk3LOSFJUsYVFd~OFro)N6u;lxe#r(Rj$wv*D!Dm-cXn}4*K8N>2NwtuJg{&|1? z_B29SQBM9J-)~a*kKe02$2C0eJYq`@ItV=ui#rS#>-Pwu}_>(b8-6O`^P^Jz~D z%*VVp;0%1@<6vb2YC-j_ zz*DVGnD!&{B3u(%;qn3LJJ*ZYU4wVs`A|aj6-Yndcmsa)NrmqdEEg8+NB(I3=1V>N zDItNE_EO~%qj?kj^;Nk6d6n|4-=E>BUWk4BVC^@UpUIz_()k_Fs&>M@bAL5ceVJls z75m{_g==$Ssl06avjI5#WOHQz@7AWo>hnrrg zj8pq3751!RM}JB)IYvamg}muM$@Nyj>&W{LnvTqZZC9%qM#5E}UFXk+OJ~2ke+7=& zvz2ikydYiHBLe>Bvt?v4tn3h(76O}on!_gsuXyl8i+p%`^V}tH@w`>V!EnmZuldVi zNxgfVLGY^=BZB0h72+J^A3>H?t6<;j=elV;rlN<*x!CM1tg)ozffUlq`Yv+Oc*;rh z-KG43-p?P>c&`anm8bgl*&48u{~S+$7yhedrB~zg|J;+5VWqUfN@mYwZ&0uG$aeORC@5*TcC=xY@lViF}!P-MbKYzu!!+9(dK({?xN@ zrG!^y9~^o5dZsHJ-1FV{H+=t@l;B}_=kST}5%|~IUl+H-=VKg}%s?w=M7JGS4;S>$ zUBw2^yyfPz4z^71D<|Jr;b%@}SgXOv4$rsMR3MisyZe%dErLh1U>@7-V)B>DGj?Rb zH&1OjV5iu1S}L&J<)m&dxZu1ODr0!N*kYNRVd! zZ+26Fx6Jb~G zhQN>HwNEY|Ax}kt_WIlN=fm!@ihY#cpWl^4-YUmoLG_)};x}6WTbif75{D}|mmLs< zcQ|()lY>obzpq#XYq+~HY=Gl$&Q=tK=XneF8o~2N98JVwe$Hhr&hXIrMUE@rxKGnc zUEr5R3!BJm90j8MU{|m0AEjZd{KC3Gco)l_L|NE-?RXKzTcp8fS9y5kWx8lITr%s? z1@d;ws;X8 zzgC(@>6>}2ET6z*^RleTJ6^VjJ%hKYF-0iCCAX877r}MIYvHIj(t)_#GFk9_u3yL?UQ!7iF;As0a zE+JSeWbcO0@Xc*KOcb9PmJfr-!G0;p6u+w)*>%3d^W{?I=fG2|UvJJgcbcD;_CX7J zkbYfD=OWGDBRd?Ex?ydmTUDI!GJ(kSF1Vzjdnc_Are=0A?eNBq4{upv*Xesdw!)n4 zmb1w>eU9kU{^>6{dXEXdQF1=L9CnhH3m(IIb|mqR$s@QpkEeMM77xDv{UMw@ZO>h@ zTiM`widPlU?i5--2QsfKCc~16j$diL^-#aqod8d*-WoUE70I#kD-TinpVw;{tl?$- z*L|)aPx5xRGqeV!C4SDMIn=l2W*k}c&W%sk;q%MF7t$IebbjCFIQUG&5kK<%7h>wS z;I@qLCUR?B?Kx`G&8{II>QjlTPhW4tb2Zh}_~5TXdsObi2llXV&xQMiZZ@RBOSp0; z$we2OWiw#Ts8e0Erd`v&_&5_bd^fj~*0A}f3$|v%Cr+w%(wZf;_^x{{ywyafh1Mw5 z)>H3j4tpJHucR?H3wgM%0Iqw%kV!GXW>?Bcb6Vew(QzT{@;mNPA#BO=O`c+=rHf%R z&0*cHb{2{$r2yqFn!}2b(}u|sM>Z=^%zN1~_6x(#1=_F3&m^1EMBrO&_P1z`jG0PU zEQZ-)W5cOFeUUGW6tlp#-=x(yG^B^P#;&7$@!njfA)`JeC6d7BSEF-Q?6=M_H5 zzYmK^N}ZC%Dy}X*ntLubS`DJ*+ z^RE)*#6^yZbWZT7^@uHvubs)d3n8$h*@FZce@4?V!C=^_Ui1;g$JfZ2CYRtM)$#`v zPxB)khAzUM1@U(&-gYGkYf$=#s&O*KqtTqi>r_5%xpxP}b5cg!hcNh7!KNtkpX2}U zE`Ste6_NB$FM#$dPTfYp^}q1{c>RCD(N0Z0i7f*Xvw$g;{4l&L^w=98MtTAD0R`06TkpSx26~Xh82ET#?XeKwkEy zVZ|XhyCKGktnZ@5=nO0DK760NdnpIgQ}W|8d|vRVzJ_=kZ028f$PW&zbP67Uxg+kp z^@npMZhz!L|CowY$p*l0`LiQ-!p}52R6^iG`Xg6@;oIj__C><>tqaAY;QO(6_eH^h z+7qt%F#8+sE!SZd7XFL^IPCIeZ}K!phaZLT)F>rStF0}Dugnt`qEQ=TDm1TvUoE{8 zcn$6xGqrpN^F&DXtT7H}=BD1e1al03pC*9lQG0(pkM?&ensgpagq(xFMc@aPLwa|-OA$&|2dxiF8r0{a2M?#-~X4Ep9=r~^Zq|G13Tk%A4a+t_W!@X zbMC%koD9K#eFt!t@ij>;3ndNai8~E^R!SP@m6lg@;v?|&;pOubrT?cDKpnmJ`*HaN zEla#3^}lkR;=k^?3ts!Ps7fBChBk=bC97Y}=peJb(7td0&f?UUB>yV zuw%!QDjC==UjOzTI5M=Fo!rItd3`#(^3mrGX?V}Nnr9U-Ge6f-DLAV#;PG2nqrU9r zD!4rKhT#XeV#5Oya`mO#;~lVlgD=#( zRZ?%RQhqor2~YK|Wv*>EdGSO`1uxP?#*=DAU>W7rJ+t6i$DvMMc;^1=kJ#bozjkkC zg73&(t(XokpLCq@9iy`&_Cg&q+1Tb7dEO~AZASQY$Rn06*!W1i=os3kd!Kg$eL*8W zf1AW8tg%*NAK7TIa&I3Tw_nn>8)gq|EBp>KnJ!sQU--~0D$H$zf6IKaB75c39czaB zoY<1dzpu3UeuTf-l;@MJoFAK(!7^Xj2gq}+0*6XqQ!C?Xz3|tHy<0M1`3M$f`hv;1 z9Wz@m!peos;{$N2zBdPrf2P{}6+^I1uXUg+EXjGnll<$`*~EQtpqG8bZ+MZ(yX>9t z?MYo9a(wz}d$N6Ei#NGWv1XG2JRI`Eo&50H=AL!%D+RWfgD~$ZCP5i0KeR23w(tM$ z$CC-nf}{(IhSVRsBcELDgLmBc_=WnnAn5mzpRnUVUm)3Ig{(w3%pH`+L3ZWdF5Ll7 z&7RhcD>k>l_K%je(rj9Obji+7@RfztQIy|;=Z;<)?C?I-g0?T%zz`G%A1ORqMeWN zzb-#>mpo#8&$vdzw!-PX8WY}SD3Y($^ui|*3c@CA@%q;j5M3-kSHI7^D~{YzcNd&9 zLaqeO{;Z|&;epl~LwKj0_s9xZopFRoAGRv0a9Is+5;1wT4R#Y!+NT7w^=7}=0v`!? z8Bm5ZcLrYA3{Q8q+NBC#^qRJK6Fk+rlX&j?M%X@aYbdog=Um6T4e;%`BJ;=%NeAwb zpKnm9r}AH4hg~6a@LP$hz(1ZX6DME%dYyx|w`9KUJ8k$!R>dzxcu|<-b+To!(RA`y zk?vmd^4ep33UHD9Q*pA8=DrWKKNk#(C)UFzw?&T1!S^q}e@Z^Bez;Hup6;aTMfO{L z%~TqG;xwT~)(_GVl!71m7BP^2t_)ha3NGLO{_Q$ACRa6^`mb)+vtaUJ4-3m>aP0GQ z(&ToR&|2#6??LgsTCnGn)n{ltY%Dd>$h+!fpNPS;QytvMlH1b`iNM^2?Yv}}%kM-M z!BeAMB4wqr5T14H;1?SGQje{gg76-xD_oTSRbtYa`S4|?J_quFeUEAc;AJBm#bh6~ z;LN#jdD;aRYM+6KUm-6XRI$>W_D@i!$(;P6^Z7}#yQ|hI9(d)r7Yp_0{bzjvT(Gs_ z{KYgr`<}Ack<&-dNRtHur3~2NwTx@MX#5|gocuilR?kW{p?G<>qELPkQM_vZ?KX<9 z%zQPOK{#!H$Xq?RWR2SMpKy(*&3B5&d4qebyWpIqNu?C8u`l|L7qdp^K?t$FR_!V}4Mb#P&( z;Od?5wSfc2Xx47!Ph7DJo|?tUY3Xssa8^g&%37r7ayZABz@JPS?Wq0=aSQd`@TzK) zps%oph05u@uruqagZ=Pa(Xws(;m?6t+keAqQnfWU@TP^`W@GTIAofIB6-2{)TgTxK zPn8?Vo>d)-ssE3ixiLm=4*Oxli1C?PMV#ZA%E`KI?4y((Gh>wx6D$`#Tu3%LJ6Dex zE-L)EgKV}TvXLzJvT!C@t069KI&A(SV-B?^<@Om48vn@h=O3xP2lO+xal(Q_^<9>* zvb6CvimwUvZ{f6mHoTvj_+gfdJ44Li(;iC&7sE}~s;$(Ye_qf2ZuwP~k(0sl%fmn! z{x5HU$^6FyumjwE7jrU%{&o2+>OWj%I1iuHp7Gs6dpUPwjF}?vS8uMu4~0r+Poh6It(fgb{XZ>d=J8SZ_?-OYNZ7DT(e^jIy);Df3cORM zj(Y&Mtk%WPT{j9`I5*Q z9*T!5U8~+sSaqIGk3T%a`qwD=CDU(La%-FzKl%HejZCLtZCBRL?{Eaq>T@UI8n!XV zA8>DY>+=(^m&~<|J+RKWcqn~Ho)LnCr}!eVynudB``$;aV!=O22lh8Z6F zo+tAQJ04SnpC!+5Aus28)29TR+dNo8zOnD9hcYZQJ1pM~zMZt_#Ts}=dHW)Y_e%Bl zK6Q9{p0_CN3-Tfa~4eN6d#?Ci+{83M19VN-{I zXS5!O9d{p#gChdFe92ro3nVYV$1)RrXtnwCdh&P6pRAIMywd7_`u5jra{w<~bKb;W^qZeapS=EYeXhnF%<+cVm_R7xga#+XpFjpOH-lou7 z1b-JSSyT(}Pq@o>AD(LMrkYX5TzEUL%>cFjo4V``vP8SVq4)6VBXjL?V1vpF>{Q;! zcG8&4E0VE*{P046B)Ou7eL4At_Uf0}a7=lKDS1uMZ$@&`!p!qz?OBZ)ci~@!s`($_ z*NQ{$;^4gjDX%}n0$wxhZonsMEi&6->0f^3*WoIk9ZS36H)oE$y#^=qMH&ynD_2{D(f9d~ zp@%BGW<^9Hx&KzSye90n=Z-}%yvKZWxfZPZ?%4pj(f4!nI(VOni&q5fwZ%zxBP@4{ zsU;E)*;c)96U=ZTtSSmtW;&p|1vbv(XTJvLv_ILS3(x6_mxzHCZ_fFt2OCK|O(VN{ zgnI3SH`EwZ#Zvk6qXH)I%#9wEYi5TYBELVFns^vCx~De%IxKRn(%20)JD$*R6<#*Y=#~du#gKhF8lKbD zR~QJ-6zZLG1s3oTNWKo+X8lSGgH;%ncxg12FgwVG!rskYqU7{|QepDcXt_FR*@eK* zw^bJ3r1FyY6aN?w0a?3vIC^Y@c@WY!aOHiAh4tG^0?)(Q=G#rkEBA$ql4l=K8j6AE z9y?GU07oy+-xm!(cp7@%A7;?;I~xUaAAQ|<243K5s6w83U`Gx)XIWwS75GSOe}*5d z!z#ra3JYE`nCAnhR~$PU0yEB(c|*~~p2c;O_Fs*^If#71?gp1XJWaUu0J(n2gH4|B zR5ZH1@9sSUGjrshr}XZzdE)!wMI+tHR6mc!+Lfm822PJ}WX%IxbZGp&(ztwm;YWiU zp%j0;Rh`qReYy-`R*JCt;}&W1=GnIrMBzuhPOHc@D+Qz|o^PJx{7&Ts4LbNZ;j+oQ zPUOSwI}WkH#u@Xi$of88#-_uK(;9Y>$Hi{6w_#S@Sn*YjTy#Zvybg9BdS*h-x#S>T z3QsS&oKCis78J^ckIcJroVLGa)#J&#aCGId^eOf|3wvzIVgckeCHckt9Im2Pa<_8u;fW?`iCBgLn-euQ<-rv^}cT&K=; z^ubwudcODIW_g{BV{pho;es^SLPzV~IJ`O9+WszV$QNr*USPv;^A6lu61HauzG(Vv zW-`22t!!66oaWaVn*hgXHg!_{l{=!>k=LZm%I<;t`SSVV;Ia;@8rTp&-f^Gr(ft1%v0s)O4)VOiOY?nTIQ_<4IPvpN5n35smyT6>>I90q3?UGZ{*wE$g zwsbYVkzwbNDzpqwxRBv3*2U{z4<9TzeB^2M>$3ir+*7s49lNW2 z&*aT8^Ct@fUjF_2w+H^;?E!rHV%h)r>5H{{jz;*;RnfSR7*>1`b%P zuM&ka|EKv#pT3CGt@-v5rOa2!Bn=?<6TfD+I(VwI*0)Q2S74^c_43nDi^lmM4+G%N z9~uEHaK3P|={dNjTt#yxEISyTL9N(dJhqS(o@!Ogl4BBV@ZDYCcT@i5yL&#d!&P5Z z(y6}Qkyo)C@IaD%b2vQCyL0nwc*&D9j91}2$;SLS@UFV+BJr@y){pu8u+=eNn^f50 z4&OsTm}SeWk9Xjyz1}OcW#S#YJn>rFJfsULW<|V*ZGCPRlY1Km=hObreImk5e%xKz z-vBR*J9k0=UhF(*)dB~6;x4D{eKU&?YlZtKve%H8nl6p(fb;ZPg6F~>88-#G;KX40 zVLtdEZ}_1e_*3JPtz>PbLZd!-w03(8?T>?4ndUF}l$^#GFT9}o-oS78$Hyg`$?Eps zzmLJ*%eg$MKd#it>}J5|F0}OICi4x>l3<37SLK}Jf#utdDX_qe9?dtn;ViXZ<*e|S z*rC;AMH}xA?66Lc?Y>#?RJ6pj&sxI;YhKQCr|5aVUOQe73qQDN{tN!|eE!?xpOT!C zyv#ql{U;-*@E@Oli#_ct$;t3o?=PnVv-pMA>}FBX;5HTT;9^zLsQxZ2zXg}uU)Nn- znT*%}emX$kxT(g!)9kF#pHS+_*7T>8+j!XuH}V38=cRvmbbZB6?_Hrl;~^R+cO z^x$5@#ib>%&dlCo1K2TrBhw=|H&y(S5$v+}f^I(C@~ygc2Yf1SsZ<`U%G$xP3%(+@ z*5(0h?ht*}7#4cX?4JvVZ91{i1YUT4_-Q8G>-qI1+0fFH;T|kIUuvx>Y%;>fk_HcP zW;T*P-ZQ>>hw`_)WHf_wjEg!`VS#Pi@$mz+zx#)C3art0;Hnk8MZ@%9BJAQ8Fk%gd zKMd`^35&jMzPKNbI54;`7S{1S#$f{+_ZG!Q!;S|Ow~#%D%zVP&+s>uG>4vinMKGDQFN{7+!QVS0puqQ;@EjuRD1_(bb=?zSTuSiyX{e$kV%{`-K_ z_kC^gZ@_0w`WfWjdon@mCvqS4Ry=tHPHWU^Z-;p=J1u?=7b_m`rRSj~@B}!%fDZ}o zdtC|ZdaqnYTdSP0`Y}B}O;u`hIC+BGRGU228mpkA6))k%ofA(eov~%XU3&i7k680jfXrOiejG|Id8&ne0+{UE`Xe5;#&a(d7y36?Imr2$m^mey|@- z6?kZy0*9Q^Y2k+DH{E>~0-Iht#xkgg=Uwux)3^Ye9a_5b7yRwMh$uOEqg8Add{3oI z^gR6hjc;TtJf7!}9{}%}nN;x%7F&La<1G9mx=}R~?k|(Pat40r{e43QoIlUoo4jd$ z$fjgCVz40B4-QzQa6AfrTwh@43#+xhyB!2S`sMP~8}1#wf7}Ot>LPs93vRk}c*F=^ zCUn&F1RV6kU`!k~Fcr0Qfd?3qEf&KQ5+3a|x~=;oV}#+U(Y9~)C=!CVr7w}9{E{nt ze=dYMLi;<&`}(TK=ELFn#To9fO>V}{xv!EnblFS{Q|WB9#}w4 zdu1G)mLoNt8&0+R`RgWpUc<4I3tm-QtB?fmvso<82H$+jCqvKw^I>aNW`XVQeTbpw z4|*Pt4q=96R(EL7^9?NoymOe~X_;XQa$%)Su?NQx#aSjZPSErG7T(CUCoeu3QA?h^ zNjz&DZj9v*qvtVhtQ>wt?H!6ylc9K!AM9Eq07uGARy~J%%a1>offJT5jiUH-dttL) z7H+Sy(4_c$Z&R*H);~}>Oit`sXGE5BV&S6r?)+TeM&(-y2FA&EoR9sKhTRlKf?vU` zx4L#Ohv&uloul~?ain_Jbol)Nr>+J#^o>;55Zb$9_V4{);kO@3E)K#k^o4WCvkFZv z{(`yhTvl#{ecA+y`(d7u>zd^2NpJ6w%SKPGCAT{qxJ-WP=A%WvrkQ=W2j-Mzsiyj_ zuDBxf3O4rry0Ha5aI&VV67~$d^@qzvD=t*P$?sjQDLo~=hnvjsO#e9f+~fRvFX7AK zz7gc-!ci|u;Z2*zn?J)xe=6-GCv;VRA=jLHeqQOcqrwMp-Onx~^7{%_ z$@{Pg|C$)GLAx$j4qRm37(mX-d%XJ={LbM}3bkKCSJOHU?$9!oAg`3$B6AgHIiYx* z_IGNPa~6p+?tqy!yme{S%ihqy_6?pUA*n;wSJzuk9unwLOo3-N>YexjcUiKQJcU_R zu66apsotNjRl&(mU!A4rE%Fx^KdpfyFUAD?hVSM`$+yCKY{PtGuoUasuYK^6QQgEz zSZD2*8#I2`l1t6#`HEe6EJ_ow&SZWAJzw#{YW0^C|C7ve=5ntoGyN===q0iwwgi;u=WL|NV3zhjA2DM z*xmIUkl8b=y}Nn72SOY;REuEooIia&l_HM1lHrx=${UM$vVR5 z1$%yFNumDy^YP{H&VOVT@dE(=58e*JA&dd{Bo0}RoT0+~Fln@s4!Z-Y%Nfd;<2>p6*YFb&D3E zsN*otf)-6nI9Gd=$rTy2j$AWyggu|{w;*ResFt#YYpYI7 zkmpyI+FQdj%fut8{>^WrI?Un83BI}19MseXY6VJmWr?*KMY@XT+2-RzjbpH zqchCb66`|#lVo~k$r1Q!%eS50@GpZ8<}R?`NMoTd{LSaC=}|bJDdjcwx1rUyCUW9f z;OIHHV)=cYV{o0-_TfNSsh2Z^JmC9zM=1O~W?eX0HOMMB8}|7gn?c*V)Hv)#r*Q(u z8c&cJ`0}`l;Aa!s>f||ht>0F{4!$Suk_!TotLZfJlkD54)V}D2i{x5hF5c&c)E@Oq ztDb*@QzlLXkgp%q+|~!jT^aT#XDr+Eas<9PM`as1iE(8%!%P(oBatdivQ6qy{ps-Y zc=0{dUZv=l7g^w>Z6lXl;oCc29wJ{_Zr$kyE02{1O@p~*ZR1bE1MbxwRA1cni=W(K zOE;aJ6WHE>rLvv}{Pr}X#VB09D#4BHaFwC78D4tx)D5z7fX$(LnCps5I=SA}R{TA@ z;Pyy0nL)r`{T2Mu^MlkWSYUc(ekuHr$?Lrr{3L)ii~6six5DZymG{o(cm~@)k?Obr z7oNYjll<$*UE4rd)cH|yiZa0BD{WyF%O-Vf7`!*g#3E=yw*!N z=u3LWC0Je~O|csGvd|U_hBI%P^t^)?)r2LHQ)8L~YvHZk{^KF!p8@XV!To)#p>WZs zglli$rB|nkhQo&X@^@+f_+x^kBH;9F&m!`v*S-1Vd*W*Skd&L;FC*0$^btLSi(vn2|_p_Zo-mR3AdfK>monZterOqzhCRJlIn|pcD8d2=6tv7SPabA zGmVwvZO6(LC*$C~yb<3y;7|1fx$*G9)|T^}@Z32=Rb<9BUYmJg_uAwwH{nC&M(zBt z&JPt;GUJPZE^+uUdyom$cPvfYNg38)^9iKwB@VbR(u7UcC#zhCzcGG`*alyH^zJRS zcV$XdupZoyvGgPL-=b}AT8v@ktQVft-=Px{UFPtcXQMqd9&;_7-`m3(_ugnwy84+N zatC0a1$-yT9eW#mJm6^!dWp3Eiu2De^MSk7w++(vU%3@YguuO8nJ;d@c_p&?vGDN^ zp4VxA$NL#G5~%!%h-@<7?6$llIPk~LjpP&m2YYuOjb+>Z4d0wX87d-0Dr4p`LzD&? zGDW3Hilk6!Aezh>E22_KWhhEAgcKp9fg~~|Q;{i|70-9;eY&6Dx~|{7*8Ru(zH9xS zby?Q3K5IY5ZQu6o*pK5pou^X0X%hKCK^&d$Estxz$f;%ay|lfmQOBkCVP*NEOSJzx z9U7XcaBq0?D>~mv>%Qi6_*PO|9G#D}K-1~R@TB_eD9XQnA+Fs|;nfw}*OMP}eT*-J zqq5zW)ABp+yly1(9^;Otcx5y!U7ZhKPpTfe0msaEbLAQQDLqDGK6@P z((?cN=D$;Qo_saz5u7hg%NsJ-iPyt>^^!Yj`!~;iIMM_^F57hNHtbZnQ{@xP+0x!m z`O}|o^{Ww%D(hZC$G2fqM-};a0Jj*$^ZSeN5?a6W@(Xr4zbAugvCS~s#}k^AUwx)| z&YxlHE;%mp_p;ODU*PlRMw&cNS| zToN2_%z%d+LFqj|$;lfdM492dJa%@D&LcdPK&IUPRe`SKQx&$=%M zx#=N^q@4O}>K`V&^h(~E#+*+1`R5_Z%T2Rg$yUkpOSsU^Zl}4P`d1)$&hr^?h0G-b zs$U8wHP6`K1XnL{s&Cpmw7QsJ$xNyFRR4JU&PD#j@!LN;Yf1IdE?&%b1okep45WG* z661P$5Dt@#kR?AYVt(8Qdpuu%lj?8Tk|2BX^S;PK6q()Z zlrPou^zN**DowJ_k>mYuf6*K>n7$lo`6eKKW(J#J58&1 zBEO9g`AGRVZ^h3s57?=@#IOa9(%t=$d}KGrwhnmR(zR9YFiTAF>aTDl!@R)bFnjt| zFIvA-Z}gorT-A~<(*S4e7h|OPQ@3_`cpWTfFM0R(d~5JzPX&CNY3#r@v>S%rc7SQ zc%Xj-*B?1A115TGcT2v)kgiwB;ZL?2!Ci@$yXbnEeCE#Y$AW)-Y$%3VdBW4_=0~wj z*{!c^Xb#1)#g)q)Uh$5{nC4K{`=92JIUg*KIR@W<5hPB&#C5Tn`p9vqb^UR8>6w?u zs1GNGyF|&&-Nz17AB$D&DyHr8w1pT^&bYi=!gLtc6!Ttw3f8W&v~`9pv~rG9j?Qwm zlBa7>aCPHc%JIqRs_%BgMTWno$nohbByHg~9cK<7c->Q%$J=17v-{Jiy>QUz?N<2I zA-NOeUmmLF-89Kgv{{c_(mR}u`G-l@B&)7-Z|EkEDOk?KNk-Y+RO_f+>qCsQklBG7U9n88) zt%~9?ZRXKNvX6+r1DU1s1sk28%O-nu^4W$RmgHQWrcV^l%P08m+QT0`H(jQ9ueh9@ z;Q&7|HW4JNUH)af7rs?G8ASb~tH0BR;#cxmHk|rz%a&_(a(k`%9_3X zWUo}QJo3BwEAk#q6~7G<``()iX6R;5vD$h@-HSWO6_X%%-$;gnIj?{CqF6ey7VYd7<=j5Ax3Q zn|@nD?r2gx{3knx?n{)$(fZ<{Z)o}8?a`hwa3zBu4{hHki68HPSJC|x_o#pz(khmJ z0rsxk;duoN7mPxEc> zPQbr*U;0k&b9N5$fF*41ah-)N7dL-D2y6aKeMt^KzSvR-nRyIic=YIRR!x*kQ?9M<|5|y3Ohiw^uFw^l?wq(B| z@0YndO8x70;N=7ILEGpdvUFC$M=jX(-LLs%d^OH4b+~?Nj|-VQ`$~io-2H-Ci?(OGuw*Bip23Vx>(+;wgpw>tas#@pS5F;{sA@A@fSh%^Ao7^4s zI-DHa>L^Thyyh`d56|Xv3nxq5nUwtqKbTp@PW!J`sHyM$4r^bX%G`X2kMYSKh9I<0dG@Br!2;$@!{lEDKHUaz#?FJ^gW(bGtfRZ& z@wKNPguqN|v_fb+Tp2Le4u##1<(ay|KT1}ArTVxgX=}y-IQZ$dkvLe}J4c+n>e+@4yevZfJ0VXK8To#ls#S{CAQ6Ty<^+8;c!>>oVLPQTwSakDO?{ zZY;SKNEYSUbM889`-oegwr{mI^Ib8lkP}jO6F&LotiT6&!@hGrW8sM@fx}(!q0sHK z$(;?n3wcnV6AxsZy$%nTM9Yw!8#Eosf4#o_yW1F5RV5Ai|MUeeHI;we#+(!KmgZu( z$o{uC_yibt9r9SOqWg5S*nxM3IG_dWx7kEc@QO^LR^sp9FURyXF`Txsk?L6b&r%aH z8|JKr#rF+M>tQV!hBG(U!lj2Mp6J5YSEf8RfZyHSe~-NV<)zz(@B$Cnqhz1EKkZFn zUCp!JWaXJjm$t#@!+rLXmz;6lXbU@+b)}J)e$H5E2OD(uWRX{YeNtf$`@2i<)Bc-8 zHdr{qenl$!3oTv#3SP0`>0Yv;s)~CBY}(A4 ztPX!$9AQnpzj@O>0rH=07-cHrQiYv@3SQ9iyB8I7E5lYdzs#cjIVLx1%D_>}7wggS z8iy|%mxTNDbnnplXmssMCNsRylBV;YN^0G{6y9*{)Rz?4V_gRKBDiyZo>DR#>FYTx z0zbHwq#FS<`d0ez!nz$sYsum-`38AlqxU^i)PF8Nws=f~gY8RIPr=uo4YX7C3VvB` z<^})B=KYhOn)kp1>sN8Iqutxjg^TiYjh$D{4A^p6y`~;4du#n#4tNpI?tnIoilUGA zkMO}s@8VA1h8YAbJ_x{fqC94ufzQmdpAd#Qyei(Fg7quII2OXEbFCFl!zMrKg+$>h zxmk~B`KTO|jdZ?>T^_tXu*eys9b)j3Zhv22IKp6+9+VC$XqPdGQ1sdW(-$9R4%v zE5jBkkWcJ*T^fdVk%ezgQ2t(U;Z=`@i*@$kyLeEZN1YRLVWI3pJT#uf86~;9Vc$1F ziR4ospNjRsThckb$?sFlkM_ee+`_ELY;uYtL-6gEokz(|qKb}VaP%dir)0wlJFRgz zta$BPvcPH4o8(A#h7aVw)|-D<9@P|;RMeFJv-dyRtEv3!<4@@RpK*F61AhPc`6mMZ zMBtwY{1btHBJfWH{)xap5%`}NfnaIxW%zgmiND?NhUu1-Z7#wWfHt33KU|D2uJke; zEH=gi!kp9!Rg?ejes?p@KPYQwiWQdr@-@_72umH|3|wXcv(NL%oefWTKWW*u|DW|q`PlF8umF%TplhzL|W7vE6j#sYYaP+l|>S1^+ zpny>n)~is~AAo-j*IyKZn**0F?1ilk=--reUFiZ?IKk zvKJf7nz>nmtg&#;6f=DK#J99gxLItna|%(lSy8>=3p}_ix0q~Dp0J$UVeEdd50=Z# z;A?v3)Dgk#gQrEB56y?zeu@RF5nE2`nEqQRlfaOrW+tV)<$?b^;Jc(+5XNCj+q z{@leH_;%ng>2kPUvD~E!)^a*kT?z+e+#RogYq}Fe$-~LzuU^Au)1>@LV8*Q(wdL^Z zE=4o4Tu&ie37kCZg9176(D(Jx@O`NTH(tPvdA%3x;P|pjW0WllH5whZ@Sp6lYPicn zzO1_Mcl*b(t(MzhE9Kmow7&nwalftbzIaz`awJ?|a7OUO8M7aW=DpIQT-*ta3p8D0_Y zx2y?%wYc@DCw#6pds90cm67go34RcJI)w5|y?NimE3lBxvXg`GVug|6L^!r7C4BIZpYVXLowI#FQMdzY9slP_oKNX$>``q_o zq5eG>!hDw>{xZFo`75m0^2JO5mb6R^CRhC6+)rLuI76=+c8%5&od@Tz2YmYu=U@Ic zNxo!}(KZZ!_4M-=gy)Rp?HYkQ?hgf$uN2Sgo`6N?Xcv<;rf=Ht3l_hyqlWxwH^)KB z&vpfTjv~A?cr1z$`5btzRaErm0$giDCR-&wxQ zkcVY|vV9YSqqNvRs={;lnS7SQ-1Ay~>B2vC<~2&e8-)iV*TFFd`gCMr{-<*r}rkMI@bI3E<1@Yx zXfuyTP76L)%(pz{^O&Ko&Gfj-GUI>!>OA@i40_q!|M~Op+W%$g2i6k%m&4^FPnWe| z?XrEXK^k!QDv3j6!#%5xkPmH>J4!zKVVj#Oyi&YYuN5B2S;3(UUriJpB!}<{UsZxb zCjDl&!8Nz;Ybn4z;VBd3Q|j(tWns>f64mYSx3&~j893}hQ$Yuu;oy)c3A-7FJ@^7! z2n{Y0htIQzUi=ErZYs813~zj~ZdWJFlBm`s3Jb~ASa-qOcLnAwgopRcUiJ-MtnUAD zK78QfSB-AiWoL%JAiU}Vt4a@?CgMH94@YumNcY0*k8e89fjM4Jljwtc$DJ7YV8+p{ z%>8iL{Dxs3c-z#$z2s-n_HVdhW7$u&Wa;mm7GxXA)N!)d+`yh`@baYLPd{J}vq$E? z&}*$Ki(5zGG>PML$R?Zl7{*|yyE|FPylyYq$WuqTezn1BiVAK_=+&=c^`6b}0nSJ% zR@kiLtPS~Ri;4&NY?Lu0+3vWv85>-2YNh38nCI46 zg0CI0cFoZXT(IM-OD!$1#Ax!-nXu*6uGl8H?U>f%S@3Zc!D|h0U-08tZa8{jN>t%d%8EkoO-!1Y9#Vx|6aGGmcBH5cc`(iPyJGHlo z{8c81s}N4yzEqkQ&h|DO&xZ|nZ1E>E#>nSp!I>)!@6UnzI!hI3lq%E*?wJe!8MWNU z9ru$%cs}fUjP{Q&6`1*9^QB9yXng${#cTA_t<>SC7B$i|svqn$E~oMORp(8fB>DZq zwiWPk+gEntw7n)fjdie{-orDCVN=#t2_yK^X@MnT@ZPRzXH8+_uzi~s!TYR(ihbykbHcV!^%Y(n56MoW_yq`d>QBO*+$El; z;B7aLSdYUKDt?!|;6|ON&#B&++&Xxk`tQ`fqVZw)YRxTm7uZ*4^K^2PtOWahIPc_I zjv-inLD1M6&$>_JBjM|fiZ&^%GV5!{EJlY)68e?)`va#>$cGK@)Huc#>r?z}D&qj6!>T?yN&xgsb-Kkw< z`!+oRa;fMZH_8z!=IIR7CvBI8B`Js6j$LS_{TXWoUnD;{`6P<$qL%uAELO>>Nyld& z`emGaVe~WaIhb$vC3(upJ)M@4fpGZb@D}nZw-yOMxVzIofgCw~%S9Sv7Z>bJBR^%3 z-AnNZc_CFw4inE}J_|ECJ{}~GC?)Kr9MR_2=cO?)=ed6Z<%n#qtU$kg%cbiC1~Ay#hi-T)PAI{*G_*M8T8RVLw=D97JR zyS_hx_E?iu&ney~B%U>#ghvxztRnxl|Fmf~=jDEq<{3YGvS-kB`hNYwQksV_H8!%5 z<9(L&sK8MdU6{#X&5OL%;F}!QZ!CxTTjf_fxo@> z{5_6zBh=i<(MCO;BWT|})>ljx&N<&h<4&*Tq7iw0k`8X`uaPAj;c_?c>#lzb$?lIK?Mdv9Fd00J} zaTU!YKDEu|l!24KIO@>6;o=i63n}>CDGPa;H#D#Q6fOaat-aJnF3s2MUkXclH+a(+ z8g`8jUIJg9wI9_Yp2t^OzDm1I9bAb@x(${AlK%1d-1esTNl7z z{68g7`@=yuX7Z`jQ9bgofK96~9I7F=kM{3U?_5n*?v3IkPfzT-PJXsM?*bkFEWi9s zWLx2d2~-z-hV}Ky>eF0=$#UMip3pq-)sMxdR44ZbX`d8?`vnVlC?5As2VCaChs<3M zFv4k*TTctXdP`OBF~IBfimT_sgXe8xD4wpiXZQ2Mo2FcEP`tUX`wY{(FNIH@jXark zV%scuj=+`!)Ia-*1Y5aatHJ0@>c0=)r|ihHv^Oj!k827Cke~40Jx~3;SHWC#Cd@i( z*Lw2%dCpO^J;4MP2D1Irx8bz^*As#xls^kDyK&Gwwy6K{ZL)n~TNRz({k%-P$HY+g zxl++|>Yq6hwyP=s9!akKK>fGuTiR*LSA!DM29`cCEi)B}JwG@b!Py|MT^ibpOxHR>{CoFuekQ{`vVQ0{=wdp9uUDfqx?K zKQjXOK4*ph_WPWVgok{$eU5jM3YT4GC{)qiVX~hiVHf_l{fR|sC;tBZ{k}^PfzDo; zo!7CJ>Z|(;Qn8fabdOU9;XiAqT|NBE1-4?#;G?ZQVCui=49lJgUqQ~CGupBrR-eVt zOimn(c}|={8Y(Tw$24E$kWEbU6vzo3 zhk3GLpFsWsdpJo)V^=P$y=U~^9{6*E_3Q%p+{q8VyW!lqO)W(**NEK(J9rWQ*5P9K zPgGPKrxf16g^!k6PF0cB`Hx~SC~b%-MS8b`t7?e#e+#_ zSrNI!k@F*YR#UxDJ*-i%!sswO^F+rLvet^z7mmQJ#w&I;z#-OYvyQ>ZHxzowQ>)H# z9*4KZGZ;3)uVcU1yTfND+5*W}Ki$Ya0kcdLTQ$K90x3JQ;6J^%@QosK4*X)ENsxL~ z(&?sl1Dt#M`PPr{pWf#;ci3GD7qK{fokII@p}biouzKy(`JXW7NoS@PaPG2`>n7kg zcDlPLUYwk_YkCR-+9NjzN&#!R`C3w__O#d+V%uCnV;@J{l(72yqS)t-{mtK z`LFr(@8)x=s_GgFYX9MU?!Ua<{njjRc`k+`*S|dmFZh_Mu2QmGS5BvuXRs6#*3%oF zzh}iq`Lvz(GGzN}`qSrGvfwig4LbJJasHR3?OsSq&VU)ER$r>d+Bee5>!-nfdIy6( z!1B3VjjS-sXu-`Ic*5J@9W%^))FrSM?q@8#!3dw9?7a37W?-0~FomOX&wLSI2cO&P z}wX;haVIQlK+F>~GwOD%-{G@Sq+8}Je z(cAqAZjdj%GXSqOSiz~Rd!#feNl~C8$7`_>+Dxpx$8}N z3q1U=eoZHQaZ_$#Gi(_0P^Sxa%=v8m32y3CQ~U;h9Nga21TW_9SVeB+3Q-{MPGeLi zPh+WLcn5o(RG8Dnicazg(Dat$VhCIJw+?4>h~ql2Q$yEImn}NeRzr6#D|6+kwWtu? zq23et`}cac9NWXEoo!bBFH5^kaJebKx4$l|rnRLb?>v%+y${^!Am4Eku_hbsQDQj_ zU!Iv8CkyNH@^_J~s`S_;;RmmiX86EY*#knv;p1KBSNOtBvy|c%!%ue2JLLzjlT&>z z0`o1^77u`Z8Z-xH!=5kYl|x_-1(hpou%edVa0IO9{L*&>XKBFmx$rtXzT%46S9spF z*9D2N<#5HtX4vHWe4i9}$8Fco^{@@o$H7!MLu+BoTX@Be-8$LuqS?nTzlP(IqPOM1 z25U?{mca$q*V}X9l1*Em7Qvh6c)rYoJvn7n3t_u7A)lvksDEEL=U#Uvyme8VUjbac>H7!rY-`nEa{skAZ^+hfHinS9 zv)^8S1eP37s0Ll2}%j@ z+vXbsWP#M!brJB@9}+fi;FK4W=X_w^bNk+XfNz}?-gX*3|8VNiN7%u7_ylE@Xe@ta zEBq(RR3?-C+hE?@C2G{}V$pY*-2Hs|LVq~-$n5ejaBQt#|0Q@hHv4fG+{y0Ga2*cu zb(+=<>pa+;Oy{>1pFPqCr&!rscn8n)U8Oh(f5|cBs)Nt0neH?MZ|M;58-`QAo+uoH z1A7^7OhbPB$@12HqRS|sV+Ow5X-50qqdFz);PRUfv#MZ!sr!RFVO`PIGKxpLmnZ8X zSYx$o9p!_Zx3$7q_*#-@#{+oY7p?jJaN4|~tYmm(VB~fHEYQ0w^&Twc!+hx??09ek z*B$uJ=<_sQ`ZX91J>@(Qg!XTrWG_>Gb33&b+ryqZ85}eo($`gdlZH|14h+{^22XYR+1dF-cy-cXTL?g9PX1=-b)U8_(7%w zE}Zr8E0r}ZSA~h^@U~v70P?1X={nEgsQ2vBz@S&ikR7x zt3O?wdIXmr_MD?|&`mhIdNl)WZ~2Ml%dv2b#9|(D zoZ!OVYw((+y>sdKM)cDz$H4L}yKj&;9KE~ZD%>J=LyFF?Q@i6?6t&mi+fVUH)UV`@ zglCyoUZt{rhsk--1$dx*{2`TXl~(1bFxbG_sl6MX(0a`q0`s3S73hWM9bRsD4h~8= zxVjI%S}f}B4_9XY*xV1N?#O!N17DSEKKUIUaA9A37Va%ocr*a7u6cC+6g>ZcY~2rd z@}XFlCmemRsB;j$R%pTD0e@iR6dZ;RhPdk=gVRkF^+(`a>)OrT;3J+x$3|gynPo>0 z!t8bLQpVu9i`v4SVcy1!j&b-i=lCZl*d$eY-cMS8ac?#Gn!TAY*@91g7dgmM(wJ=X z{3Ndl9yVpfVljolKVMhL5HmS)5 z-+9{l-5NG99Pc21W?t1uUcvamV;cPKPVjTG^nvZm+2JCaL0@vfW{#87;ZNVPt;io5 zRyEFm-JbcylEZa)vN+)Lzj9uXZ{(MWbHZv99a(g|rx!f>G!tI2DdAgHX;Bj~@|69E|@Otip52*hGx7^4l*Vwg|xWii{6T9ZZ{)5bOX#K_Qua?e( z=U$PFc7P{Y{W%xFg8CawHp4d2WzWT6=7q)^Ea2qZ2PBrl9FFPYSX>L%MxR_ z-N${q1iUB9T*d&7AABk#1^=0hZoT{HwgN1EOhHu(?Mdc#OO)Vej7cw6!=duRoGP$$ zjD;TMhYLq>fF>-kwAYc2*Cu;ef)0E-uTz@F%S;pbA9`@Uj{-wBoU{65rW|~0k${i} zrk&xZ>SwQq_qn@#)PWT*XD_G8@6fstWnK8sWcbC$kXEvVa)|`BOYulZ%tbIUfvYFiGC zu7Gbb)vVqE7do>Hkmq&UrEZ1Cy!keftCd!6*$ZEA{OX_uH#*#tbcA!3Rf>`~C>^{^ zK9D^9C&l;ns)oJ$;PIN;krRt4S30k_S+t?_Zk}wRaj3w>cVMQn)9%d zGMvNx=t~TIYpl;r2JUfKIsFzKQ>7e7{V$YJmvkGBiob16mUgbzh=)fH9x0ZDT?#j? zB0nCV_nh23v@S0JKCKzSKrVB-Dv}6G4>&bbeldOhbTbJyew1cM=Bs%9?H+u@BDq)` zew@E(O)?z!OFWCrUHD>U3cMjYJd}JQZMgM5eEC&?AvyWks-aX^-mhtl@;T?mcDr2o z=iMPa%KuaBp9~A(X^P=iBJkvSx#UXN>-m*HA^6peCCW|kqr~df{P6w_rDwmwM}jpv zY5dN$(CF!gYsGS1XnY?|>offh>&Xev;DLEBw0IA|G1{E*R3HA_wC&VM^qmE-tG-wJ z1MQmD&X(jn`BRy+{LXvDTd2NV=?h?>_U2#rVz^)rpCNW?*DzFcpnCM>d~;AgyzAY= zMygkxGSA0*;LRhP3&|_&;`6%TFis!Y8St!fgR7merf>C|>2QH_A`6|*a-o`a?_7XyujuR)fOEB&r^4YwM>tcd z9zRR`oDc&4^3b0Uge{jBil2qg@vn}d`fRP!w)Yg=cgHqzA*|P=;&KA+Sp4=4xl?Na z<5Bp0_offD{BT7OyBl0*CSXZcW<0*m0dDU1oKE?BnCIqNa;n?v-?j_QIbjXI#pjOD z_2RYB{-fl;r^Ro{PMtPFYvGmk@v4;1{UedWfqu9UIB)9gV_L@HUS=E9#Gl zw;L2C;l%p|+U&GFPm#Imu$r<{6y-yGXSoN}@2Ybw!ZiPIaH$%m{m|;ADOFtz`X(8E+23kL)_; zkPVdjPaUWA=Q(83`fNYqgQ-6pyn9cOFLSI7q5hhi?)8=O+wDNOdH{TU**zng|AbuC z_(c8PANPcb=0{O^$AmA!9Od}FKsZi+a!oY6He%d}d|p7(g7WLI%UU_|3Ny6`%D?N) zde-D54n|hW*TrrPC1l-4hjb~QPh`xPL-F`DFdRtrQ_%49H8Pvdof@i#SKa51kV8jq zp3Z<5Ii*}7?>qHCp2nNcdICHg>@F5^OqsqX*5$UuVb9Az!mJ-AlGM?D4?HFLwd|K zUAS%B7GAS`R&O(WX3s9W?eLx;T_N(`wZge(uxeHNGJ334vsXXB2>#W=uS}1n ze>I%w<7wUiuQV!jrt#xHe_Ap{1aaE*e$l>l9dWv zYq@ib9?KPcn&qVcYjxXhBx^n_-?{KIXUx*W@Io`hT z{t)siwTOq*&N_SP09lH0`VK8P*{pUG)x7<02dkFDgENyH$@~k4<0&SI11r>M`I8S# zG|2;ZeSX*EORX2eRAIl};#Rc(zaHPeyHi(GS5i>^kH4w!|GZL9ck2J||NMUcKf^%= z`u+dq=LUzjA{WDxzkfX1*paH{5GBk}cAavQQpG!rUYg(Po`<>Ue2uLxg8$v~%03+M z=FTfOKdYcJ&5gRMfu*?Pj)Z-J+q7@YC9e)2jcjbvXO0~?FXXCi4Xp5VSEVW(UbB3CH9V2Yt4}_fup{jO1$g~uGqdNg>xEiL^3#O9d-CCd_rYoM zuzUKQfT!@qcrk6VnC{0*PvB_ly=ii=OL$6k4xG0}Q<7X{D_i^+uD>%YP8ROIVf-x< zUi>gfg4`?9RG$uKeJXsg3_f?b^ko{ncHtcfazgIbC#kSvtzC)?Tr(+p^FAE%p<0=2 zvTrCc8D5i}{a6~FwZr<}UHH(_aTW58W7?64FzdE^SyHf+SKQGAxOffoF>+AUW3_mA z;fU`d@)u^uLwDd`R!Ki4VV%lAx7+Y-u8ur%Q$YH{IM^g=hCVr@<5%4cII422LIUR9 zwzK#etl=DMPxehoesL8JF`L0j7U0?CO`aYxJ|GT1dO0O<1uj`7@s{jbe(qo-%)Dp& zX7bsYPWK~Vmc+Rm$-b#8oiD(Z7Z!1m&6$JmhrpT&CP$XSR;#Y-orBqrrM54D3yOs% z1K`F+gJ)zJ(K%YaaIdqVG5LA;<7Gau-;N4ta!q2{2X5FzMKFaA9`l~(#}2=)zsSoA z^Sk$dWPmxx{C0DbZ$y-jE91(rMC0mASmcPd?ss_0c*_%Z_<`tTYd@^_YeO0N(x~#2 zk8q!uisd*)V?>EyN-cc+gSzJ!d}ptl7&%)qY$o~s5vkxBIL$0Ncobfg=jHzac1g%g z9)VRf50_TM>WxyxL$v<(-2Jq^eNFJT0XWesv!D)MC%Po87k>Fs=NnmL*GO^?ocY>W zkzA&JQk2ZfF)~E!4?cB#MAc$1OI;;-d&k*_WR|0bMRYuWs)>Tz@t3s!c;gQV)V_G6 zqWn4>c+*z?JKQ9C;;=6q9F?N`1NP5U>OTxKn2OyPgvYN$4!gpZKea{Z__rQ8GvESi z=xHA#U#eOdO_qEv`hje?jyr%nRpiAq3`cU<#XG};xnEw96K|w8l5OfE11LVPvl$C% zdEXBO2PuBJu5QDpVE2SxOJ?*(l&;W4IzDsbXahFbnV&u12flIkHp?_PY0rlDnFP5vWfq%6w|6a1Lx#j&z%8>cPdz& zhOa&U>dOJQhDaowgl{nqI&s315=S0-!nbdnm!N#A*x>o<2+S{S^nx5X=^;b$OO)YT zGYfvi64FfP`^CL1pS-;2(A|CTfu*mj$jnj&O62lsQE$n1!n@2J;l*=uTgji3KUD99 z&+^I?lC!>X+Bm>pJ99F~+edp%P2rUr-mItNZ<#$K(*WkEtcs@do6G!kzanfsx8yn# zT*!WmPXgvWm0moBc&`j|n7tTYwr%N`NtiE*PelyA9v_xT-tj#`Lj+!=t-wh3@MS); z0NyHLJn#!1^^3eI1W#m|C{X*=n(Xjd@T>=Kx@h~>diP$l!c{pw?2Ood?vj}6W4P+s zF8!E8Hhd{}s}Ht5<;zFM_v?_MLN7ceE-ON|SmdDI3Hzv)9wnQIvJAGt>owOZQGRF? zTujY}f5r+3()rI76FCmsgwKVwbiIVSeox~0nNi(!Vmvh8#|oK+&WtOUMS ze&I3s*t$ZMQaCg0Ks7m7_X$TC+_I{$n=Cz(^T{hXZPAuCa_!ySPF3&*mYP8F!zq2e zdRT0mvjExsSCz?U*v+6KpN_|GT5i!G996(SpRT9e{%pO}f6Y>L#dQ7qHnFgm2iD9! zexIByR3|?NzIT#6foxbiRz4R#Ch#bce70SxQ4kLE`I<~#7g}gDA8xw8w1S-VVyaXF zwicV~NBjGEFCp9twv=rUp!tHtFYO;Ro`SjF+0pzXO1y5;8{Q>&-i78XeBA;S{&3B> z%v174w#hf4a5Vq144Ur*KAgEd9G0~xn@RJbgfN{9viEBdMe>|akD1TIJ&*F#$pzOw za$SPoZExPH3EQvWd=mq&u-GwA2Y!9zaa=qc)8{^CB|Kw;e@GJSe$?1(6}+cE-t!*p zC-GpBK0H+AbSN3Veq8zpdHeD2fhn-mqb((5#{r*D_hE*G-#f`yV>+x;;cs_i=d6a` zFIH*!2Vtyz_yf6gg;JKoK8oawzyLnRiyIg(f`H!m-8>{wAQ~s|8;=t?`ZA zt*-f48)oYfP&I;A-&`501MieD+(+KEEmB<^;)OY6{;`c=3ju zb8hn_Syb=%Cvth+*laU+_H?#4YvFTGE((~#wkI|}F@OgePR+1@vof`rOkjr9FUmK< z5lvfdZD5ldH|uTSGdX3yCHi-;$VFyZcDwyCa!HJm6F zxrgp1e)@e_uz}j026vMi5_Zia=W+-C_V~%#Ib_2Ff!5T1`(o2=6Zp^F$aAk6UW)%S z4{sAmv~PEbs-yn#42(J|4!ihg*pOAO+&aAkZhy>|NBtXFz93c%cE53CA$g_#-EvV_ z#(VJkdN_GoU4aOE|3sk$IaVpsfV_tzOMxuyB)FI?rm%J)`N)#U1!U7o<@sct*yPU( zV8`Cv90T}*d?k}Ge1J1UhO8xB&nyII?ohn74*t$0_)P%*c3qf@Jnz&%$6WYByXTp; zaEWDT-)uNCy?bO0Jn=cBnHRS4%-B!Zu}rE5BDrp9 zUtp`47jooB=1OtxuCsEAaILQ3V)9?_Z~xs>1q~$yc_sD#^!5Ke|N8!8 zy62CSQP;JYC$z9k8}scWZ2DoaR6;=WYj}scgbvxlKK0fc*z>5n82OEEpTIjf-0olu zd1@dfiEOymDu=x0m)n!~aQ&j7M)LIv(>8LpVu5NntRu^?p&CwA>+>d$`4jxwOw*8jW4h5Da$u6CKUrxf$DC$(S;~PJif_4vmr^U7R~-~d7N6Ra zLtcF==eL{8V@2CwjksSq)c*X6d?1<2z@?kKZP8-3c33OQdy>rZX6aG#ttUQQm*5s= zmjUu7`5A`f8&CHg=zx7z_MIjRTn}z1+y6`mB^t;_xRk9myd~{hn z8tr@iA6y~xsWr|gtL=#BCnse49Vdq^n>6czCntyYl5_VpKPBs)(YrwI*7lO=g>AET z947ZB4Y`rK)w>hP9G~ZZBs;XuD<>B^^XT@$KgJgIlArVJxJTB?R%E&iZ)DBn>4%SB zWM?Kf4CI|451s!dMmBrQ+ehB$tSd+MuT!`A4ohSeXp?yiqD#nacWTYaMTr7R1MsmD z*MsD5vyHBk_gje^CtF;+$?^l9y=d=#a;X{HA+p1*y$)m<<(p09hGFj=JP#r zYswFh4fqF>$lark9^~3h1-wIW;3JdWWbRrEPqMt#PYH5pc@jBPo=NdWQT|AG*|ChyX zO|<=uEjhX5p*>wI$(;EIImuJwFW1uX>LkXo#TuYo}FOQvEnLFf_OkHdD&G zRSOGuGVZj1b55@}uYgtc%vm$`7Y(K66?AfqA>fd`Y%QB&biIg z7r=5)+O=N5>Y+j|vtYZcDtlhR%B;^sIbohffrV6W%{CtWJ_A;@ZCgwA)^OR-X?9pS zuk-p_*z$~I?U=N>u5?03><755KFn_f&TdJ{uYqSQ|03A~mz(gvpnAqHKIBc#+g@i% z^-2CgPe>okQSEhu>XYB5x4z8S{=qYB2dUnyS3b9c1?H{TAwc!yW{2t`2Ke%s03)g& z^4%Q!K4bl@Z=F~v|J^LpD?Y;OZ8oM+euqY9Fx9}urR^@1&nq5TTzC%)CVMZU{9WK# zXYr2KFY#z1M;9(XTme5QioZhny5xM?c5+$W%SYt(GBess;gNH#d}N;&Pi%@|Wt!}WkVQOf-DWp~%)TJRn7lHKWrW7_`#7Ep3Gm*j!4u@3Zno}w zaO{F0f2t1!X?h2<;msVJX;kmlKPXTtgkOKS=tA-NeA+*{3~oFh7x5XM;(m0Atb9_t zjN+*@8Kpz^H?RI({}0O-2bI8Tsy#C){&!5h#b|r)d?$8N|0FGV=adg;n`S+w{M+-> zx_~@&d(50{`sk}x0lfIwb_sHG2ltvHSlY#YK3xxOmYb=)fD70s_{mJy8+OtDR&C=| zA`hSJ3wQ$`UM0j%*S~$6+?ITR9W%RyY5((z3RYA9v8H`@Brm!p?o$U}>5~f}?|$@g zLj%0>_8B{}vi;c~jWAEB%y-&eaeVW;FYxhlv`Qf8F?AYCb%8)5e6x%hZ~?zck>wBW3N`@G_RQbJxL2>|;gg z@T64#n%%HpDQnPO*wO23vorjSXK7J9ELR%Cy%2toRuvEdUtVTBH66appu`pq>zt3- zO2;$xn%RPU{k`QX%KyM=K8G*DtbtWt-8g>N(;XAn;K8~Fji2C6M{bMWg8g&Du2DQh zM#kK3!_U}#+9;lB^Vhzl{Ritl=gx#VjVzfn;T~p(z*xA=7qSo>z}v`Cm`Wb>Uu z*t?KrFdSAjS!P)bzq@&4S{N*SSl^cF1<%iqOk@V_YCAG(;MHFN@U!smc{E=WRjQOa z35U;&DWdui9GA4v12*er3af;#^%MSDKOs^P+k4HPi zwo9q&+P}TMf>{Uio55|$idH4&9bp0Q1_} z4_d?9&%DJys$>45x-x7d%ra*}UIcCy4Vbco&t-r0Bs>*gs!&|%u#`eKJ*JhNns%JrTtyzIJs#q`ZI0X9%*s-S&_x9Ww2BVhX)n^hD<)v=g@Kod7!*sqkHD^^B!(U!1U#EDCYY&C(goUSzvn+(KFdOYT4u_Zrxe3F@ za#qXS;cHR_wq*B|gD>)6vDc#w)IT8|o8{iZO9G~c&xJ2XuGV42c%R%YH3EsC>{@bxx9Pe^OwKPnFsruZ})A26QX~7rFh;v zv!=NcHlGqnq5cp!;s31!4$7Kr7lkj5FlEsB%-Z-3G%BO-^_i< zA+tA=g>2_$9EF3E)8CL2-fFTRhOZ7=v5Ubw6j?VPfc*#eOHzLHwHH*-{O+WDaqSX# zm&7G;GS}SOCn&$ZXr^iGhnYJr<jx=mu+w-L>8i9m1begR-61p2ztHjk z{wB_2DF+utML2ZBCU3t6D#6mhwuL;))OGoNwSK9@ue{oy^R!l8iP2c=Vbvy!dtKW(_#Q zLhA4)IA|UFcXHpE+$A|9`jr|Ni;? z|NqR=44g^R@8ZutKmSDFp9uW-5ePovt-{3+{rCU06A{YGoh^fJr_S}57qLuJH;zZy zep(9drMJE1vBlrN|EJw{?7>mv&g6b9%^teGm6mR56*@y+cI9ORdGirYbF$33W5>vA znEm%S!81*w;>eEcZ%^!l6>omY_+RYZ2{e}L|37-9Nhy_N%9yDEnPp7MJWrW2t4PT_ zBq4L5NQNdPDW!xoi;@zRlp>@-5=zk|ocE`5{Lc5c_iwMY&szU;*7~27wRg{YtC#& z{86WT3Hfb-S-dj5Bh<5kd~r{1#RRg{*LwB#95`{U&%(>_t&M3V^WktlzU-s0@FSC} z?C{C6yV;}Q?bB85xZud#HLm`&edw4n54@*-IKdA-_~nufna84Ohbz3Gv^8-t{BT_E zlmombT5vrdoRpo}Vg|1@n(~Yv&V2fQ8CjWMw2v&Wo%2K!F3WwzDg>u!8@!f-V@HZI zgyGLuZih+2N!v3LmcS)D?2j#j=emxXh`_rl8bu`F^%WzMqVVvVa04;;NAkDRV(^7n zHV(2~bMqatVCtNUqVTmU=O5(p4Gv3wyVK>cIIL!R`>_b(5A@mIkbB;Kb0)h!x~VGx zpZ9T|wFG|Vr^&JuHoJ8Bgb*xxY(W6|(M{z}0XUCQs*Aj}es#_wSozWm8p_Ntk0uG7&*lz(J@3+-?4YQvzylw_3C$<;%z+c&{Gfd%^!5QZL@W;`l zI%C*-W7)-zaNMv%jS+lcYI)fZ+RQ;O2fv@c zzI_VD-<)ZhH+A4$@2g5!;F;SVFs_3?2n}}5g%1Qjexwa&PcLL&0GC~z!9jjGmbRJ) zHZ(Tfparj8!+TR0=9@E;t_jZz>HR4R$KL(^Rs(KRh*gw@cP#(9R}EHrHL__n%sk#0 zunK014F6#c-}&@#Q~_q?T^r~ETiweSk%M(E9?94U+r^(fE(5=RXnbZXoF&A`xf1?1 zvG-~y?9>oqB?%k9(jSe6jUMNOE`x73R$WYlh2rXyXnY)9&c8Pm*16x3PvfiC=5{vu zOitMma=VG9!ai8`@fB8bH^2SfXN5wS$>t>owP(1nQEDf^U%6+TJ5?(_Le?Q?l&V@h7lV04e1R^_Zn_L%dqgvzh|X&xc~cMmEZNP<}_ZRgT@BHW!~ zM)|I;zm+)`ZsHR441h~=Z^q1q3+}|NA;+7GY$gA7J^#lmH3bEEd4+%XoBb}JY>(H!pML0zEtu4jM&6*5 zu-)ZH>#!Bmx}$lw;G$HoIwiQ2aoff`c#&J|kT@(7`e{}+?4EwoUj*iKD5}~EFLpFh z6o4O`;$ljKZwz_$E`~p)MU6$k98Uw6Qfq`&0ygh}CtJrLz%LXE`*7Xoq`1JbIs8HJ zg~j3)WRv8EUVm7so_{en-25nb*bPpc9lTQ%X6^WN#}Zy}ZT*Rra8~e$8Tnno5iuFq ze2TY_Fga%34x=^HDn9xt(fnep}I|NEy}*V*N_4N8_}{(6$tpjSJlSja$L6S$4-}ShP%j>5UmiOTUbFnidpmft zxAg}!Gspv8pZKZwTZ${h$QE_)r;`tMF*1?M%jKD<{4bt`;kI!5@|8n#;29B17LZLI z++&>$ul)5RVLd!!x4k3_9H>!QZUghAs`E{SXG`_Hv4R5LZ(dlz`&2nwCE%A| z)%|VYHyJ(+bf3!HIWU#Vf01>wp!?=aMll!YKJV?aBlXW`6I$pO5|C3N2{SNyz_ z_OG7OXGza39=IKjGl6dwcATT<1_Ej4P8q{`cV$HBxr0k-n?J=j+8iC51}7(d_tAlQ zrxnDL>*XC8j%Wv1MVSz`P zSuR|F6;yI_Cvab^5V-MW5xhMo@YWAlHLYhJJqN8kIIyV;ZmN-3OwUodUruFt0=L=h ze@WR7+FLhH&ke>Gc}0;$gbEwU+oYl*$;(F#QXApP-sm>unt3ya54NndzTD7_Z^j3=1A{bvG}B3 z&Ve7FoW7i%!;H)qXQuWi2qvkK+0qP_kbiL;YbOV52Cbv#x=~koF2%sdXDK9+1K56b z()(DCd>ADPVTXp*LAkKexd{*QooGAvJeZZ=EP$Q^-!SdT&xZ?_+&N6%|J9HABwUlf z$c*x-q2%O3UX$)Kd=j31D|x60mW^wH=Aw!MCamGa?hZhDNKBeU#@ z6v9~`?)T^a8C@9g-=ClVH!^UTCq{vl;nIx1eLu@%zAM@fj?p(FKN9cA!zb8_P72Q+ zFwlJcX6lGFUjM#sy+r%2UrdwUj;$|07N2X5t-^F7k^*2y`|T!Xuy>NhhG2Nl_KA(A z@VCO(I$`jyv)_-Hz;e!!-*>`0#vMb9;dKg`+R^ai68|ekaO^{mOHuG;bGu81Fe69P zMcTfu|5>jA{O*l?-VS)(?f40OILTE_nf6~kxPBSgx#=z|)jvOa(G5NLM3x-`wJ*J_ zC6(fLt8Rq(!o59(rnEolXrt0CFw-nMKB_NN;I`K$xN>~KIr4+tt7qL|wXLk{sC{8q znqNA@)nliol0}C_ST?}#M{3w<`=`(Ho9y9lT;2w>fBpLsfwpkivkOb9{&Q_M$~N%h zMoA%RpG!D%^)vR>Lk?{^5$SWyuVEO}Nfd zj!PAGTT!5?4)^M=Tcrt?Km3`a22W${_tl0E&GuSE-otz27x~i|!))^Pz`$Bvc$Vza zYpSqf8uw#kSVmEFjGU8g%wqxj_MX$E?Op5r4^Td{9lyo@F3*jlY zq5gT}zN(4rIrd|n8yu!QvRs48JI~PD2zzcY=OW)pSmNak4_(c2Br~mvDBlKaYF)oa zHb1zg(hnZ~80kgF>lmf{I1r9%^$@3gybKu54uL;hkXuOkx^RBtD2>mPa;H@&pSRST z@6q^eUE;i&^4%l+L@pA3InHE6{qZE`-71<7W4ldOQGc^ZMrOvs!!nUmXgsji##P6| z2dx@jk*At}mra5dw0$no__-M97MKj1cjjl)_)7DACA}AJ{&6Xc#-AZ4_n}mn$M)fCIR=Y<%-T$DvAFWH03H)A>7e#1y%7kkg@qmny`%gzm^FIW!6`Pe z+sGq2Dh&7F!wV+LD4#L8cM_h$j#iopl>gcJ2UfMg)epbirvAL%a#!sIEVt=f4fX%z zYG%dCoyZLeIY@Z`mJba~5VekoJL`$sI3U40DHl`n^9Jrcj~du!cu`FU9@T z2PP=rddG9;{cexihS`VVK#|vCoi)-W6$PNphbL@mSmS|a0`IF&a ze$n`LowZ4b+NU`>cRr1O$DI+9tKi;`8BOH4!%NO7!{!^G_J+d&>kg+W!FCU(h|~D* zbSn)~grheaj!}K{8a{+8z?B|hBGjIYeTO~d;m}XKay0%WipTlnVAYc)<#BM3X2EM2 z_;X0zm)&r7YUHk!u*i>H*JEH2p7B&^c=^5^+bRCaOVv#Z-rl$;jJ%+0gB97`ZOsy@ zFRbPaFkU-YXEVy^!=8sF^Ba-K*QU5tbw0o0NN{YqvVH4vI?&R&A7e1eW zM|623$#xlMB2L3kgjYC_Gh-*3&%v&Ti|ombZ$}4dysda8U`+Nj>0f*W7T0RBBJ&MO zdso9v386}4pRZ6^0qB*Ct$rt=IW~5`rJaj96TTd4BAgLQeW@a{3~b-=)SQ2y?1243@*@ z339RmaHVj$Xc?UE*~iHbe?Fh?Tne|D%8Bs7Iei>5C9v6(9=XNv^mF0XG~dp-If(JX zbJVw6P`*X4U!BbZ|8V#kLhBdj_3<7qSZ!sJI<0SqjZWO=gzaLk%N~Va-%|G_pKG}@ za0vdG+*7d#Hai#+M1Fo~Ydrbp_X~??e%j1hkjnw9*$7-t=G+cFX9%!j)&VGrNAtu4axIi#?pdv8jox5N{7sY z4Np!}rulv1gz`}~n0aqn3eBJOGHx|tC_+9_n80Vn+kSV~3QV>ax*J3?s(Jb5*FB;j)c&40nSvy&(u z+@Vwu0J9#r_LDqrux~S6kGWp0*-!hE6@M^=uEzuew<%M5THh=Yr}MLw;LL~QryA@o`&Y$X+VEDlXO@&t?t{aN>3Su;clZODQ!y}zu9vnwa!9273!k)@qX_54&*Gr| z+1SBvAOr6UkIy6TUhpAw1$ zV6UBJY&3q(-0b(`g%9nX7f)6wFYH|ex4D$pl1Hzd6qm|tTs=HX>g6j(Z^&K?$lyN*g`CFIXArVPL$Ue?gBpO?u{l-Epk{q z3V(|i%_HwlQLY$hKFa5nE)FwLi_HZk*GzzS352hn_+ysL1M4NIc= zDf+BkY!&LOUvg)Jt_K*Nu&3Aev)rzR0dOj{3`CQ zB^y+@GAh6g5`qPmaP_YR&*=Kru9W+p1-zIotXd6jOylXM`kFt#xw0B|zn3^c?HPKR zF|Zb%CE{yI@otXGo;057Ix^=|`R4UE%Z%WXvQ@=oyGEI{rf^5cSTWTXC8n{G#^>s< z#(~tHMKQ4{ywlmd;Mv^v z9@O3d-oUFq@V7-N7wP!^dcXHikJXf=dvi>5G~p3lB{gXi%*qUw;+nz|0kF+t$E0BVXE+4MJC0ktbU#!;vmQb`D5= znT>dHu|%B~JVWtwZWiptl)sN`J(41t0+)O?`>p}Yj%>?~hvgKMW~sxC3-@Z1H-7W$ zRD*}=7F^#=7gvJ@1QVLADMfgrf(&47s#ysxS6 z0XZ|;?t~(I=7N7GIpNySVRC`S(YNGfH4WM1zvlCwE|6s9l@*m&{@V*Ang9BNpC!EK2mdZDa5Sxr$onjC-FCj2TKruyXoS-*Oh z+9g=FqwOiVwLD~hEWGEXNw+fWXuDL}AJ$?QGFO3bXt&(=gYyLYZOMUp3iTV{&Mz?^ zRN=F0HR2uMGb&YFYB2w!R(5VU=CXa)YB;H_No6|heeJ988rbhf1jAHV#3{*)oZEIW zj~RB%CBjCn%p!(xUah?l`3aAfEIIC+#TR#YA?M?>#_+`Fmn!OT z(*>?lGx*!Mw}moXcYA@TIXu~mHv*j{$%=Qss;eR%${%!%Jjhzpt_H8@TfuArYfdB! zuZDN%>lu=3#@@KBg$?(o6_cl*v>h{oc^C1nvV^yG#(Sg-m0`+e{$38n%E__5=z(L=CimpY#_>?8kz<1{Sk<-OJ& zwpw7fp4>LGY(06lX~LA-aQ^P53NKjw$t!=dWAw>-@<4X4$8&hiwhY0o@Z}3;qOalH zCB=i}-sK!YeQV$yub(EMPwl zU)yPuL2^sx$$}n>~9|OhzDL3D3?RlRuOu*7?uo{lOzWS6-WuedKb3adBYMS zS7Sxt8MUuUD4&woZO4|v1=SAUHpA{O^3O`a>>gSx$kQScnPuR_MuVnJaQSx0?Q$?j z$0cv_V!a|WWmv3!<;9I~@tMzN>hN+2lb@dOf&E)d*T5(HcG{7z+Qjqd(e~`mGdw6h z@35vm+<5Jt54n1UR*41NTQX%EjR$t!s&|%fmf#s9a)rKZ&Neun^Q62hJXE+xDFl`{ za4f`y%4_c3lmvTDyxi#oZ+zDwkpX9V9@(}59ygx9G#CEvuF>iUKVvNPDu6Bb7YLKb zu4%ZOf$y7^JJa~J>Fju3MRAtBnf9=D!^`4oxZ&5^TXt|7qh%x`*4K9tGjwVG9?FTD zBL;7+i}o>sJD3b#u7Zm@mmi|_CHVWt>9l%hJko5|qj<$RZ?dXpuQpjPkh_SyLGjWj zU3hY}-)+7tguL;@EeVQ;H@q;{fft=E(NcmJsf%sWhJ$y@tMI^K$9OX2;ng{LX`HY% z-!?@#Sky0DZ!SD*DbH~!xb*7mYjl1X@{N5d3IFwc@lU5WIT>jsd8L2%sWMLmdD;K` z{6Eu_8ir|k_~*~hpA7uT!2f0$h_#Pdh0lfl{Q`A$d@UEZv7)BMW=;cbQ$@{zu%IvN zz41Z*+9=~Zy#D=c z19|h4%d^N!2SdeKV7J`t?^K&m8Gk1eJX!nQXPxIm(5emZ>d$XLyzkh_2uqlwro+?; z7A&b`FouKII{A=~&gDI`8eX_MzJOe`C2lwQgyV%n-J{vVvZm6(cmM=x%`LQlrss4?xE322l%HQk`((xSlem0(5 z%`N4>3zj!`nkx*?oH26|`R4rbZ$hv|WBlewc*(jM_sIum7YOWx_fAdKBJ1t!v5SD) z9ydJ^ghwoVHT~c(BAl0b;N}%|i?+gUjqbi&aK7$j+QIo;t&P zWhYqI^FTkv%idh;_JB{w@71UB<56oQJmJ@poWJ)sUm&!W{H5y7BZ?P3y|Zm2{K0WV zof}@%awFac_W10~!v`Nb`s)k%ezg2nG7skpU0>Mz^GpQ+SS_)tk=lR7^Q15xpZU+d z7XEN{`t~;RhrX&4WL>AeeUz^jcTXvDzm1$B<#X1>JAAaig5cK{)F0^ztEX&({Z&fl zQh()T)-BuuJ0=J+NWcp#cDZ}OexgIM$y0h{1-!9%yn-MuTg=y+W5Yt6ldyls`&_x12ViRd<}e>+v-yQG1-bCU&odH~sw5OkNhyaY7wF6;vC%3=WZT z{3Zv7SBezU{J3cA|5+Noync12G@Pn?u1|{M=Y%6@KFu9ST}WoVW9lXY%Z=`sNfwR_ z-bJ2VrOhr}p7VQtZkO|4iMWZ#X33map98ZnnN+T2DW(SapZ$ zcX%-8i#B|ey-`F4c3Lr_stezCeQ-z~&d*!^OCR3rE-_UB{Wa}mJ+J{BokH8FW=YkF4{#Co<&%zn6Qi9FkJ#wBi%i#)+a4WhB_-xge ze-R#%*%L)hIy#N%Dm;0WaCF!57uVnm#wn2$9}AU?rt`ViubqnIFK2x6Z^H85m8X*< ztM5I&4M(e$uv2~WI-7si!HaWDN@+Y4J#;F$10NiJ%ttO;djDPn-0(#DBpu&X^#lRB z-r&f3%1)lVda+^JR8099|5^T;;&zc5hsl4vUiqiXD~ z@cQ=~khN&MVWBf8=S0Dt7oH50J3rWqq`;>yd#Ss@$2x7rGU3sj z!ghD~u9c1&nY(Lrkq4D`VG+-Pd-eKXZG-bQU4wGrp6P*$g5a@BhxSo?oLhB>{41UR zbQV1IsmqLDcy3^E#sS!E#}rBO9*;`Pcv!ny>I-ep)#g*{4)cslr~1RHQ{@&q!DZ#| z4wKbH4!PRHU6-%d1;G41GY8khwP}nysJ!8Bg-cfOORc)L5V+!*bfg*lc#$?|I9wUl z<6;OaHAkrIgrBJm8tKB_-WM!)!P8RA3{>DQ9_x}sSSE#gx-5LX=3RCwtaDvWas{kf z8I_a{cd~qCkc7pje{Ifyzr5q*rZ_X>-qK9itW){^GWfP7W70vmjyG9tDJ-U~@{ODw zI9R&`X76!0lnu+g>aJf5s}+^E9)>4JQ3K~wmSgaGHct_XZ*G?Olm~}BYc}MA(`r^^ z=fmrqt<44DBTbHK1@NNK7k6Y}H^2Feh48exq%S^j_dOUCUqteAP@>ps{gsOnJ(JZqZre)0@YJ-ah->(E2lR(Nuh zn}5i(eFMM!>6=9Ph|sFjqS+8#JRwHoYjSq1*dy_f#$S`{bKQ2tA1fMJ(D#32FxsN z5lw!0V@3*@^Q(3+xp;E}(-k=Sg;@mEzrIPyxC*Y%5;v#z12Dc(!GbBu+j08V`pGz@$bC7u;ELy@zbztrIY>;d{-hYfqd*uFwYk_M>Ku= zDLC(@>85Y+8jGDt#qfFG;>Y7Kw?hB2ldz=MNZ=G?QFNI&QxO~!>+xe6+{S3lPw|a> z>t@V^oeQV#CoAqb+Cx5IXt?pO5bKzh4 z?bCkOXWr+<4ttaw>!w~Eb{IGgJ8b1x{Dmtwr&jAGmgoz;OZrA>^Tb8(6-=1Dl?mAa57q3@4AePyI!f zDm5&n{U1p3Em;OzXYM%C5BI3;ek23mLHB)tCuf1M8k^h%d?9h~W||c|wZ<>FFWbK&XE3KiupD`1ob6|_!_LS7YG0gp@Vn>m7CR-W6|i#KmEks6#-wff z5;%OR$gCIe*7njg>W|)u;Z@!6sk2AInBcv<(v@VbBpr1I*thljrq?j{kc9nrjNiO& zKK~wgXx{36nh)aNPoH`RhZ;P3{t90EJbiO7ykfe6U>CfKb133Hys$a&`g6D^`S5M> zwHv!Px5C2D*SYt@dd~il4e;b@<8#>JY&|^7lg);{u_(l}p#7WpAX8zhr z*r(KF2U)i@Qtdo^y@$7<2#&qk#CsZ^(a;%3>sfBxkE$X#Qswa!vX;T~vE#6Ma&bo? ze7UhEEFX4^`&>uXa(&c#43?Ho?Ihp(veW7a%&L2cmCEbxn+2oFhzZ!aiI zo3aO9bo0Y+D^~70oDA>3E^PQ!|li-WGY_G`)9lML7;bR@MN~t}{g$}!;;E6!H zUF6UPr=VT%SA{$e@}P@aksrMB_@(J|d{gwozwLTjewH=7lr1NW;;QiuoEET#>@PR+r;OPLOkou>CI#}9 znCxm}cxaaGj{^AX!1OT#xXw1vhb$H+Zb#N!KA=yImW-;>fj*_{0I7!dAGdB=jtu-%Q6tLdh4bvQCo=9{a!zn(w;@pLaOC!_eUzyDwM zzkUB7;|wDP{P*YQPX_*E;7uyu=bmPUlQ?CmeF5vaQKPqKH&ARwszq_ry{y(<9@hK|e8ocVX>3J$G zzfh~706x7`?!G%*ba7ziVOZN=e7Of4x+ME*94z*H(-rc;strC4F!Or-4I5$R)~-he zuvE9;>`n0fGYs>DVJ7DHs$TFhDJGkrcKB@jC&3DDIQ{Fvkh^f(!sEAm;HeEA>Xq=K zji1}M!fQX94(7wf>2p)J!L;7sDuC)sv-mWA3NDb`)qWBd?RUx?g*6BEx8}pj zQ(8aCV7vtwU$i;`k8cp>b%UQ9^?c2S&3r~mJYkE|dMC+V`WLl!!Aaal*ByjsH&3z6 zfF+f!*ByY5oOa!k2U|vj52wQ=Tz3=Cz`s;9BKE^t^>Mznu+-Iq+SDIT0TLS?z@~4{ zEZhqhIJ;y$gB@Rf;ZBAZIHfFn17ANA9FhQseXuv_gB5eSb>iUa@Ct^Ha9I1Q1nPg! z^X-p@UZZmNG$ zPgWBREvEX+zqqLdz}?S3vG&mRj^42}pDqZUn0N(GFlip6`N+HVr&kwj)zLa{Gc2AP zo!JgM?HaxA35S(F4|oDs=UtAb_2PrV9hZmj_ARRQw4VHRy^+8gv~1dyjgIKE4iCd? zl*5F?y?$PBd6b7c<=Fq;P9|UYFmLq;dFX58zU}ai55fjC#>Wz)l>Om>@a{sg!tJd5 zM0l%&?FAb1PanNb+Yg5yipkD_{Z-x@<-$km3P))Uv>DbLtY~X4I zn_Pahj%CD$LF3=s^ zr$gJHdNfGe$9Ok(Yr_GNo-Jf29>si3*xJ4q@4n$%YSX>EmEoOtEj|>$IW?*K72twu z7gd^Lj*hzdaxg=eM$}QbKJg6$+1-Ohlk)MrGT@{vY*-RzNp?>rT#rT$x^^|71cPC3gSQ2+AB>&8-j@8sBG zY0i#VGKa~-_E!QIkdJuHdQ9!F4q<#mb9k$D_lP09WoA=6ji!IC2?-|vN6*QgBy6BxTSI`u>d-n79 zP<$FBt6O$Q*#C4rbPsK->im{t`yX3JjKsK`!Gkm7?SG*3(@PJ}sls=?r?LNpOBO#} zA`eF#)wdz@PncHJ&hdIILuoe&#`qo<2~ z&4sP^pN}Ows-Adk2iNI-inCHW9f&z~G&ZpP&usLv&r$ZJwX7l|qX4o^JwvB9&zi9;%{OyFQ5S4#e zw`JZZQw2?juKrd!zN{7RI{IPG+z(TzeQT}@t|9LX4(BJI_ispl2d|kk;ZBa8Hn_D1 zo>^z@K<*s4w){05bB{lfoS+?ZxefNzul>Eh15&Lkp20h!gFjJy&fMqM*TNqkEGQd; zmvQdbybKRso?=Swdv;9nB79+Yl|FfMkn_BJcvacmCse+1>E7H!@PdlW-}O60OP@Lj zTc{2eQT^5)tCQ2=k*?@QveCIWi7~L3(Cw!T7`6HrG$;Jw9IqiAGK-H{=4SXv!7&N) z&6X*zJYfOBFRbLei{`p!@Kiq$J=)*Nb-M@Gz@vA3FH?K66~-M`!`pXHsU(L9zk8|* z&p#`3mVD`y%SUB+*|hWRWR+PQ^$PI%0Z*Ra?G0Q%RTfq)+*VFLpf`nG5|&ous-^n7 z6z*Ax!zLH~H%@`?*ITKI!4>BQddbft4t!V$YhB&Hdp4Z!ont>AzP9tyc2+p{{+h@0 z;O*SUPm*mHGndYRAF5v}odaLyYJWNlK0DQ(fel_Gaj^fDiGt>@eygcG6mK&MX@%WQ zmpF05d<%VRpTehZHQSMoF{m#hw=WblAXi)QRMo-@WcO)u!9SBn!q31D5A+Q!gwG|) z-8=<%e_45ytT8u}`2_5>r>c`3<{#*PejHYhGA|{2#_sjchf9najmQzFci+f_7sM}3 zn-3fN%Xz24#}q!a&Vz?O)H&>dZA>ct$ULvK%i`g{)BEO-1-_>1?t&F8s~O1>K3~PW z;9na@c9D&`#s{6@O1*-$dx+d1HVzVodVPd>3}NC;l@&LoP;7k27>UIH&HT6~c9zvP$EH8J?y+6pygILY{D z?Q+;{mT8a))E4k%uJ& zkJ}i-))`Af72uX)&RG<{(diVY2v-G${@&k-qO*dlU~#6lCOyQtF3IYuz^XnQ)>HlO zQrN4>ADeiM$#nvW_2l|h{q5@TBfgf$YOoZS?-e@U%k3V=R>NYOK9q655xiGxwBf|Z zvU}KIvw{&F9r#(W)ZlFR3D+WDJ=pbojUEd;|7`a|GPH0esKy-dZO3 z!se@LgN%@F#HfUNZ@EC-#u$sRRvqsFMVJLe@YtOR1UxO+PsY7uXZ(v zorRxY;kO}QGm-HvfxmE_-bem<>l*h-SZ*Rfjq1D5w&`*qJlwL{)CBfFyGi0Ge0*>6 zVRQJtLHN8ZxFOr!&kEM^ld8{vzwuavTf;45CatNk)yu+}>tWUGEEe+I9sK&__ut{Lk`H@(140p)go%N_&qT{Lzmy+Z_IC&U(fP zzCQFpSsUKj*RtCM7SiYOSq(=V-@)JtKhB$OMprEw4o&iI@Z?oY!9!&=ci2IFPlE>H zH!Qnnd%$1c@n}$aKE?H$$h8bCAN62vxpy-?;o=@+e@FPl*MtvbyYQYMY9HIz&#N}U zQ73M{%7quNbzANQKll(bTmbhM+9hp)M^xUj7sJcuytCN~>np}hKLckM7B^f4IY8;C28j^HSlda8Pjlh@Z%ic+wh^4OXkp3SLC#L{B`i;RoE8WR~PExarVVi zDIRN>zWqBq@nYtJ?Xc~SjKY~1-#gccIr_jAQeT)P;G`C=8am!HtfsRS;2Mr4_LMJ& zZ=q3+aObpSe|uQ#!RmrUSopg6Y8nqd1FNk|;pX{^UeWw|->eaG1!f-~XQuh5lF8Op z2M_LS|D+2K&J%x3=ckWtBIz{0s;A78<^R|=AJ!cmS!`?;aTr{2q9(z@Y!py?K zpD6AiC~zqmHs9B6OzV@HaQNmtIK;5~Gp%P!Evv44h7+wnS&;JzO=D-{dM7g|Zb%YV zOh|7Phj~}NWM2vI8!v3OZ$H`M7oH^a#kaUBKWQ&%qH{Idn ziDTvDm$QwlJz(E3+b`r`?_SEvV`lhZozk@fR~Xuc+&>Rjs%Z#MAm zrF;iuvwri1Ck6%fQ-7VXvpXFLKMi~+u?FVIpM5U|ZtdGPNbB)C^SAS2;f4^~dNRX^ zEN2}2wrz<&`Pz{g3-`eHyBfb~!izJ89;LyemtK33cbwf8a}W;aF_}${P7Iz$cNZIW zX_>0Swe^ABCGb62OF8o7-A8NsGIR#4` zR&1s7%U|zD=<98ozVam6VVlS+*;zc;M%ctF)&b5he%eb;=(3ZuhxHdT8S%ou%KSE2 z!l~k7DP$R+H+GcM_Qsz}7sFDGDl&>Ni|pwN@=2D#9aG=~3T?##aNoMKiSN;ecWTn4 z=^Spbt$juh%pK_vOis`l+V}>Jv0J~I%yvMY;Wb=!IXp`c_EB2v(FN-c=6|RC2_zq8 zZikicmE9wE@umwtgNqhKnv;3oUuGm5+P9qMhy6?%&7Z>+ImJ3;5o7(Bm+-D}*UNlx zv6i3n7~ELJ=|t^!HZQol0PXi(m>f&Td)MXQpftRN``2P}(5+S5jbXzxEEg$Xf6eDV z-T%uet&~yt*MI*{LGi!;{=XIjOVkvt|JAp@fA;q$1ONZeK#EF?CM!d(?%y8r>^knu zc*jFo^DO@23G*gpO@p|(1-#=}VvdVx)#3HOzv+d)NyFfU|A*}M?6UP#)?9xBpAW}Y z=Yuni?O-3R>CNPV*at7|;jiUS9+3~cuZnkscQB;AArJ4+V%rL9Xfv@NfnRhNREEGO zD^3hkTsnQ#lQ{Tp@5wo2%e4Ylxv;OF;`ChjL(^%N3V4Q&jcXQc%5pWW4sJjCBO?=b z{xw|C3_o!5a614$bJ~BP6+ZLJo`rmOC~x>JJePg>X7Z1U+1h>Z<5xMcWS9EpE&XuK zo1T2~0=GHgoEw!jzdSEqOZClkd-h5i_K6+L%!VJ>T+UX3r*6sYAz!)a#AOc)+;aIs z9^cO9?+9;e)O$g02|YD^3(T}p(1`rwY+T+BxOzuJ(?M8pr^B&G*t6DGfqcluDK#1P zKOV0_?Ri;^X%RW z|1iolEQjxEXKIq!w38Jt!q!(lr|*IJTV%MZV74ivfyuDd$Q(x{Lt_24xXU%z~Y`?=r$RDnHtGhLZ5+T;)N zrbxh(qc8i)W^qyY45vCLjmE6jZb5R&?zik@0i`3Nv1sa)aUhcntl7J9;yqrdKZ zYnTh%^1$eX0ODzyjv@~5ma6resQ#Mr2MO!paQ>!E%iwi)vs!Fms}vj8<*-R@37a*X zuv>65S$(qT!pfl2J@?7=3~j5>k(J|kR^2!9_McOPChr7ypjCIIPW@@Kf9KBYYjZr zYuNrN+{9enTniV-yy1Bb2fwvDa2x*UcV=BL+{|-vY8~9|`E_bPJh{rnNKczH0DJjx zD^k33`qz+;aCiS^7BcrbzCEAdPxI&W)BaBG3H&$=&#vsgehb$6rM`gjXA#zyOYJdz zq@zgrontevg^uT4YiiLH_|(eO&g<|8u6YYtU=G`%7|O@TmTd7k@a=7%Z7;)C{{1iJ z!2?Q1JF4KY^MHu&~>*!$Fqgah0%lfp8pIK_h<~SuAknNwP}jNK^%U z>9qGdvX_|5-3#!mOK$vag1 z$PL1duS?;dUb}k8&e=+VXW{b1svTT#(l#ccQ}DjUPh|w)Ya&shG`_5hwQq{Ssvb|% z^WpcJrlOKC?|sX~d9as#_+|yT(b|QX#_RHv-_$hW6Iaj8rSa^aJMcsYZr~~pp!0=M z(@#DNSS7iTnf%xD(LY^)%FD~Fl>gTkpz{Cq{fbH9F&eB48Gk>0J_s(lF59fEIddPg zdd3qRKyA$zyIc4T_2Bq-=kWUX)2A^`pYG0`FE*gm|GMH`KiEF3fwyY-2PI&mURn|#(VQTlQ3E1-fi@SyJvwpp}sgIR4f8=_Zk$da6 zPhAdM=QH!*no)!#GzIPiw*V^A!y+ zleYza77~I(`^7TT;LdE>F=g21^5a@^e3Z7`D)@Tkrr*}jJ(#W!J3r}sN^!5&dsjEW zykX8vw7)s^{vY?kOUpm-kf%<)SAG+2dy%r4%qLv>>lU0X9k!LcCF|!%9sJ|z1`qOM zFXe(Ec=)~3G1|Z0)ZjHsFdA|{S>~m}M-sns=)kp=0!LEdxXgvS4B$uCIituM1n*RC zhocACzU_srEH;RQU8_d@yy5S$ zxm|v6QpfOJ4R~^N2m8(8i@@>nbSVlrA-+zGDRc)s{n9-n@>2eZqEJ}BV;i?K+@rIY zpAQx~KjWecyiLQ`P!8jbIV-R+7Pid2KTiSP!EsSD0iK*yo%>C^$i|)PT$Ooa1$cv(9sXD-|MaBzh zzFvwk&ZYLrUJuM7S9Ng8TENQZ7S)rRceke+z~0WQoKDd8=k!AL;nb7m>_za!L+_)_ z;F<4h8EE}5u2dYfhWnN0Hk884J%aAo!P0>yN6*23UC;h$`IS?UQ&f`vx9|V2RQ_-G z|4gqKrkmlPKR=^f%_J+ZnK;M8`^%48JcN^3?u19dM|XMddjQW1c`!c={_1MPL(c2C z8x;WSbTf4{!TWy&rP#r_F|1>a@D<12F!KAw)uUwQxTP;;;9;>x2OHqHL>c+dIO+z) zfyR1xcUa-cn3RR!;MXwzQZSHXuj@( z>oteIQ~vp*H%h*OT@-Hcjl#@7ZYlM^>2E`8e>-8#zF~Mx%ku|gh;u!AI&}A!HU@Hbrxg9GMzA^nb8-=h0lQ{U7K}Nn}n+hEP$4WGocT zLLy`eQDzm&lw{15gfbQ(l}I6F3L!F7Qb?n*sAv#L<9UBttKV5?Kj%5?ch)+8oIiGJ zxA%JO>$PXn^7Y~w(EffY>Pyw&ye;=nlD9YQ4%dWlJg=!D4-XiWuYtd; z2umV=RmoYb4Lch&sE}U@g}IPR_ppeQv$lmE-T)hqDZT!U`*~gD8rOmM8|tx9xQ(Y{ z^;Y=$H2*2`T-~kO#&A#7$NkhFmG{`nTfk0lC0od8AMY_+!7>&qcgQ#2z6-L4nU&OP z$(KWHHJ#w1fxZu9p$qPo`(fdlwdu zu(|Axhb(Zh!};n!_=t;Z$PCzcOx7R>{xDg8m&}sDAWZ%J__}kFtgw{P(vyksLvdbn zHn?YA_MsHm&v^R>^3ce5$St@{x3rHFX4==C@&fk1WZlXOFIF8-n1Jtvm1+vWu4bYk z-{1(QEakcIKgaKXT~HPAdAk4g&(ACV&kxik$b_xsWXS%{=_W@d|Ci84RqdJm<-5B# zscMgvryW_f5+{n60&GX{-~T+%gwR}k&wuO;u9`JRVI&Z-TppVb*TL)8I@FL4CPXAO z!mlQ#TgaoYv#++o$=4P=C0icrS@i_|dl#RX#^JAF{ZAFoD17ZK=hiX!BG==~c(BZ@FtrGqvf#p;8PuPKBL31B5c2BX^#(_TY6JpnXZ=``%YF^C?Tc_7kf3cQvBFM zPUf0$m3jGE^6pE8&gJemjxEO1(3Emxmg8yGzv$^22ajS?^bCIEUXnx)BaZ;Ibq8HVb{ogafXHMOnfduJ-0+z>K$2Qqf{A|^l2>531{Tmi=d|YQxC~UdOJjxvYF(hn2&TG&2Bj=`S+zo_1 zkIfh}qwwH2eJkNtAETm-;QMN60ur!w8gDnlNn^>UufUhz*wm6A%XfXxhmY>GKS*Y)xFvBOzI9>G{Y~(qxDJOL*oB=% zg^X`I|C9v_cP9;QgwMYzl{*Vx6)6rTm++W-X2O1>Z4PA5!)Iov!LO6Dvo^p2_x9VT zz*(NFJ;+;_ubGCyeLMWb*HL)>&PvAScS3py9pfprRFpBw}RLK1tYkC zx0aLouVUs@z5(pAU)^y#EXF7iu?4>TcFi>tIO0=HAk}9~WW53Pe}Uw>%Zl)gUp60T zyf0+jou&Z$n_Xw1`GR?1QIkAudQFDi4z64)J1hr#eR)((j#<6#D|v9$q8IkCSITZh ziXY;4WzHTrEL`N|a`M_)ISz2>5#cQ>;Ks~x4JVjyPD&(so%p%+&hTQH?d!93|G;LGg83+_uvE?V3__itcwH{gejH|D1lc&-LN$%IO3CF!!?&BWiCB=fje; zKHd{Mm1YN<*i1YpPbIya^n?Wq-%8T@>i3hUGXj=rzIB)U&-MSmZC8|(@%1+U>&LJE z=XQk?TMQk%S#MJ4s{D+n_r?%Qe98MyWaDLhOq1~6RF_Vt8*QKakt@Y; z#;vdlGP~l@<*l$^0Q)Vnxb56eEKZm}K4(^vTOV%}UJRQmWR;Q2EY{7@K^1|v>EU(xy&4LyzR}%3EbZ`Po0Zg9l0yx zENpLKrSbvRc{(qMTouFB&-bwt=4R%`hPy_`XxEI$VMiC zToe^)@fG#6o^Ou%C@itvuV@@D$!8ECFYm0HY=RGXU)=T%?kJUYjDvHt%^lyueu>BC z-bMSADV{H+-tcmPv0V%Nw|DH^GpcYKzI^XnHHAkF>1)-&i3=204#PtuwVJo!1pj#D z5xChpe5e+dkLeYA18a1yuOZj_@I9jYae3?CBZbhsvw!{92~|N!RayCe`#@Fs ze|}$ml1$ioPKHbWdH!R1o_OZ`2{r9+2TXaMC#q@lH?;lOXn+Gbdvz55w*R}~kd5I` z-Ee32`~-ZRz)TShcEmc-SN=!>_OhGeBbz@eHCzE-^OLi{p*UUoeI&RX|&g&o{|?w%!C`0Ql58O(o%Irb1- z^3d6D3;a#eF3BHWSATcTI@tYc;4?qiAhqY_O4xk0$46f{Z}8@2894T3!9gE5J>+Th zB3QZ1`HnZdWz|%Z7+jX(f0(?l&F=vZoVtQ{;vk%;Gx>-aPS(zjA#2G!w)lnizL%&H zMgGnAO_v-kvoM-0|KWK4clgEJ;1Y6^otelxnA;%Rk$h%QvGFDR;jGL8a_|)sws!bU z?GpuZ;8m}XHh8A2nJIZ`1Kai{I4MEo_5pYngV3g%Fk{gwHL|}1@6uwJN!i_pd?I4_ z{RQ~bR$T_V-n*vGCKHa!Ilh(3cR=u(d@{u^xVehzN9WWh#}lw2E4Mk-r`E}~+Guz> zt?wz>YL8A#7+kLK=^c4zRdHV++;#rOO0s#&X+~c-)uQw@rN^M+l*dlM{DY&I;#M%XxI4@92;io2(&cj@xOcU9fUYTf9Czdv;v9E!;6OA+!Q(((JoAVWBty6Uy)L z$5#DpaATy~F!|lYQs0?y%ZBpbe0K1BpEM$OlC3p?=;Tt!f&;Ef~HtfN0kskbg<0i2|Sc-=? zQwQeF(wFUk9W{cSHo+-U7e!lPHGxb9a_TwZ^L6mw*;&0>IH3{_*gGeW!p-J)vX{X9 zzf+niz1=r9a}~mKjozKrh10y^iZ8;?UzmDqh5yd_hMrnU+u-BIC%(`sP(OS;)DpfK zRsZ#m4;nX-H{YKYy@2qU0plUd)$pL8U?QvZ~68n!Hj5A+sx(tJ|PA(2`J=inP*Xg-P+ z-|koi2b@0aN%NWUtAX#;@Z=9oSDG)`!-AJKz{fqK6li|_A^csc1&&t9TTAn~=!zYT z_h5s2pBF^HEkhwQAHX#`N7KkV0u~H+!B)3V#YMv2Z`Wo#g?p{UB%|QxobR9Y!z*l$ z>qf)rx;Irv;Ul-6*c^kIdmM&7!h=ioa%16J%CmlchKFt?KR*t8ty0zd3TN}BElz-? zEXO;i;f{-S13r z18$!vRy+rP<(T8j4JVBnHC%>c-O5_|;GzY0(yqdj9RcqJVU36{C$7QXOc8F2VR7%t zw41QC^Aa8fc=BCYWdmFhnK)+^y!mmmRU5o;sict>U9VM>^Z@Q|>S$dL4}0`n?}QUW z->Yth-$!35?}k_V-(9^8UUEe9^K)2X)q6El*u|kFzYkVwIwWrfpSt8CIRI;WzxieX zGl+U>4#7zyy&HGJG3wVEUcsB@@R{v`eNJEZAAz%T;u!7V!GoBA;4fafs~lj*>;1y- z;L&j<3ujoLA@JZBoO`oskvqILNy+LHTwLNdwI9~uHe;WFBkxHMd%}wy6rPd`vy(yt z;0F&)`@h0{N4Di3hZl4o%KZ&1-^^`033u{{S}|h((Rb9l{49LO+qQ@W_F|N2DT7ZI z35L-AW?Xf(bR)duYN!@BY!ol*)e6s%`x3$f+sa>`(+R&SjZ@%*Uo7a)dIEF!`b*O; zEXXTI=LP(7@!}A&%HYiDKKSo0&8cve#SpCXx@R|qM{Ht0GXkIb$>vSz&8UhyPWz#g zZnD~B_eE(s?_se>{^h*nGrY}T;Wr1$*(raOrOOV?zQ0dVbb><-a5^pLvC-}Q~DM5sxE%E9lrH=spc1$-%HAiTrV%U zY+3Fo+*fNCNajY}?X2YRI)OZX z-Mq{<9{%$w-?q1J}LD7e1LbQbv{-?nOU>-=bOx?g5)o>2_knLWOR^0RZ()L<;^oSjld z`Tb}4)KO;L(e1nXP!AFB4yGPL99iAB8wTNr`vf}3(rOG0ui&R$b*lql(~%^>VL003 zcPe>i>92EdV66@%sl)L7+virjh2533`pGGK?iZ6|f+Xt#;UZ0c26D-j&7nu&eKBQ{ zBk(t;oE1TEmu_z~-7m*}b}2cvC1!L0u1UJ29Sn1Gj=55PgDyU-B+ES+QkJC@vo=WbXWd=!>h$tc`L;p0JTBH$jDZ;zT`y~*N_ zWC^oY`8zPzygO-;@ENY=fJS)5Xs%5ZY;O4YR|72lVApv)_QnVmcUPP_WDB{ zb#NwwFwZe~8+$(YEja3M!vXT=N?oBEm~HW^Qt}A%cf~6Bgj?%#vUA7I=jCu;jZ8S1 zWmA!P8N6&)vj}-bv&-)raEAS3ix@cfq`E(a_v#i$()~jRRRigI(^u+Al-~$>3;zmu z{^y=zDi6=oyi~Ga@bi0A-j4L37K*R^G$ftsXL;_XCQ7fwT=_QDUxSS1gX^%^*8{^; zzuWF=h+l)b4`*&BPpwI~T?AJrct4`{$zwm7SxDw=FCsT?(5NneZ$I3(k?d45*hT&} zKi!+!w@9a>nSAz*q6PJjs@6T7R6ommY}u&)&HU{2trm{W2^B+| zeq*~XFSTFSRqJeW)>xRuU3gkuqk=pjyNUGyJYS3X7Wwsrr5g^| zx*(3y-`KLqn)=^#?E6PFUijyi@>2hdS}MPa{QBI$g%@zrqc$8)mY5a zsLgZVP0S#dzR)(IKC=I6xFy|BR7gjL`Ve!+6DtKcZ$RNH`Ag=Y3g!R7mzY56b8n;$ z-KX-Mm9N*PKKavVU+*&5I3v2AoNByc8P!jk1M5QS!)1cAt}ll5gFpF_Mb11bmVnP| zo8*%>oPM}P3|66CF> z(%SE{T#SjlxU}apC zY%j$F_f>aXqVaH=$$gr9bhT6ujhE859~${!PYFE%vg^aF`*Yw6zZ0TqyeYURPtJvH zOb+$Zc>L#hosBWfxx`>rGvZ{#WwTKq?@i!YSP6ezwC{c_?Ef|;xe%VT57jshH+-)A znh)4 zEn7HSZWw4xNrnk z@7dr<`MGZSrJiiUYn@N|eHXv_6`5=QPd_TpS%nZWvc*HQ)wAK>s&9g+AGvH+tR!>3 z92=zi_-B359<#IirKbz>sI9~A>y0=9;ilgX!t=eoACnnZU+f~UwQq~?f&16py-nW8 zF}T_n?qZ$s-~h~4`?8a~UrcG(3r-8%Z{i29Fn+ny1O8p_pFw7vks!AZ9`P|LAt$80 zJnaTwx@UNj+#WP}+ZmSKW3q&tKYDMwBmDFIy>?1}yg@+E0S>j4-9%2!;n$#W4Od?i z%3u3PjFS`mp4Im(<^P}M<3pK0PJSPyHTAScfyREsVJ{m{p*8ix!o=<56)S|w@58z7 zqPNL$+Y^LojUC!4a?}G3QPH+0-$^-U?g^iGxv81r+b+1GcdKDNyE!G4K39vF6YU{Bh$W6teza5ey`ViArhVZr@gAlBL-~giIY;Qo ztSWf7wj?i^cgpqE4R~+1GQRQ;&ko|VlgnUM;}sp0pOJm{j?#QJ%UbRv`JegaM;W%d zeox6pIfcxHMt34kk^1nvb8y`v8(V9*)Bfj+T=>)5ISXuHL2sYd^Y9bU>OADClyvgL#xV-;;%0{eO_#ws>r%>lw@s@3)7Y zcOQ8`_s?3hz>}=$7cQ9rFZ!*qmOS&0W$zjIut8G}U0)n~PlDVmKI0+X@4l_W#nbS` zO=7PoKfzw6ap~}W@se3&ow=en$lHEft)%=Pz4UPgU0?2TE}F{ARk0zr;s9JVqEbD%xM7Jk-)$KcoPLdVHn zM#WswaMmyTg|wy$OiItE>+9bweM=4%ySP3AE@I0nqcyq1pg8|1oZDJ$ltUYf5pSzLV?P=Vcz&cf7&y> z#1HE_z>FntZ;&^QZtZl0w=B~Qr9DjermSMxcOBz#mY_XO;Q0mNv=3Y}>Q+X3AiimD zd^I*c<1Na=cM*Ol)jdW|jJXs?o>7!jK>NHk*5Y;)e|d+G&|Ww>JN*^y$sD&g$CE$a zdXY!>+uNF4MtkJ}A9<_FCbGMp*duaS1K;s1ID%t?Ank4Q&$zXog*k)Y z*pRQ5wV$Ou*XPzV+i5S{Ay#cj_SoQdf!sZCl$rKSoas|ew0Ax<86BDm_xZDaqqFvz zGA<+9V}-6sJ{JgUj0|k1J=qDZh0Bh>QkfAK$lVE5*5u>A%p=JgFP>Tz1P5)Lew_vf z&&v3723#?f^NG?ge9<5fg7AX$1v%uqb8ecDFE<5$O@aN)zCI<-nR#<%GJHQnry>;Y zUAg0U63o42>s5L-@zc@OlbowR?n&ongZZLz8`AGQl29B^q*m>^{xW4(dVWM?Cu>Nq$uY+gLwzx&Z8@dWsLXn+RgPkDpcCGxt8A!RDx z-j$69=^euGWhF22^Uu|r=p6%hh*%9-?A*{nGK2W80IJ{Z)nPkm7SQK7e8Cmxg1@su zqvn)*CT!MNv4q0sM;>N92V40}DJH?2nI7<6f@h>3k)d}S&%^Fp7r?_CJm-)t*ESrv z40jzGS0l6S@Ja53h2C-w()EwbFXOOy#}hZ+MTM z33v_oL{k0ipDE=w3uZjFHKi@h zxsv`Yc`kgs)z_HpceX2j9{kBxyN=r5Z`1zsLh#zT@`B`PCq83gINWWAKJ}Ntb0M0d zaK$`(&uDl~SAVwazDO6>JG|`>fcx0OS&HVPzpL5OdhXRUf7P)U-=_GCI@g!c ze8;r~I;ZJXuM$_%vH) z1FX?_L742O@^KrLf0KCN8=8NQaQmrKeRae~RFHK8zJ1hyM+Gt}$tj8z46ESGk=Qu$ zE5{r6Rp6T6zx2p+Go>OFVQ-b=%g7dy!tu*t2EA85X}-VB{K-ZZ9%7knAU}IHFL5c{ zuiRKkmM#orlY)nZ=ed#1bNn2seeJ*6%9Hm`7kg8GShigK9jz}1^_06r;3a)FSIJdc zW`)$h(zX~xkl&mtxGo6aQ#z$WZr&RaO8s@?_pu3DuM7${aZ&$Ha6Ed8Jo#(v9gPPb zOSK&GnSd<=^h_;hRpw)I+QixiG`?CzSW3tlMa^wA9_v1r{fV!v@T!^_o^5qDlESOb z=Rc(JyUV2E7+JDao{gRnp6jaACU^1Nnwo|meNTEv>uLDw)9f@K6s-vnBRjjrZ~6i+ zYp$G0j%}TI@fqIZ6H!a+@o2_EZ<iIX9V?LVHih)-)dlnJS5pKXuQ)DTwDe(G@hOy6?6 zv1}?Yw^R7%vljaGqKEPK2-7vju>~ss6U$hpQ|ue8+o#f@hpRMP!;Be`+8JGy5-qrJ zy68M7e6O$lgDlL{6sp4q^Dh<{UkqR7cy>$>mfQSQRs=R2*?mG3_VfOr%LiwR=x&yT zv(<0bvBOJ>US`R{s#i6{zazKhZ^L*g_tD#vxQF1sr4jT=ZySV91YNgPLAdt*J5gk5 zZ-==G@Du4p_GHDj9jnA(OU{AU1Ms1E*He_gSsy$D$(zgYN*gxXJeWzIE550g18(>s zmqzY<6>@_OPB1reA}g&I@n?af2NIabAFTLC-=TiwzPU^E!;-(x7!1P;@0zoa4-}r* z*$a1zD)W(*6f%B4fjtaLUQlZU_|LF;1pjTFuBi;I4*1MaPBDd>a$nJY09$hwjFX>O z?>OBKuT)v$M(NE@Jj`?#c9ALiK=tFTseS-g?M;ViZ2NWZw5% zaKdn7{h7b`w=!O=8U-xKdDUTnt}^wKiPE^cA3MU`VCgy_q*i^oLd!B zLw3&IG7fWniVSuDw$*W7O*FJ}l_e;(dp zDLFU|b3B#5lmp+Hr|wN&GHMl<05gzZuEtjlDl3;30d< zKR%w;$w}c~RQFDdBiv+Je?buJzGGrH*{!hqz7H&^=N0$~-oE#MhdZ38c+Q3DGit$5 zzcYN9{nP6Yuq3y;-5z*pV8mK7)9#anyI@mi4_9gr_MJIBJK?I6g{EWhx`;;#=J3(= zYWmcES^ienbl_833U7zuMUjK*8(`-m&sg$Rm2F2>!Ckhua>$eGWi#dA-bk)I@=wWk z72-6eTHI$sW;t5^gyR35CAoZ0z7xRwbFbAUTLt;& zepss^1m`5*i&BLd+lKeghxIgOZKeA4=8`-k2phC~xvCEL^ISF{m%A~UQG0kz)^N>( z*UhpzK-QQim_p`o)G;6jxgR=4>76<_)V>ZDyls>(44<74{iF?F3D}*u5Vn}}Ja`R! zqn#sm2|Oc7kcXV4X{#U&&n)R4S`G6`1a4glzpf7!q42itayH9g2D!#w3hzr7nv{X} zp1tsbykMG-nda+RJYR2<-4bK9$%)e3+T;th1;^xIkDBzSRKENertd4@w@1uxt%TJY zo-nAvYLg-gR6q061~+NI?oAv$ig3fPx5XRa<9lQlD!>mqEVXI<=x1W%CI?9v7L$XU zZr@!FJ86sY>%$4`^`Y``)#BoXh7`VJ#TdEbSYaqxODU_E;%{L*re*{)2aHE6!QIZ0 z=Z)crNj-bY@0YFC`a58Lc8!uvuxhH@NelSaqL52lU?#t3VV3Y%&4-0s;lmxvGOS>O z?N<(NgP$*E>?Hqe65VDBpJTKT-w794Oq`?f$fhH?n*2SV@0Ato?W$u=_H{Me?*h+p z)NCR5&gi=t2(L0o@vw$l)Kr?nVZHpsd@`Gf>MNShq(6lz+rTF4C#16As7GoW$my5Q z+$n{5wWFuWT0a|J()@l%P%qaO{^xrAU*7*Ks;I0|R#g38{A<-a8QpHw>GT)#pPK)tRd(yq6(K>zn$?4E-%q9P=u=^H3f&^ee7aF%i#^C zt?eW5Pf=zU8CayPjQJh>w^j~|PG1{^ch{FmPMZ{=_+9UWG5N*7j*sM_p1JK+a4GxFKV~Y4=cn+&$OiWp z2rmtcIA0DAm+ok0#a(mX)isiNPj~&A2}_IU_>n)PFAtgp&%3`SiM;C|=R$t?oQJ1G z1)OTfw_ycbFU>oP!dJ*|<5Y*|*E&DC4qJ-NGtz+XOKJKlyUt^|~_q$m!~g*}__mAkOUzTX05UZZzM$X^E}2ejd-z!I}4 zIOk~s2Zg({Un`7+&HLw6tb>IMLyO4Cjg$AubBo2>$f<#v9ps`1rt0Jw11q;|goF3F z1V_M@Dzh#bz;@k?Yw3Q1s!<)}lpc{<%HN%?yv^HSWzJ*UkHh+P!WQHQ?~DXbz_+rl z#gU&m*&aOwx9OjDBuBZmD5k<4AzN>d&mUf!Ox9b>x!({DZ+WsU4L;(#G1&;#(*GGk zUYpl`c{{A6f4qx)dmdY$3G8Uybdb#IoEBjU>#sDkA=k(+yiLxS$?ryv(BOPcUa$Gs zkM5@*zMuXo6{QZ zOT7D#TqMm~VF8OAl49|I%XZrc?||{cx4h(~F9i1*!&~rc-6{Tz@tfa_;PrOQm-oR= z=f$+htL1{`l229|=o`X|?%nPtvx}`B(SutDeH*>%Kyd+$KAHuo5Q<>Q$ib%G%72riRMAY#?hCK&-k%JQ zd}|w@3wP<3TPDFD*Rp+I2v=3k7^Cvv4(Q(`2b;;glOd1(hz<9L6+BL+Q~hNX2lb`G z9`7XXP<_w5^t&$;e$<{NKyE#q7n%#3h@QMb?Q{O5kj;5m=9gp$`H7&W*ai3k$MACU zqFo_t%i#l>vM0h}H8#DiWYJ|}(PYk~z8>nc<3_q$AMKgazxvpCw+I${^kO;yZj#~VDugdt>{2E7cEuZ? zfqNtxS^VL=l|3BCVaIK8M!v8)^OYw7@a2iQygqO|L$8V-oKtY{2aT7Yf_)kL;q~H` zZR8v0+mbiJ{s-^gq4-9(HBU>xi~X9)choZRb>HeN& zqDs`BZ`}86I|Mr}tu6Ts7x3J2qw=hOlTrEsPQ0|IlFA!y6y-_%AtFq65!FZ6dojB) zSodh@3UWxYk?tG#UNBb$dEOM?d+J{rv!^S`Z#Zga55OEV(tF7*IqiP^aAbn@LvpF4 zv`HU4XIiG596O{p`Vu~Ncl{LI-*#1HGkHY&=AZg!(0$fKeiLCXMd1sqYfh18^33L? z{J%-CzeVZwy=vY@_4A2i(ac^7AKkct=0~BZiEl4pg@YHD(ERv%$6(-N_=$h>~MjNwD-o$$#-amyAs=w^_gCCtkDv7h{C1z&;%{DJXf0j1y1&Qf6xs~r7( zf$GDt;A_lc-pt3VhC=D`7*R^gKA1W6s1P*ka{g&*kv5T%p}UFc|bX5KZ{=WbJZZxOUqH zMKV_*qYO8^bH%EC6#sOrS2`E0VzRn*CEQlDGm{fOv1KYy6&9+^)g^c5EW4uuJ48il zlilRD#45rU0&nw?ulij%w*vn0q_A=}?5fyXKwj6La+>_@z^I};Z2sbw2>D>vRHQK6 zykhSfcG$eg_3{FE=jx@Qw12)T{3x9K@XD%PWQm1!UJ7vX#8T4%?8k2} zfcE#Jf*w}X{(nyg|J?uoxAVV}qUuWJ|Mlnp?f&QY|Ko^}jAP9Fli?QvaEv)q{{06X zn=CU+m4jgS?WP)Z%(-#Kuq_N`)@ik%W0NX#vU4=ty7BJXN!VFX@MRM0m%Y#GD}3nK z!jD<7Oz@>e-{AMZ-k!SwACQt-`2${ImZEnXPV>lI_6siDv`w6jwI45=FJi#qw^L33 z!9)0B;_w&~JnHDu*A4qFZH%1(AD%iO-w#U%Us%Wq&q%kfAA)&2hXc7`W_`A(5m>cB zQkEAsGoLJf2b&$e&cp{_&0YJHeBMcN7J1Sup7kS~BQ|lD?0JE!nKaWtla!2lCVmslXwdJ;@LOLC2;h| zj`B3Pv+B3A6zmY?z;qgJ@H<&deq&{%mjy4pUhOIkZ?v%8l?V6hhyEa+^*Isw5Y97n z^IQrSln8BP^2fI%o!~ww1NZDU;n)EmYfQZ(2Rr;K<=F#^#ee!tR=f~<=`hSDT(wpn z&XRc$84Z`eake50R?YZz0zQ-GTTgCWy*TM4{H7(|b2;3nS>r|F z$2&M5t$<(OkaM8xrytwySAvH#_oN?(bC;Y;CEq=rX%q`L)-k7$-D=yd>HZ5_*Rd$W z>J~@Rj>37DmbsA4yIHM6VLwy3i)2p`qXNo*^zD|bIdN^J==828ag3H?(j1A z@oGx{g}H2`1FUdIB8R+z>pH6~{CpN;E%{ZnQLq)fQpxl-`Lp7=Q`&HDWZWkzPp9AK z7i-`zu>nuXul!ckiNouTHq}%4hX(cbiovgUCtM|4eV#TTKfK^^jXZn*dx>7O*AJa} zO;n#hlhRnJeMg%<#K^+?=f*ju!Z$lK)X1*}bQDg)rz|e+rS?2^fnPHSUe8|7PW`82 zc<~WGSa7+~6!ouXr}?`*;ZTj>wGwdB#b@=@UyIkw3loExRD)Zs;U~^^F`{snRI__GU9T$c*{BGoq^5kN@gaLCW{xZ@*8E!i&v=Pi=^zS+ zubGu4jPMhie8j$EyebP<2#^^Iy3$8srMXIM6klq1%b@}IQSYxbx}VH>_X(PBwqI%1 zqw+udIKAW!{CUNGhDETC&bP2@Ft5D8LaIM$IX9I&Sdt-MgT|ZOvYHPk;qsvj85&>R zNn<0iaA$`_=%4YnYR)-->JgaA@me!)36ChhDZXTo==uLVn%$_^>z3 z(&gAsP8K!rae<9<@0if|`?`j2ogM6{o@hklX^*9CoDDp%Gx<36m+9)%t2^PO@rM=E zAEk@K?9AY&Kf#xvQWH=L^nXU<}{qyzXoOJ1M1wTfyVaT9=Js|H}uikPXj;)sclPAJ>qdF_%6d zvk8xVw1sQmKk(QAkEh@>=I|Zux<)g&`rJiFdkU|USZoOwaO!U-kG)7q+X>Gv>ztm3y>-vigZG~7g9nf_*zBb+w=#fGf-{-GtgN_V=3?zebn6OSv* zyzX?{ZaAai<_|ZREmqOj2~L```q5r^rqYV5)E+%8$1A*G$6d3@A>!vlO!0Fj8 zU&$pbX$onu)TgVZhvBDt?IOs@SF(==!n67p<&r;itz!y;O$A0KDLvCC4nv`^%~Rvo z39!Hkx0%Oa&X3E3$QkOt9>l_D4zKV?gg+bkdd0zAqx;?IvG7|Ff#WCO$G2tjD81Gy z8LN0$c=uB`dW?KV{hMk69D3K@=O&z)KhB;6AN|H1@fZ%(xRH|rGuMUkJ%i^;M!X>} zs$L-Y0`}!e93wBB>b0Zsccpq?Ia!TSK=mzLYU`p-e&eXFFa{Sq?w24pH?KWN>$5^3 z`v$V}uXTKk81H9XVkJ`Ht)IF)xZ%v~jz)6*qQD{{`12y^adJ=irOVoI*LS;zX)r%u z0na+PczgT^*)a5G-DbG#jvi||T+tp-P4ib!&K^~A;;UJ+X@1)iZp(WbF1&nVt{J?# zO|gyaJjlGn64rU1`tA(8+mcn<2EG%Q-je~Ri=G&z^?qvn#k_N{%BAfcK5*18rWqGt zOC8O^2zX=v09OG#k(BWK96b5BW%3%VHumZ21z0nyi}yNg+s*fpJT~L5IC-3(A-o#? zo<4p5CLADgX{a9Vd%32&1~wX2FKdQZ^XT~0!uH{Y-S^%=qx)R`3#hbkn8J=CFvjs&^iIhb4q6c*vGzQJkmX!2CtiG(RQO0i{ELBh{F}}wW;K#U;6{Z;2nw6+sFded80))b;DmsJ09?X2%@GHJbi{@}U$JXn2={VCd?E!cVVAo*;l^szrKwlJR$ zU%PQii}q)W2fm!3``>(O(zyhdF&*ch3&%thDJ_O|m3FM*hl66o^JsroFD>wk2d>DP z&Z7Ov@r`#Z$f<(sY{cQ-D&>4~?KdS~Q8-F-?juUyYuyEPLHLr>nQ5~9a~0mX@Br8I zVRG;Lv!epA{`9g%RDSuHI~LISXSZ``^K7`g_xl+-Pr0%`y)l9DE2u7-Hw(7%{kf+T z?(}%KjtTbq-1Vgaeli?aP3JjX?&@!~Fw?O8yPxpsTK}9Ya1{H4%XA)`j(Od4p5pH` zGn|HhJL_rCd7wQ_hVKjfb2`vF2wwKebR(TV{o}uEq5b&Je(%Hdns3Zda@d(H7W<1{ z1J1l3;Aad6e7DG;*M=bj63e_!J$)X#w>-1rBv4iSl&aS;9tKfG(4)M}!M*(Bs z=%ujuvc8jV;XQGj2Y4x5HS+x%xFIgSZy59Aj4KNp$vYUb-_d-@n_+y5yv=O4L^~W- zqrZ%qUqrTLaA>7f^;U&nh!qX}+c{hCDgKQ;Q?^ESLTefL*#qE^L?I#_`%ev~}@ zUV*&^=GyD;MQ#xZW3Qz6xeqER{n7(AwWV<3Y|jC@e|l!D-c@*{*vo@#y|Bvc3hZDR zwUhiZxn?98R*X^QAzwN={_z;R7UzEkot;MXD)!@`yl51qalZ38y{fI~UA>FeBu1{! zSIC81of<>oV7VXL$o3`M9qG*a^;cFYz3P3~_Th>b?54-UPOkpI^VI=1f4Xto0Ia-I zcqyGBTzS+*>D6(@z*jF*__gPd+Y4CztNSiv*knoRSGY*RE`Ymvh;Ak(KsTn9`Z!`j~q4 z16WAD{k1%-wvF#%3oKFE(oAOxCYhq{X4v$imMI^sD(dK83p1&uC%?xYMDF7)+Y(r` zk=vS{LA*0b2AF{#?_75>z^0Ex7Tn!AwT`q9WD$nS#767`_g1a7wdU&Y2xLAeQ<$N z(~dc?ky@quet2%oqzmnf+Px}gdB885bQiM2<7pOgWaf?O3s_<1_lC~2&IZ}PD*KH* zK5~9obpT%VDr70`yEf!=eDZ|{Tx{vl9F?-k<=-gK&vXP1W{PD5t_u=MyEBmNE zMEA-ZqvuTR8~wehzN8utpJG7$N!omUM)m*C_M3+`ecc-GK884NdL|0#o~}KEmEYjJ z%F{di;7GfZ`aj?d)48|Ets|V_WR~8GJe22*HP?bC;q=m;^;D+xH^+8=ge&Xn6zHsQ zrLg-urGHoG=T54F>+Km5WPU}RR%!#*mgYkvFx!OOC8}cskty9FSYlI`bTEAD`1tqd zFsrUR2f4mcg`eiOE$!j*6yNOm(eDpnW$P?iY7@K4OVKpfeXUAKrSwY;Pk*GnQhQF+wVl7#7gOf#o#sl0sY z`!00Da;%IER3DeE#>RSJ*L#=uk?;Lv+5Qrq7>b!kUZE4fI|vuAoAsLN_n-AGjyCua z8GNS*ai%0Qepw;TafO?kY5v?UTEMjv&hOcJn)c5rl&KEbW^m9DRjaX80}^=8)=eOU?@Ghll%3s#pN8KCeBWsd3`@YLEM4hk>M z_1!|=s_)T8j=cEj84K*15VefKIeGqE{zsQ!x8dNWWIGR5h6`|K;OG;&|5lER zY}s)6@T^$M-`o7^;lq@@00ax$!j3w{+U7|#5 z@H~r@8uEN$t&_Fn$ec;?s@f<22YYuOjb+#Wjh~1RNtBXgO3`4simbtxK-g+WXkY zvBzWY<2=uO@{q;O<_9Uk59Gh-7r~$Ixa+FGtKRH)Er5UV+8rcsynQy5?$OVWug@Z% zJn7s_W%5(IaWDCB%Dhy{!!uFtATpnSga+lY;NoXNa>BaDGbnt;t+;k&3jcMOxez{Y z!_Q9V|7(8akVpQV%GFV57rskpMo}E2=;lCrZmQAIb&~8k%svqffB3+WLN1M$P>z9L ze-O^X@{P-PbjdHgz2B1OaX9_<(w@cYrSMOwi@p>-^R1m(IjqyPy^tK{ zIl)>5TkMjWqY96w2;98^H;in^Ausiu$59P8c9eCJHMC=u$Qe49`p6S^;?&8N`{X{7 z1;0fG(>(QD*4jcfxP0q^HRLso9}U%E@6)HQQu?=-We<=|}dJy_ac@&?)7@_Dj89INM^M*fkZ{e|3<+h3SUo-5o=>%P#e=o`uK zw64un2Jlh872D!quIb~O={calz_+ib;0A5&G;(R!;KHLY_xB^>w2pLqp!6^l*5=-P zo5B-wPxl>y_4gi5Q^&{>{FiT&%ib!slV=Eg=B0J!z}#*bIzFR&*=Nd6YUj!u zhvAf1n@GyHY&yG3B z$`4!3xm`f<4_^!BB~QNFn@Z=4dVZjk;wuLy)D6MX!W`|C-WgHeF}hw$y_qd^KI0#+ zM9B@jr{~c1{53xdk;g5Dp>Hps9AYIBq8SiJYud!zL^$V(aTIw|QM?GXgZ}Y|N96Cy zoH^7kpPTj9lI3&O9i{c$f{Gity6WM9>h zT~031qxkV@-)7E)lj3*9H^WDtozf;>;K@_F3y+DWOOrRYEVHYJMf@^)>G;Aly^^ct_3>Z_1d zaP6s#HhPWs3`?q>AiQ2HneF#$yf^!ga>5&JdREbz-oY|PliF#e4GW>yHvQN<(YB0k1W^@OQMq-+$e#k3Nth zh2N)Yd*;siAF;1x%3bG#b5oqM>FAr1A<~&hb-VK6)rxS*6QPh~SXEupQW^ep*5vgI zRaIc^GUjU(KGf?_Prf8ue=r4J?D%xLD!H;aNfYVYd#1cFfmcQ5dFa4SZ%3*&!L^}G zQzqC3lI2DF2hAkIJUz}9$5Vj zUpR66h9}H*z{)!maLk)88-5_-k$>}J#3Al{6zS^RI7vc^B8&< z!RI~B-D-xvl&-(J9_Hn?e$xVv&)>h2{HON9YUbTAgwHg_rq?3;OvmGHJvgoXb(jI6TUzxjd5)&Kp4Nhj8a8E`Vh|GhiinD^$w z#~1h}YP0(T+j>`PMa*KUo=U<}XpFzkIr)Fpot)8~m+>WX4@!PWLm#83(kMv zul=0>eAsw{DJOhop__mpoO??%k<9wjQI)*Q;L`m$FrVgyULknV>|phI@G5sP3t{+M z%u^qJxc9`$r{o!?k+uurjP(1*#o^MMI-%suT@n@K3>J+MVVJY-3jcC=CiAr^NjT!i zkF|2}{Lz~_E8w};#w_Jw;gk$hB{=xW(p{>sPtT4E+Hm%Vndh|OFZ;JGTL(|@DB9}6 z%t1`jMsRG@y-GcJuf?G%WB4Rv=Eik!jk9wenQ=0`+5qO%(h}SRH$FSZy&mSfDtH;& zr)%xB|9;;ZmO0;SvkbNWZhGMZCwM{N4jUKvPb<()+M(?VA6T^b1BH7iUv4E!DqQd; zi%ZBkQ|qyL7c%Jx|7lI(2d{*YbL^uUD7|<0-}5=Zd#nyRQv7>P6${8LU%O@8;LOEA zy7sWF(XlyBa9QA`Cw6eAv&FD2d>`*rB&T%h64`M<*9S8blpsXdQc2tPUq7tT9f zs0Duxv0fYmM}5nkPhK5$mTND3V8;6lP1r>?k;f0NQ)P`H?=dOWc82|=7G|i!ogDFF zHn5d(SiTxOxLTaU3f4HcAc*>tf0b>m1#FbqGNBBAN-!HFXC%DqCSMo6wUgrSYdCXM z3C>bER!iykb}=Q(z-iKRvvDnpUzyt?uKEFjA&QQ93m;uf>B%#Iuj~H=v)7|5*_lJMFohd6z%PIWZ-~YGzU-$o? zrpN>p2-p*8OdH5y&*aJGlaH$@A%zXOYF*ES#TP7i;6C(2MQ+ z_UZhu=0lx0JICiU-K%BrkS=kL9mTdc7L_D>*Ej}}=SnMg$-|snEpjDrYFNWOviVL9 z?Nay+-?>HP`3BoN%gKwL3zL@{hR(VUM<1BuB?Et((dt?WPsA+#&JQ!pl3j8Wp6l5? zHZG0*0=8%IG{CQ(#4>(@#ePVu+<_J9V}|k0^`l2dJ79J3LWKkHx2a`cAHX76oU`}9%OciBK7u2>TEBY1PFrHq z9>X3ByU@M)0>%U^W-!t6E8@b#+GN657mHD}`Bx8wf2ENC@j zMYm4)(ed?S^EhC(hkf#1@B%AOlbLXF?rT9O*lkO+04H4Y-Q$=oywGI>Bl+Fi&#E?X zoaB>gia&EWQqB^NJiSAioU9z!ZVoe=Xdb2Xy^ni&Zh~(w9(&9Vi|#X=yAl54`fwGQ zdD)y1LwJ0KbUYi(us8JRTKLr$)&}xMyO3}Cu$|=eZgNQ0_CZ}Zzms__9lt$%po+{s z>bs7-v*OncE%>MZuoF4xp>Lx)oKSXQjE>jN|1qTsA0K)UNj^NOd`ktM84#sOUKp8^ zPZo?TS0PJHS30f;FIhY-X$I`INugXG)>V<2PG&mrT37~t;y33cE1X<#lYa#)^2S-> zx95#ZE`v9^&z?y>(fGku9M;)tv4osf*UT&ef4;D+h5XubjgBxJXW;pkyhbW0R0#G} z@|C3X$@S@1E`rakH!&vPbvjc+uFKkPNWQp=x0wfCrYPh_*MDr1jpxNm)W069EEha{ z>UC8Q+$8U-G#hrjB_2w)F>Bd42d;K@?I?Ol&KlUW;W@nEx#~1AcKg4_2N9G8O6 zt63h2gHJ!t>01uZmt*UXhHIn6q*uZZna@jy!_nGK+gHKqiKcDAaB}6Pcxm`@RLyK( zICfvWm@Mq|N&JxyytVB0a`I6PKkr>Id!J1ZIrQ>DmbLJYc1LL?xK>4uQxcY|GvZZ) zy`QM}alvKESMxRC4wXrBcDTiPWVt5X)tXnV!$K`S{)}+XaJ!@q#qUaDCEHeU`;ueM`*1SAUlX~$k|$XD zWPjnVv~qihyDn_?Zd2o~(;ABZdXn`A!YiVN-Spt4e0>v?etvC$ z_Bz-4<|82WOfxyyuyJj~(pc z)mpRx-c+5C-~=0|^^ZZd(_v$DE6!}B5za+t#-bsh39aHx+!l|4Mz zdv1vA7-o{<1#jGX{eT;M(N})OUO3JyDsmglw_9g@AZ#Q*@Rqz!DDCZ0xPP!c+5;}L zKK1G%ym?=#zbBj^(#(DBbaE19XFS4gu(hvj2k3X{vr%%15jBvHa z>utZ|8{5oefjQFzS;$xAUbxSKk5;~_-wO}cC*{qDFBC@{_lH04T0Kn=UYT)Y3HjVK zlZ3@^*q*_1KUmJwyDd8s(6Ch`VXmAs>{mD_>mXWX3-~WddM*+!k)TkUv7sj@5EYPg?Zy2mAS(LZfYjw@OH`D z+0;H07km_}hM#u5X{Ppk_2HrRTX5O%yKz@|RgT0C{21ZN%N1$q)WBb ze>^Jv86Lp4tsa}nj{;Ut{DNf)+Z@qoxUfFQeJ4tpa*tPGHS02oKhTVNG{Eb2QeLl>yO?S>rxUbyv?G-p-a9%vk z2c&ylh6`YoSl*L#zkDZc;7|@1JQ1DC3P*Ub{;Y?e%;?jb4l5VFxT%8qZU4vca+;rg z3^4DsgWt3bG}3%-o7-YOdsweO0Qvawb2Ew za0^%I>wdUudY8^5eD$pHBbtxqIh4+tj@kaF$?o?wU;Q)tFJ19gfqYd$_7jD3s{|`| z!?}yBE;GR&p1pT`0vEJK%Qhjs%X@e#X#Q+Id17xP9RKy+~`VnEb;GYhVK_1 zDI?$5rV`%-H%RZo_s zCHT*3>96ade_H>`D$2?z|J$Gcm;0CX|1^ePh8djr=l{u{D?(vLoD5I7|F%H&dw1XQ zQ!KV-6bRrAKdYd%F5|qjL?D(JAC;m-g8sTdorc2Mh!??vcD(SeKmFga7sVV=A#*)n z3xm7heXKT{PHZ4DWi<_f`&WIl%FN9J3=LKps~8kW;b|7PzLQpa2&o zUx{7|3-?{oSq)E}KJ-EZUKnk!r3h!eE#y*!n^F#XE5UP8Y);CboqyzEQZJ{EI>AFdeVN@$9G;tgiXUl+LF)xA>qotX%ndbR~Q($B{t~-qB}yQ3bZ= z%003U4%HDGP=!;bI^U2hEyQl9!%^2(>@|R&it}pf!@UzhIUC_6yF&`d{gXRBkcCa2 z8f=0`tOKu^!B=$}c5H@Sg;qvbzyqfxdAGpo;s@kxVCGM1Q)J0Cakh@I?%BRtE7(o^ zNSF)k%BgjM!rOcn%e%uzea+^Z!`{#Qu!k!KqvfqL$RzVwZjz+x-;<6w#F@G3=J&uK_6u3n3;9u{&~ z-!L6E_hwvs4=&{|YvhF29NfC03l_19X`2nN^YCwa3U8{o&_mZ#>yst^64t4RkB@ z7g}|&o`k!El#`e+ijCNIPsG3v*A8kk!#Y_uX|ZsRW?L~?f35wrGq6n9%FWZ^`7TqI zXW?}p1Xi=a3r=la9#8SN%-q8cx7l?IU4SoaY7*jr#Wf5J(%|PVUzldW^U}DjufP-9 zuSMp-633RX6~H{}cc<{d_XajNy4fx8 zpHW?B!|jeXSX@I|k;29DI_7o2kJ`JK$PqQ7Vx92%$a~m z;OuYK&ndj^>MKj~v}T1bu?f2PW+q(}XsD2giE_^W; z#_jFG$(>;vI2n?p|8}dqJlf+SV~B6i8s1xzjlWNS=$EYI!0hS9;%H0!{nxjO(5-SS ze&?5OFW#E(Q6QVlsE#+hLWZ_4P%{{eY zWA^ARq}rZ$jGPGxYAYadnjkX;|GNR@@T__DiK z!?sp2XUKwqC7%>wmFYRL%2-ESA#nSoeaHM&Y3OWDG=11gLpUR(;)8s!(Xu|D>Z?MV1 zJWXE|$YE|y7b$-ZKaa6$!Ci*}u8>~{Z{Q?9q=u%gxB&Fo9V!T zM~Vu`3y-%v(uG;4g%>Kp*6tZiYv5)3&dgSWO*hQ_?Sk%!CsZGOgN=<8{&Mj>ajMUk z@&?=WU@h@=S^DsUwXH>DslCsh8N!;ArZe^7%~kRX*TdV`BWIHZQWp$tg14x#JT!n8 zemt_#40Z{T7g-M)D&Q zo57t?k{M(sR>x>_*sr`di9F-Q{W|i>Da#TkSjKPX{Vi~y@PV96_)o8K9-I=&f_H5; z47WhIXibX`^{%+;O{^3@`Mqu>g$MiX%BS@H^gjO<7j-&++B^5$%LuP|Q~8>%x58>{ zS2}!}J!FLPV{9U}G#Snx<7EAvpW4KhczB=H-Dzawb8nZOf#)^J36RSz2OFZ{f)_o@9!$|%frkm>r z-|s0gqVi^}Y8vr{52e57q56;uTel%{r=#%8D0txb=Y8aDoVH9c zu*1?LS=63N(~6ua|HZmHeyoEvp1ePJ4mM)h9K9AkAs(Pj7Ge!mqW1XH@LbwiIKi^+ z*YEb7P||xEj$YH>LH*;F`eA2E|EpK|P3k|w<0@Jw;A^k5YN>xcNnc`i3_i=Wq?G!f zdA_jkQTWpg)+*|+hiyOgQu$^z_ukilO<3QX9D?gqHx5&O*FW<}fXdtPfzE3h9}4gB zst3cNFBBip_@V6bMUcwJPiJc?jW5hPO$KDM>a)wq=a((|5(wMW4t$~U>+7OlgXD{H z3Snff*2oPM-}tRSERDCNiRE2EaA965gA5$%UmQ&Jd%u$}g~so1))sD5UqYQp59w~O z&sbZ18{EsIcaQwn@t+s>1a61(?9?aTb^0EqJVnQEk8y*Kx~O)O<*(RQZ-=!McIQ(W z)XDMOCU+ii8lo~`y3I`3{<8cw~ilnLHOX+GmKQ`@|_;jo#BwoSsSQMR(5|1 zr9L@xAjXR7tSx+_KlSyktLe;JeCN1c}>m(G3nJH3*G(9?8%!P6=mDSZ0!t7cT^IU-^EEa3<4 zDb19hLmixXWP@s>ILa?WaOPWE_|h7k7AlXwme)V6|COW_6_gbJ-M6#3%Kh2@A63FI zM`~L>O$EE9cI!%DDzKXS%qUGA+uw^_Sq9t0obMvLyzdWIgzfnCH7Wkqts>Uya5>8= zPcmov;&Kz%S);pxrYaoD4Y%FlwI-7$G?kh7TC+b4Hdv(8LsO;w^Ar3J!*9QBVVnnl zI4X5Dg2H=yw8?RbNtP$z3TDfBN-cg9@TomZwobrzzdc?x0}leu92zM7 z3I~K5D9?mPpBGktfj`fF^?(azT5+D8rrP`0{}AGam34IFKEVu*PZ!LC877S4M&MMD zOPzvn6W^-1VK}3CC--7F^Q!UtAvj@?`lcnYdxvGFVDli|3}pU!TAgMLQqT!5zxBU3iO9}{;- zoPqBK`E+W-O6;q8kHTJ8ZPUrG>zT61PDd4j$g)fM_Kr*cUcVXXe@BrT;jGgJMby4W%04R6qnVm_?lEMk>3ihJ{V%R85P(;>3^9_2 z-h`CTg+20qH5$R=J6=AU4VUctUQIqe{o5t#Pu|`iD#^?EZ%A^$K6-bW$R`(1T&4c` z{B0HorDt-Cdp`^8kl?L+fIl{9KMF@R> zpYS&nxWZ4ub4K37&-~dgQTxcg_TlL;JX|1?=MC$gI4MNopYKTxQ+qpJlW~B?*L?rx zjr3?Mag%}QM>yb``?Ec8X1iMrcL<@t%A6d9!f1h?^lwSe)s;~3Ab(<6C>Ls*3M~%qr&{x z(|9Db@?>8#>=$~2!w-&fb=gLi>pL-v>fh%+e@!FYpw?Qj3ub&gaJL1H-YOzRk502X zocKFn$ux^&)Sky=+Y`xSj8{r%e9?|!<)HJQInS}$3T9n;m9u=H(p z1N^;Dy_fo5!*y}v+i<_|zBgpfVCm1v@J!u~6?DGP*W0h0f}32I4UluAd}7J$$72S` zS3aNIbQCtd*7lTquC;L;`Pi}g-?j|f{^KB=zvcLD3NKyEUGEQP^Pjv;*K=T_0D}dr za71|*jSnqPR_U#Qmp@TVqVYqea8|oETp7l*l{}KGH}@wV0eM=wq zyc?W<5AKp;+eIGGjnkt?Z_<->_ImI!=Zd>!@V2P?g5;a>g7&4b<%WGlYhX*U=?vsk zyw}&0Bg&$ll)&tMT@Q5O&j~UGWRvK4Z?f!Ci$e0}2=ybIAj@o`%!; z#7)vPbl{_s>&+_RZ0|_{a+v4Eo@)59Mz;yMM0EK;4P5H9c`v!|BX`Mdc%gEi6s5-! zyefh6zbSX}16_Z&SO1A#autjHT6oE82CqTbUi9fja_qwmEnF!76YfpRsr(G*3%Cfu zikWLvsC-LrDLzqv?N6ScqVi9Y8E&_M=Ll7@(EVfj*VaScaF#>eYjS9)uIX<0yImn0 z-B0{?FBI7WbAQg}CLdJkczg)n(Y{QYES}b=N%P+YKfLFWB?nEDV&Kc`?{JdcCN_LH z2djqI3{v{x&D%uI!z2Ep1LPLYI9qZrdwCz(;r5E@aqw-?1&_%5qROY!VQu+<-Nh|~R5^IV+)IaRNEF}aqbg{2DKb~p7l<$qc0de%C)c=+54YEN$h2CT>u zW_xasf9+~=A_x1{mXdP>5=ZaCPG3ZiQ~O|^SSU#ScU!o&juyN>Q12%7?;@3n(;D#0 zT@2A}@R3V1yVT$o#_v06{0i=TWhD>us04D7mwD7)mV=AVt$R=7$)k5CcaYCBS(MZG zQ6^K#M1KD>$(P0}tH3UMS$JsPxDc&3vYX|Ot%8GVSp6Mf?)T2zE8)EnLU$x#+t*_U zq+p$yCc5+}_Tc!bs%0>j$j<7QXfH>eeQjI{2hCY&`T+hO(7%MdpY8q@YOiGqX7}lM z&f-)ndbG{R>b7t>y#42y@ymw2QfL&g#iKl-{9s_QrhprBb65S#Z5*D4nlod~lqucX{(n6S|(2LLQOi zxa_Jo)IZ!b^}{6KzrK{Y0BgZ>g)0hfBF-82X$CZg%gYxnp~vsLuUA@-2dWzi>GAs# zyZl`8Q`;(adi;KkS7pZUIm@BBDoU>}=2!zc&N=`39hhzBDHfXZbj|vhK-Xi= z$E83Hy0Y)~EqL!5ZB4RY)0Y4mBcAJ*PSEjhZ}|z+7}8XE_&J$Tzqp-VuFcdjt`BAdd3X*=z8}QnZBYju76qKPOi*nJ4qh=z{y6|KDi*CJX{=J zN%^&KHoQyT9j2yB&Wwn8MCqNb(K#r1M+5-?k*rNsTF^>nmrg+Cctmef-n< zUw*ZclJdX*{{R2lbbvnp&%~I_z}mvJ5r6*k^M6+fgh_>&a55bE`?tw0;WtzgK8dwt zz=PUy{Ec%O>PX1K#+@vuUpL_IzrG@a_bo8Y#;=A|N2V8IS0=j_Bq3Jx63=$$|8exZ zTlbDqs{6mY)@C65&sjV|Bpov02kT_&O%Q%yb(T`lw^7$-J{tUSDLZUIq)FUU7`f%cUfe0;h#sym1vS+a8@90ndJN}0~E;gN+_T0?# zT)c_)Df)YLX`s4X-#+#+L2Q4~d0G@Z_~cwIqyKR<8`t~^4Y(vO_cDb)zwyFJ9nQVO z@cYXZ`49M8&49%|+m6teC(2m#hcm-3$Hl{FM-xBw>$AskRTr4zHq$PvHpO+SU*Ukt z$K13d%0;!-)Q|9c_myt6gUX4WCNVGIbjzzXw8KltQsIZsVY%uAR@$XzhhfC29=Izn z!;yB`IcBQ!i^41xh`^D>V|Xod+F28MRVqU;d=njzcTD52!B=hey0;wmW`Y% z1ecY>?rDY%-)WW6F1T$?qE{N>{c1HL67Zi=J?oLXe>wc?gvEy@g!?L2dC{);t6q5{Y9-xaxn4YQ zeV)Q0ieHy^58n@hU53IcxybQisiyq!sa6X=I-gZLcRabFvEP*JKb6QJ2!Fb%Cq>u$ z=riY(DBQZZrH0Bw@Im8OF*tsU+FJ6-OZJT_aMK!@161Ax&5ZtQV5>R%?u)=|8q?ld z!Mx}DSJBQ?ES=-x*6`V1dMsp%_QQrAaEQ=pH`+yb^g_YY2$;*;?FsGh^QSi~@jdgL z+LOonF&F9`4u0;oWb-fXu@wJNqkTH<0Ay0R_nANJWM_DWb^x-wRiL{E_P@>~PA)q% zQ+*Sxcl44Qwcn)R@J?emx_D7GwQr@DOOBA=XPaN39e&irO%$nrE%w~A++2mi+1A~dr2hHW{`^nFkCL2>g53Yc4ni@j!Zva;B>(;Odyk-O5e|Gv{;E&r ztzJ__trhdr4P1BQiM)rH$V>eF*Wrg=zqiM4nYP1s+FIdHY{RmXz5cgkRM>Dk0z3-JnYzSM6Cv*E=Ksm&s)q zpU}9!0KSrMvOEj^6?HBn0G`u+_*5bM;nAfxd*LbVyrd#H+32W@53Ji>npzGYuJuzi zhl4#P4VvMdN84q|1@ey8WQ~XgkIdjT!n@9qKhCpdFojcC%XwR1$<(W7l+k*6Egx7s zf(045;#J|nwo-5M<;ImdPOyW#y!aE?C+0;WS>#wSKUt>puvP{vWH|BRDSR?>Oose5 zw{z|@IPzTM$QAg>8F?eJ<)xPs&*5^VM1vk!ZMMMS7cfIhL;Z7@dBSujnX6;NL$bZw z^b&Gwp|iiC_ORP$szLY>sJ<$(=~r4Q~E`xwm+lm4N;7art^2_H>{`p&N;Cz`Y{|~ z(I?mhFFm7de;?kPuasL0`*=4fwZZGU88ph^X(H2pd%tA70C}y0hiMDKhaCo%6vI5u zfk&F)?Ohiv3*gv1{(a=jOV;a=<+)GvH^TF|-*;St?_Iy{e-A#AJWz5K{`Ao}xE3~Q zowhX>ekC|nQ~|$R^xzG(uZ9&oSp~55*MPkluuA&$D>?99ab2r4czu1JVkVqsBdBx< z&KciUdUi0-sjVF?dqzr{)FN)}}7O0iK$@)jJwit=+lE z9zNf?aP074?2FD!6t!%&w{E zORlLsE&mhkwfbHB9bedJ!cyrA{JE6%j1TPkquKZ~JXRUyNzUY2AN2_?)620Ymx(+x zBWpg=G$UIJ|Ku8giz}*lcEfHLPt2mNRhm*y1?_}cS)EJE;m5Nx9(lv|bGkW-VOLEZ zb+XW*=tSCDWtYH-#h$Pq=b@ibaFOx!ICr@0dimXhaP0UUfo-rT`}p4d@Fx2;Ei^u| zrCg9D8+2LSCM)asRngWm2A)He!RA??N zgzF>~EXX}69m^>F$mVKI@_Q3S)jW8g`RQYHy!joeBbO<@vd~&`{reTeY4E!tHbHXw zq16?XAE&&wum|wtX1ULl|J2-OWAY)RGdSso(H~#JL>~f*Zz3@48sWvL_ zzt+z`O&MgBq@`v4?e)L(zpVe687?ufeq>=_s>T2OU-uI(5N3}3t7iP|O^KT~kINrD zg12)Sd=m=|SJm=2EjoSG5HBO_Xnp+wfB$t-LrdVL`2A~an?qhtJ#ch9-n&(Rqq@_- zaXG^^#B}Xr30y6>dBzL)*D=$%*WqVsA{CF|L$`O7R>IuuQeVqpBNwio zTd=_ux1*8p-Bb^eHaNpZ(tvU;H*EU21O8JAJ3Grikk`9zJ3-+mO6?Ll;UXzz20Fg} z7o$!W?3H+g`FDErFa37K_m<-)5WeFI%X5CY( z580o#LI>f@54YA8!GCRU|I~q3%PYw%{@eReIV=8oGaJ6X8a=jj{B3tsd6)1(Wcs$P;(y^HDl(S8slYLp4KsvFmk6V?i5ZG_*v5?n&1ep4n-i^BiZg2dFFG)m7YTYMRX?|Z{v>kH2a z-Lj94|7(5xQ}dBiR+5pI`FEdKx&GG^s}#jBQ%;5&t-p<~*`+?ocO@_`E#3ITObTDv zo;xw2c^>a4-<#ve8TZ%b!;GdAfnS|~*mL)B)SuXf>Rb0V!u{hGYqW7Rue#B4vf#~4 zKIAl(V@~9t?H$JrVKo!>60+iO#kI}wvv97;d+=!~&T1Qq&o{A+Y_{{Jq!TRq`9&%D zPD;m^7u?UXtd5)!UQx6MetCM?9r6K|A;rD$+1c#($R2ikTms-JX`Vr{aD;L0G5ECK zxmxltvQpUfXjp|9%-2vg5|X7Ugi=Nak{K&ijgwmGGZZdv{soP8D1u zRCm#38Q!8P$Z(6|ce{&EIKu;y){84(nW)$=>Q<>n6-7U4P z@aY|)iR1;kW5>zg{{_$JMdXcdnMc{- zqpd&QG{I7BUpI2Wsr=e~>Z(1o94hy z=i^)!J##U9B!=0MtQ?YNvji?22-`?rr0QTN1Ft+cXM&E`^{Hp2`uLXoDU~dD>E-4P zu&v{*yL7%t=B;98u;A+R++>Sy7wtF07c?%JG{Wcg2biff^hMqFya)ej9U+?~Zr+9S zj?7@BaHHwTTgV4j3TGI=;|x7}$e!Mw7pZ+*%u0#91N%r%9Uvcf7CS|5S9~5wHo0sY zL;l1b&r9v&yztRgPAZQ-t<~;OXDbi< z-R+_+wcg>?2PQb-%qG7Ea$9(^%SUm;&6%#IV8fWatJQ3$dD&z@4BA&79L!}x`y06m>ED` zutZ6ZJU3(DLob{rwPT8$`nKv(JIt^6Ly_8(qNQL&D;%|ndoi{D?YC;5-GduE)elgA zx%~6U%R8_m@5N3si^AqTWQ`f-W8`?|8k<^}WnX&`^+%VPLPKS+M~g;nC+rszxwshq zxwT_{7knYbZEY%iaH>@0AGIrUHC)@-783jWp z?j`ra?M#C`6h3NKu)GiMO}F_L3-4|3E$)YtW5b&${hD!+S?^%hTlU}S{58j{rw_qD zr=}Lt^&2@w8VLTwhDUAON+`cs$N7c7z;{-3>XF|o3a()vIeG=RkeMs=ovFURcg^}iwt8dJM(rmpF;1MuZ%zj9GV*x-J1gqnomFG=$og*Q zez3w`tHRz;`%}v95~uMa#`v}=S#)*)Ge69#P|)-Mme~4rwHR!cl68n&c$W8=1l;K& zs7ux!IUY#k)zi6aSCC_Z+&8X|I1v5CO>7WO;Ik^=YLm%w*Elq5{T@%auyQZR>0Ug`v_ z`Mfr61^h~4wDLRL#LQ7I178ll*Ypj(9v8x|2v>F;yY>YR*w5gr413ls-t-wBvFsUB zg@x}2Xn%rh7pJr6z%zDiE*OQCbMFZo!pC`oi{HaT6_Z8g@U;|Q-(lGF?1uphSlZ8> zhddx_F~bTTt^G1O1l#Z{og?$Ga&0nTyKZc7}4Ox?|%T26$;j(pC+@8VGtnQ~q;Gv9Esi*L< z8kK#Y;2YZRg5)DwQB&ln33q1w4xc?YdJGPWFZ<{$bFiMgrUCnU&N)cl_;l&rweVom?djy7syizT;Ou)zQBUC4 zVSOve?-L?6b-~L+e0}v`fur~Kb;4THGcp&$r5d+nC|v8w&y&os_0Tsb@(~#iO(xj4 zfAcOf_o`@B23T}(_swRw=g2H;vh^a9@nyn% zHy7q zg12DLOzk%mKPN|a0hw_-j~%7AZ%CDq92e7=w+S9H?7LeFw;qU6HHAkrR+N;&qWR(W zWUVthr;1>9->F-)D1DfAadRBpKXXeLdH3>Nv(LllhScAZPjyb&orRTmydEZNUaGD? z1^-#pCim5vk&AB04*iZVRrlMcc+=mJ8=ZnyQn-83y8Gn*;JQU*UY3Q67Q%Z*_kN3k z12#D3u)~5k>)XgXx9E+t!D?@`+sQ9=?bKM|`Trk#cOKPa+xL&YLZdX2R5VC3HV;(F z(4aJHRB1$Mq|hKLA;}PxMidHVh%`usB&CT|8cCX@NJtv?`(tgtXFb>byVt(|*=z4- zZ{L-x>$Q&KJkI0%9OL;t>)Y%uCpzAIA}WmHZ5pP#lj?tV&O;kAdn@Cu6j*WNEq^9> zuCVw$^0oAgwd5PaJ*!gTOyMji8ZVWpJXUFNpk2Qexw~~qHlMQj|bF8V;6=he1M$=kKHCe(DHHX zfurj$w~?ovSdvcuBH1uOZr{zp&<7`-P41^YKS!~^g50`5#_B0-HqCjo7gkNa#ZU(8 zr}o5<-#RbaNWPf0<_+0(m-T8IL$-#89+F3G_8%l`${TK`^R1F+O(d_|<&{Kp*mEVL zEb{VS6MApq2;uG{wZ751-^gpWeIuL znT#SQSTIh(J`!G)q&7j`8PM2v7%uRjd%3=(c2sK zeXgfs;G!x%F&mhz`Otf^gxm5_Q+RL1n_e;_%j`P_u!&&EvJ-H0nntS*eB;LUCFHpa zhH^FGp-M9;^7q)9SBfy_yNlxFR}rhF72r8LdHKjcYZr&g!EHZ}P9r~xd}AOBU-LUq zL+4u;8nc3Y%g(ZbJY$}RS7Un2>#Rb_G?g%|dH zzAXi}bTgMzd<3-X9OU6!i@eInNoG-bs_=NA*$OhJsgQ^|d^yqQw}rDGebk4oZub24 zKigwH+DOYS?aLR84f`w4_Uoby(N4W>3^+z;@@74GT3llMbU3f;)F<+z>}b=K@RPCa zAN63B=eF|HrdcYThc?1ByUx#`HqkyF)=OR(Yu8Fv$kuqS56eqGmZUa3RC73B6MV;% ze+k*4yXpkFsj^T*W@B&%C@tcgU9ZFDmTdI;W8W@)ifLH@5IQ z{9HWw&Vw&KR-YoJVvqi7SmMm@@rfmdoqv!t5S0VdNj3N4?g;YbuwAlV6^gYff$0c)UH1Y^OH3M+M%nUiBzh z?Vt>y#J5Qu$g3$vM4y0vEvSVLC$;FK$7pnSyXP zr=U4`?67|h56tS>;z1U)xa7_O%jnxZC%c{&_GX5|O}I3vyhC}f@|fV;kFMV)4|?=i zPNM%jG~;KdcnF&dc8tOnLWM%)aY^645!m#Um^0Zmi!o;iUjAu3ja=Dho%0dq6YacC z-lfEUyBE$l*d9aZ2b<@8x=87{Suf8v!{dH=iR2G<3!@w0 zu&`9M&NG*{zl+$1pY?gZv_5E;BN%}=S3iDY4~PNhSrb ziGjPY+?lhB>3pv@ohZ2lf0%BSLLR$#cTjPxbLvTRw&aa8^laTF;KEu52rOjty zsj?w%vh$K}+fTtadUCQTe?ss=?-&~dbg*C?3eN}4Ax_>*Z2UtFlQ%+!XDlq3_9WHsaqQ4eX8q!zJp7zbG_dW zFO?SXBL^+@D+qzPo0*C_V2-MvS(I*UC$pjrj;+qUNbcCgcCiJ{9%)aY@|5dd7&XJS zYcqelYDjuLIa!?FoYEs+OiX(N58Xf2O~=>l$*yXEg%))Rkkxt^F1&=#jFnuV^Y41D zuTcwc$b6hc9+Bc4t%hIfNRI}?CzwL^kT;rWEhYcyO)S|>4d!q<_QAsX5a&V6r(yPCXE4RY6U#z^OVTNMmRTS^?sFDM+@Z626Ce&W95++)0;hN^n z+N|jHTgHtHoZ-R+YMq=gQxIFrE||sZjl(>+#;=meAC6c3t|0^u4BH5hr5nNw$&p9i zi<6hL%(Em{H3>SAyC(!A$(z!mj*)Hem{pT|UR}Ms2Yx6$zm7b>mBhIh9vdwBZHsL6 z7)t-xkR>mS^ta^&A}`=SqqHsDsJ{;0$@ZX!(i!f`?Ry1F^hQ*Y6|-|k$ou+jz(&lO0~K`b3e& z`}4lK4J>f3l-8M6xRm4W@O1cCw|{y&yq#~xV+PoK`QmjQ@Z*^KLz9U2pV_AM#5~3^ z_=1g;49z~N@7t_?!rsR-B*|a*yWjo+bIE5fqVg(KR?B^Z|2hBsyLW4p6;zaE|KoRS z+kDt1pY?gZv_7Di$FYAxCJM}b)SFPo6TLfw?bYH&oq8ruGy=E zXE}2Vgt9K;y>W|tu`lWW+?&zwC&%Jnkei4|p5lMyR&Ww4%!N}Ix~kC8@4oJnx(P4f ztML5oU?I6|nEMG^9(irh-Jd7n^`nuOvSHca;Tvjjv7M@40o+r@v3!TZYRw17PjNQF zLA6|&9Po&q2VWN)Q|NQ&h5TyG=Jw|0pWw)aD~2m!<<;S<2jKq`9!tKm~TdyjvGZM{Wi*TL%)QtiLNH#yaxwZbxouCJMZkG$zy-3M=f zd!T;?qLR_Tzm@EEEuoMZzID1dr59FfI)9u6E=cTA>VXeDkX^_M4~#mW>V(Atp3Y^1 zH4k|dmcxz{_c`$SV6X5Bb;bqRcvfmu)iZn|eDwH&V9)3{(Mti0;8{7U%YtXPxj@N#vNX-aTz zjM?=e^ddb5zI;{qzE6!q2izDVoTUa^hO`R4hW+d>tyu#rZf6{;fiJ9DWgTh0@YY=0 z4Ysg~P{wO7cwm*z;Vtm!1EuLZ;e(E6)9heL)rhm(;h(Y0m+ax#!~D8#Fr#mTh67wP zbVx5Ix%)vJ~A zy*uE2y(9fJ%5?7prMttcvI9~SV5f^5{2p+Aqh*E%oTe?6up7Q3J-a#pemb^#+#j}^ zt=E+Z?+jLU-3JSu-HSZ3xjp!A0|}8dF9bF4#7c*CH;-? z{T04ro8iW3ahXTp$>>#!TjBl{7Y(9d zt}BoH-@z+nAHIu$*V+6${2u-)?f>E=yzsrrj8CxAn$k1p;ES!AtY6_lWu3AVSo3GQ zG1y2Be;cG;4~+E z$t0=tIm}@_FJvanHDSHA24<{$vz$EJ+a~-KoECq*pM11?hGZkmIadE-7ObKFCZ-8K zKJIQR20Ixp3+jMNB$n2%fYpFsnbyq3AVa5lRe}!2cV~!`mcYH2%Y0-RL~hG>7vxTW}twbU_AY8(49%Z7ubm!Zw*K2lz^UZE^(s zvY=hX39j;MjSYug?_1ySfSb)SBoDwHgWghp@RrHN2lvBFuB*=l!AhOlLcy?j#3Sc; zcuww|6*NAWH(!cKg8f5$KKQ|!n=2cK$Y{_e(!WFf$K$LumA7^K zMg_`WAnYjwH&yMd{eksnb^`Zoet0K7)9njfcDi{B53Fvt@gc2mGe3N7nFU|@$QL>Q zUpnlbKNFt+M8t-y&%~2D9WE2OxSKr9@a<_vIPAp?P4b=MJclV<|ASX*cR#|>$G3P* z!h3f=+((u-u3Rz>2iB}_>VsRg&!vySFTD3X=!Fdp8Fk2AF2AhF;+7@iDp^|s-LWk~mCjPWBlG^NkTrn;meij3UG?{=cz(iFZA6c`THzk zzG8Swn1U|N0qh$jhfCmfn>bjgyalfXS3HH=6-$mSgKIN;Gs)}2PBqZ^3%Sje%ixj8 zX}Qv{?b|S4^2-}PJr=<&_ip5pqh@z&)0`x}DCs5VheQ)r~FOaVut4_rCe|=sUiKv}DHP2X6=VaYK)oAq zAM?G!x$xP?*L}%ad9zE%b+dM*7s63tukVS$ECY!WMew0HPJ-faK$f)#IeBU9Z_9m= zT1P&;vrU=O+f#0~(DB+|rmZF?yaMjno=WAfAodV2SaFg$idL6jr zp<>#47$5a!yb*qUCCbqVzPaY}3L`k!VO?nu>=EY{>;!9F>&!n7Kij->zaM;OX`Wdg z{A1q!xFFa$`qRFA_*9C+{9yP=?#t(e@Os9_U&uV|l|PE$9!;g95SX=a$*23UlNfX3 ze)#+CvWaJ~S7=;DIQ)72rLtC-?MVLiXqbP`C9`%|TWTB9-oZ*gmQ0I*19Ub;b;4(6*hiC7SEaU)f1b`LCiiC~9_fSUK0H`{ z8lJB)xOf1b8oT0f2JRVPt{j8II3FLUQOC4#?T24*s;T99a{LE&#R<4a(L0aar<5Yc zg#PzulwQ?;8p{dq-*Z2a(l0&B%IAS=9Z&m^Q-#Ez&xL*RVg}E_#pCxICE=AvK0Zo- zW409xsln?uH*}nZ?|eDgrw>>4x5`od>NuMDP2t_$PwQe~*Q=Hvt>8AtqO;`Sr>~Yf z!H=Ix4%79uro7t_06XMOQ#u7}NQ^EGhp!%4`QZdyecZ^MX+L>#A?6((t3N zVKbecQrbK_0#n{d9}?5Q2Fz_o83_ux>QnUA)^{U2i&6v7Q+y<5o{8?{Ov z!|h2iD%)VugOXgOaBFq2Bzaos9pMT%$TqCX4K{KM*;NbocwOH~=Fz@Z{0biNE@^Ou zt8_0NZ-7;g=)HA;OA~xUTj8OV`HP+40h>!LD3p7pZ*uMe{*F+hYYT_jW-WI9&F1C0T;wDm$&NrB$wpw4VG~ZTsGfKM{u=tuz|wc(=ieb+n#o%-+rB1aE7} zC=i9eDF)g&z&D)T)X8gFEM{B6wmk1G7r=T=Dy5s?*T?Mh=fmrC>`t$Ojn{u;Ax~Xo zXAp+Nx^23I;Y_Z(4=2!m_p&6v2*D3^QNEoJZv zW+7wpO6lsk)F0pOWR@W--*k#+hEr8n_tJVD*nH_;5iFtkM2inL z?K+Z9{rmfo2b^5+Klc;=?*3m%Nm)krKmPnDrT_KuVZWdMGZir4>+kDt1penlAaPx| z6(>Wk)xSJTp1OPYe#U-0#gdK^ojQPb-dY)tz3$W3JUn^M<6*!4KlbhPvwo-WuQ*7n zm5%z8`%fvyTs%!1aCE*8-1KB43`7LsMyJ`6X zSdm$xjQpuu##anZ$^Ch34CZIx3@4xbszlenNnqLm75H3Vh(`-7cPCO( z6~6X(Z^Q5Qn3MgJd|xL|h1#om&;E$ju*&gJ=@)RNzx{{?oI6tP@(flj){|ccuMA(W zNEVHW+@%dy&WzYf{+Oj)NWN#1%G?b5?%Ghc6&BO$eVD!*csc zc*t!*St`ts#4&$XDBhP2-S*@f+^jP9oB-Uacll#3tQervA`EZLy>sXu%)HxTnHX%r z_hrKa_>ogqkR<$P6tUKZJt8+I$Ne5v3&V0}uZ9bT9nvX(a^ozCYjCseE$&;e2TOI^ z71&-@o;e%tNZaXp8CG$SRHXVazB=Nc4$CHt=w!mn?tG4nBO91sO@N~}dcBK(hmeFkihj;uK-wrc)+MP6n`Dd85JHirj-0>R0~zL{(r^&xL?Bz33W)q^;3OMXT#fBg5F8Ml2>A1^23v+YBuDI!}Cwffkjr`aV3{5i({wu zR6ToNki6hm$`L{M+N-_4Xnb|ci&%-m4{~{}$ifdxv%a6)dlss6FFD3$~E$ zzaJi72FH3|KTLjeYk1`v*fnFiGmX!Ss~#v)JRDxniy~WAo_MtxmVe4ONahWlG1~>^ z(mUHmcFl{c_JVgbHNPfDs5(0Mz{)xK^%A($nPstcNDgtYq!2ny;qAmw9V# z$!u>&x3R&jcVgqofg282%z}?~ZGTQ?PG48R2aC%tXdgFbhWVF0{)>V^?^J(KHN`^nBm^c2&>+@ z^NE}@Ff>XIx}Yy)3GbReJA~qYt$476(xp~wB~FJ=yIm_FYn-pkCJ#>rsggIfueeU0 z?>^+e8NOzm;YI74Z1S!>o8T8L-M`y=_027e2JqeLIJT8Y-{@U*-wOT}$D%==$$nYU z6?RT>H6Yuzzk1{c-+u1CZ3Vo;^axuxTyD;GbQzqqa*NIh_>vBb(NdW0W&!5~Seo1H zq*#?XU^K0@Soj?ZO_ds6pt{&g6LmJFBJ_r zPyL6-XY#;z__FELwV$x=<#s)ChWwW$-{JEQw)Opl_ryKcr~O1!+6rzuU*g4KrEZvO zS3V!*x6praxD$RmYyRK>EP6|3XV`ZTOvj@aMWFx?Y}K9X(1f&xn!u1~cr>enjOz z6J5&l6+Y{l_|*|URa7#22tF{v{=y0_D?H6lYjmf$j4`blpF$f{X;0PRo%fZlujxtQ zk3M*4_d#Z|tk3;y@|8VdH;v)2DX~EEw)*i$MzGOG_Y>q7k@us??o;NRRNf<(JQIqi zhyMyWI-mbNt1623)tf6`k}DeTEhhVNZLAo8ji$VYsJ*W6T;}`&zZGgbMt;M1p@gn4 z=EZq4@;}>uF8V~~oAXE0Ft7buwtEZB8*%~blP|(Uc@IyJGf$2fk-60^i)r472rYYh z0q(h-70d*`J;R<$zS}(OA-QHEGM&6+RnreLezfM(d01e@mBTaO1-MgAg~QlHVp!pa zC2bXnaO&VLiz30XLr!~Y7geck>3qIwj=MANSGq0Tx|G6fW8u`=KnkMqwq4c72u%S{2sE`6jL_83o`29<~W#nWX3@jWBjP=YMjExMe9b{!?mdna1DJZC_sQjm&|Lmyx z=i|eF-~ZDc5Zwg*zu}eY5pK=NaQ|O_e`^`HQe8Tm7KGnaAa_?NG;T?xu-VuAeCE;zlr-DwvMKZaOGvIXso-96atmNdp z;Wet7FIIhXcZ8Fk@91ua$2z>m^k8Z4{YS|hwJb-;-=AELcmw-a2Ts?9KUc9nDTPNL zZ)%W-qxYm~K7uQ@J3NtrySz0VAHc6~3~Q`_AJ`@ulAY^YSCZ@4+4JthR&`b%m%&wO zr_&2zN$-wQvfpjn)Oc7h==|a3u<_3AD~`gRM(SN;Cg*lfJ$UQ!g&`~9xodKIbzyJw z@r`7ITMPGS!`;*OX^=0+u*k267kvsfA@3GwpR)*FEK^@io^^2D;aRY+>w6ihKjUQb zK@Rw<(hF44+PN zk?XiaT*>xZr_Um%cf{|Fg6G)ESMkFs4*rTq;pB_Eukpgsmo&8^;T*dreI9s$W3(!H zOS+LR`CxgkXgD0{%^kx{`SpBk_rn!D(~ZbXOZ~J1;L1abJjr_Q@5+4OlNZ$t$Y+XE z_;$j#!sbYE!A;ZG@7MFLf)kc@`k|c-8_xQwH48o}<(_j4j&Na0 zq3cXQ)gghzaee@9A99!5!{w(b-8wRHYU6`bJv>%X5qFI3BtdTv%|Ie&& z;buPrA8cK?mN5e9KVDf>&w~f*7swoj2Mk0$Q~yz4vQ;Mrw)FdYa5XFt$1QLc-f;5S zN)vd~FT31xaCEC_s{>pdknWKLOV~`iyA|&HG!jj=F86p!-ki90G#UOnc4Ly}3%8%s zcv4_~-u{_R@DZtWp)^=+RkErx{9Rl(F#~?YuM+G6mn`ay%A(_Ecp6&cT#pM+g%?BPcRp=bf09KT*i{<+;SYBMb28y}njvj=WiXb7t|#jd^tb40%pA$woDec}4woHQ?7PN|yy?cVYX#QXD zkY_9TwyY~3KOBEuH-ua?V(2Rbv*)(ukr&xU_X@9i}Y@_?c+8qAM$IhWZ%N;KY_PJI`o_0-En;*=YluqRT2)>FehxmUKqg4K!*>)~5@c8_5% zpEKz@VV0V~+xf8c#Abc+L$lGH_u$gK3uVZQvbv_-fLG@R2Gj8~71nII2JhW!@tDr< z%o6KHi``6H^I*3#vhFT-#71d^%#hNYr0mDhwMYJ_uWh9$Y*A2hljvjGg*Sjzw}Sv4Ti^_sfLgzHfopq!y~UxN022d&g3w_ zf+IH=sC*OWrT!C`51%d+oKCL0^NW$@OT)v?V&wk29G*0vezogdPo9!KR!Z}&kZ6}T znMp9WtrxD^5R*!dTmNRF2OiJryiDHotp5Y~$I84bobh3%@kKfLe zW-+1lYi{??BudZNa@ma5H`NLkIqLt?FXh5%{rhhE(VP6fSpN6pkUTWbH(`gs|2 zzSG*D*PMZ$g;Z_04)C~Y`^P%6CUL^8z4t(hGde7+Z{7Sam z$X!HUp=V~-g;c`oF)@6;VxZ4Zwn;=?DA z&ik#^!yA5VpLCe4W@eB_9v_Q2^1Hl=JwvpAoTb!KK(4=g`zo!+jt%y2$OqqEvN;LM z=i-CS;gg3ww$pl=E#o*vcFT^eq4lx8FzYQj>G9q+8jnd+Pg}?n&mX+WhUYb0XeXNl zhlxFhdqdN@$df_~rz+s+)7;_-@SV^VtLxz7FXtwt!C^7%>SW1zc8O#I9S7xC@SnRh z?uTQXo$#@D+iqPzdjFM~YJ;%xffJ$RwH6wuL^1yz(u=uu9xmOg5w-~)Ebo7js(523dDC(?=9BO__H!wza9Ed8*LnDCwe1G-uz9g*CcItaohmu>#ISk`JZt3q zv=q2BMrjq@|7|F~_9GGYICdwL13t?*Es#9VvR;uBPV&vSBpYTks0+ZIrY~d8!QTf) zri9>6w>?*qi&-Uy=fkzjcZ^Vc*cvZc(f#JMBL5h&{B$*!#qhI8A5rr8vVysEe|o23 z`!kB~pSxS7;Z^$Nf8M|TyXXIkO7bdls{iTzzv6#;{?EiD$H0CH|M~m+8-f4J2%NMH zx8-Cw&-yP9-iz04xc_nxx4J%o@wbOmHO)Ucc9^flpL{xO*L@h@|Md-;V4Q3#pW5@e z$h}mps+V%7JblGaKFntSg`D@zVTS-5dh8?bX82argSN_>>&KYO;N6!u4dGM*V0y|vb_cE!Agy4y11Ht5J$&2Gf zVPTP)SLF0YgMMlFNON8nIi*gwc?CQe*}2vgZmM2oDhE$X|CLT2%aJivfJ?=hSl!@< zzKLy0lpcNY8~J1wuc<1GzvQ009j^FMeoqbVt|{o+0jC)(;?aV=zO;RChv%=KrKAIA zzxRCa0XtwTaBOFQTa*FOWStC zYy2X9P<;~Sv^^zHlYjVL7WNC>JJ%mpXFoT88GKKX_a6CC(rADbY*k(x5dbrbt>G7= z^zP~(d*Geb(T|1Uo*R=bdtsf}LzdK^oPCx%1;RC_cQ?(3CwXQc34*_DxL`-^nRGLD zQ7F7Ydv^jS{E27m5cz4n+AurpRT`~EW@+7G#RNw?$Qka3WBAIqFv1cRmds?MwO5ui zz#qRpx)A~&iT8<{!l>Zo%DEj3doy$!kT(`72hsUeZ@#`b2`5W$eYy{Re^4QQ6m~yY zBT4nQHo4mI4R*P+LyWGkIXTOB1l~1c)d0og2lufE@@XGGABwM!nbl*;pB!}|-Wz`B z_n_kk{HVFQ#}hvE^7+#-SU@E51GS%j(!Tvv-&s1j_o@9)`YDD?hr`;k*8lDw77u64 zfOlAn2vC2zx};2td~jL#O6q?PX3Cy%o8q@nEP%HS?ry(SN8Wp8rARA$UUutE@}F5s?81YE)Sk@m zd{0pMg7*qH9fW(|dim4!zw#?RdI&al)m}mUBj8R|QY0MXw4y-}?zgk(qFGJD{CF?< z&ny>vw(k>-XG0B@TuR?8b6sXTR$lP{_N)>l3n2#3$c zJg;5?f7g>%qyBXB)$=JDzx%?up3wD5Bu;NohR603C%ed-5>++HJ5E3CCYNn}c0wIyeY9vH9e?0d zq$Q1iUklw}vbcES za07fmLCe(=-ghwQxEh?s_%hJ~?i+5dTnU#hn{{h5%xIpqgZf{5l;KBOZ?{{^hl{{} zR__}+DNNLV4;{1bqV#{R*Z+1ys-Uc-_#gj4>i_zKq){H>Hk=G+{`L7!fz|DJ#dKxO z%S^1C_8H2W`8oBs%k}XS>Q8hP`3?Se+lx)uUi``3TdgDT7P(Uk%Qo2I=yJC+-5qd_ z=#kznu;YFgW=cPDw||cwtny3AzXhJ(+jvVAPI3x=*a-j3{>4FFyXp8j@{v6+IpyGV z-_eoRaMp_JYh_^>ZH=eo4hDr9a*e3pZ{N!NVnX@FgIf|QJzw~QIN9bV_i?hxvGs?^ zJju&;lSPx1Y{{NwZac`Wv6DZjytN`f!pLhZ@{-5{KD*D7%?7{vke|3dI!!JyTCjK} zJlMNOi>wxL&1MDc&hl{~nemrK_;T3w-qMkJI6X`K%2N1biSH3|MdKw4a;es1Kk^*z zDh_Elv$(eY6}-!qd&eS}<5%x8^5nL?hUA?s8yAtIR|v;Tz}KH}xxa+n1)n|)b08ddbK*U|Dg(a183~VaX9T}z~FPZ zuui~j3}&nw+CpBuq@v^p9GJScjC%jCoJu$HpV8nvc=6PCxa8GACd#im8hGy;ygS%) zE4l6X_KW1FrU!PA=jHmijldSA;a|uTGcpv1;q0=WJgQH@m6|P|;ctzRtEs-bw~Oo? zf~7u8KS;j4V22S|Bj0u(+3wEf)ONPK+HP~2o zp$9AMV{5IY3Co^;a*3SXy`(uGW=wIpzy~W0yK_8&|I8X9nMqX@@QwZ9la$^RJbO(Q zd@@}yf-K`)evRU}^qZg^6Kr4U81xHPH#SaVfK%?X7E}K)VYzbVC$7g)__nPUEcNZG zb{{OPRvu~!_bMKUeGf00t=4Z2r&UHg?1a@lqRKYI!ZpwR$X)V3zml`!8(hi%oWK6v zbgQZ$EBBv&{-2!Fe|!GV_KpExe_wwi@HYZ~Bk(r@e00rJX&v3{^T=jv&aK8Ha zx8zXP51c39>q}eA=y>5m_7Aae-`ij69u(JeiF_G>ZhI`q|7uCRm zw;sLcgCD5yI*!4L*IAN(!0RSdS2CdW78{L9kHS}@cXX2-r?1wc z^ts)wYD{pdL=w|?IEy90XD0m7&u%T%KX2s~Z%(+W@Pis%-;6n1+_>Pnhc&w?9%)zf z@3O*jK5Sy-OAG8yPU8IMrQNGPz@C|7WuIVEvDWVQ@LQvAC4F%FE>-tV*lk{d2>D&t zvWa(aSH)EP2Uv6w)42}#xsS~AF8K5jmLu)(ZK?P@nH@V45z-b?VG(abA) zt?fLlf3Bh82d>vF{le~e_^j(r`7apt;+l(e_t5b-{FfHPe@4IltFyyJ@P@iXUq31@ zXK7$Eyjp7a8am!XTL0hym?MM#VIFM#u`jJYSH*w5*6=hgY?W^^=M6Cc!5)GKOh9q}zRKO@W=Sw{d-i zT@=zdFT$-gyZp&_2bFEF!IH;pyJ)Ij9z{V*31YR9cTrmpo%!*Sd z%ir&_3o5;H^6^p$*VIZ zs~X|V;eg-i$`>QM$fuNgD=EJm?=6>R*iA9johr=Nu&jh^ zHeJ6}+l_PNe)fv9d&fuv)mI${mJdZ zt?c3s?~n3Rr=wGbPthmk5cdIKw;*5~JkIqP-T5uz*F} z%4T@kk#bfCxK2ddnY>2%sE<7yzb(y&EOhKlpe-D5s$@4=>gcZ3|s^yk& z#JlKl^3Nkd_l)4%QB23kvkIc?b>UTAU8l(R4Fy8T8Hz@y$%elK=V`*iUwx9vx9*#M zRff|)>Ru+FmK%Mm0DCFcza_VCmSiJ8X6yY-zSh}iDhof|&bp}u?#L}zNd9zM+Kjv} zQ)16jIM$qtl0Y2Ky}%|4u&F zSjHyWKhBUKG=EfqSqVYX@gY`1Ms$|yX`36*WGW%48e(Sw<%Kl z_db?q_zLfHKT}Wr!+p+OWpaUjdT{`JhgmR|oI7H3KN2==ySs{fRP3SAQ8;6?LzTR; z-tNG{CQLKl3bWI`{~+Y_;{T(LlMlqmud0~9K*q_@fh~K zb%2F$Df$oP5vS+I6|&C zIe#m;&vQJT1NQ2#3)g|KtY}u61?zRQ@vVjZpZAS(!3wwcR%*bn=hY^2!&Cc=*Q>#o z#QNjNMjK8K(Dm(bi}ED9Z=J294Cgy!{-WbY`!5y9!y`lMGN}A>9AhV>V6FWZ!l*u% zEY7-$!5o=szI44J+;`=KVDlo2Oo~^2VfEk~SUH|6o#NThW@^j>du)okO!2O8f8Wgt zGn6s1QhP`+b~ZD@l8f_n87ciIi`^L7TcD<3`V`vtsO_pBeXvRbFB`RYt<7PUR(N#g zvy0R}c7*Y#HNl&%E}B8+3eq~$0H^ERy8IoMSn1(f51-t_??4_}zj*CS*rDv(T(U(& z)wwEoc8gckH@Ho54bO8}@!)4$vg^+J8KrQfmZ}Q*n2dP91K8=D+ETLorrEan@S3lW ze8{s3$1<+Mj%<$gZ`2MZ1`yS;M@`nd`=GHKe!^bf4d)1$_&EWu*S&ZZ}M;iz9VLh%@A89z=BSwXxj8_3Sc@Ct=R_ zI**pa+ggsWQTuM=X;PPlt?fS+)A;qXwN9tem5``4V zG6heaXgvN|Wyi)J&Zqup{(7sCAkw?qYgg0w+V_AnVICa4{agom&g@K4Vc54(EuH#v zW#DR?1#qhKcQ+becy81t4jUEC$RQ_Gy6e+=5dXb6j~r`Ws73Xy{+wM(W=)$&qWL@D zJ#!(Ir)s+@)eJ7(a`rl%Zxi3363yr3Ra-xiJ8H-7l1FbH9VEXFo4QWx@vEuoRdoDO zi-HIz_*Sl|FZp=-PJLS6b(9U1>3o)_gR|XWkEqfz@=V5oUb4F8jql_eb3=`2e{ky9 z(q%M$oytZRZiheWTr%c`CxjjyC3mefb`XHe167=8eYrg3es(VW`kL~97wp`Af0rN} z%cCy03tr=+Q%bH@?{Yf;_qndtng=iT6xO5lfRj5%jCM780&*FnaCYkq8*+Qi8n>Tt z;fDE^ztit|1kilGt|(52eE0ZVT?UN*CkfSRWHI-45hnO-Rfh~&$DSu)8qC{!bUm5z zNMXz@cK1#vI1AnRay_O=K5SD4^PJ2l!X86y1u&!L>a^OY|aZQ zJys^~*k;%~E@FbNXZX;Srme7^+>pLD@VzC?U(Z#$>zrVZsAtdK!{UaQCCST1r;l~Q z+4e_2()oGS{3XcA`<)UT;OqSMqU2>G>tgNTUJ(^1@~+v92W{X3?&<oWH^5nI>bd$UJzVYRI`~SM?i{k%@ws7Z;K}u4y_A1@WO(Xo_`uSaVdOg; zEMc^M?K!zcpKM@rlAqRdzB!tqRNsM*3RhRcHa4SM$js?}g3Do*G-E~bFIFypTF)GZ zh1zL<_G^uqJFRCYmd!a%uG)33NCcJ^%C#ly)ND54g~bjSzoYo5=H!f1|6Bj{UL<*{ z)PI~47E%uJASdX`#La}elYg!xA6wSEnta*uASb!~LCtM8*s=KtGquOH_Th)L9$Ku6 z&Y=CJu;-S;GvKPi*Keu)p6Ud%O=7$ZFsbbP-JUx;(#PRr6MHSlc7AqNG~Vv_3@DH- z9yXRHG(nwYt z(3wUSt&&$RgJId@_y1t;PM~t^{{PXJD4NimMkPb@oKzYVg-RMo6irGINok@%l9Z%DBWY43 zq)a7ch=c~2l8OdIDwSw(-XH7q{r!K>^MBU=d(JxNtaHx#ws5c4+WWfpzV`6h`?}rt z6}is6SRKCvLGMoH=x!>1-tMOxOW=5!hu!TkOX51|E3niS<2|(hc6H^* zbU$KvFu~dn4ii0?P4`=>_v_7f!^Vj_gvfurpZll#f7PX$ikj;G=I8%4)Kvb*|Nm!V zP-0*Xoi+_G|LdP{)9|ev3=wXojMHW^%$lz$vuYg!Q}-MOhIxs`TLXLM;u{#ZEv9{% ztLH8LMh_2~F0uLp9q-&Yff_&E1pM^)ZC-xmej38*wh zBAxU6i909ZUITrn2zXb#ZF(tuQ?0`&2u|fM*uU?xQ-4R_T%ouX94WiGJ{xLYQSviYXoc{CCdwG-|b( zb(s$Ey3YG4C*UWh+3%_RzqZex{x>jkSn0WKm$QraUI*8Go}La$ni@(<>gxag2-v2o zHZ=l{1cp0sFvR`+4TyRHZ>wM5)b*lSvg+#`^Up-G(x*C&@D&NB3sjD+o4_NF2Z<#sRMd=|y!`s%u zfxL0;y720)y9c@90&7c~b@2Kzp}iAmr7^uaRZDoP)hh4grINkfB%H>PesZD2a%;HO zT8(!Oj&G0_5qE$+kKG^Df(N^0F71Xtp1v4m2p<*{5b}W~J0xO_;ThMxO83FMw{pWR z;Gmbik^5n%1fNYCV2yk`F@N~SfyMQk;Tvxglmg&OT=|*`&xDe!SU_YZz;cU^!O`st##l<^3K>Ze8F&GuZO=AobB{w=0SKGgLQ@* zoHqTKu*CtN$|zXNK>lkad^F03 zFB_tZ{a*`E zd|pC<_gVKOVggC@KG09a7Y?eQ9~i{z-@{KV!cWT_rNbwY zJ2S|Bq5`>khuW_khh;P!naMYHU2}l->22{!MHs?gc;EFHh zmKWf)>A{s$|MJnGg!8aQbSNtAF+Z__HV9Z1P#t_l*bPP5z%kv*Dt$#`Phv zmeZ~8XWFpV}wA^>O8CcuQET2brNUUzIE% z%zd0ZyhNos6aI3ntAx&P=Rae58Z2`^MeQ)0s~1w83@aD!oD&TfswovD!mUAVxk+$` zc;~N^u>F8)=q31?ziVwATyWNPxDs|8@F8X;B;#iIO2sSBP*_tqqL;kCk9S50Tzh3e=>>eU@2LAhxS#h_{u@~Jw!n#f z@XLs(!FD*qVmg}(?CRjL;sb23YQ}kcc=p+cugUwn8;tE>|MY7APPqI{be1j5QONkm zvVuAp6a`;+ zENMxAr=sHeT0c%2k1y^v*i!z1{`C_yUO(|t6`f~~NY%y!2t ziOS~~FtViiz>~ayc`q#0ynTW!J7@1z^0Mgme40-#%&c-gaPY{xQF86cw*vd%f=QKR zntxL3<$qK9vANy1X?~xw;;bU)+4*lPhGRo@-jcZ%8pu$*8kkUgMvkq%_?$d=U~-(! zw}64cp5mRL{)%2d_%K^)4%xt0^Q}K@bHU;fd1fY;ZWz42tZrrr?AvTwlm<7yzF9)) z@+Iz0W$@<G zXI?%R&co+lYR7znC2s2!UWOOGve*0q--~D;y9W0OI*5LQcY8BUFNd?68CVD4S0$PQ zx8d(41wY8~JsApBu=A#6mVv&7+FFX2k(J3MrL z-@^VJn*YzsFXw-S^I1#OTHwZ*b7o{)+Z>m-@Nb{HX;i=94wnwHn%9VAFKpJOklhLg ze=cVD44V`?S(7(0Y&H7`kJKfa)A{y=iyP4O+okz4QTab_J1MurcVgaUQ~cWN@ZQWD#^k{nYkVHSa`}AHH(={()1rHD>S&AxwRig4=N#lZhwBa{lz-z+ z{kyR3;3VTYSk}h5tr9-1C;2NI{u$Y8K<0BYNjgpW4~y1Q|NFe(Tzm?i>%+5)Ec-iZ zLn0h(HDpBo>we~+wqL4C)fH9#?eG8p*Y=B^|Hs7Oz%Vn0Nfa;tSN}w4g*$ODME!kt zSNQzhL_)uY-hz08LgoPty_XNti@3JpcH+s^YjSw~`|eHxbu+vD^cdx~GJI_lVO_R{S!_@K?#e<77F7 z6J=!geZh6)Zl?8yDez3Sndhb8jVZ@6PQ!vpU*9c)hdDgn=D-{oj5A;P>GO(&O@1pDQ46Xrr>V>T#hKA+v);U}9$QrLt z*;c_*y>#Tn$_@A6Q$P0wQ+hP3e-5=*;7?&^GDG0jQt~gB7mnnFWXpsqf8cY5E*YWTVvqMEu zSw(H>zx(c(y5hf{j)5;DI{r_;jHtxQ6qL9Z|84x~O6NDcGMiX1sOsVEM;U(k9K8O0 z_|lgVmnJ`c`yRQca-B>(R@emxmopD#<0$F-;_JKNBu4jf@+|hWH9c@cDrYNsj*egS zN4R|;C4f9tI(vklN<6$rd9gXwCdK`s`*HZ>owD71FvtD;iCB2)&$U~~{VWgK$nQkB zKJ~%@2J>T&!7QT>qdH;3`P~bTz$5G|uiD|r!_x*M;0gUb+sRqYl^4lNo=WAk!685H zUpxdKxbylkIqq@W;c&QCD}d_*+@RzZxF42SCF4rhe}AWsoi{w2ze%YBb`Xdg*$Jnb zuPJST-S^n+aey0j+J~OPrRvknSHo3S;Zb+tB_Xq8t|I?8K=u( zUBi!y@D7yTo@4Cow_wGIBQ0w1tsQQ^uET4aQl-h?)Vcjj;SfvR80x)U+f1Y{!Bf4N zc%xv;dDumKmMEpqu%BO%4_Duib|I9W;{>op$`0Y;#*V_(sNeuY|)3GE-^?*h22=~8Vz7Ut7MUM_~cvN{f4kk zkkF0{__W_)iIs3*$%;|(2JwW2tKjEfO58Kyi8h`QvW~s7KGkn`=*nRHiUz$cN8L7% z$Fdqm*TU!e^FEWsRTEyA!g;N+i}K*iocrHx;bM{Oi#hPN=8OZ5a1%#VZ#FDbAg1aB zANVR9O&$%KRqFz4Tz#7P$G402yTTj#t?!VX-9}ip!~U8~^K#*G)xBTb;gIb9i{#Cw z%AOwZeCfg-vQ^P?|6y@&dH zyIYW80Ia~R@}vkZXBhqz2)pN}zb=N&!vY@%!>r;9_Fslq`@FC^2!9hvvL?6n$mWyd zzdN0z@hE36V@C7IBI?~(6)gYwvLekl>BB`b_u=J&i{{dNys|w<`XQVqwn!}wzVl)S z`(s$lJkgTocha6G7oWhJ_Y4OmzzmZNdiC(@o{Fd>STw)!UL)Lm>P+e>m}?|;_&K~J z`rG|fxT0CL@CAHhygDo$J`*8sNM3d&GLzhTRlmCfzV>w46^bua!n5*ezK)I`Ttrdr zukq_2!mTpmt)}Mxi4P;jdWCP}U`SW|+h^hOBzIW{t-)_aEYjWj)g14J+#Fa|zaA6r zsEqgq%fE)(X$ZCSS@nQ09{cM!YAScAcJZ&Pu*kabTsr#k!9zwD;cxpb4IAJc9n1FT z!FjPiu9DA;l^dUimvJ5IBUkR3HJAviDhgGTRZed`6%U`ez#M}%YSyI<~`1@`b18U8CdeM-|~fJDlT^}hG&=V*Gq!!M)G{*;F+5Qj-G`}`{cgL!{(L+_PKCyljjlz z_{!ILn@ZuEb-Rod;fEg%Hdeth3*XLHf~|DS9UsAi{D<<%`;*!n>tIQP#JA+J;+KB) za6jj*1u>JOfh2+${C(gaF0AJHxvf%e0!xL~z_R(>&rqkiK(@fR%ESt_J zslZKs-n>lkt@rCv$>}|b*T@pes)gilZk+71;OK{a;;OLrDPvO}xM7i!q#A4`$Lt~u z|B_$Js}4V8tcsU_D_YDhk-c7j^H6}LlImA3g%7!yex<5PiD7pyMz^9h-|bm{b&X6Rp!N+TPXWcZ zvPq`s`bBWUlM+6fb&A*aBe3CK_Squ=@|8Vz+O*)3PfGjg__9S?I*s5B+Q~82@N>n| zT4Ojlt=NP-gYkWf9lTL#Ni@~RDy_3}Gi+HUyO(TyN$}h?n5WXM-UPNC{~^^3i?>|U zUkN|943h4ErBkHex8iH%dKi)*wkXNYA z{>Ff4QlWj)jm*)swrLui{L0^e{H3$SUk3KP^E?^P;nP!|e~U{2j)-Rctp(?moi9^@ zRVEuv$sC7uf2+byU+OZJ!6{F^v}wYZGrowBk4Lh%EQgJh6Bm+eKgZ-p!MSdA&uM-r zPWtB_gS{kPN09@B!VA*juZD`BXucYIe>n9RUiWnQV;R`o+4AEj_%pkT*a+gwRCHX; zS+@Ke93MZ6iK6Ab6Bm3a9{CJi%cK09gXMu=Vc{Y7zz?wZL?jcL{etMhHndOX%2CE{ zxJsCb>ptw6zRb1@mTcXSbQiW}|q#q{RHyVrM2D^ zN1e;LnZKTdhcBJ_N&YQyI_(rZCsaCmKK$u;*yR*BRz9(XoPKY^`ZV~sqMDTi%)`Co zTsqtrl=PiE{{C$S`HP>KyCm#dC~}kXSH68ReE}TD#yvvk)5|p5LAG@e45ac3b)Qd? z&wiNmAqnPm2~wAWM|{^Dqx!8eyr4)vCf&Rx9Ij^4sipkt#hoWZ;qRQ%hsj^!8_Gjq zf#vnhRDP_zrV;r>WNkCmkKO#TSs2{NH~$S?Pl*MWR0PbzKiz=be&F=Nqj2a0tp;k3 z?9HN&V_;zczX#;Mw%VJRf{(l-{Bg4!A{PUlm{~xqKtWdZM z2SeJ-zipzlEUV+xA1~8mi%8DTty`wIeo&b+nGIow*~4%cuYbR1bwhK!x6q#H@;~H$ ze&x_@TX@Ta2kR*u)pAbcm@%Ab*czV-UvRm%PZ(|w+cE7doG7s-dk#ErBhTV&*z5Z( zm5r!HdvxEs8?bnFr71c0PTV*0_KsD?tKb>?ZH8{aSJ!4&u7J5-RXCNy?bib{$%Bhy z{1`gk_KJ9xx=;l6F~P)%Oh z2iW<^k6st}0OzsgJ@B5*MM}Q#OxtxLLvU(F%U1HN&?-T)$ynqwKX|Ga`kygPI{;sf z`)okz{rd;*9)TyWeF`6hf35n_N@iKvGn>3$NWYJ)<6_B97GUFPA#eOKHZ}kse860L z5*C@^YV{2^AME<$df5$@QZG>EgYx zVs~%>`FmKn5ZTjg+ZFQF$&^19TYdR%5q#LqVLGMDbga^Bf`^4hE|QO&sS6g-$PJsr|M--o<+A56tKP#&%D?FD+DdYQhRI^8&s;7BxfYnEkWso1w&;FX^%l0a zYF$PC?&~kv3XjZASx6T6&gMhjG^fUzEY`;qPv%V?-$1sU?)knA_FOBg@fDsicl(o0 zcxkZvQ7V7a^W3s7xX|?1GIFt3hC(l_fP3RlaL$U*cm1%VcAdPJ15~W*?mD> zu%N#_&vcCchy|_@o#f1C*}U)rh4x1s@C?($Q9d{~@pS@uP2J%1d9X>{3k~w6c}hAm zFsF;VbQ>H!E4@t(9-Ef8z7=+v-)d|GXL-C5r19B!=?BAVIBA})LaPy(t zjLopU67w(eG{@Y)MtDJaP^dY~^g}MZ9GSsgZ0tCJ#!Z#Pk+`W_#YjeI;Goqzwit(6?`Cg){OY5q26UK%Ged&Y6zhdG-o3OV7AHvC3+VN*xBWpw=F zFXKtoa6n&bG#AWn9-u{*_juY&_1VC|m3ap~!tkSC5sqe9clcdE%$_T-lq^G=CoIReW-~g4ki%ZHb0~UI|PB#@k(f<5II;?E? zboDX#?Ae>qv|b$RFk7<|wqW1rN2}3a*PDOZ@MtP7)lgMpo6A5M)B2?QuWC%I)CDp@#j5oL(JlzRNroc=Ga+6cwU}x;Lne+aY?T&J`Al_ zFZQhGDZIMy#8N|ePVl{!C-BA>K>#`X9Mm1@{~>S?~zH=AX8y7XEDA6Z-&O(Iu~6 z4+pxW*58A5K7NXN1z*y3?XHGJcJXz-hx48NQ>x&Fnf)?Du(o5_x_oD~=WDCd3Eu641-@3gOu!-kBwt4XI>ddjL@RFEAm&xC@JxwNy zW(;x&!S9T}YmoO1dYl)Ac|FD^ufTWf`?+P|w+(ai3gDMJ?#e5`mG)8<`S4_!%po0E zsB)+`6ZVO|b-@U3VA!xG6~4Z?*=;QxuqVAb5q@~dW|0}JwPiFh0d_nle$g6kJn2<% z44$>K^@=TAo}45e1rJmk-X^bjJkA9g#>fc`P?F}%q52{D<0eoOFNieIs|uxcqH4y(VAY% z$u(_VCR^cwwl@#M;g1cE^u1uGt79($;Nu2$OcX8h`$p3|;i>4cz9uoy1D?5QnDG$O zRRveElN}_pCPLv^BbBdqz>9NMNx8vG7%t_w!#S5#UsHP)+LpF#hX>s+pVWkx$Ho+q zo10~Jw_<$sPHz*Xc+xJ}^y?mcfmL3@3I059r9O>sY26GvNBF@4lh9B&<XjbwT(6ZW4zR8Bq%66`mMfJU_eh!D9yX}&;w4YC7@xO;$LiDfl4sbz@81BkCrH$j z$J%DZSi-d%=XR2X+ZyD}VJTbQ5OPRPS=d_GJpa;Hdsv`H^%>3IMz&ph$Qvq8@*BWn zVoL1fsLu&pH2>}FHV$rqubCd+Rr__-NA*M9IUKitbK*-Adi zSFFbaFAA8PMfv9+cT=7Xw;Z>QnFHfHru)*KB%?FHB8U8Cb z*Y%dAGVmjdi8?yElQH!5$ZvdidGVx|75rS`qIf&3{$=`QvVfHvR}Rel>Rhc2EMs2h zpA9cKsQr|DwbVV$3$B?}Qn(TB8|Zmu4)atbY_^3{_>LEu!IRU|x07pSFIWr1@=Kx& z?BECIpU82;o!UCfHp8)UT;^T4%7Vy-J&v$qaaibk_+*W8Gx=S9u+npQpH|wWGc0+B zYv>+4DcQbeJM1>p#(E9*Qc~vF0mn2jw_JtiUb?p3170M);Pw@`HfW2|F4%)(Mm#zD zl4j`vc&e38mvnxNg71`b@mxmw-Vw3kIM_mHqizXo?&HFe0Bh|CvVIH)l;-s2!QC~* zD)q3#`R!{8;P-c$&NRW^pRF>;mZE;Q$Zj|5PLt>RTzmHtwl7VIBj-*GhS2pER~rwU zgSpKLv%kT&Ts)tU&uMea`Tvv~7@_IN!4V4xIR9 ze!C}pFaF@t=Ws)jLo1D+Z>6=l?J%#MV1qZDzQuy22bMC3RVMo{_?GYyUN!V_jPk3P zYbkt&w*^)vlUY>^Hj}L+-`sS8tvuz}`ru6}Op(@bvz%7K0L*!nJJ%Slxz+461iP4P z1dx?vm3ET-6DwBe!g?&<21a1EF4K?8;lTmfA3tCQ)>|feaLUo&zenNB+VgW)!@l8W zB9m~5RY05t%(hxEYZ_+doUSdZRR5;}KN7g$lv7pV{&1jj<9A+|MWu247(6wLcd);Z{ zaF`|k$r?E9 zwI`3Cuh|On1@Bj z{|IayzAE7m%;$9XVj$e)DtwFPn`+>r`h9S>rvLjuSWWC}?@suuS>0zp_`=6#hmG*a zx>qUguuNuh+Zxz&Q8>#s_+skAb`#k6rD%o&{PE5YS@M3h@H~6ify>%m55D~-UZ3LC z-p)$H`oFxmmAZKbL10X-vFd@?NDC_L4LWpAO4^ zNVFusF`Yb4UfuZFhWwIiX)1YSFfWVzuq*iB4EU7h{u7r^Fk$_s+a~ zGvQq}2RW&{$(~P~vtWzcJlW4-*079i@T-m@G*R`Q#cv*DBlDx%3x@u_V{ai{nP!wy1KIZzyJIH)c^Gf=Rf!V3^y3)&;O@>GFOCe=U}+C z@o#H?@VwJ4a;(erX3xbJ{~>n+ z_dG=fcr@$IO-~$kCjJ92E4<5I*vkuM=zhFn5T)!mk}9(Y4!CGi)(K~?DO2@^$AlvG ze}KD1*J+R?hmLI~U-FhvB71TSo43L|>YJ{T{k&r}Zo>C(9p1JNp1KOos~ZwSDSf_) zqCC>I9#rL#hs9Xg72uO+o*IO~tYVCPim>HpX~l5Z=y`9t3cN%0)pK%KzWOsYxZta1 z=pp!3z|y@Ma8bCXX$0)`!_IUWY$Y9|eHh-9)3;m)KJ-I;gnagb4!a)Q{hPfa5@xz; z;jscP<$4@=1kPo|HFsU%suFqeIM{TfVBk)850B%#czE@BX9q91 z%Ov3uS>a;L_dW1Ak?^#WaA(-4iw|7?queC{Rm-IZwgMX0No5grgjeT_KwWrT89& z!`GJkr@&ddpGRZh*smLnQsLb8Y~vH~=5Z#LG`PJ|%R2#foc8WMS*C5^b}}qdG#r-> zGkR>flnUSPE4R#m{jU{tr^DY}&M;@fx4#vXo`zT0dtWDyJ$aOS7Vhk@-g_FpIjrTI z3rjVyNS%SZ+NSL~2WK#zd`6b!$nQ80`=$tN&w?`^oz*CY3nrKb$(?I%I$eRq7CcBj z3tPmW=`4j`&QsILhCl3<3BLhfVUT@GUf8)fr5v^@4A`3kU!TU^RZ01ahB$Izjm#*s zyRflEZy|Y~K%mb9c<@@QQXZTl$7WUwuc{b$NdEAtwf6}uI_I|nMS+V}CMO!;si?qu zog=du?##XEN9p`WS8RC=d(PgppIoK7sfOn3Nk3U%a_!pQ!VdV5)VLG*Gvn58UGT5` zbQiL!=EfzT;b(>3yU5Dr^$C4&)SAEm^7Q7dYdKq{ZY>`&T(W7Nq>kwO{?B{#vVe zi;)fX-&?>Z%vBud9w5O;u;zcViPl4DZfPGqg7;4-o6=h{)eyJ zcF}m^dR@7I6SgvWRYl{Cl}XHDHXPW!YdV?3v)XPB+&j2UfyV2L%hHeL!dtI<8`F4R z-0F3J3*MMtc!I|J;45t>Zn%A3;w_pVK4Im%d0@99%Q2ciVRGk(`C#9$$vW~x?BX|q zaFvkG9`ebh;{GCV2Y3HcvVR8S8*#XMz_o?uWAXh}rzBvb%(4LT6P^bTq~L0nu`IH; zcuM_ZSof^WXL6j@iyj%cs8sAYS$Ef~QF++!q!vGUIL?_i#FvQ@qjpmZ7%-mUJ`HB|FT} zc3%l+-%MzwcokDKw8$9N<2E=&PHon%GJ%)G-q}cwUo)g=3MX7!FG-%ZyUlPN?6##w zjC^l%@pVhsDD;gu`QQxqH5=eE6MbQFrFD(bMp#L0>7U~bA9YW+gUgM0Z&3VX{n@&K zR%17D#>FS#snvOH<^Ba^Q#I!;PDuAu5IRorS+QdBt0Sxx?&m=+o&WSF)o1mNM;B*r?g zFBf#+Ua!fXeefx>s~qGe_YhvP3X6fla@cU)@d6)sTEIO?a!1DWT(ZT7#_QA{F9+Vf z-3!NAgy)b&H_e)$^_+j$D~;?D(U?kBcI-Gp?g;LM;ZttVy1wwkEyWs$#1~2ke z*DFhDf3fJffIC@Dq3P#N*wAs?DzaIh^<&zP{4yFkrv;CgN57-p&0qH~^e7&$1X<2J z#Eh$hJ9Q2tkHfxZ{sK5$w)YfS^OWl@irFG#jGg3yQ{N6=guRy83UrS(d~_}bCiQBrML7?J4G?QSE}z6S!`F<>ld)c)}PC03^Dcl zw2?3Del10Nj)*Js_fUSLfB-hyV@PGBS~kJaW95PS<@Dx=nk|sH?q-WG)sL-Rp3-ugh7g zZ;OE=7p>8Jtf#ff->L*|(|Gt&;W3k3?68@a*7*5n>jlW%afQ1sz;BqpYm)uE%LDRZ z21}cEa*xR&P1-}m$u>2T16R0YX2LP<4?4)J5*AC+o@A33^G~u8k5}U<_!D>dWpejq z9(NLa>et*ZYVU*0IVC6Iymr~}{#31< zK>ayybD#5ZSVAHCKK1|hz*cXvSY%TNjgM7jx3^OM1^v&z(fB!QctU~pT*-4^wA1*k z6<@rW%9D6&_>1Pt_iUd^+Jn7x>oOo8>)TdOdoY{q;s-Rp1b1(9PJwUu+ny#j&u!RE z*PAQgyPvEpx$_+D!Fm{Kcat0WD)ML#)+>6+f&AC`EQUEA+0v&ki8wGUC}kgnJZ5?y ziWb5zMm^t?*F2pVr*&yhz3azdnDNMaS6SGgWoy_0IIZUQQCgRD>|J&rg!yF)!sxzd zf74gV5ctL)}rqbYF5U-rktj)f{t;C3IgBY~i$s*4@{tD=v}?7VYT} zhItmYu~A(2;`_aU)@_IDKFi50MWZ~luFrpRB+_?c>V8hV$pwKY2xqisNuzvIO@0VzJruoG`Z?Bon`9isk1KgzMx-# zbYq|Wxs?9Ako6`xa^PtyIetU3P9a=-uJ=U+%#(J9MxK?Iqa%1yMlO}k=@2`tsP-DXn}1pm)n~;E zuiH0Zwai-$WOf$4iCb`L#iLmbaNXT!j@pFID`7Ep}_T7Qs8~pxG^>yCZA6*6a zKU|pi3jXOFXkHD^{8+Ei0!Q|)2q*i#WK3g2@5m*pvD5M4E*%Pd@MyfDMkS2Ll3$gC z^A4R_N99?$uFFt>?@o@+Bj41>b5VpHuE~p#UEVS5HH7auJt?YyH!KZ5uo`yJmWm|b zzBc=`8GOrUb1s>)hxzz_SZK-g^YMz6cZA2tQ=H-0&D? z_SSE+g@3qt#MHq%#%J!@3|sq&GtelVkk&79fTu?7`T(Aq9YKW~9qz-2`D`Dw zAwA}}q!-m++%q<;6*hP0O`-m}8JpwN2**G2+jJA2Hmcuv2aXFisq$1(t&TR-`P&{?XUBX9&kH$Rm^n@ z@(eHj;YM?0_a2!6a)`NZ$7T55^?Rcm;3}ujJZ12KYfs9k4|>@cPhN-H7AH%ug@3N= z`$1!xueR*A3GDgBLjTV-i1d7*F{3hL&vWuln~t-(@LbWNy)@>Bbp>?QV4HMnwsKhi zL`$|T9Ff1ao6@BncX2L&>pDaH$z?f@(goms>!bXsysBEWZ*$@AOII(Y`aC!0)8K?N z!u2g_&VA~+IfDbXv=a5E`Y#CfeaQ|xm^pY{g>Ah01LwdUVfUv|OqfU$`$*@vj+YUq z_V{c2{L=u{aI2J(GXxLbATDVuS3ncl(VRF)4T zYxFWg`m@Y`tocibWkgrf*Wq{7(iqVVhs?Ok#sdFTG5bJXxx@GPB(CD-z=_p8@J6w;tZ_In`C$!tZ?nF{FkI2T z{o*Hh)7}N2zrod8P9=SYr&{5KzleS z^k5-1hL_|d?hQZn;f;rWi%|KiR?A*CfN!+4y&x~YJbBy@)_r!1k=oCqK#O%1ocmn& z5Hs3$72hsr6WA`vNuCE*o>{(O4V=yzH(v_2u$5Y33ZF}ro>YfD3WZh8V3v~~mQsI~ zYM7;yul3jj=)pYa_y@=u#l2=mu;Zw;1&y+2nRU7*a7*%=)8r+k+@g-~)F>RD<`cRL zW^q>yrSzKlg+&o?@cADr$g<0Q1XJO%RTX+#^kP6L9csotJ(7-bUoE_&&r;`gPGMQ=z673Xf(Wr%^n`}q4pS0aPfK% zU(^jQr}hfqy|Mf=oHFCA5ZTXv)BZtt`pEZ7E8&f1sfT~UAA9@d$U_!JKYznYFW2ld zg6m=<8K-0Rl?c}|Qhz9X-mOcsF|xh;BlX|Z?391BP>k%^5U`F3=`jm$KBn=J{O!PM zvctUk8nWNR>YbA~e`AqE+A{bpx5@ioaCLoILo1Z!y)e08|E=nM;=h|vm19K++R8xh^`mcYw4>K$%7ANZqkMLfB z?ILxbE5m2%L}d!#6@6u_E~SV}*^fAQU1cwhVI5wf-^dmj19rd6kCJZ>EjdPMQUGxo(<@=^Ca znq-cZcl-XNFR4?Y_`7+ET@JymS=^;$>FS3`0r1pn z^w;&~pO#0>rRtiR|MvaA%YVE7XJYVVV4utQ6)*p{{)7dGdvY)wGXC4I4tRNEPfk)d zx8ADXU+!9bhOH_UN;REkPn zn>#H{37)FORP9W}&4xvhF6OWF?hKvZ;a-6-ta@s#dMf;M$-YSP4`I;{%y7@I>3inE zwjAd5XK|HNS0^{TAUPd=$DuJ#4C#NpooHQDU%!R%It0{XO{FMj<$D@tBP+EGWOeY#z*X|8o@i+>_WW0r+j-aTPuI zdFq>9KG?os?5#c=b*KI`KP+$~jcoDngi;J(M3wdW%}GTVBa z1zbHZVWk9IX=1kA64tZU8>4jA%@t18@NiCZC3&5CD3>kFChTuS9@w)qbrW1z&1+1@ zOGWX;+rcdzwVLGn>@IUQ!xle29{S^@>BZ!Chk1v{E*CS$HCD|2X;Z&F@M|@YjWfvJP;(_BBrp_~#p~ z+vMIl-{zGt-+UpdZLr0xfX&-rUi;xCPVn@Z!vgMbpm%Q-S@FADMKC-ZW52-#j>y;^ znE~J1=_Tt1dwq==%7u%Wmo9gQH#46s&4<}575d0lGMbCd!8d1{h3b$GUN+~ zS~pXB<#*>xlQ~6_wF2Ry1zUd6@q1O5yX>d*Ma@CvO}3Z3Ff5-2D=LD{}MeTF@ zgjOy2_?1=KjX+b`7s%?4B4Y8 z!_x{L8MjF$|Eykjzyhu`-Lr%2b^I0oTFO6m`-dxB*eiL%5Z->4*NR*dD&wpJ@7yKy zj>hBl?W1*?@X%wf46^tw*N^Hj|GHOy%)-^*rwFs2s}H91lV?=~<>31VLQ}{sHNDm} zpElU?^U(RHs~Ctbgj=`Gt0kA@?l?;GTb?PZpXyhc63{0K&r=tUpz9Tnan}}sMO(t( zlAFACzT<^g-HfbKOd{0QiuLC#;NK-m4mjicnQ*I8G|4MPsvWX?!_;e+tEeM%~4VV`Ml zZA0mJRsUp4FFEt-Rv0|4Iy^fMc1`rV7Y+;ic$pN!Uo_c+Bj9BBi;pkByvyxN4#RGh z@$AL0?+%Imk#J8(C+B6jg(oNF2%NuMc=!t3m3)EmDBNP0$8Z(q#8>*G;ULyI@9BD1 z#)m&W21oC^@yFXYDO$zC$IiyNQT}2P{@ur69pTS+$^6&fD8<2*eJ*oLVc)BPZ^`@G z+dfdbZuP>b6R?43x*VPV=e2F-Ct($q1JlUII3OnH)+;jKl!Y1Dbt7v@hS~$#g9xk|05j_YWxag^I8IE25at`^XPF;No ztoTe~3C)+vTUTe5!KbWsX7<5%9DO3M!5%IlPiXu<9r*F~IxIeI$KDSx*N*tpH{cJs zH5Xdoj5F<)H(@aY>xD1j8!cuc=t`4ZZK@`roSH31yM;JA)tK_3xW>HJtC`42Cu5 zaMV=p*Hy+Hxp2n2dmrfNp0z8haHO}?;jr}<5K=AfNiQiKyM?VG2w9iFQ7XTIWRCt*+7@h@~0V|lCl z$p=Okg{8u)i;NYsV9qj!mTWlZSIf4u@HDoJUwLro8p&(quO}?Ei(tu|7ZKU;iPJB` zF2cS0g>IAOZ1Srw!%C~n7U#e|g$z7*;fG;#0{$#- zdgC%2t5Dqk3Jw^E+;au4FgURCH>IC`>~RO?I$@#AK&}6|rILJ@eO>Q)Sj0qN_gz@^ zN1I6zoHg6qgUrdSw}zZ(=CPEFF?sGHyz`F1Eb@v4nc5}rmfu=W!se!n4oYdP$A;of)hx+Hte+i={h!R7bhkL;h9lEWi+ zsFH&=upFp{6(+BKA-fI;WRc%jtQsUI?8}XQ2s5m>S$7|v8f{af?D5L@>5q^;S4{X( zE~WeF1W^7PNnd=(n&*$yR>1+&87pn!Je50!bpESCt*!KoN=f^WrQ}-^Yu1tXD00z4sNRz@Px;L;xY7}j&9yg9e9CS~%w{|CPR|F5^lF-0$GzEKG1Mi|)e@MX#v!hpoKsDl&+ z*F;;hjl*ltH*6V(Kddq7qx9Ef+WvIgu;Ij~b_yF0*1kwFhVzFE8_8Sexy-SHcR7k$ zk{gCZ18G|-yJ7bGpK##WQdJ+=I&@zRg(39@w>`8C4mg`OV+8&+N70eC$uUXw55L2g zx0C3BU(>A{@G(l|$_DeIo5d#k|J6K3|`o%9355K%JQ+ycy9_-RYw-o`x-f?76 z1C6{?_T!bx-V!M<6wBCmh6?a+$a~8ymCJ47yL9!=SC5%=IiW2`5(9PG<^b_ z{ObHe7LNBDd=6J;`;Jg~Et_yId;tr|+s09OwlsZQR|6}R8GNStU<_J#{1yCaU?s~m zEF?2C-U@Hrrc=d)#k+dalAe%tbX7PwT9N8}UyV^0wu8{8~3 z(Af*0IU+TS9iH_v&Ga+ewQE%gS?qY${6V-r%`k%lc4Fwr}F!O}+;RPn-{{Pxb%@J5~ei}+y+yM`$SL9`dGO)dhk zPE>fvEVwG$Bx@c#X1=1F9WGq&b8J5B5V?kd7ar^6xGD@QzWY?j4}VoM=v@FO%Uyp& zZg}_lFTWC4ikSsXgYxY~5T2XUG_V!E>KT}-0+;UHV7(I-^0^?U2CrG%se1$tz1b_c z5^j7xz;_Pzm(jYo2Hwlt9F+{84wNe~g-6808>is3=n2Vv@UM!upJrfY_vd>Kz+;}w zJkxMwgv*FKtaMFDa{@kfQLxq%K5xM;*9zadlso$<>>P4ds}ZhyrSggV-f6dK9nAMQ z2I1iQf-icIU^=A~^iET0eywDVklP^f^{Ol%a56^<4L8I8ftBBDwL7 z-SPQta{T7}obtNNK9oP$@onV3zYe!jk3;uHt7WSq4423J^~h)jeZ-EF)@ z=G?=3G70XCx}HJaIw$`MS)#kf%yxkP?g%`5_q+aWIAgWgM{?3F6XiRw z;?wcJ!i}5a*-~H)Q$IUuKU%fbR;e)Go$~e}_;b?2(`m5b>Zg0Yz|C7&-loIpiBT2( zuxf@kV<)6Og8__b2wWTO{tU+8=Zb2f10zyaSH9me2{OPn`y z;e5#revBv&CUusrcVUUPRzD7y!Tn7rh4-92R?G!Imo60`FZV3CH3zma$l@YD`TnMn z+NZN!m~wp512*a`L|zO%Y)U=-rcqse(~bEe?BarnCB}FN4p)yQZEIV}cOJgdk%VJdB;MVJuU=EOmWEk+M$-%7z4w`S ztHALsVo?v_;pM%eT5xS?dCntvTY9jK9;{rmR+BdW_U^Z2HiZA)47`{0qR|+hEE)=< z@Z_Y$c^0t7Q{2c?o&NR3}^(V#Gl}_z@@v2)n z8L;9q=is~W^l2M&YA?l~&$Zrz#S_09QhQP#XfB}pgReJ-pW2&$l<=`CIA7}8#{_tn zX0UKI>|ZaRPhPM+Ca4cqW%ZA|1{;q{7IVyBsW&3y_~$%)an0&hNjPop5xvv!rA^C= zWMDIgG09VKnik7jS@`=0(_JBOivMJx99;8i9xF`!Y?k&U~PuGmp)lV4nFiSs}*K!TG3zymzl`S{SFs~iASu1`;HiE zGh)+wL(iua#GIl z3M^u=^}{k)a{po7NLYB+tyN^r(Ag~4V3pBZ;J_XSyQbgR zOlI_H{B{$z+xX?yQh1p6F+(yuDbgcGmJQp~avSF8D~VnLpSjlbFcpq&+b|^$rwk|S zWx#7nbKJ>sUh^WeV8(MyihudMv|K(svGh!+9KxNyjJn=~)iSg1I<=d$oZ zPp?P{uLxfqAOk;3Jl2&5JFXNMl7wvzFFZkB80sfUe%8%wlM64ualAtujt(C9m;zV& zFr+VpJum2GT!nj&*(vbBl_gT~RG#_C9V*=L;tT%A&%zySZ?rk#4$a$(0^ob=w)oNf zC$GP_!5@y#KJGsYmeqTD`v`3HQf~tTyo<$F(hL5u@&0|951(cA;`M}cFRL%7`Bz4k zZlfD~e&CBA&DUa%6))Wn$BYzY()^Ee`aq2fymcznk?gd1R{K7M&`oR`fnPxD73 z(V~;a@UNLOiz$8f7mFseV1N00Z)tuQZZ!McGT7!!cI6EGMt1dVarkDBU@XlSEj(A= z5P^@3>y}V?7$ykK2*buTp9N_CXqO;fHXqKv-5*TORG7Xg059LcBt_*Jy0JigF1*{| z$_Uvu;fn+>yi4^=3@f~5-!@h9PLHppWV@UvC&}HM;qGj(%^s8Ue6Z^4=f>>txd5@%ZO2b!X9&%IvChwS9O7~~rHRkwX_}Sj&ymWsbFc5$B70zUy z3M7kaq;`LXCFdV#rT#!YqhgE=y7W)yngfu@(;F6RxK49(BuyFX6Td(HOFfl$A^s+^|1+H#wf`?WJdM zNp4IMo&Vt}x0NOEa@Kowbo~$g{=pC7lpWpTWM!Wm?L2sKhnNSY|K|Dq-Py2HjhH^= zcWceci&=2ZGWH1Se+K#8cVxo$xo_u@+sjpj(qVm(7k8-tndTFyxC8f^JQ<|&bsuV9 za0`xY_i?21*A~6Ydkt25vnrPQ8|K!75|Qx27gxln{=_^=4_t=j++N>yVARX+ItUQiMS8EySd;F z^*_?vct0P4k3W%)ru%iXlZ>?+EEQrgkNO+MYK~6_;1NE4Ch8ByMlH(7r`6`yQGc;y ze}yi^H|fdSMe9`__8As$*!RlmO055LXia><_ngQv{M%mEegks7Y2U99_*0Qk6nTDO zozrz#Y+3pmI!Bb{blhGoVfI`36+56(oHviqUwuSnrp7!z{8lwxcb@o!9Q}`@Bg6=8fg9qctv1@LAB%8ijl0<$J zul$tCL1%!u~-|%W2P}GHc*MJ-oZ(=glGbMd7<& zHt^U7J^KMzXev5!BRmzV71{{XEd98ueXRhcqQ+fxdOX%w?g**P7&UgbK z8f<(l4_D>|NRs`wFF7m=_g7up^%~9zj%b&HXP2#WXn-T1JZ`2jO3C= zj4wx{!)xJ|{mSEl@W4ykIb?hb_WF772TilO8kqa@PdOTMV!zBPB1@PgESUo@N?uY( zmfW%2b{g$%MUxAyU2{IieAlu7nFtBQG0k7JaCB>&am0uN%mT|jFka?w8BQK z6JG!0pwk%ESaHIdcge#K3hKYYZ&Ec|$!nHeJ^2}yH{B@E1%<15WX*X+L1gaaA|WP9M8xXO6Kxjb2c01 ze60DMeDFJ~S|ZH*`_i>;ihuOr&+G7Ofi{jF_)l-%y)d}=YmFfJ#f{qRb?^hm3uo`c z#Rnhdl2xYWdy|hmcV27;cb}ept^oel^R9+`l*`P7e7)v2H^qOF_i+WeHY>CH4fZs) zMBS4Xm8^%$b9mkb!3)1JUn_yXRjPCQ!(ZR`ttf-1b_vRmrIyY}T>jk`MS$+Xt-&2@c4r@!Dsi#MqYXnU_YGGef8wCol zlJ!_m_4VNMMIL&TIVo)s{S&@E_u|HII8EbF+i&>H>esRnaLS)kKGa^)SenZt;o5N3 z2yXa=>AQ>9;B$7fZVSWizIjs7@RsUh%CyE^yt?LO49u^}okwf%z2zGcV`0l9PaT)R zufH~(h=cbY59CpS|AhJ*#lxbDw)v^Ug}uwUZ^E<0tVdVEZ|956PJoXr%JMaYrFHhN zPJ}&n%xYT?C-F2+CBY6HJ$@GO&|I7FWSDCvTx z=aN%4@WoMOwG_D9L2&O*Skq0XITLO$AD+Dnju#U(&w_(%Vn32+yxx5xUw2^Gy%*-V z`6fLV{+RH`jphJiDPt9X8pq`(Xh?@xw*1|F6pTvth$!SA3}d zv9yV0Wrx#NJ#eS~Mr6NL3kw`9ZKO~A@mZPUI?S-b{zvI#eaT;JWQXkNXXJGut3w%K zr7taCs6UE*`kvzt>XTW`Qjq!|CJxiuNjSD{Rw4QA^o8qm{|{ae^r8N!>;mHezL7_- z;N7o3)c^PeogV6efB65pLH&=HcJA{|_`K7|G8$iwSWc!k!2-X|C{q7Z)Vju%?(f59 z#$Tzwc@~|j`U-v&Q0`Cnqjt>oDe~=^b+^c;mLEO*4z>uMdPH`1dv~t|{yoZ4O7_l7 z6zqjLrcKSsol$uigK+)p06FsHPuYi*{?_98gLJ*wQ^9}buk1?iBeKi9>0TZP+`aj{kyL z?tRuEOC|bb(i&--Y5_ahxc7)72gdVnecyi4qwwNk?o~A2&$pgGKpwNqdrNCrmmcFf zva6lu~iQ{Dd_&1rHaBql9@(Va5;MT+l&MzMD!{{lj%z9d_m##l!a_$K%vFx06 z8T?2`JtiN%A6Y&t5!RhM*FFQDY{qB7;F!H_p6T$(m2;e_ypEW@ElPt=^!9~Bzz;3? zN2x#P$rn9Bd!If!OUOM>s;ZV73wRK;G&)PZ0Xg$YG?OT39yH3k0!Z9;+aky z9P(SLpT-ZHwPIgs54Y|Mdmj19-V2g9VCTxK>f|qKGX7C;sY|6jy$Ut&qORUWSjsXY zi(Um1w9Jq{4W~<1-lkWR7=IOSJqa&TI(dd(9U5A%-Q^2kKh<}ZUPU_S)YNbYZq7}9 zyc^d0XmjHLEb&`6m|jK7TEeMGd(v5}e@yLy<5GR)cfs3uHT21w+cFupz+qcG-t2&P z%MO%ofJ2m{-*1N}{R8W1{LR`V8b_9^`+qSQ;eBSX zdR9ruVR+t<>uF=S_Np-7Uf9lO>rW#%q1t5MPB`vftvy*}<+=b{a>d(XL%1aQNDe&{ z-msPVwgFtW>T9$*Y_@OLIX(E|W#iK2aMqf#23>fu{78rlJaTkj6 z5lmWwVrG!Szm5Am&Y?2>XPMLY1KRX!b2p*y__|%;x-sIYnzwPa!1AFP;bgDt%ceVF z%UPS9OyLJdUBtU!39&9+GgwqB%CiIJOIBUH4*vPafQ{BhC(burCL3Sv8GQ#ke{y_B zwsntCLIkXI7It z4aUyHQKZCIXnKW7#@(z386i&r(ymRPvO~>AA^=ky||64d=9}7VE&#vWs@~!(Z2V&shz# zsvUSp>!InSgR1)Q=ZuxbWb1XMK8Em(;kAn7Lnfm(YheNRsUx&rQu-M_M0FNxnY@VR z-yS7g&L*&dY|06mPx0i)dXqzs-q&q~YuInCC0Ewh#nAjHqJcYwjvwP*mt6(#5Hh|_ z*VCJ;DnjGK!8KiCYhYHs(%V!%$(!7?^k8x3I^+BB@8M2sO8>gk{r5BBq2!i*D`0lE zp^vxW#%pS9+Hj86>Gii@SZLr z=e|9OSApFUV@k+5j81k`AJ18vn`!;k6a4Ur63nD6$w=p4J0+k%u0Ai`nF7zQQ`<%L zS^747YdW0dxFnzIdt=GBOiFLy4r_jL@7X%z;~T)=827*}izu z=614hA1_3^^yp{5Kxtan-In+e=2&grOfJjNta}W965DJ-dDy1zbcN;+itz^+>A6u! z5%bq_ICi`HdTLW67i|vHp4-W;K1M2oWXI!nPvND3pLb9h$*wq6K*xUw?2aM7i5GCC zIo0=NH|9~9HV3cdFM>7NZAHmhQ>=aW;5C`S6BPeU9rL|x*lV~{jl6xfhaT;tis!$J zqw9@Z2a3@ig|98^0Hv>}{9FwkpPn`lL;3kAA7+ z!fTQTjcMM)=Et;QE{qSXZr6d;W-8ff@BhN2Q`>5|@zg*tnPblp1DY2n1btgi&jRdk zM#<7VYRe|?HS{dNiK+IBDO`0Yria{-R_{mi;F7Y+_mw)MYH(1)WZGh~UnRA8a`NQX~PLnS?b@3d6t++D(^7j0b zTYTV~Qk(chDZY8D%`w z%fol3f0~EEP0Z;{WW{Y}{B(WChuVruVV*fIQ-N^Ful!E3i&OfW!!YaRVK%z&*)B>+ zyTh%yjIQJgVToN-zL!qk-$_2c<(fI|!*MYrq$t3Lm6P>tVXZyuGnT-McN+p4zn$F5{beLFw6UQl(Dqr+K`^mF%H9{KpJ_`|2epIW{GBh}!eg2NT_tzxz6| z^L63dL;1oKE~U(*q75_c`xro$Va}IW1}hBPAEWCre36rugPoh%St)q!z4w*Yz+D6aX(*AsXM83w9%Sv9mF6u_{BlbT9yU~ET!wKOGG46f3hz!;{&B{ zQ2I(N7kuOOgK94L+2qt-@`jAE>%8#Q*W;_m|Lm_8q7Qp8+H!^7Ppm&QZ!xW{ul~84 zc^uBOQv7SJy}LCijNV7wVV0{&;bGz-awJ^^#;D6gTtgg3#d5ps|5>H0x(Ka=vF zJ+Q(VGa<5}{Lu_Y*z)!rce-BmpO3fbV?QOn9gUQpGqpy- zl>Px`3oR$OUQT%fS;_gPEnTlF%SwdYHgme2K6cdRA{9va56D@0%@sCYyY2^-*Np+Y z_muvt49CsL-IlLDdBVPa=bNc~O=}Kq@`fd?%(s(OD!aLS;jQ>C67oOmOB!`({##k4 z6mdBDn#GC{hwFo35$$*CzkTtS1-PU}X+5ROJ|0Bj`_1k;Rl+?S1>eced#v1PKXmX# zUF>6+C&clucQm`AFO58b@B7OIQ~b2-P=;qPORC5^if?*Lwzmp?&g*}<0>1iS*J0XU zc(8Kcf^zszOY9%=_<9D8r|?hJ4_35)F*s2_Mem4e)G=CC?achLH;r}n!9*K5BZ!-Rp zO7Gn23mN)Uz-xk+k3&o8l3{jqeU3>U$7*!q4^eK(4qzDwmF zkiS!#{Ll8Y0B!1^505at*XsVIBbv(SRJF!SCiGQP>R$rMjK{4{al;WmEAErm0~D_TwK(XAVN57VBUY^#wj`BqZcDe^}7*GFkR`eVlK zCs{NpzVfg4W=+lK(4JoJvbba9-2JCH$On3Y!r0(8pB?Kdeu(IxBE2W+HTUWtN{^bS z?Bq|_V*JK8vQg=#7<%tBY{7Ib?b*pXUkv>QXY^I*lGknO?56jGUteKvrTi`X+-FTL zZsIvlHVlY!rTDJu;p$W#dp2DarT0KZpPe?O@_OVp97YZpzQ#`e+N0`1*J~UN`a&%984Tm}p!X;PxW9U9wl<>^% zFudxgKv)WVxoX7=AK1^u?PW47H+9IL{P;lIfp}PTg^CNs*U?wp5(n2z);1r4d3^H? z$jm$3j+144i?R~nb@REF(LP(*!M#y;V3E1rzI6S6ruTn)|6fHzQx)I;|6l$(TrH=+ ze;w{$-~Z3qz<|I1{`t2A{w;xjOW@xU__qZ9ErEYa;NKGXw*>zGR|4mj2D@=HMEvLH z*VmSEI~M6_=rI?h{LIzY(EFfcw7<>(PtqUN_|02`)fp=?OW!TUNWT+`{>K#m8O-6A z+V?+VxAT6Rc7%&7JEQ1m_MLYY?Skzb9R**(^QU&VZ-m#ghwW^D6Al~xu!3(${(eYq z^H%S$fOX|oXuO6M#W!DF16M8@<$4R7Uw$O039s8<{jCZ9DHgj{4gU3+|9Ue#+iU2} zA~-9b`Bew}-MOb&n2wiU{j`(3Mr%j_USsRDts9me=E>xRg&zr4zK8wJ=QqfsXBg!7Zx^k zPrz9vD)C=nzOr>gWAK4Fqr(I6o!|Qo55d;zX_vpk0y952x?xXVk>DRNtE1KVHhApY zVZKq=R@+9h3GO@bsQ)KiU^|vj4;TFK<(_~Y)HeUDf*X0hDF1)2!<4pTNVlNm0!3p5sfEAHeVLzu{nq|85m8Id^$*z`1J#Pf{!S z5_oDYC)^Y1D@XAQe*7q&4I6cP2^Yhys_k#M;jaZxf0a`BT(c@3Snban<_g&L-M%|> z;l_izjjG}90Jg_`aJ9hm`UZHG;h8`D@GQMg4_n}8^}@5L6^^}?j_raK4rqFkgBj*= z^}>I*(xQ}8uLj_Tu_zM?@3<(#J_M)h25CU`@}juTH`mn*_eK z!4a2~wj6`=#!qq3{kD7q-#j0f+d@Q@?$4uwlZxJOV5jbjH?UIpk*Y*TbK;s4XBfxMa^K_sukIb%&F?-yfy^LP|qoqbqD^F7}T4lc%@%g!aP` znjieg|LlMM*Y&@)3Vs2=fBXIaD*xyDe^wv^{{H*t-xBz@1pdD+f$M(3?%WKyCjaq$ zJM0U0)Ir$lY15_4{n5~s`@Ut!Cbk=1=hpMekSUY%g#F9HidJ( z>4}nWvwz?=f`bn*oN|RfiXXxljqyOnuxdZddC0(*;xpVH?oer`u9T*PLcM$Rh!w?fO9jHW>fh*yx?L?HX01%CY!(8 zwBt8Cc4Fl(^3jsq=ZvVo>yOr?QTa|-u^;4wRV*$oruxwPzSCw7Z2I!XU*5pmrp5;s zu4odY@Ohk~cLd?O6Msa>dnJBxE`WG~c^ z9(yc=g-fHBQTmS^96Lb1!OyycoWwo&mzQ7oE=!h~yjw%zE7#uBq5QjDZHQY0=j2vu zQu*F_wXIMTK3;dUZXaBk*Xb?>i-y$P-2;cUnjRsau<#Ejf0X?`Ko-1Od%y|iul%`s zF>IUVV&w?ChMcS+m)!WMv>RSt|J6nu&Z+#(49f%AH@aK#68{mt-qttYR^+B?oH z+yrmRGIx}NCEO#vSi@GUv&+b-{ktoyU<2Ne7Z0Wm zxP5O~hy`3RBRWYwXWQqx0p>os`0`SC*ES=4bGT2tMO*>)NEy&s4<9-nQ%)ANijrCf zpPQYxdO2*J8X9K|Z&GxaA}?ML?6sEsH6c(5J|vgE-UyaS3E@$O3yRiB8^ZaUBZJ5* zE7%y;z*BD;TvgzKbngdx@WC$MX0jZ!(hXgTA202z3Lh=cJ-QlhmXRJNH{Q3iTm|cQ z{kW(GzYz2lSqX11-zA_9_xUb)uLEbr`Nfhirg)}l!%WShk{a-u^oC*Oth zIU6)#hfA+@G~uN9!NnS||JkXBWU0`*qiS%`xuHFJ@Em3#UJ2Mk*8T_C-hKZ2#c<%~ zW?Lipv5eqlA=t~2pKmREEBDu~`S7DU>+|G~E!J{^@Vp&eOvdm=O%sNBu$)hz7kSRr z&kg)=llclQGq_Q$HE0f8Hoz85e$+50o*S;+95ZVJyxvb@k_FbcOw1z7nBCaP410)H zoV0)$T>k84f=$fgO)cRm25%n*`0(Kp5i6J}N5T6KMw8heRx(+`$2CVSrr^u7-f)qv z?#1enZ3-iwl2dkAYfr*qM>=IT!t#9alN0biN2i1}x*9ZEDGi?cYqZ*PX1lH_tQz9> zfkrPi4v!!zFS`%g9CZAp&Y(}aa9)?G9{HS-qni%AN$ZyUG9?`Gi6xXnL~!?sr>n#ppk72Zy8k#%Gt)yGn~8(UVv<#x3z zslNPziWX|ZFH_&2BD=WXOj3cpQ(PaCPrRsQm4hGGu?Eb7N1ktyl7vra1zaOv=5n7X z>caZ9bXx$m2h#xKf_&Jt>cJHZ7`0Rs}VC|y`JK156jrYSR zF^d`3jkTN&D;=^}`UZBI%cx21`R`dy5@C zUFC&8Ej@JdF}zc&{t_R&WRJk^GB`HRFoy0QA-RuL@8EESujX_=rmkF4IS6lAv@&-g z%*)E;^c}u@MEk}f_<-r!*&;~q*WW!_GO(h%8M7EHXRQ8%yieoSD+$>7{=8yYSZsU1 z7j2kP*883UEPq=fX%!sx>)U%p_|3Vw-}T_+Rqaa4VGWU2+-u;0vvpZYaE;6FNU}%I ztZ`L1Qk_@B0A5u&i<|nN+fALz^kJXPW*4b{(qCayv=kn{xqS!q?>dfwCuCsu!|`=A zz6|>a77M{zYKi(zuwZ(oi2$6j_;Ur#cfPqfYtDo9wV!3ud}n=FlDjB8_Xwlu0eG{f zLKEfB(Qmy0+1ZiDRRK;9mAXywLtBatQTnn?`c^r^3T^M3*TE-~LwLxsS(%bHaMB)W zA-Z11@z_>dIKlsDIvrnD5VVuRMHAb3J>fw%Wri)V&2)Vh%{P;{9FCE>?PiUT&6=bV zs6GC9=W&SUug`jXPKKdr!e?I@8HA|9#%YoAxKmPsmZwdTc0{>?Tge?s|h~FUfpHCFpTHg!AaBJ&b*eSS< zW3IN|u-4n8Ro+;m=sBhS!q5MFqTqrvudZ9p`eKf@o`%%QLW;fkn2~1%{P)q)Zuf>F zV6D9oJh})szq>}M6<0YY?_+2Hf6t5>FM;)P{9cjAPxL9@hj;WPsjPulin~Z=z^T5> za)$7iuC?K@u*Q~8>(|16r+Q53g}yP&&vQtPa?!w;2QPflmxDPfiLoUe)NU&=bSnE4L;VxDR>+<`BC(641PUob~+Fa|2D?Kf&8%S zzAt?N<~Vg}fdtHyILLh!W~y~dI|?5XO5!en_qkuOPlF40IZZx?9e+BSWWymsQ>hhj zQMO=W4qQ{?AXy2oEq01}41caW6kh|csgsX+3fFH5|5yh%yU4Xv!$YF2H($dZGlBi& z(7k?5xftHEbGCLTy!v-mo*eA@@K-rG?CwccW%%nBN5d{S+T+wKE!eclt&aTWgXhpH zc-Be}u5LK@<lbN$gg-HES$z^7JFjw% zJUaMx$!S>J=FAwG<@%YM=i%htUI#zH>q5JXQ{X-u4YfY_#8lhQESTZr*EsV1y!(Fl zVOJeZ)qZ$QNX+sQSX5_C16k~MY)>V8Wv8siXILn{>t;Qi*Lk1g3;bu%m;Ej9ii3VP z$!el^d3q?E%Taj%-n8#}!x#AK`Q9?}aB)fT2plr*x_J<8n%t#34&x2OeDd6dlXn*I zYU^1|CovDh_4@rslwt2imKWdPGqsP;>cf*KcHa3852wuT*$SKQoy#%;H^!K5-v{e5 zU2`B;eGyiThR^TuY#oKe4aD+4!$Vom*HJIRD%NxKC;WG>A{+ea+5}v|IxC98<#t@` znt~a3ZofeOdiDA3S?GtSMaMyl5 z7x?Xw<)7((K7V$xwj-?j#LJC5n4fV|7Z&9n$ghHzE6u+&fclXTxM%nbPH_*^dI}2% zB`zq1)8^G*D1{5eOMaJ7xS!Hk9PH)0aK&R-O*%Q_EL?5rck>aP)tt z?wFzW>vX}c;UVm0-1OiSg}ZJIAwPY;ox=g%tr*vJ6aM_|cAqHxlj)Oy2VAN6YBmqd zKRlA{2p<<5Hkii!e&L{@^cI-qc6`cjIC!FM%o@J(NN&zgSe$cSgC)%I&NpfZ{#vu# z+#HS+D0x8rjbh5hG3w9vyBr;V2~VE%w^|L$Cu|v@{;lYD%6xK{v&Ppdcps<#dm3;4 zIsW`_GfH(e4FvtSGfHLkzh{&ovx7ak8BRO@$A-4!=^G=DFJLQ^U%prIA|8nzsBUo$ zz!u4VG44S8{LkTXK88#8Gqn{@an#?jC$1Y@CuiPI>8GQgZ-2&63XjxYDRzUOIA~}; zfkPJ;ZTEoxzN+j7g@c~36_1d>Glbtdf5zVjR=d? z_spE=ai8q(q3HZ9#mN`q|U%&I?y0K6jYQLM2@e;cF)|u9A0)esLa0dbjqkjHmKBw$LTN z8D5o8!%Y5X`TlRsK}AzTMdiPK!1(_xFwTesdvG&cWdD!m(5>>y_dpGPk*H4T-Ktvb z=rm_+zN?S%gspJ{7oL3nXLC?Ob69M0!P)__f4iK^q}aAQUo&t1A4eC6=`tz9-kl0U zc?j?C5NlcrzrV_3M4oJNwpt83CA+zjBUG;~Aj^J!=T5%i#G1+t-{e$~%!l(IPkfpU zZw_@(A&2g`Ry>7NKQq2iK%U;YVZ{g>F5Ve%4^GgKSl$mOMRlYVzzrhdZtfs)GA!WA)#{R=)TKDp*(|##RsM?=#{uqb~Fpj?b$*qnrtUzLX@_2YWB>@qYwQt*Sio9=1L` zpP?M?aO4*3gg=Lyl)r$#uAFdehySi!(@74QHh4+uW|<0vbI9?oX@P52=C(YBpCu*N zy@S_Ad~Krh?{Yh<@R#kfEOO!94*X|dBRo6wkW@C@c`Tr}0siVWvLqd5%JI5h4~tyf zoEQN|*s-)zc^vKho_YjMS$FnF8T{sku{+uQ==b;JB^;+5$XrQr9b~(m+4=k7$7e^w zAH&yXo_unKL-U4ni(##r40BiAyr94G&?z5g$_r>c^&n!5Ub z{rmq^l>hFnX{pmU8_zY^Zn1MVtG{9DkHF8=igO$>t9* zdy?XJF1W0Pdvg!0GTAo44J$o2N_!9ANq>Hx2VRlBUX1)Z%FTE#{6aDDSuzswsvoYoge-xCXXy|(YJ?7zCHQNW>@5=$zp+4f7$5zysRDY-Q&@BDSlb{ ztBnq@@H;1aa&Tj`n-je4lXxRt&njY8`ySY8C^w3{L${U319oIGm_y|uuX@z!2t0kK zHK-kq77y9y2M6^m`P~9XWq0oOhX;~Nn8|XfQ`^a&tE}fW!xnocoXFOXBORJxp^+bA z~< zmUe$(F`QPEZt@)dP|H*kveBdGpuhXTtb$7;_uuI z2YFe%Ab0%w74R8W-#R~pTw@s2I{?RXG;AbqUV2yXJ3Jz^ae&UReyZMa1lDDmC?>PZ z)DDlr1(pG)$Pb=Ihfcuf6Dx|TJZ^;kR$yvgp?6Gh(zg=+xX@-3dDgeXUVnM+*;4Z2 zZ1zp$NDHmLS+HKcG$VOgka!p?+}*2cPyzoethvSp4?ouHr1Cv#>^DMQ5zg&K-cn~T z%nti0XK;}(y8paO`EOZ$NxTp~CAs2t9jveMa@#%lp4VZuN?2Hao=zS-X}`*-6y}uR z=*xlcKNa~_0t;|87m%MgyD^blLVOg+9nqsTPhj^&L1o!+Yxsqw6wZA*P?NmYwqWoX z%-E9In@Qg4TKOE_8kA8%zQjIps{$5ExZmANjLI+uUU+V65_-?tM8l{hm zbJ2`R3=+k!c>!L;> z2iQes-xg{wPx6*EIKdi&BCp8qjr3{iZ*)G!)@GOPNZi@f%!=^hy z@EM)OuH@P3F~+Ci_w2pdl%B;EaXM$=q2=pJDgB8W%if=dC%GD)QGO3<#motV6NDag zQTf;}GZDW6=l|X;Ox|eOBOD0__Am6N`c>3b){27l%-9Ubv2D_Ead3)rZJQ```K>aJa|7#*KWF>-hX*@s}R2DxjZ@*7VEdmFNQ_;Z=Svl zd+0?CJcFypZ#_ze=f3ImdI=xeT)#FE-ngv!*c*7`kML_Z;RKGDgf=+;)WzfR@B#CU zz8~T33(9uI!G(9;x_^cDKQc;=g_T{e^^U@Edum%_VAU1JZ!xy4(7WX$V|4>ge66m* z0~aXde2ah^4z~#i!*(~jr7yvPwk4K};5p3K=U;?>?u))J1~-2HQFR{vIF%ev4ln#^ zMb>8R3?pw*m|!BW*D4}|&o_iQA~?@DzF zfH&`}@gzq^zt%blOS7t1sJ>;=fAu)S6Me_IG~mdou#@ZI_sdh~E`=+`wFNf7?tEJP)Ze}G zSiXszwN6%W9?bMcL*EkKYb;qc2j*eo$tC-K=N_T)$0J*3hWz-Pk~@u8ZG#4LtzhjM zFF~h%uAdRnan-gDC`qa<&u#*|Z*G7=}%EB)7!z+E~6q~{AKVBdB1ov)Vb=DM4 zJZCOQ{$AfXVFG7YMcIH0#alw9>-yIl?vl)h@V z^L@H-P~Pnwl>Y9!ZM(@oq{n&3;o0X+_{bs;Mtlb0EAk72SHQG(6}h=yC->b7J!U7l zuQVr~34I-w2fvo=Qt5%GwRa?vcPyHH@&mjeZM!S^QBdi#kFcBnb_Q~yR61KP%yEwI z)m?aX+{bl&u(U|#U2?CTOj19*VWCJ3dF{Y<_AhW@=+Z7S?;?A*0r;@NMqxT%;f5_` zgRtHsy=~ejI^CKdw~Chac}N;rdDOCk7MAmu1)_$Kb8K z-LJ`kYQbxN!Kdy9oVW*{4L|Af8_ua)5L^Ju+!*p1hcDGz`QC@m9Cf@s0sHL{{$2>n zZM@$x319Xak$3FETFwf%O_{Egr%5RxIh8fmbpbJuHSDw^Ru+ za$$~LYWjh~4<$8^kyR|37SizHM3Qw`7vr%eU;O`p#mi2xWkiX5Nga zzzrAp{ptJ`Icq&`!NV84TIu>C&lLlc;G4gt+9-Wj_GVTmz@lNg3RCc5SAoCGHF9q$ znQ`i+FopjZ?2e%Py;obuLe}0o8bIzScF&51SB|gOr}Db3y3C(^E2?r1xlKfypKSkw zX^6`E=-Oa*Sv6<>)?`)C7ad4}exG~k&#clJLGT{ggYi4SXx;2*%lY1YPq*8m$ zjy0Oef{*))MpJwKXL}dGJ&?y^TWx@T;gjD~@Cn3Wb-x{94kwup+mcVmZ#+)(8i7aS zx5-=YKjPd9TjiywoP=j5Dzj{Z)3+F}qJHy)p{f&k$d+Rf^{YE9{O#@G@vg2d)bG{@ z$H~*Y=+Cw1OQ~P}Zt>J^1suJDg*Oxq3vmCW4aZ#gwuG!)VK=M^=j?p0Le_A2@Rj;a zquX%{$h&5g8ORy(6P;(^Xq603b$G06O#qqgQ^!^{c*W`U%zuTKb?}m(U#PxFC3IYwtqEzyI{W&wj7Qt7vGbsi|uIx4X4k z|MzY!eg1zIgDL}S12Z3f{5OBj*asiNZwUR*9X->-*IWXJ@oq!K{(g>OAy z-trTEwN@)T8aCC+&m4s7yLDg2(N+4muMNOH8@_Xe0# zG9&g5{HR%k{RONg7rZMKo~O1-`57!EQgSH`R{LRnyab+Oo}``uyFFEFc>pit`SUar z&YsbqPJ?%+Foov8ns-b2?!f#pTMp#HRR#~%#KW-+x;goTVDxnz%OFZRD z`}}{k_a5+397*55R@<8sm}tO8%Ps>*{%zC_^^!b(3N3y>2aCXhT zr1xzv)sy4Bvz4;%CS9>j+k@YcZXEfjB5(ihVSAQdB%Q0-0BOy?K%kS^8crJnWcL96|y* zGtz(L#n%y`YOTt(tN-Z^`>J)kJ%Z`=JpC;JW1IXb<{jHnr(Wob za(z04&ZJYX&vaMYlKoq}ixS?Y?;q^;mN_^wn)KA}9}j2! z&7`N<`m0u}S8pR-`1s5VZD@Iqo==Xke)G2at=6O;4gV!@JL$lZK?|cu-->>sVSTs6 zr&CzJX|wQS)@haz5fP-nT9EmK^|KFx3$-MzpLG2k>uuAVBbt-;Zq4yB{l92TI#0tx z>v`)Q>^h#C_0p{q8uR+wzS~%>5$RHKcat(nU+a3Qb2#aXZJwshB^_8mJFy|@YxO=p zGnVx1Hsy-5E^unm#^IzlOu1oYeYMQGK21o!T+zo8M*75v9u;0tR(GH2G6hJtKkC_a zmGsNU9ZIwAo7`^oR?@E))zq+F^lOPKQ%H~YELg+YS9J~U<|gg^Hul|ES;Iy8se68V zF26W@u3+8YzV(>kGvnJh#yHY}+xW6@Q=iOv^9FkUp@d_+I|LOa0uaQ$Nz) zz2uMkgU{W!HtoHCdiRa{%L8p|ih2530=~=tH@ok35aR7UC250GzJeA$w8NY$Ul^&s8peABbs4{r0U%jiiu{rluY+)p0$OQn%Xq{C|rn9BX= z>h0T8dXfHRSh3+i`rxDby^~36$BhXMA*~zLxomIJZ98AzUyby-HKQ~8kyf2=AMuK^ zJZ4FNE1mSHq_{h`Ne5l6Z(B9yEt^qq|Q(WBpNl^~0=xIvx?u zI`h4Z8gogfgzu_Wp7fHNf#X?s8iUEjNnf7yF87zDC*M5%EH~+&oY#weO?u&mUx({S zR}C#wdO7Ka^H$x_kv_P$L@(C+n*^Vv_ZWr-PVqQbkzO;f#oM>EJ*&?R-2V;fxWZLl z{!04mwUvi)KhXQun9{$HKL6wAPq?4xL78_wUy|Ot=hHaum!dZqj(_U-e7yK7 z>1IiqD%(gGs&LbNiFC~Z2~$~*ob++pNzw^tt8dy)dUKySwU3g%eY5_>9i&ao%2#D= zDL?cQ>k)fyS3E-cz|-;#xS#*M_OYplNq-$ZU^wd!!ZYh0ApPma>dSYL?h!dfwV(8t z4G)IyCT%v|%dwYquP&WtvhJL>V9i~mhn1dxn)R%ow+-WK#J&%!4Q73#o%Jieh735Y zPi9?f(u3-Jjrm#Or!85(H*xXpnWXi*E1l!^)p%!a|0(IpPvWvzzdm4!ole>|J}5W0 zZ$-NT6Q+?43J6VL9WrV6!%s-}su$jX+uL$R+yIhPR}%p5vwgq(|&%(IAkHnxPBzxl%~?cyD{0mUOxBN-@c#*S%@8Iv;88 zQMa{i^g}Y|I+x**NTyD+i7vT zL8PaBzIs4O(gCXuuNq9c#fbNJlqUTuE^!5K@5_U#J7r1Fd)xm4=O^%5=gn0~&wlsQ zK+flxt_5dSXPvUkJeBld-J#_Aq+dHD>+&^kS!dShhNO#47}9b+X;@V%ttsgn#%pK! zn%vcN%*JMt0-Y)QR-6=^+W+2QX^rCnfn;rCikk z`!|yw^O-7&_4xBsn{FfR{ne@K9J6l+=?+bTs_^nF&zIKSL;B{2gYR;@BGtZldWQ7u zA6x}GlHM|_b2UDmwwM_4q8;f&Qy(YZBi+P(rU~nk8~T*{fppf+niJcy9(-dm^Equt zo=wrDD`up>c}RMDQTwgdq?h%I?EZ*!u8#-&)Qa@{Hmy=v|D2=#Le_7;&)fYm>C~hi ziOos3EVpD6>p9b-PH{e}p1)p$j~DB9p3{Vr&U35n$rq#x$6kMmq)S|Du>2+I7~AlY zK>A^9vw5#cPb$=VS54CHmmQw5zUrwnuLkL;Rqq#gL;5jR&dqv4Si?7bJR3hgsZT}H zHLhJ6&BwdA$nTq%BW)`2!&P41qE5>@Jl{V4R^F#i5- zRNfiDeJuBuKU~4zUwr(Qm)ytF^w-zt?~{%)jX~DKvo05g zv{mv{=v%}&IHjLGE+w&da!kBE#ophUlHly!E1^%%gqVIQ{hZF2#N>GA;O;3Yed<=K zG-%MEinO?oJ+7xc!CA3)zl2Kt`#9sORIOa87zJ`B_vbj-^#=7zOmSA|ot!kpNZX~d zoe7}-{QvwJ@MplE0e=Sk8SrPop8nrOs>jUc@>viiT>ly1Y z>p|;o>sIS}>o?Y=)`iwN)|u8%tP`vm)>P|IYl=15+TH4~cDA;&Mp~O$8(M>{wXIdH z<*g;HLDmA++*YeqZw<7(vAncAvD~-ZvRt)Xu$;0Swd}X-v~0FyT2@*XTfVe>Zkb`3 zY#C=svy8M1w)C?kS-M$bEuAdUmIzA|3tH-1YFa8=%36wBKD6Ywyk{|6wB~o_SLUbY z`{wV=S?06mW99?qo#svEHRfgJh2}5JGt86BW6Un|P;-BClG$nQYHn|iG&eP)xt_VY zxq`W*xv)9EIj7lZR-4|KUYH)4?wYQfE}Bl6j+pkEwwczOR+$!?=9^}lrkW<0(oG{x zgG_x)i6)2XBU7}grKyoA#8lf<#Z=Z*%v8vf$7D6>OaaE9jn9lf7;hP`7|$7x8xIhCjNObe#tz0PV>4rzvA(f}v7)h*G06D7@jau- zC=9A;U1rFxb%7(8CaC=xk_f zh%huZgc|A?sv61}iW@#K4cZv7U0rhbKfk$$dz zrhbZkoZh1!t{ zO6We+<b=sBMueI~Ev$UUR$7|EHBeVmx zy|vx7c5NqZ8*K}1xHec@OIul6Mq5-{P@7w8(P}mCG_N#IHTN~&X|gnDHODjuG&?n$ zG;1`=Gz&FfXl7_8X~t+=nxUHhnk0==(^b=66RBycK}|hPbxj3LNljr*eoan|QKJ@b z#0&9A+!fcwMR7_T5qrfpv0khai^Y5~TTB%bM7kI$28li*Q8>g$B3iT*jYNp3EvksJ zqL?To@(8QYi2(J_>SyX7)VI`E)aTU4)d$tP)SK07iBsW;Rui+r(}s*rcv>qeN>Pzy z0)?j)86i9oWO4{kOU2oO3{_~ZENiALYf8o{JWUj5V=`2v5gCdSuBe7&s7M$Y3WkaT z#e|Zf6@@4!SaCK`RDCiOtR5MvS64B06lZNk)gnXHYbwqfWN5>xE2bJ5s#jH6R)q{T zsj{Lfk)e7O6;*)@HLyGxDpF1{Wyw&mGGwR`rO8mRQi>|6s1k}PPKJUNQ%q6CS%eJL z3sO{JGPH&d74w1OETou%iYcHhdtWj66=y!hTdRx(t?qAW9$p=~gcp&~{_8I)yu#i=7h?bMQ?HE76Cb)gtF8MW{PDvDln#mngF zFDmICrI?XqtinAadzpJU86n)m$m9_2p^9^e;v7td>J1`86$UEK0g6gdRDUv5ub-m& zDyk0|s@Gd_CM(WfWCDddNmp;dR-0jIw^>$>aLR-Z!f8=ET z$S{8th54hkGk@e{{%A$a9|dFnC>ZlcMVLP-!u-)P=8v4r9~tJ4N-}>Glldbj^G9oE z{>U(Y1aJv8H9`ZBg6br5$2DUF@I{|V*W@m zeU(Y6pZ;J#r$c7i}}+C7xPDo`J-jbAC+YOC?@kq!I(cP z!u+X)i}|A>%%4TLm_Kqdf8>lMLot~@s>l41llfB%m%^Wm`6DOuM@He##r#n)=8p{X zM{8&PXtm5AwT$_r(99nh=8x9E{835fj}-GqhWR7I{835fkD@Stq!j*K%pWO*KNs^y zYf$)eDg3#ZKdQ(4Q84C@nj1=n>M?($m_IVi9~tJ4jKZIb`J?L0A2pEqBg6dBikLrI z#{5wQ=8s}Be`J_HN&)jnt7ZO3F@IED;m^hVQ55EnmN9>{_b`7HjQOL`%%57gm_Kqd zf25c{t8g)Yfx^Z7>4b~<6T-#((Xt?A8S`foF6K`yT+AP>kNKmL%pWqjjFMU~NqWH`X#{hW zLoh}b!4wI>5CsZmC{Qp$M!^IH3I<3B=0`0UAGKh5jDq1&3uZ?x7#)jXax{X$5klcc z!G@_(3x-B3n3)`ck+BIT#wr+?K*7A|1mj{AOp8r0EE>VA7zLxE6-CFBBY@2DM-q)Ph-13q~POFbO)rAQ%L5pcRaPK`;dt z!4L!rWdT>{E|5SXN9;!aS(Sr2iC1W5$iSxQQQG$NHWidr2NGZ z)*!;#VbU)kC2TCD#7@Gn_o6W@&wc4H55v0ehG9M1VOYuD7*;x6`fV_L>@pZWy&l5i zk_by?N`D0yaoGVQzKg;J1wOzA1$hVLe;>lAZ~MWhJ5Lb%bVN+iEAD`zkXlRyspWGa zCe}jiaaQ_2fYe%5A+^qK1Xm>lcbxR+gw$T&L2936hH%qUMj$>lBR(r4{RT+4d!x+Gd~F!L{vM3p zb`V2iYh#GBo%Gj*L7qV{Xksr6ozfCRr}EQ8{I4FQ&D{lQU#bw7mOxxqQ*j5>hXJN< zU_j352;bg9IOfe~1L!{USLmL31?wK}jCGF|mgR$CaK-sBxaMUHtGOP-YWI=;5a{x1 z2y_ixk1+BWLTY{K4}}!_1W4)A5W}Y3$FP}gq(2OXBvgSReZIi3io-Fi>ig2)7}9&> zf%HD}5nT@vJ^7`-DY!bU0GGW6HV6l7&@@TMQ*b;O_MyxcdVJkIuy4F$bhS5{C5`Fl=yHtY7^O*015^D;knMxeH0t zDgU;g5OYqK<=cX*;2Llhj>3BP$6>u6E=zw0a2tLFxAiXZRS{unbLsyGQZDv`l&mNW zJ9YuXj$fDlE|C09JS1=FfH15f!iYxF9}5G{Z-xO`D=@75E6P!M>5qeqI<(K#`3AA{ zhxF&&pPdjZu0pKk3k*5;2173JTeJV}zp;^l@{s18Rz?Gh)AX?TQ#(3NoJPl)F0x(~ zSh8vaEZK4tV|UHK*uCeZKMpuRY z^jCs)&3=G&ZFXUNzeO0IvQ+wW!{#|RVDn;uac9nB+!&H(OEJNI!ir}eia-!n+`|L7r=z^%Q0cX zSJGbsj+a{u$Ll>qd+RD_Z<{LpdExZ*K5+Vr;~4X18O8=QkbWbav3vq&a(FQIqdpkh z+1vj7aAv{{I5Xu6#%{lau{(Om@|EGt{tP&CJP+DwH?waWDgD*p?7|2*yFMNrNy+Hw z?QKskIM?J6oQv3njxsCJQO=8U893Lu2Ap%Y!1yug7(Z@_jH8ANu@P{=Sqftwx-sU_ zN$D>FS8Auj71)chkvTE8bqDFM2v?$hge#p@7EWAGp!}XruH4>|L-G_O4lq2`wIBLR75u6Lmv%uyj;s%H<)nw;Ln< z4dEL)%6)^IFn-w(j9-~4{o$}`a5}6?^`N7q5gnz+OMfHSKW01ZpZE>N&CiQ*3pz@F z6WE@x0k#i&h>lV_(NXb{^tXV$v+Ka#b+^zN{1TlFw@H6XxDpx!SHdYyXc)$U_ot&3 zoH_D7oH;!g2C)YOGd)Q(o->R)=i9??ft1~51A3ckQtu`9r0FlBzX7d zj&QC)6r5|AfibI^W6au;GEOI0eA5Jr?@<1SY(@J}?|#)8Rt$@R6=R>EeNX`TJIV50 z;n1oGIJ7$y;~voW`{Y~ckAbs`lHlyxd1zNnLc4mD^xI)y-gB_8L~V>K=D@g8ankRA zBPScdk?R96u3!a>D|B7@`1(Lejwk0_&bKDO|Q+h(@_%qwc-P`<%YUFZjA|?CUT1-B=-aq|wlCY%uhj-V1R>2gH>NrGGs1ncEclY<-Afm)sbZ zbw&DTK*F%qkTALs*3)mtdIs+}h0j7Kj-4AiadI`+y0-RcTi5~T{#--x^-AL z?Gq)AN(V`et3gs^EQU7Th@nm8O*)kYdKWkby~})w_>#tK{PaYYw?RzwXozui#?U5< zseG37mxrkC;Se?G4TknTPh%U7OMeyUS$+)ktf$4gO&4L^7M-Qv6FRqCr_i}I@?rB6 zOR@P$c~ehyJ#|@ zcq%%Em6LuS_YYMGu%w&|meip8cwKs+BgQ4m`xtki>IF;RONFIDbJ0NdW>AwlfKBxV5ZYnxd^U$FwCjEC{)eAR#V{VIa#%UOrLw;Y%(*K)2f4l$B_tN;E za{r%4wf)Wgf7%6j2nY{p`b)|K1ngdCg%hiDVC?=KnDDZ?5+*>CJ(`Y3oz;Dl8zFFp z^lP(6k)_=`fDMjJ|J^7)9h{t<1lRX1#h8jTyy7oIXY}AYZ-%syaR?2!VOZ{^GL8Y# zMkm8)Lpuz;T=RFM3XL#eP;mC>O;~UO!=^5m;HdcM*n}s8XKvVgJlcJ z`o6{w`xvjT`T*RUv%tOMFb3Zqj=^_oC~;IY2Kmq)aG&UeA&shHNaJTR{tGSZ1DXt>Hh)TryGL%{A>*Vt}FfRl5ySx_j3=pU+=&M7mHzoOBZDMJK%o%6?oM9 zG5Du382m~O%2d?=Pv9BwXp=Bl9f84`Re(%gF;eiqU~ z5z?A=#n8HsFq9ry%KoP+1!>J_{C}J8u))tY=@|g;_49g2YtahQ+U3ap1#j@J9KWrq z3Tf#yR(@hZ47oKFL+*yi_UwVQaUS|L-AmWW<1n;^_YA?ucz#tQNW0kwvd<7MII%%i ze%YSZkT!TSoe8wSkZA)jWX2Kc?*#6PDd4_(6hksnF=UKe`ac5CkCdOc0z+QD!;n|r zlgiHExiAns7eB+07C&N0%g3^ve&f%;Kg__`NR2$C<(B2v!tkCiV0iB?*(bSme_bp6 zr(xKjqA+aO6|A>qCf3{Py*?iZse4aB>cKFqcYQV1yXid%_4P=EuSY8~Vfcf}F#LHT zte@Bv>-X@UTpxzvC+@-UOM0w7=O?T`U!K&f)G+d37Z`cegY~zM!umTp%69IAk>}H4 zA_5VN`QFhCW=0p^s!cRh7Y|uLLgBHVnQQjKR0gDCrn<@kCOO$RN_-Oe7Z0kKHnm{KO**k_iSS*9Qhy+j+E?<3H_d7 z!hjrdy_4Zcw+e8i_xG5fsf7u;Zqo1TQKTd|vi=<$*-nqn7!F~A+1p>>>yZmzk1l-z zN9TVGN0*erZoBQ+ZSOa7y@TM}?>E4=&*`z8@gHNt$KE@bz8>ZA^~j5_N24af@x&r< zyjLPR5A8?ikz8`UpTqH)IynB>Ep+5+PJbt)|4Z0Arwr`<>M(Xo8j9WeEKvNa?y!Hx z5ZM3ONQ~2U#5ldYtDx!$CuU576Z4Luqy3lkh+7$1zBlZtR|ob$KeT`GA^pj_Myh^r z>~vW;b|DoLEYyEw+bYYaz>&){;K=vG&~Y~$9Y4sc2-QG1@l~$u{wDj5IcVS2RF)qC zNB7=v`3Vdai+umm{G7lsXN*a)w7WJ*|0+15?hZ#R>(Ei}S9FA2m44b6 z-ro=3mU)HURu8~#Yg46v8yr4z8V+BZhq2!k#Ms;Oq<;q-oANmvTmB_>D|!yQl^84i zJK;#h+HfSaBqlt${aZhs>L481)P^3d>x6OP)WzEJtt@{84)s0{hbC7=hh;wP4@af{ zI2@kS0uC>vuF=Nym{L>k+5cJCeehS)_eWDM?#uEQ;m`v!99Bi3^B|)0Tkl!; zWjH=?8XO-n9Ubp|g^t`H%io0)QN7^ANA%cI7xVhe| zBW3aLKK;4iX=T?09_w8gtW;91lw4I zJl^ZQ_vsn%0LZu(hEVG(ggV|M(p5-Xn+$2&saLrXJu}@TOUC!{+_;}Q*BxP5@aN8g^U3i2p#kY9p@^3RXfNiSsOA+H$~{S5FtUHLK-z`~^1mbh0U3W6WK?Mn8MTZEpUy{^JxBU`LVC3jNUzlrVP+15 zSrw%JHKaE<0_o5bVg6`@1!2;E8PXmXg0$zo5mwcvr!Xf=|58W~)kAt?+NOQa5DxcI z{HmIe_SH|2w!96(!AS^5y!osJ>G>u@dLg>lKRS}0S-&I8H-z*`)giqy<^J4Lg!9rL z;Olw*?;*pI4>D{o5U!j;xF!h=*b5mz`D{D|;YkR>bMFzg7^I!iK-!gj2v7HrKUKEh z*Yp2hLwdR$(kCV&{InS1mk3#YJ7f&M0U2(J{o0Q3tNbMj*ajI_HbBPRZU}FBBL)$DqP4ePH6$%-7SJQV-J^ohm=V&F% z|3Y~?1?ffA{L| zm@^SPxxS)y()19+tI6`drUXd^PtA_tfoQ~qgu){4Av_s8jn;vuag*$uanQ(n(a;Ax z(e=R7xf){0V>GqGJQ?5D6cfk5v+X{^YmsUyPXTC%*asYsqdTJDXIR%kDV>GNZl z>830{3erB<3u(nKBYxHvaZV2D-wkOE0wJyOQN+(_*<9~W#A-8M^wz>%Y4k4t-pA=PI@bv!>JVWR(w0JvBM^ZqRFG$_wrNO;(6XI9lh+iL+{=&3f zlfXT!AZ=F#+OC1pUj)*UZz(rbZ|y+1FMoGENAsm%iibj}gw&R50h|{;X;aG_@kQE4QJ2{4jkl zJ7xJua95{p{aW-hpy@`u#7KV|NUM4j((3j=EJyou1$hdfil%P$PT<*2KPelR(7x!s zC}|I#(Otna?ni{Vw6D*XH=R|n;CkC0+&cP6Sx4>J)J4Yc25G&ii+iw^rc$9pd)pz3 z|9}7I*hrd}H+z<*igHu>z~y~;;PT<3+4tdNDu+w|d^mF`7fppR6k}@j#F#pVrGFZn zxpWrJd`Es7VHOiEuV(@#z@?tc;nI*mjA?Ghn20ZBG6uuBw9Rmiroo6AHvwbD_mF-c zQz)ob!gDH#AgUy|9MJ_X zx6O+&@7iFjO2$_WhRf$p!R7A(V?`3in!M;wf=izU!=*18V{FL;j4fS7iLd$w&ed5A z=Niw)*ouoVwrXd&USCsrjD$10?ov*}Ft$?$#&$`O<$X<2G8WEsb-|hV-WWT4J;sjo zu6Gn%J$DSQUeATG2)N5k2UbUi$5F4{*nlI49(so`rX6(3WVs50Pcz7=q_APot6 zuoUeNGiCe*aJE0t(O@sy-&{faua6bKY6)DZdjT#qNkK=^NOY9&9@;bDrfW%+@qJ9;qFN7UwL{^o^#_dUZpWA&@+Vid2`)Ds zNc&JC#@3#Lv2|rvylN|)esvp8zoVgnj?XaGIa9WCA6$snz=eJ@&`zUd?OEPK-2u4# zOA*M@WMRy}Qy4R%lq`P~E=7%pOKl@CwqpwIEBmGYBwW2U9qOFVSJ9X;y3vrT+q4eo-86~4cJY~W=X#pM%!}0=ptWWXr6B{^!-@rx5DUx)5yOXLw0S#kiB}vAMgf7 z*NcYH*pIg96o#Dfp8URo(OtiV(Y>=UwA4%tt=Lb-35U^f4j4V8D2DuE!_YwQ$y5s% z{TZ!$&Nv#UkclDX2g~@r=G&t=_|9#E(N~LPkGu;$(p;85M7}H-{bU1%tnP~;>)Oio zHi6O4qG0qdLooPoPYga@SNajgn9IPJ{9j}6x34hxgm(~XIT+LYDU4}NbNqR7(AWU) z5sb?AxSKuVFSMkF_Mx&ejvYpSS^!4RkH?S?5;3GmIq9eCd{24E7*iC3f28%kY^M1A zpZ~9AU~HsG9@0w6P4_j$q_3$$SHkem<6!twy0!}cmb!YpLsfFa@Erid55`cJ7j-%Q z@<@rVDg-0OzlIUBpCjgOiI`WO^aZ?t5ua&b#DcAGFEQxyRt7dM5GTdyNL{1xHRTp3>vBbUvBk*jH5RGRJ)bIg-*&cMifEn(#29}owr z=r2wBSHP$mqhVCX)`)A?BW8|~{vTmfyVo$Pn}=dFpucaV-`5nV8(`FxG#GWW65?vQ zwqEy2miIL^>Lf_5&=^u{yheI}0Wt2HEbnW|)TfZzY!Re(_<*iq=`o+gZ)JHOQ>m&9 zkm~vnQqzKH>P*@$kN42HA5uS?0;yjNrR)EDh%@deaa8#rb?I10U9ni1!Zq1@NVpHF z8~Q-%R_a>ZG6Zp3Pg%Yh`Jy3pdnd#*DfpMc$Er$@dWyz_oE?pLwke`_e1xh5O^LpUe2wz%}?&a1EzEg!9E|`c?UpsLBN{S0Qk@ z%OFO?(IDwxWSlR+l~x;E>9h}yp!T@D7Y#tZCEyx=gRX5KAZ(T6_5&`0Yr=YPO>?D6vhM$jDs8b1#UugYM)W>sAV1ItWQWp;E&$H;G}#Q z7H7t=`1~@?0T@!M9}KBpopvQP^@MxR9$YY_T16NVTmi$TeDJ&R|9xRd^ePzAg}PnO zw5IMPc~%kNV>Vq?ei$;!0z<~NK*)MacRCu$?P>`_XMGPt=R_e^`~S!zv62j8)=ij zEcs-6{$}!7>Gv_2vT6#P-&_UG@4JhRksZ6~#sI=k0HXHSFlFNF)4)!@R$WOPoN``Z(3s#9<=I1Da!nuqb5-eUYtnIF{| z$SPkOva09Gege+X-rEmy4lYia0~goQI`cF}XW{WO{*Q2R&r7&?ECAzotLSf);`e|0 zGw{DN17jnt@{m?oX`pIW_QRm7d!(X$Qy|SDeqH)^!J5+NVNK0-G(hn%+V?z@{@t*q zZ8KP7UyF_zbVFk1cZxsYD_9d33TtS%QGA0M7#}Q8;#AvVP2VT5W_l9F9p8^}r@i;R zeaz>t+6!wdJcqSlq6br}{qEsZU-SIWhqXJ3!P-3+FfJkptx@r()wz&wIaXB&W$H^G?a<9zK z9LStG6EeT~8l8uo=sdnj`sYIC{Rxms0~Z}%(V==#2f1Ef?<43A>ze0-by4Loe$gA6 zci_H^GaA;lS_A9sUuQqOYag^*`d7gEqQ_u;x!LGQu85Al8>D|WtiP;<^-pNt{w?oe z{EnZbeHl{GY>-gwmQml@BPclOF7Rh){3wA0k3He(ibd3nbvRDg8Hw~!t`o`%7^ zhqz3hRrq>akIDpTD+)r|%BfU7gUUCR+uI5VHMo;3i{uQx~B zL-F@|e8mv=QPI&)ec0&51B${!F+O#@KmiHTf2K*WL zT?Y92UuCL5^Z)(M>HlAU2K*WDXTYBUe+K*+@MplE0e=Sk83+g%8<|61{})%%p-P60 zbw|U-h8xjQ{3Cj$W2*Fj2^$Z80UJ-1M|-E9Xz%Kf{&BGJE|q`Q0OQ6#!MG_Z>7NOk z5^KYz(aq5QT{zmm|5ExF!=_C7+ut1>>QB*Os4V@7^b}BY*c?T#&MaLQ9px8D|2*<7 zhRw0Z={1ZqFz)jorGFS~PHGIBQ)#^S*eG;N`BnNi!{$E6VY9n9#&x1D(=KM|KMb4G zUc%;y)IAn^1|1G>SJ+0_{OLW|{5eg@dU6)pPd!!22l#rWX*z5fR}Qv(l18sleT$9= zc|Tt@1GZ#-2wS$7M91n}=vd>8{~2uAHWRj-r`JVlXx#?yU8cUUHDxVq9rcV}B`MI6 z_^E8?9@sjf9BiFIccuDKSLEP1(%&Dp9@WCub7kmNtu(ItBRK?0^(kyCdL6b6-i!`C zjbqOv?}i2Vc-5wA5$q5~*kLJ!j^TQAjF4T60lr?!3bfm49De*7*`5io zE95ck3a9SFIz}3mbzAz^!miefU{{aJG;W{fNPOz;%Ki#=&5eUy^Xq5NgJ^F(SeD-c zyS}OhyH>qJ`-EF)pRz*wKZjip(_z<7#nC>ZAU!KTOZvZn-FbH@^C@Q1vUPm9NB>mE zVDp%c^j+qs{je;?O;St$CD``?Xf zv*&%>Fgh0F%I~8)iE_QlQvc__F9WngsLrU@2H1YFJ-0ow-J`evW!cWzPS_69yZ^S^ zHrm$MmfIHD=GkW3rr9Ri#@O7p;kJRcKDHjVcw1Ln2U}}f3tJ;wsI9K8x~-zEw5_PE zkS(t*hs|gc*0%ghVSUzlf@ zCz;2XUFM@#dPY%qLd zSYr6n@R?zn;bTLFVU%I8p|7EbAVV_6#Y28M?YLYK%cBn(8uaK>RaoZ>l^AD z=xgdL=}YU2=nLp`>CJkL?yc@8-4osSx|_Pox-+_Ob^CQYbQ^W6bxU;%bf4>{>n7?( z>r!d(YQ22HT^Y78mFeK zroARo(^P|+dYbB*3YwCd!kYY=oEoD>E#8P1;*q#3u8WJ}lsF>xifv-OSS1#V`C_)1 zDkg|@F;WZ?eMF*gh>t|HXek zQ!-ZJX`(nAlc6Gw$WWAUMKvTtMZ(BXFjN#MCX@`VC`2(d9U_-(ps4y}C|Er*RIjdL z>L||IimFA1s@GJUHOSD0RaZr z!bRvcFRbWAFT9Li^}Z_O%%4WMnLnz|{E=b)Xtm5A6=D9U0`o^s z=1(o$%pcWb{%9HVM~3;M^)Y``g!!ZOF@F?=`6I>rQ9b65f-!%zKIV_AGk;W)`6DOu zM~e9)6GVn8Fn^?&KT^ye8Rn0wGk>&<`J+ZKe-wrJqeL=)RD}7XBFrDvWB$m={E=b) z$jSUsb>@#sGJmuw%pWzL`6I>rkz)R+B=bj#`J*Vz9~tJ4N-}>Gh4~}H{83w&KS}}f zM^5ICst05%7xQNpF6K`!T+E+QxR^h3GJgi)V*bc5e^i9|qh-vWTDX`$Qp}%8xR^gu z%pWP{k18;Kq?kW4%pV0~{zx%@TH#{;G{VLFkz)R68S_UanLmoj{82FGkBTsVYT;u3 zs0j0C5iaJBoXj6NW64lV=8x(zf8=ET)WW6k=VJcI$^4N~_;WFT6pZ;J!~D_OnLk=B z^G7XX{wOr_M~3;MH86ivlKCUW{E=b)$S{9YlKG=3%pWO*KNs^yO5xAN{LvZ|{#*)w zF6NKwF@F?{`J?8BlA(IcA1UUK4D&~Z`6Hw7=VJb-I`c;jWd6u7f3zazkCriiRDt=U zn9Ls;=8saq{LyNeKT^yeRaf|PF@F?=`J-jbAMHKN9|dFnC^Yk@7B1$GoXj67=Fciz z%wM2zF@HMYV*Z41F@LlyNLj}G*@TPvQwtaKN9$w$s3h}8PUbI%a4~{#?u-rHA>Wddwfi3?QQyjGtaGeLBJL*#xs^6O3M}Fi0A~9OV##2Gc+`T~Q42=LBA6VFU~q&`xKXfSYSe zBtkGFYM~&)gqQ>aq7%%AK`U?5C_dC&_52c|(S7zVXq7Sw`K2oy|$PA~`t!5nA>V_*@_%qqb*;6( z<(Q?IdARA2v9W%hu9Idc^_!GYJ)_0{8~?ehm(msNSw-(@pVBWeA;H;CnwWTJk~75_ z)6Hp58PLxe6W4n{a!QPIa7sUWTuNf^u`t;4~lNxv~lC`)nIw8;fez(=#EacS1jEWpau$Ii-J4 zoABtMziN6=gFomBK~;jL}PX_d+t!YG?@Yd1)zOrvr`@Sli-r}8c1w&es_Z;Xit7rtucA-O^{28hpbxR;tp49kgAC)% zgG9#{U)g#1OS6NDGzf|aZ?9}a5JWT#DxEEr95ro|ouO8(gW5#LH0>YWt53?1-z_gw z=D(9XqP+B9+EMv#51LD|2K>FPiAH7REX|J`p%iQ@f|yeaZ=)|LIMP&(N;=x=@= z|J(t~8~%Um;l@?Dur6QQwt+6lJ{|mrKkzYq?EUCm^UstC*yKH90c;WeUmRU!+@htE zd&fJId-DM~oKK`9TQ_Y9tvd!a5ARrBSv40Z<0?)AIisQiT~+=>lexw}ZZMY!*!a&h zmuvjP#`2Xy8CU5Kbott}33S!?6V2?`dr)HhKW=Ask$?^VOhdD)6fK=?{%%%zOOkt+ zaTP73%h$NE-WC2|H}xMjQZ}w#)7H^#p+!*ipZM~N2DNR|G@@}(cHGj5@#TYhB_ 1 + + for ds in split_dataset: + print(len(ds)) + assert len(ds) <= 500 From 843e51cc3af8c04206767c71f9791b002a7f1014 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Wed, 7 Feb 2024 13:05:02 +0100 Subject: [PATCH 02/24] Updated manager/splitter --- src/openeo_gfmap/manager/job_manager.py | 36 ++++++++++++++++------- src/openeo_gfmap/manager/job_splitters.py | 8 ++--- tests/test_openeo_gfmap/test_managers.py | 4 +-- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 4849343..a56a39d 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -4,6 +4,7 @@ import threading from enum import Enum from pathlib import Path +from tempfile import NamedTemporaryFile from typing import Callable, Union import pandas as pd @@ -26,6 +27,7 @@ class GFMAPJobManager(MultiBackendJobManager): def __init__( self, output_dir: Path, + output_path_generator: Callable, post_job_action: Callable, poll_sleep: int = 5, n_threads: int = 1, @@ -33,12 +35,15 @@ def __init__( ): self._output_dir = output_dir + self._downloaded_products = [] + # Setup the threads to work on the on_job_done and on_job_error methods self._finished_job_queue = queue.Queue() self._n_threads = n_threads self._threads = [] + self._output_path_gen = output_path_generator self._post_job_action = post_job_action self._post_job_params = post_job_params super().__init__(poll_sleep) @@ -129,14 +134,23 @@ def on_job_done(self, job: BatchJob, row: pd.Series): """Method called when a job finishes successfully. It will first download the results of the job and then call the `post_job_action` method. """ - output_folder = self._output_dir / row.job_id - output_folder.mkdir(parents=True, exist_ok=True) - for idx, asset in enumerate(job.results().get_assets()): - # file_name = f"{row.output_prefix}_{idx}.{asset.file_extension}" - asset.download(output_folder / asset.filename) + with NamedTemporaryFile(delete=False) as temp_file: + asset.download(temp_file.name) + output_path = self._output_path_gen( + self._output_dir, temp_file.name, idx, row + ) + # Make the output path + output_path.mkdir(parents=True, exist_ok=True) + # Move the temporary file to the final location + temp_file.rename(output_path) + # Add to the list of downloaded products + self._downloaded_products.append(output_path) + + # Call the post job action + self._post_job_action(job, row, self._post_job_params) - # TODO trigger post-job action and write STAC metadata + # TODO STAC metadata def run_jobs( self, df: pd.DataFrame, start_job: Callable, output_file: Union[str, Path] @@ -148,12 +162,12 @@ def run_jobs( df: pd.DataFrame The dataframe containing the jobs to be started. The dataframe expects the following columns: - * `output_folder`: Folder in which the results of the job will be stored. * `output_prefix`: Prefix to be used in the output files. * `file_extension`: Extension of the output files. + * `status`: Current status of the job, should be set to "created" initially. + * `description`: Description of the job, should be set to None initially. * `backend_name`: Name of the backend to use. - * `task_id`: ID of the task to be executed, will be used to retrieve geometry from - another dataset. + * Additional fields that will be used in your custom job creation function `start_job`. start_job: Callable Callable function that will take in argument the rows of each job and that will @@ -161,10 +175,10 @@ def run_jobs( output_file: Union[str, Path] The file to track the results of the jobs. """ - super(MultiBackendJobManager).run_jobs(df, start_job, output_file) - # Starts the thread pool to work on the on_job_done and on_job_error methods for _ in range(self._n_threads): thread = threading.Thread(target=self._post_job_worker) thread.start() self._threads.append(thread) + + super(MultiBackendJobManager).run_jobs(df, start_job, output_file) diff --git a/src/openeo_gfmap/manager/job_splitters.py b/src/openeo_gfmap/manager/job_splitters.py index 0b82cca..87dc061 100644 --- a/src/openeo_gfmap/manager/job_splitters.py +++ b/src/openeo_gfmap/manager/job_splitters.py @@ -12,10 +12,10 @@ def _resplit_group( ) -> List[gpd.GeoDataFrame]: """Performs re-splitting of a dataset of polygons in a list of datasets""" for i in range(0, len(polygons), max_points): - yield polygons.iloc[i : i + max_points] + yield polygons.iloc[i : i + max_points].reset_index(drop=True) -def split_job( +def split_job_hex( polygons: gpd.GeoDataFrame, max_points: int = 500, grid_resolution: int = 4 ) -> List[gpd.GeoDataFrame]: """Split a job into multiple jobs from the position of the polygons/points. The centroid of @@ -58,9 +58,7 @@ def split_job( for _, sub_gdf in polygons.groupby("h3index"): if len(sub_gdf) > max_points: # Performs another split - split_datasets.extend( - _resplit_group(sub_gdf, max_points).reset_index(drop=True) - ) + split_datasets.extend(_resplit_group(sub_gdf, max_points)) else: split_datasets.append(sub_gdf.reset_index(drop=True)) diff --git a/tests/test_openeo_gfmap/test_managers.py b/tests/test_openeo_gfmap/test_managers.py index 30c1cf6..5ed266b 100644 --- a/tests/test_openeo_gfmap/test_managers.py +++ b/tests/test_openeo_gfmap/test_managers.py @@ -3,7 +3,7 @@ import geopandas as gpd -from openeo_gfmap.manager.job_splitters import split_job +from openeo_gfmap.manager.job_splitters import split_job_hex def test_split_jobs(): @@ -13,7 +13,7 @@ def test_split_jobs(): dataset = gpd.read_file(dataset_path) # Split the dataset - split_dataset = split_job(dataset, max_points=500) + split_dataset = split_job_hex(dataset, max_points=500) # Check the number of splits assert len(split_dataset) > 1 From 97e31cb3028fbd962f27ae97c24a0bc0eed110ff Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 12 Feb 2024 09:47:28 +0100 Subject: [PATCH 03/24] Finished job manager and post-job actions --- src/openeo_gfmap/fetching/s2.py | 4 - src/openeo_gfmap/manager/job_manager.py | 164 ++++++++++++++++++------ 2 files changed, 123 insertions(+), 45 deletions(-) diff --git a/src/openeo_gfmap/fetching/s2.py b/src/openeo_gfmap/fetching/s2.py index de7e201..c9c7487 100644 --- a/src/openeo_gfmap/fetching/s2.py +++ b/src/openeo_gfmap/fetching/s2.py @@ -105,10 +105,6 @@ def s2_l2a_fetch_default( **params, ) - # Apply if the collection is a GeoJSON Feature collection - if isinstance(spatial_extent, GeoJSON): - cube = cube.filter_spatial(spatial_extent) - return cube return s2_l2a_fetch_default diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index a56a39d..1e3e409 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -1,11 +1,11 @@ import json -import logging import queue +import shutil import threading from enum import Enum from pathlib import Path from tempfile import NamedTemporaryFile -from typing import Callable, Union +from typing import Callable, Optional, Union import pandas as pd from openeo.extra.job_management import MultiBackendJobManager @@ -28,7 +28,7 @@ def __init__( self, output_dir: Path, output_path_generator: Callable, - post_job_action: Callable, + post_job_action: Optional[Callable], poll_sleep: int = 5, n_threads: int = 1, post_job_params: dict = {}, @@ -48,19 +48,33 @@ def __init__( self._post_job_params = post_job_params super().__init__(poll_sleep) + # Monkey patching the _normalize_df method to ensure we have no modification on the + # geometry column + MultiBackendJobManager._normalize_df = self._normalize_df + def _post_job_worker(self): """Checks which jobs are finished or failed and calls the `on_job_done` or `on_job_error` methods.""" while True: - status, job, row = self._finished_job_queue.get() - if status == PostJobStatus.ERROR: - self.on_job_error(job, row) - elif status == PostJobStatus.FINISHED: - self.on_job_done(job, row) - else: - raise ValueError(f"Unknown status: {status}") - self.on_job_done(job, row) - self.job_done_queue.task_done() + try: + status, job, row = self._finished_job_queue.get(timeout=1) + _log.debug( + f"Worker thread {threading.current_thread().name}: polled finished job with status {status}." + ) + if status == PostJobStatus.ERROR: + self.on_job_error(job, row) + elif status == PostJobStatus.FINISHED: + self.on_job_done(job, row) + else: + raise ValueError(f"Unknown status: {status}") + self._finished_job_queue.task_done() + except queue.Empty: + continue + except KeyboardInterrupt: + _log.debug( + f"Worker thread {threading.current_thread().name} interrupted." + ) + return def _update_statuses(self, df: pd.DataFrame): """Updates the statues of the jobs in the dataframe from the backend. If a job is finished @@ -69,15 +83,15 @@ def _update_statuses(self, df: pd.DataFrame): The method is executed every `poll_sleep` seconds. """ active = df[df.status.isin(["created", "queued", "running"])] - _log.info(f"Updating status. {len(active)} on {len(df)} active jobs...") + _log.debug(f"Updating status. {len(active)} on {len(df)} active jobs...") for idx, row in active.iterrows(): # Parses the backend from the csv connection = self._get_connection(row.backend_name) - job = connection.job(row.job_id) + job = connection.job(row.id) job_metadata = job.describe_job() - _log.log( - level=logging.DEBUG, - msg=f"Status of job {job.job_id} is {job_metadata} (on backend {row.backend_name}).", + job_status = job_metadata["status"] + _log.debug( + msg=f"Status of job {job.job_id} is {job_status} (on backend {row.backend_name}).", ) # Update the status if the job finished since last check @@ -89,7 +103,7 @@ def _update_statuses(self, df: pd.DataFrame): f"Job {job.job_id} finished successfully, queueing on_job_done..." ) self._finished_job_queue.put((PostJobStatus.FINISHED, job, row)) - df.loc[idx, "description"] = job_metadata["description"] + df.loc[idx, "costs"] = job_metadata["costs"] # Case in which it failed if (df.loc[idx, "status"] != "error") and ( @@ -99,12 +113,9 @@ def _update_statuses(self, df: pd.DataFrame): f"Job {job.job_id} finished with error, queueing on_job_error..." ) self._finished_job_queue.put((PostJobStatus.ERROR, job, row)) - df.loc[idx, "description"] = job_metadata["description"] + df.loc[idx, "costs"] = job_metadata["costs"] - df.loc[idx, "status"] = job_metadata["status"] - - # Additional parameters - self._update_status(job, row) + df.loc[idx, "status"] = job_status def on_job_error(self, job: BatchJob, row: pd.Series): """Method called when a job finishes with an error. @@ -119,14 +130,19 @@ def on_job_error(self, job: BatchJob, row: pd.Series): logs = job.logs() error_logs = [log for log in logs if log.level.lower() == "error"] - # TODO figure out how to handle output file structures. - # job_metadata = job.describe_job() - # title = job_metadata["title"] - output_file = "/temp/error.log" + job_metadata = job.describe_job() + title = job_metadata["title"] + job_id = job_metadata["id"] + + output_log_path = ( + Path(self._output_dir) / "failed_jobs" / f"{title}_{job_id}.log" + ) + output_log_path.parent.mkdir(parents=True, exist_ok=True) + if len(error_logs > 0): - Path(output_file).write_text(json.dumps(error_logs, indent=2)) + output_log_path.write_text(json.dumps(error_logs, indent=2)) else: - Path(output_file).write_text( + output_log_path.write_text( f"Couldn't find any error logs. Please check the error manually on job ID: {job.job_id}." ) @@ -134,24 +150,81 @@ def on_job_done(self, job: BatchJob, row: pd.Series): """Method called when a job finishes successfully. It will first download the results of the job and then call the `post_job_action` method. """ - for idx, asset in enumerate(job.results().get_assets()): - with NamedTemporaryFile(delete=False) as temp_file: + job_products = [] + for idx, asset in enumerate(job.get_results().get_assets()): + temp_file = NamedTemporaryFile(delete=False) + try: + _log.debug( + f"Downloading asset {asset.name} from job {job.job_id} -> {temp_file.name}" + ) asset.download(temp_file.name) + _log.debug( + f"Generating output path for asset {asset.name} from job {job.job_id}..." + ) output_path = self._output_path_gen( self._output_dir, temp_file.name, idx, row ) + _log.debug( + f"Generated path for asset {asset.name} from job {job.job_id} -> {output_path}" + ) # Make the output path - output_path.mkdir(parents=True, exist_ok=True) + output_path.parent.mkdir(parents=True, exist_ok=True) # Move the temporary file to the final location - temp_file.rename(output_path) + shutil.move(temp_file.name, output_path) # Add to the list of downloaded products - self._downloaded_products.append(output_path) + job_products.append(output_path) + _log.info( + f"Downloaded asset {asset.name} from job {job.job_id} -> {output_path}" + ) + except Exception as e: + _log.exception( + f"Error downloading asset {asset.name} from job {job.job_id}", e + ) + raise e + finally: + shutil.rmtree(temp_file.name, ignore_errors=True) # Call the post job action - self._post_job_action(job, row, self._post_job_params) + if self._post_job_action is not None: + _log.debug(f"Calling post job action for job {job.job_id}...") + job_products = self._post_job_action( + job_products, row, self._post_job_params + ) + + self._downloaded_products.extend(job_products) # TODO STAC metadata + _log.info(f"Job {job.job_id} and post job action finished successfully.") + + def _normalize_df(self, df: pd.DataFrame) -> pd.DataFrame: + """Ensure we have the required columns and the expected type for the geometry column. + + :param df: The dataframe to normalize. + :return: a new dataframe that is normalized. + """ + + # check for some required columns. + required_with_default = [ + ("status", "not_started"), + ("id", None), + ("start_time", None), + ("cpu", None), + ("memory", None), + ("duration", None), + ("backend_name", None), + ("description", None), + ("costs", None), + ] + new_columns = { + col: val for (col, val) in required_with_default if col not in df.columns + } + df = df.assign(**new_columns) + + _log.debug(f"Normalizing dataframe. Columns: {df.columns}") + + return df + def run_jobs( self, df: pd.DataFrame, start_job: Callable, output_file: Union[str, Path] ): @@ -162,12 +235,19 @@ def run_jobs( df: pd.DataFrame The dataframe containing the jobs to be started. The dataframe expects the following columns: - * `output_prefix`: Prefix to be used in the output files. - * `file_extension`: Extension of the output files. - * `status`: Current status of the job, should be set to "created" initially. - * `description`: Description of the job, should be set to None initially. * `backend_name`: Name of the backend to use. - * Additional fields that will be used in your custom job creation function `start_job`. + * Additional fields that will be used in your custom job creation function `start_job` + as well as in post-job actions and path generator. + + The following column names are RESERVED for the managed of the jobs, please do not + provide them in the input df: + + * `status`: Current status of the job. + * `id`: Job ID, used to access job information from the backend. + * `start_time`: The time at which the job was started. + * `cpu`: The amount of CPU used by the job. + * `memory`: The amount of memory used by the job. + * `duration`: The duration of the job. start_job: Callable Callable function that will take in argument the rows of each job and that will @@ -175,10 +255,12 @@ def run_jobs( output_file: Union[str, Path] The file to track the results of the jobs. """ + _log.info(f"Starting job manager using {self._n_threads} worker threads.") # Starts the thread pool to work on the on_job_done and on_job_error methods for _ in range(self._n_threads): thread = threading.Thread(target=self._post_job_worker) thread.start() self._threads.append(thread) - super(MultiBackendJobManager).run_jobs(df, start_job, output_file) + _log.info("Workers started, creating and running jobs.") + super().run_jobs(df, start_job, output_file) From eff07d2eecd755bc0f89be700a9c86a2a0f0a26e Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 12 Feb 2024 09:55:35 +0100 Subject: [PATCH 04/24] Fix! Blackified --- src/openeo_gfmap/fetching/commons.py | 3 +-- src/openeo_gfmap/fetching/s1.py | 4 +--- src/openeo_gfmap/preprocessing/compositing.py | 17 +++++++++++++---- src/openeo_gfmap/preprocessing/interpolation.py | 4 +++- src/openeo_gfmap/preprocessing/udf_rank.py | 5 +---- tests/test_openeo_gfmap/test_cloud_masking.py | 8 ++------ 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/openeo_gfmap/fetching/commons.py b/src/openeo_gfmap/fetching/commons.py index a589dc8..898c86d 100644 --- a/src/openeo_gfmap/fetching/commons.py +++ b/src/openeo_gfmap/fetching/commons.py @@ -128,8 +128,7 @@ def load_collection( pre_mask = params.get("pre_mask", None) if pre_mask is not None: assert isinstance(pre_mask, openeo.DataCube), ( - f"The 'pre_mask' parameter must be an openeo datacube, " - f"got {pre_mask}." + f"The 'pre_mask' parameter must be an openeo datacube, " f"got {pre_mask}." ) cube = cube.mask(pre_mask.resample_cube_spatial(cube)) diff --git a/src/openeo_gfmap/fetching/s1.py b/src/openeo_gfmap/fetching/s1.py index 4fcee4f..2f65079 100644 --- a/src/openeo_gfmap/fetching/s1.py +++ b/src/openeo_gfmap/fetching/s1.py @@ -113,9 +113,7 @@ def s1_grd_default_processor(cube: openeo.DataCube, **params): ) cube = resample_reproject( - cube, - params.get("target_resolution", 10.0), - params.get("target_crs", None) + cube, params.get("target_resolution", 10.0), params.get("target_crs", None) ) cube = rename_bands(cube, BASE_SENTINEL1_GRD_MAPPING) diff --git a/src/openeo_gfmap/preprocessing/compositing.py b/src/openeo_gfmap/preprocessing/compositing.py index 5f7eaf4..c3d743a 100644 --- a/src/openeo_gfmap/preprocessing/compositing.py +++ b/src/openeo_gfmap/preprocessing/compositing.py @@ -7,16 +7,25 @@ import openeo -def median_compositing(cube: openeo.DataCube, period: Union[str, list]) -> openeo.DataCube: +def median_compositing( + cube: openeo.DataCube, period: Union[str, list] +) -> openeo.DataCube: """Perfrom median compositing on the given datacube.""" if isinstance(period, str): - return cube.aggregate_temporal_period(period=period, reducer="median", dimension="t") + return cube.aggregate_temporal_period( + period=period, reducer="median", dimension="t" + ) elif isinstance(period, list): - return cube.aggregate_temporal(intervals=period, reducer="median", dimension="t") + return cube.aggregate_temporal( + intervals=period, reducer="median", dimension="t" + ) + def mean_compositing(cube: openeo.DataCube, period: str) -> openeo.DataCube: """Perfrom mean compositing on the given datacube.""" if isinstance(period, str): - return cube.aggregate_temporal_period(period=period, reducer="mean", dimension="t") + return cube.aggregate_temporal_period( + period=period, reducer="mean", dimension="t" + ) elif isinstance(period, list): return cube.aggregate_temporal(intervals=period, reducer="mean", dimension="t") diff --git a/src/openeo_gfmap/preprocessing/interpolation.py b/src/openeo_gfmap/preprocessing/interpolation.py index bffaa49..c404403 100644 --- a/src/openeo_gfmap/preprocessing/interpolation.py +++ b/src/openeo_gfmap/preprocessing/interpolation.py @@ -4,6 +4,8 @@ import openeo -def linear_interpolation(cube: openeo.DataCube,) -> openeo.DataCube: +def linear_interpolation( + cube: openeo.DataCube, +) -> openeo.DataCube: """Perform linear interpolation on the given datacube.""" return cube.apply_dimension(dimension="t", process="array_interpolate_linear") diff --git a/src/openeo_gfmap/preprocessing/udf_rank.py b/src/openeo_gfmap/preprocessing/udf_rank.py index b68dad1..7271b61 100644 --- a/src/openeo_gfmap/preprocessing/udf_rank.py +++ b/src/openeo_gfmap/preprocessing/udf_rank.py @@ -1,4 +1,3 @@ - import numpy as np import xarray as xr from openeo.udf import XarrayDataCube @@ -31,9 +30,7 @@ def select_maximum(score: xr.DataArray): # Convert YYYY-mm-dd to datetime64 objects time_bins = [np.datetime64(interval[0]) for interval in intervals] - rank_mask = bap_score.groupby_bins('t', bins=time_bins).map( - select_maximum - ) + rank_mask = bap_score.groupby_bins("t", bins=time_bins).map(select_maximum) else: raise ValueError("Period is not defined in the UDF. Cannot run it.") diff --git a/tests/test_openeo_gfmap/test_cloud_masking.py b/tests/test_openeo_gfmap/test_cloud_masking.py index e0c3db4..5a1f23d 100644 --- a/tests/test_openeo_gfmap/test_cloud_masking.py +++ b/tests/test_openeo_gfmap/test_cloud_masking.py @@ -124,12 +124,8 @@ def test_bap_quintad(backend: Backend): backend_context = BackendContext(backend=backend) # Additional parameters - fetching_parameters = { - "fetching_resolution": 10.0 - } - preprocessing_parameters = { - "apply_scl_dilation": True - } + fetching_parameters = {"fetching_resolution": 10.0} + preprocessing_parameters = {"apply_scl_dilation": True} # Fetch the datacube s2_extractor = build_sentinel2_l2a_extractor( From 16c9e20242863fcccdfb6bbdd8660b231dbbd500 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 12 Feb 2024 11:02:37 +0100 Subject: [PATCH 05/24] One-liner mistake --- src/openeo_gfmap/manager/job_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/openeo_gfmap/manager/job_manager.py b/src/openeo_gfmap/manager/job_manager.py index 1e3e409..d8051bf 100644 --- a/src/openeo_gfmap/manager/job_manager.py +++ b/src/openeo_gfmap/manager/job_manager.py @@ -139,7 +139,7 @@ def on_job_error(self, job: BatchJob, row: pd.Series): ) output_log_path.parent.mkdir(parents=True, exist_ok=True) - if len(error_logs > 0): + if len(error_logs) > 0: output_log_path.write_text(json.dumps(error_logs, indent=2)) else: output_log_path.write_text( From 44405de906f85aea6812da44127c178e9c533777 Mon Sep 17 00:00:00 2001 From: Darius Couchard Date: Mon, 12 Feb 2024 11:40:03 +0100 Subject: [PATCH 06/24] Added example notebook for the use of the pipeline --- .../S2_extraction_example.ipynb | 1233 +++++++++++++++++ 1 file changed, 1233 insertions(+) create mode 100644 examples/extraction_pipelines/S2_extraction_example.ipynb diff --git a/examples/extraction_pipelines/S2_extraction_example.ipynb b/examples/extraction_pipelines/S2_extraction_example.ipynb new file mode 100644 index 0000000..934a84a --- /dev/null +++ b/examples/extraction_pipelines/S2_extraction_example.ipynb @@ -0,0 +1,1233 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example of a GFMAP full-extraction pipeline\n", + "\n", + "Designing of GFMAP Job DataFrames and DataCube creators functions, as well as post job-actions.\n", + "\n", + "Those dataframe should be containing all the necessary infromation to run a job and know where to save it." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### First step: splitting the job\n", + "\n", + "Splitting the dataset of extraction in multiple job based on position is necessary to respect OpenEO limitations.\n", + "\n", + "This script performs a split with the H3 hexagonal grid, yielding a list of sub-geodataframes.\n", + "\n", + "A subtility here is that some polygons are not directly extracted (field with `extract=False`), but should be kept for post-job actions. This requirement is filled by removing sub-dataframes that do not contain any extractable polyons." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Configuring the logging for the openeo_gfmap package\n", + "from openeo_gfmap.manager import _log\n", + "import logging\n", + "\n", + "_log.setLevel(logging.DEBUG)\n", + "\n", + "stream_handler = logging.StreamHandler()\n", + "_log.addHandler(stream_handler)\n", + "\n", + "formatter = logging.Formatter('%(asctime)s|%(name)s|%(levelname)s: %(message)s')\n", + "stream_handler.setFormatter(formatter)\n", + "\n", + "# Exclude the other loggers from other libraries\n", + "class MyLoggerFilter(logging.Filter):\n", + " def filter(self, record):\n", + " return record.name == _log.name\n", + "\n", + "stream_handler.addFilter(MyLoggerFilter())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/data/users/Private/couchard/openeo-gfmap/src/openeo_gfmap/manager/job_splitters.py:53: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + "\n", + " polygons[\"h3index\"] = polygons.geometry.centroid.apply(\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "137 jobs before filtering empty one (no extraction)\n", + "93 jobs after filtering empty one (no extraction)\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "import geopandas as gpd\n", + "from openeo_gfmap.manager.job_splitters import split_job_hex\n", + "\n", + "base_df_path = Path('/vitodata/worldcereal/tmp/kristof/GFMAP/2021_EUR_DEMO_POLY_110.gpkg')\n", + "base_df = gpd.read_file(base_df_path)\n", + "# Splits the job using GFMAP\n", + "split_jobs = split_job_hex(\n", + " base_df, max_points=500, grid_resolution=4\n", + ")\n", + "\n", + "print(f'{len(split_jobs)} jobs before filtering empty one (no extraction)')\n", + "\n", + "# Remove the geometry where there are no points with the \"extract\" flag\n", + "split_jobs = [\n", + " job for job in split_jobs if job.extract.any()\n", + "]\n", + "print(f'{len(split_jobs)} jobs after filtering empty one (no extraction)')\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Second step: creating a dataframe for the GFMAP Job Manager\n", + "\n", + "Implementing a function that yields a `pandas.DataFrame` where each row correponds to a job.\n", + "\n", + "The dataframe should contain the informations required by the GFMAP Job Manager, as well as additional information used by the datacube creation function and the post-job action function.\n", + "\n", + "The output dataframe should be savable as a .csv file.\n", + "\n", + "Note: the full information of a sub-geodataframe of polygons can be saved into a row of a `pandas.DataFrame` by storing it in a row as string implementing the `geojson.FeatureCollection` interface. To convert the `geopandas.GeoDataFrame` into a stirng, simply use the `.to_json()` function." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

?Rl7z_lw6F%tXdM5;4TV&p$4EH@2YY2j`CbA5X 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