From b6ef9b572969fe0d48a5f138dba19fb43265e2a8 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Wed, 20 Sep 2023 15:16:15 -0400 Subject: [PATCH 01/51] v4.4.1.1 Bugfix for `MultiLineString` unit error in `src/stream_branches.py` (#992) --- CITATION.cff | 2 +- docs/CHANGELOG.md | 12 ++++++++++++ pyproject.toml | 9 +++++---- src/split_flows.py | 13 ++++++++----- src/stream_branches.py | 15 ++++++++++++--- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 8498f274d..0c47bf8d3 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,5 +4,5 @@ authors: - family-names: "NOAA Office of Water Prediction" title: "Inundation Mapping" url: "https://github.com/NOAA-OWP/inundation-mapping" -version: 4.4.1.0 +version: 4.4.1.1 date-released: 2023 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dc1631156..b47e6720b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,18 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.1.1 - 2023-09-20 - [PR#992](https://github.com/NOAA-OWP/inundation-mapping/pull/992) + +Fixes errors caused when a GeoDataFrame contains a `MultiLineString` geometry instead of a `LineString`. Update black force-exclude list. + +### Changes + +- `src/` + `split_flows.py` and `stream_branches.py`: Converts `MultiLineString` geometry into `LineString`s. +- `pyproject.toml` : Add three files in `src/` to exclude list. + +

+ ## v4.4.1.0 - 2023-09-18 - [PR#988](https://github.com/NOAA-OWP/inundation-mapping/pull/988) Format code using `black` formatter, incorporate `isort` package to sort import statements, diff --git a/pyproject.toml b/pyproject.toml index 7613ddd00..af8b9d9e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,10 +46,12 @@ Wiki = "https://github.com/NOAA-OWP/inundation-mapping/wiki" line_length = 110 skip-string-normalization = true skip-magic-trailing-comma = true -exclude = ''' -/( +force-exclude = ''' \.git -)\ + | src/add_crosswalk.py + | src/bathymetric_adjustment.py + | src/identify_src_bankfull.py + | ''' [tool.isort] @@ -57,7 +59,6 @@ profile = 'black' multi_line_output = 3 line_length = 110 # It should be the same as `tool.black.line-length` above lines_after_imports = 2 -skip_gitignore = true [tool.flake8] count = true diff --git a/src/split_flows.py b/src/split_flows.py index 7b1818994..205c152e7 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -10,19 +10,17 @@ ''' import argparse -import os import sys -import time from collections import OrderedDict -from os import environ, path, remove -from os.path import dirname, isfile, split +from os import remove +from os.path import isfile import geopandas as gpd import numpy as np import pandas as pd import rasterio from shapely import ops, wkt -from shapely.geometry import LineString, MultiPoint, Point +from shapely.geometry import LineString, Point from shapely.ops import split as shapely_ops_split from tqdm import tqdm @@ -139,6 +137,11 @@ def snap_and_trim_flow(snapped_point, flows): # Identify the end vertex (most downstream, should be last), transform into geodataframe terminal_nwm_point = [] + + if linestring_geo.geom_type == 'MultiLineString': + # Get last LineString + linestring_geo = linestring_geo.geoms[-1] + last = Point(linestring_geo.coords[-1]) terminal_nwm_point.append({'ID': 'terminal', 'geometry': last}) snapped_point = gpd.GeoDataFrame(terminal_nwm_point).set_crs(nwm_streams.crs) diff --git a/src/stream_branches.py b/src/stream_branches.py index 0f4b97d51..f0e88cf74 100755 --- a/src/stream_branches.py +++ b/src/stream_branches.py @@ -15,7 +15,7 @@ from rasterio.mask import mask from scipy.stats import mode from shapely.geometry import LineString, MultiLineString, MultiPoint, Point -from shapely.ops import linemerge, unary_union +from shapely.ops import linemerge from shapely.strtree import STRtree from tqdm import tqdm @@ -365,8 +365,17 @@ def derive_inlet_points_by_feature(self, feature_attribute, outlet_linestring_in feature_inlet_points_gdf = gpd.GeoDataFrame(self.copy()) - for idx, row in self.iterrows(): - feature_inlet_point = Point(row.geometry.coords[inlet_linestring_index]) + self_copy = self.copy() + + for idx in self_copy.index: + row = self_copy.loc[[idx]] + if row.geom_type[idx] == "MultiLineString": + # Convert MultiLineString to LineString + row = row.explode(index_parts=False) + row.loc[row["levpa_id"].duplicated(), "levpa_id"] = np.nan + row = row.dropna(subset=["levpa_id"]) + + feature_inlet_point = Point(row.geometry[0].coords[inlet_linestring_index]) feature_inlet_points_gdf.loc[idx, "geometry"] = feature_inlet_point From cafa6be936fcf99e61ff10a2a043e679afd4bd4c Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Wed, 20 Sep 2023 15:25:54 -0400 Subject: [PATCH 02/51] v4.4.2.0 Fix pandas and geopandas warnings (#993) --- data/usgs/preprocess_ahps_usgs.py | 2 +- data/write_parquet_from_calib_pts.py | 2 +- docs/CHANGELOG.md | 46 +++++++++ src/add_crosswalk.py | 4 +- src/bathy_src_adjust_topwidth.py | 15 ++- src/crosswalk_nwm_demDerived.py | 6 +- src/derive_level_paths.py | 2 +- src/finalize_srcs.py | 12 +-- src/identify_src_bankfull.py | 10 +- src/split_flows.py | 2 +- src/src_adjust_usgs_rating.py | 16 ++- src/src_roughness_optimization.py | 50 +++++----- src/stream_branches.py | 134 +++++++++++++++++++++----- src/subdiv_chan_obank_src.py | 18 ++-- src/subset_catch_list_by_branch_id.py | 2 +- src/usgs_gage_unit_setup.py | 17 ++-- src/utils/shared_functions.py | 6 +- tools/adjust_rc_with_feedback.py | 16 +-- tools/aggregate_csv_files.py | 2 +- tools/combine_crosswalk_tables.py | 4 +- tools/inundation.py | 14 +-- tools/make_boxes_from_bounds.py | 8 +- tools/mosaic_inundation.py | 4 +- tools/plots.py | 14 +-- tools/rating_curve_comparison.py | 12 +-- tools/vary_mannings_n_composite.py | 18 ++-- 26 files changed, 272 insertions(+), 164 deletions(-) diff --git a/data/usgs/preprocess_ahps_usgs.py b/data/usgs/preprocess_ahps_usgs.py index dddbf2c61..7c58181fc 100644 --- a/data/usgs/preprocess_ahps_usgs.py +++ b/data/usgs/preprocess_ahps_usgs.py @@ -325,7 +325,7 @@ def preprocess_usgs(source_dir, destination, reference_raster): f.write(f'{code} : Skipping because multisite\n') continue # Rename columns to match NWS AHPS data structure, this only applies to single USGS sites, if a multisite the columns are different from QCFS. - df.rename(columns={'QCFS': 'flow', 'STAGE': 'stage', 'ELEV': 'elevation'}, inplace=True) + df = df.rename(columns={'QCFS': 'flow', 'STAGE': 'stage', 'ELEV': 'elevation'}) # Many USGS maps have elevations to numerous decimal places. Round to nearest tenth. # NWS has maps to nearest tenth, for example HARP1 is both USGS and NWS, the USGS maps are to the hundredth of foot and NWS are to tenth. df['elevation'] = round(df['elevation'], 1) diff --git a/data/write_parquet_from_calib_pts.py b/data/write_parquet_from_calib_pts.py index 63ac4c666..ee8c9fbc2 100644 --- a/data/write_parquet_from_calib_pts.py +++ b/data/write_parquet_from_calib_pts.py @@ -162,7 +162,7 @@ def create_single_huc_gdf_and_write_parquet_file(args): return # Drop index_right column created by join - huc_with_points_gdf.drop(['index_right'], axis=1, inplace=True) + huc_with_points_gdf = huc_with_points_gdf.drop(['index_right'], axis=1) # Set the crs projection huc_gdf = huc_with_points_gdf.set_crs(DEFAULT_FIM_PROJECTION_CRS, allow_override=True) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b47e6720b..eebbb5703 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,52 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.2.0 - 2023-09-20 - [PR#993](https://github.com/NOAA-OWP/inundation-mapping/pull/993) + +Resolves the causes of two warnings in pandas and geopandas: (1) `FutureWarning` from taking the `int()` of single-length Series and (2) `SettingWithCopyWarning` resulting from the use of `inplace=True`. + +### Changes + +Removed `inplace=True` from +- `data/` + - `usgs/preprocess_ahps_usgs.py` + - `write_parquet_from_calib_pts.py` +- `src/` + - `add_crosswalk.py` + - `bathy_src_adjust_topwidth.py` + - `clip_vectors_to_wbd.py` + - `crosswalk_nwm_demDerived.py` + - `derive_level_paths.py` + - `finalize_srcs.py` + - `identify_src_bankfull.py` + - `src_adjust_usgs_rating.py` + - `src_roughness_optimization.py` + - `stream_branches.py` + - `subdiv_chan_obank_src.py` + - `subset_catch_list_by_branch_id.py` + - `usgs_gage_unit_setup.py` + - `utils/shared_functions.py` +- `tools/` + - `adjust_rc_with_feedback.py` + - `aggregate_csv_files.py` + - `combine_crosswalk_tables.py` + - `eval_plots_stackedbar.py` + - `inundation.py` + - `make_boxes_from_bounds.py` + - `mosaic_inundation.py` + - `plots.py` + - `rating_curve_comparison.py` + - `vary_mannings_n_composite.py` + +Fixed single-length Series in +- `src/` + - `split_flows.py` + - `stream_branches.py` + +- ``src/stream_branches.py``: Fixed class methods + +

+ ## v4.4.1.1 - 2023-09-20 - [PR#992](https://github.com/NOAA-OWP/inundation-mapping/pull/992) Fixes errors caused when a GeoDataFrame contains a `MultiLineString` geometry instead of a `LineString`. Update black force-exclude list. diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index e326f225a..283f0ff30 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -2,12 +2,10 @@ import argparse import json -import os import sys import geopandas as gpd import pandas as pd -from memory_profiler import profile from numpy import unique from rasterstats import zonal_stats @@ -402,7 +400,7 @@ def add_crosswalk( if output_hydro_table.HUC.dtype != 'str': output_hydro_table.HUC = output_hydro_table.HUC.astype(str) - output_hydro_table.drop(columns=FIM_ID, inplace=True) + output_hydro_table = output_hydro_table.drop(columns=FIM_ID) if output_hydro_table.feature_id.dtype != 'int': output_hydro_table.feature_id = output_hydro_table.feature_id.astype(int) if output_hydro_table.feature_id.dtype != 'str': diff --git a/src/bathy_src_adjust_topwidth.py b/src/bathy_src_adjust_topwidth.py index 04dd34b24..72e86441f 100644 --- a/src/bathy_src_adjust_topwidth.py +++ b/src/bathy_src_adjust_topwidth.py @@ -412,30 +412,29 @@ def bathy_rc_lookup(args): 'Discharge (m3s-1)', ], ] - modified_hydro_table.rename( - columns={'Stage': 'stage', 'Discharge (m3s-1)': 'discharge_cms'}, inplace=True + modified_hydro_table = modified_hydro_table.rename( + columns={'Stage': 'stage', 'Discharge (m3s-1)': 'discharge_cms'} ) df_htable = pd.read_csv(input_htable_fileName, dtype={'HUC': str}) - df_htable.drop( - ['barc_on'], axis=1, inplace=True + df_htable = df_htable.drop( + ['barc_on'], axis=1 ) # drop the default "barc_on" variable from add_crosswalk.py if not set( ['orig_discharge_cms', 'orig_Volume (m3)', 'orig_WetArea (m2)', 'orig_HydraulicRadius (m)'] ).issubset( df_htable.columns ): # check if "orig_" attributes do NOT already exist (likely generated from previous BARC run) - df_htable.rename( + df_htable = df_htable.rename( columns={ 'discharge_cms': 'orig_discharge_cms', 'Volume (m3)': 'orig_Volume (m3)', 'WetArea (m2)': 'orig_WetArea (m2)', 'HydraulicRadius (m)': 'orig_HydraulicRadius (m)', }, - inplace=True, ) else: - df_htable.drop( - ['discharge_cms', 'Volume (m3)', 'WetArea (m2)', 'HydraulicRadius (m)'], axis=1, inplace=True + df_htable = df_htable.drop( + ['discharge_cms', 'Volume (m3)', 'WetArea (m2)', 'HydraulicRadius (m)'], axis=1 ) # drop the previously modified columns - to be replaced with updated version df_htable = df_htable.merge( modified_hydro_table, how='left', left_on=['HydroID', 'stage'], right_on=['HydroID', 'stage'] diff --git a/src/crosswalk_nwm_demDerived.py b/src/crosswalk_nwm_demDerived.py index be267c89b..4ef4469b0 100755 --- a/src/crosswalk_nwm_demDerived.py +++ b/src/crosswalk_nwm_demDerived.py @@ -62,8 +62,8 @@ def Crosswalk_nwm_demDerived( ) # merge crosswalk table - crosswalk_table.rename(columns={'ID': 'feature_id'}, inplace=True) - demDerived.drop(columns='feature_id', inplace=True, errors='raise') + crosswalk_table = crosswalk_table.rename(columns={'ID': 'feature_id'}) + demDerived = demDerived.drop(columns='feature_id', errors='raise') demDerived['HydroID'] = demDerived['HydroID'].astype(int) demDerived = demDerived.merge(crosswalk_table, how='left', left_on='HydroID', right_index=True) @@ -152,7 +152,7 @@ def Add_traversal_to_NWM(nwm_streams, node_prefix=None, outfile=None, verbose=Fa # branch_id_attribute='levpa_id', attribute_excluded=None, values_excluded=None, verbose=verbose # ) - nwm_streams.reset_index(drop=True, inplace=True) + nwm_streams = nwm_streams.reset_index(drop=True) if outfile is not None: nwm_streams.write(outfile, index=False, verbose=verbose) diff --git a/src/derive_level_paths.py b/src/derive_level_paths.py index ffa841de6..5236a0d8f 100755 --- a/src/derive_level_paths.py +++ b/src/derive_level_paths.py @@ -145,7 +145,7 @@ def Derive_level_paths( stream_network_to_merge, how="inner", left_on=reach_id_attribute, right_on=reach_id_attribute ) - catchments.reset_index(drop=True, inplace=True) + catchments = catchments.reset_index(drop=True) catchments.to_file(catchments_outfile, index=False, driver="GPKG") diff --git a/src/finalize_srcs.py b/src/finalize_srcs.py index 3ca975bdf..33899aeb5 100755 --- a/src/finalize_srcs.py +++ b/src/finalize_srcs.py @@ -13,12 +13,12 @@ def finalize_srcs(srcbase, srcfull, hydrotable, output_srcfull=None, output_hydrotable=None): # calculate src_full srcbase = pd.read_csv(srcbase, dtype={'CatchId': int}) - srcbase.rename(columns={'CatchId': 'HydroID'}, inplace=True) + srcbase = srcbase.rename(columns={'CatchId': 'HydroID'}) srcbase = srcbase.rename(columns=lambda x: x.strip(" ")) # read and merge in attributes from base hydrofabric src full srcfull = pd.read_csv(srcfull, dtype={'CatchId': int}) - srcfull.rename(columns={'CatchId': 'HydroID'}, inplace=True) + srcfull = srcfull.rename(columns={'CatchId': 'HydroID'}) srcfull = srcfull.loc[:, ["ManningN", "HydroID", "feature_id"]].drop_duplicates(subset='HydroID') srcbase = srcbase.merge(srcfull, how='inner', left_on='HydroID', right_on='HydroID') @@ -43,9 +43,9 @@ def finalize_srcs(srcbase, srcfull, hydrotable, output_srcfull=None, output_hydr srcbase.to_csv(output_srcfull, index=False) hydrotable = pd.read_csv(hydrotable) - hydrotable.drop(columns=['stage', 'discharge_cms'], inplace=True) + hydrotable = hydrotable.drop(columns=['stage', 'discharge_cms']) - hydrotable.drop_duplicates(subset='HydroID', inplace=True) + hydrotable = hydrotable.drop_duplicates(subset='HydroID') # srcfull = srcfull.loc[:,["ManningN","HydroID","feature_id"]].drop_duplicates(subset='HydroID') hydrotable = hydrotable.merge( srcbase.loc[:, ['HydroID', 'Stage', 'Discharge (m3s-1)']], @@ -53,8 +53,8 @@ def finalize_srcs(srcbase, srcfull, hydrotable, output_srcfull=None, output_hydr left_on='HydroID', right_on='HydroID', ) - hydrotable.rename(columns={'Stage': 'stage', 'Discharge (m3s-1)': 'discharge_cms'}, inplace=True) - # hydrotable.drop_duplicates(subset='stage',inplace=True) + hydrotable = hydrotable.rename(columns={'Stage': 'stage', 'Discharge (m3s-1)': 'discharge_cms'}) + # hydrotable = hydrotable.drop_duplicates(subset='stage') if output_hydrotable is not None: hydrotable.to_csv(output_hydrotable, index=False) diff --git a/src/identify_src_bankfull.py b/src/identify_src_bankfull.py index efef55938..8b99e295d 100755 --- a/src/identify_src_bankfull.py +++ b/src/identify_src_bankfull.py @@ -125,7 +125,7 @@ def src_bankfull_lookup(args): df_bankfull_calc = df_bankfull_calc[ df_bankfull_calc['Stage'] > 0.0 ] # Ensure bankfull stage is greater than stage=0 - df_bankfull_calc.reset_index(drop=True, inplace=True) + df_bankfull_calc = df_bankfull_calc.reset_index(drop=True) # find the index of the Q_bfull_find (closest matching flow) df_bankfull_calc = df_bankfull_calc.loc[ df_bankfull_calc.groupby('HydroID')['Q_bfull_find'].idxmin() @@ -156,7 +156,7 @@ def src_bankfull_lookup(args): how='left', on='HydroID' ) - df_src.drop(['Q_bfull_find'], axis=1, inplace=True) + df_src = df_src.drop(['Q_bfull_find'], axis=1) ## The bankfull ratio variables below were previously used for the composite variable roughness routine ## (not currently implimented) @@ -170,7 +170,7 @@ def src_bankfull_lookup(args): # df_src['chann_volume_ratio'].where(df_src['chann_volume_ratio'] <= 1.0, 1.0, inplace=True) # # if the bankfull_flow value <= 0 then set channel ratio to 0 (will use global overbank manning n) # df_src['chann_volume_ratio'].where(df_src['bankfull_flow'] > 0.0, 0.0, inplace=True) - # #df_src.drop(['Volume_bankfull'], axis=1, inplace=True) + # #df_src = df_src.drop(['Volume_bankfull'], axis=1) # ## Calculate the channel portion of bankfull Hydraulic Radius # df_src['chann_hradius_ratio'] = 1.0 # At stage=0 set channel_ratio to 1.0 (avoid div by 0) @@ -183,7 +183,7 @@ def src_bankfull_lookup(args): # df_src['chann_hradius_ratio'].where(df_src['chann_hradius_ratio'] <= 1.0, 1.0, inplace=True) # # if the bankfull_flow value <= 0 then set channel ratio to 0 (will use global overbank manning n) # df_src['chann_hradius_ratio'].where(df_src['bankfull_flow'] > 0.0, 0.0, inplace=True) - # #df_src.drop(['HRadius_bankfull'], axis=1, inplace=True) + # #df_src = df_src.drop(['HRadius_bankfull'], axis=1) # ## Calculate the channel portion of bankfull Surface Area # df_src['chann_surfarea_ratio'] = 1.0 # At stage=0 set channel_ratio to 1.0 (avoid div by 0) @@ -194,7 +194,7 @@ def src_bankfull_lookup(args): # df_src['chann_surfarea_ratio'].where(df_src['chann_surfarea_ratio'] <= 1.0, 1.0, inplace=True) # # if the bankfull_flow value <= 0 then set channel ratio to 0 (will use global overbank manning n) # df_src['chann_surfarea_ratio'].where(df_src['bankfull_flow'] > 0.0, 0.0, inplace=True) - # #df_src.drop(['HRadius_bankfull'], axis=1, inplace=True) + # #df_src = df_src.drop(['HRadius_bankfull'], axis=1) ## mask bankfull variables when the bankfull estimated flow value is <= 0 df_src['Stage_bankfull'].mask(df_src['bankfull_flow'] <= 0.0, inplace=True) diff --git a/src/split_flows.py b/src/split_flows.py index 205c152e7..1cd86abee 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -53,7 +53,7 @@ def snap_and_trim_flow(snapped_point, flows): if len(sjoin_nearest) > 1: sjoin_nearest = sjoin_nearest[sjoin_nearest['LINKNO'].isin(sjoin_nearest['DSLINKNO'])] - nearest_index = int(sjoin_nearest['LINKNO']) + nearest_index = int(sjoin_nearest['LINKNO'].iloc[0]) flow = flows[flows['LINKNO'] == nearest_index] flow.index = [0] diff --git a/src/src_adjust_usgs_rating.py b/src/src_adjust_usgs_rating.py index d4684a8e5..d93c6848f 100644 --- a/src/src_adjust_usgs_rating.py +++ b/src/src_adjust_usgs_rating.py @@ -1,12 +1,9 @@ import argparse import datetime as dt -import json import multiprocessing import os import sys -from collections import deque from multiprocessing import Pool -from pathlib import Path import pandas as pd @@ -63,8 +60,8 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep cross_df = usgs_elev_df[ ["location_id", "HydroID", "feature_id", "levpa_id", "HUC8", "dem_adj_elevation"] ].copy() - cross_df.rename( - columns={'dem_adj_elevation': 'hand_datum', 'HydroID': 'hydroid', 'HUC8': 'huc'}, inplace=True + cross_df = cross_df.rename( + columns={'dem_adj_elevation': 'hand_datum', 'HydroID': 'hydroid', 'HUC8': 'huc'} ) # filter null location_id rows from cross_df @@ -89,7 +86,7 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep # read in the NWM recurr csv file nwm_recur_df = pd.read_csv(nwm_recurr_filepath, dtype={'feature_id': int}) nwm_recur_df = nwm_recur_df.drop(columns=["Unnamed: 0"]) - nwm_recur_df.rename( + nwm_recur_df = nwm_recur_df.rename( columns={ '2_0_year_recurrence_flow_17C': '2_0_year', '5_0_year_recurrence_flow_17C': '5_0_year', @@ -97,8 +94,7 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep '25_0_year_recurrence_flow_17C': '25_0_year', '50_0_year_recurrence_flow_17C': '50_0_year', '100_0_year_recurrence_flow_17C': '100_0_year', - }, - inplace=True, + } ) # convert cfs to cms (x 0.028317) @@ -146,7 +142,7 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep # Assign new metadata attributes calc_df['nwm_recur'] = interval + "_0_year" calc_df['layer'] = '_usgs-gage____' + interval + "-year" - calc_df.rename(columns={interval + "_0_year": 'nwm_recur_flow_cms'}, inplace=True) + calc_df = calc_df.rename(columns={interval + "_0_year": 'nwm_recur_flow_cms'}) # Subset calc_df for final output calc_df = calc_df[ [ @@ -179,7 +175,7 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep final_df['coll_time'] = str(datestamp)[:15] # Rename attributes (for ingest to update_rating_curve) and output csv with the USGS RC database - final_df.rename(columns={'discharge_cms': 'flow'}, inplace=True) + final_df = final_df.rename(columns={'discharge_cms': 'flow'}) final_df.to_csv(os.path.join(log_dir, "usgs_rc_nwm_recurr.csv"), index=False) # Output log text to log file diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index e294cd56f..e417753f6 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -155,14 +155,13 @@ def update_rating_curve( df_prev_adj_htable = df_htable.copy()[ ['HydroID', 'submitter', 'last_updated', 'obs_source', 'calb_coef_final'] ] - df_prev_adj_htable.rename( + df_prev_adj_htable = df_prev_adj_htable.rename( columns={ 'submitter': 'submitter_prev', 'last_updated': 'last_updated_prev', 'calb_coef_final': 'calb_coef_final_prev', 'obs_source': 'obs_source_prev', - }, - inplace=True, + } ) df_prev_adj_htable = df_prev_adj_htable.groupby(["HydroID"]).first() # Only keep previous USGS rating curve adjustments (previous spatial obs adjustments are not retained) @@ -180,7 +179,7 @@ def update_rating_curve( # Delete previous adj columns to prevent duplicate variable issues # (if src_roughness_optimization.py was previously applied) - df_htable.drop( + df_htable = df_htable.drop( [ 'discharge_cms', 'submitter', @@ -191,10 +190,9 @@ def update_rating_curve( 'obs_source', ], axis=1, - inplace=True, errors='ignore', ) - df_htable.rename(columns={'precalb_discharge_cms': 'discharge_cms'}, inplace=True) + df_htable = df_htable.rename(columns={'precalb_discharge_cms': 'discharge_cms'}) ## loop through the user provided point data --> stage/flow dataframe row by row for index, row in df_nvalues.iterrows(): @@ -253,7 +251,7 @@ def update_rating_curve( df_nvalues.loc[index, 'discharge_cms'] = find_src_stage.discharge_cms ## Calculate calibration coefficient - df_nvalues.rename(columns={'hydroid': 'HydroID'}, inplace=True) # rename the previous ManningN column + df_nvalues = df_nvalues.rename(columns={'hydroid': 'HydroID'}) # rename the previous ManningN column df_nvalues['hydroid_calb_coef'] = df_nvalues['discharge_cms'] / df_nvalues['flow'] # Qobs / Qsrc ## Calcuate a "calibration adjusted" n value using channel and overbank n-values multiplied by calb_coef @@ -283,7 +281,7 @@ def update_rating_curve( df_nvalues['magnitude'] = df_nvalues['layer'].str.split("_").str[5] df_nvalues['ahps_lid'] = df_nvalues['layer'].str.split("_").str[1] df_nvalues['huc'] = str(huc) - df_nvalues.drop(['layer'], axis=1, inplace=True) + df_nvalues = df_nvalues.drop(['layer'], axis=1) ## Create df grouped by hydroid with ahps_lid and huc number df_huc_lid = df_nvalues.groupby(["HydroID"]).first()[['ahps_lid', 'huc']] @@ -309,17 +307,17 @@ def update_rating_curve( df_updated = df_updated.sort_values('coll_time').drop_duplicates( ['HydroID'], keep='last' ) # sort by collection time and then drop duplicate HydroIDs (keep most recent coll_time per HydroID) - df_updated.rename(columns={'coll_time': 'last_updated'}, inplace=True) + df_updated = df_updated.rename(columns={'coll_time': 'last_updated'}) ## cacluate median ManningN to handle cases with multiple hydroid entries df_mann_hydroid = df_nvalues.groupby(["HydroID"])[['hydroid_calb_coef']].median() ## Create a df with the median hydroid_ManningN value per feature_id # df_mann_featid = df_nvalues.groupby(["feature_id"])[['hydroid_ManningN']].mean() - # df_mann_featid.rename(columns={'hydroid_ManningN':'featid_ManningN'}, inplace=True) + # df_mann_featid = df_mann_featid.rename(columns={'hydroid_ManningN':'featid_ManningN'}) ## Rename the original hydrotable variables to allow new calculations to use the primary var name - df_htable.rename(columns={'discharge_cms': 'precalb_discharge_cms'}, inplace=True) + df_htable = df_htable.rename(columns={'discharge_cms': 'precalb_discharge_cms'}) ## Check for large variabilty in the calculated Manning's N values # (for cases with mutliple entries for a singel hydroid) @@ -367,7 +365,7 @@ def update_rating_curve( ## Create a df with the median hydroid_calb_coef value per feature_id df_mann_featid = df_nmerge.groupby(["feature_id"])[['hydroid_calb_coef']].mean() - df_mann_featid.rename(columns={'hydroid_calb_coef': 'featid_calb_coef'}, inplace=True) + df_mann_featid = df_mann_featid.rename(columns={'hydroid_calb_coef': 'featid_calb_coef'}) # create a seperate df with attributes to apply to other hydroids that share a featureid df_mann_featid_attrib = df_nmerge.groupby('feature_id').first() df_mann_featid_attrib = df_mann_featid_attrib[df_mann_featid_attrib['submitter'].notna()][ @@ -389,10 +387,9 @@ def update_rating_curve( choices = [df_nmerge['featid_calb_coef'], df_nmerge['group_calb_coef']] df_nmerge[calb_type] = np.select(conditions, choices, default=df_nmerge['hydroid_calb_coef']) df_nmerge['obs_source'] = np.where(df_nmerge[calb_type].notnull(), source_tag, pd.NA) - df_nmerge.drop( + df_nmerge = df_nmerge.drop( ['feature_id', 'NextDownID', 'LENGTHKM', 'LakeID', 'order_'], axis=1, - inplace=True, errors='ignore', ) # drop these columns to avoid duplicates where merging with the full hydroTable df @@ -420,10 +417,9 @@ def update_rating_curve( df_nmerge['calb_coef_final_prev'], df_nmerge[calb_type], ) - df_nmerge.drop( + df_nmerge = df_nmerge.drop( ['submitter_prev', 'last_updated_prev', 'calb_coef_final_prev', 'obs_source_prev'], axis=1, - inplace=True, errors='ignore', ) else: @@ -436,10 +432,9 @@ def update_rating_curve( if ( 'src_calibrated' in input_catchments.columns ): # check if this attribute already exists and drop if needed - input_catchments.drop( + input_catchments = input_catchments.drop( ['src_calibrated', 'obs_source', 'calb_coef_final'], axis=1, - inplace=True, errors='ignore', ) df_nmerge['src_calibrated'] = np.where( @@ -454,7 +449,7 @@ def update_rating_curve( output_catchments.to_file( catchments_poly_path, driver="GPKG", index=False ) # overwrite the previous layer - df_nmerge.drop(['src_calibrated'], axis=1, inplace=True, errors='ignore') + df_nmerge = df_nmerge.drop(['src_calibrated'], axis=1, errors='ignore') ## Optional ouputs: # 1) merge_n_csv csv with all of the calculated n values # 2) a catchments .gpkg with new joined attributes @@ -474,7 +469,7 @@ def update_rating_curve( output_catchments.to_file(output_catchments_fileName, driver="GPKG", index=False) ## Merge the final ManningN dataframe to the original hydroTable - df_nmerge.drop( + df_nmerge = df_nmerge.drop( [ 'ahps_lid', 'start_catch', @@ -485,7 +480,6 @@ def update_rating_curve( 'group_calb_coef', ], axis=1, - inplace=True, errors='ignore', ) # drop these columns to avoid duplicates where merging with the full hydroTable df df_htable = df_htable.merge(df_nmerge, how='left', on='HydroID') @@ -576,7 +570,7 @@ def branch_network_tracer(df_input_htable): # other hydroids df_input_htable["start_catch"] = ~df_input_htable['HydroID'].isin(df_input_htable['NextDownID']) - df_input_htable.set_index('HydroID', inplace=True, drop=False) # set index to the hydroid + df_input_htable = df_input_htable.set_index('HydroID', drop=False) # set index to the hydroid branch_heads = deque( df_input_htable[df_input_htable['start_catch'] == True]['HydroID'].tolist() ) # create deque of hydroids to define start points in the while loop @@ -621,17 +615,17 @@ def branch_network_tracer(df_input_htable): # starting hydroid continue Q.append(nextid) - df_input_htable.reset_index(drop=True, inplace=True) # reset index (previously using hydroid as index) + df_input_htable = df_input_htable.reset_index(drop=True) # reset index (previously using hydroid as index) # sort the dataframe by branch_id and then by route_count # (need this ordered to ensure upstream to downstream ranking for each branch) - df_input_htable.sort_values(['branch_id', 'route_count'], inplace=True) + df_input_htable = df_input_htable.sort_values(['branch_id', 'route_count']) return df_input_htable def group_manningn_calc(df_nmerge, down_dist_thresh): ## Calculate group_calb_coef (mean calb n for consective hydroids) and apply values downsteam to # non-calb hydroids (constrained to first Xkm of hydroids - set downstream diststance var as input arg - # df_nmerge.sort_values(by=['NextDownID'], inplace=True) + # df_nmerge = df_nmerge.sort_values(by=['NextDownID']) dist_accum = 0 hyid_count = 0 hyid_accum_count = 0 @@ -708,9 +702,9 @@ def group_manningn_calc(df_nmerge, down_dist_thresh): ## Delete unnecessary intermediate outputs if 'hyid_count' in df_nmerge.columns: - df_nmerge.drop( - ['hyid_count', 'accum_dist', 'hyid_accum_count'], axis=1, inplace=True, errors='ignore' + df_nmerge = df_nmerge.drop( + ['hyid_count', 'accum_dist', 'hyid_accum_count'], axis=1, errors='ignore' ) # drop hydroid counter if it exists ## drop accum vars from group calc - # df_nmerge.drop(['accum_dist','hyid_accum_count'], axis=1, inplace=True) + # df_nmerge = df_nmerge.drop(['accum_dist','hyid_accum_count'], axis=1) return df_nmerge diff --git a/src/stream_branches.py b/src/stream_branches.py index f0e88cf74..3491f40be 100755 --- a/src/stream_branches.py +++ b/src/stream_branches.py @@ -105,6 +105,23 @@ def from_file( return cls(filtered_df, **inputs) + def GeoDataFrame_to_StreamNetwork(self, gdf): + branch_id_attribute = self.branch_id_attribute + attribute_excluded = self.attribute_excluded + values_excluded = self.values_excluded + crs = self.crs + + self = gdf + self = self.set_crs(crs) + + self = StreamNetwork( + self, + branch_id_attribute=branch_id_attribute, + attribute_excluded=attribute_excluded, + values_excluded=values_excluded, + ) + return self + def write(self, fileName, layer=None, index=True, verbose=False): """Gets driver Name from file extension for Geopandas writing""" @@ -117,6 +134,79 @@ def write(self, fileName, layer=None, index=True, verbose=False): self.to_file(fileName, driver=driver, layer=layer, index=index) + def set_index(self, reach_id_attribute, drop=True): + branch_id_attribute = self.branch_id_attribute + attribute_excluded = self.attribute_excluded + values_excluded = self.values_excluded + crs = self.crs + + self = super(gpd.GeoDataFrame, self) + self = self.set_index(reach_id_attribute, drop=drop) + self = self.set_crs(crs) + + self = StreamNetwork( + self, + branch_id_attribute=branch_id_attribute, + attribute_excluded=attribute_excluded, + values_excluded=values_excluded, + ) + return self + + def reset_index(self, drop=True): + branch_id_attribute = self.branch_id_attribute + attribute_excluded = self.attribute_excluded + values_excluded = self.values_excluded + crs = self.crs + + self = super(gpd.GeoDataFrame, self) + self = self.reset_index(drop=drop) + self = self.set_crs(crs) + + self = StreamNetwork( + self, + branch_id_attribute=branch_id_attribute, + attribute_excluded=attribute_excluded, + values_excluded=values_excluded, + ) + return self + + def drop(self, labels=None, axis=0): + branch_id_attribute = self.branch_id_attribute + attribute_excluded = self.attribute_excluded + values_excluded = self.values_excluded + crs = self.crs + geometry = self.geometry + + self = super(gpd.GeoDataFrame, self) + self = self.drop(labels=labels, axis=axis) + self = gpd.GeoDataFrame(self, crs=crs, geometry=geometry) + + self = StreamNetwork( + self, + branch_id_attribute=branch_id_attribute, + attribute_excluded=attribute_excluded, + values_excluded=values_excluded, + ) + return self + + def dissolve(self, by=None): + branch_id_attribute = self.branch_id_attribute + attribute_excluded = self.attribute_excluded + values_excluded = self.values_excluded + crs = self.crs + geometry = self.geometry + + self = gpd.GeoDataFrame(self, crs=crs, geometry=geometry) + self = self.dissolve(by=by) + + self = StreamNetwork( + self, + branch_id_attribute=branch_id_attribute, + attribute_excluded=attribute_excluded, + values_excluded=values_excluded, + ) + return self + def apply(self, *args, **kwargs): branch_id_attribute = self.branch_id_attribute attribute_excluded = self.attribute_excluded @@ -261,7 +351,7 @@ def derive_nodes( # sets index of stream branches as reach id attribute # if self.index.name != reach_id_attribute: - # self.set_index(reach_id_attribute,drop=True,inplace=True) + # self = self.set_index(reach_id_attribute,drop=True) # inlet_coordinates, outlet_coordinates = dict(), dict() node_coordinates = dict() @@ -462,7 +552,7 @@ def remove_branches_without_catchments( unique_catchments = set(catchments.loc[:, reach_id_attribute_in_catchments].unique()) current_index_name = self.index.name - self.set_index(branch_id_attribute, drop=False, inplace=True) + self = self.set_index(branch_id_attribute, drop=False) for usb in unique_stream_branches: try: @@ -472,12 +562,12 @@ def remove_branches_without_catchments( if len(reach_ids_in_branch & unique_catchments) == 0: # print(f'Dropping {usb}') - self.drop(usb, inplace=True) + self = self.drop(usb) if current_index_name is None: - self.reset_index(drop=True, inplace=True) + self = self.reset_index(drop=True) else: - self.set_index(current_index_name, drop=True, inplace=True) + self = self.set_index(current_index_name, drop=True) return self @@ -500,8 +590,8 @@ def find_downstream_reaches_in_waterbodies(tmp_self, tmp_IDs=[]): else: # Remove reach from tmp_self tmp_IDs.append(downstream_ID) - tmp_self.drop( - tmp_self[tmp_self.From_Node.astype(int).isin([downstream_ID])].index, inplace=True + tmp_self = tmp_self.drop( + tmp_self[tmp_self.From_Node.astype(int).isin([downstream_ID])].index ) # Repeat for next lowest downstream reach if downstream_ID in tmp_self.To_Node.astype(int).values: @@ -523,14 +613,14 @@ def find_upstream_reaches_in_waterbodies(tmp_self, tmp_IDs=[]): continue else: if ( - int(tmp_self.To_Node[tmp_self.From_Node.astype(int) == upstream_ID]) + int(tmp_self.To_Node[tmp_self.From_Node.astype(int) == upstream_ID].iloc[0]) in nonlake_reaches ): continue # Remove reach from tmp_self tmp_IDs.append(upstream_ID) - tmp_self.drop( - tmp_self[tmp_self.From_Node.astype(int).isin([upstream_ID])].index, inplace=True + tmp_self = tmp_self.drop( + tmp_self[tmp_self.From_Node.astype(int).isin([upstream_ID])].index ) # Repeat for next highest upstream reach return find_upstream_reaches_in_waterbodies(tmp_self, tmp_IDs) @@ -554,7 +644,7 @@ def find_upstream_reaches_in_waterbodies(tmp_self, tmp_IDs=[]): tmp_IDs = find_upstream_reaches_in_waterbodies(tmp_self, tmp_IDs) if len(tmp_IDs) > 0: - self.drop(self[self.From_Node.astype(int).isin(tmp_IDs)].index, inplace=True) + self = self.drop(self[self.From_Node.astype(int).isin(tmp_IDs)].index) return self @@ -573,7 +663,7 @@ def remove_branches_in_waterbodies(self, waterbodies, out_vector_files=None, ver if isinstance(waterbodies, gpd.GeoDataFrame): # Find branches in waterbodies sjoined = gpd.sjoin(self, waterbodies, predicate="within") - self.drop(sjoined.index, inplace=True) + self = self.drop(sjoined.index) if out_vector_files is not None: if verbose: @@ -648,7 +738,7 @@ def derive_stream_branches( # sets index of stream branches as reach id attribute reset_index = False if self.index.name != reach_id_attribute: - self.set_index(reach_id_attribute, drop=True, inplace=True) + self = self.set_index(reach_id_attribute, drop=True) reset_index = True # make upstream and downstream dictionaries if none are passed @@ -755,7 +845,7 @@ def derive_stream_branches( progress.close() if reset_index: - self.reset_index(drop=False, inplace=True) + self = self.reset_index(drop=False) return self @@ -764,7 +854,7 @@ def make_up_and_downstream_dictionaries( ): # sets index of stream branches as reach id attribute # if self.index.name != reach_id_attribute: - # self.set_index(reach_id_attribute,drop=True,inplace=True) + # self = self.set_index(reach_id_attribute,drop=True) # find upstream and downstream dictionaries upstreams, downstreams = dict(), dict() @@ -800,7 +890,7 @@ def get_arbolate_sum( # sets index of stream branches as reach id attribute reset_index = False if self.index.name != reach_id_attribute: - self.set_index(reach_id_attribute, drop=True, inplace=True) + self = self.set_index(reach_id_attribute, drop=True) reset_index = True # make upstream and downstream dictionaries if none are passed @@ -855,7 +945,7 @@ def get_arbolate_sum( progress.close() if reset_index: - self.reset_index(drop=False, inplace=True) + self = self.reset_index(drop=False) return self @@ -885,7 +975,7 @@ def dissolve_by_branch( ) self = self.dissolve(by=branch_id_attribute) - self.rename(columns={"bids_temp": branch_id_attribute}, inplace=True) + self = self.rename(columns={"bids_temp": branch_id_attribute}) self["order_"] = max_stream_order.values @@ -948,7 +1038,7 @@ def conflate_branches( # make the crosswalk id attribute and set index self.loc[:, crosswalk_attribute] = [None] * len(self) - self.set_index(branch_id_attribute_left, inplace=True) + self = self.set_index(branch_id_attribute_left) # loop through rows of self for idx, row in tqdm( @@ -971,13 +1061,13 @@ def conflate_branches( self.loc[left_branch_id, crosswalk_attribute] = right_branch_id # reset indices - self.reset_index(inplace=True, drop=False) + self = self.reset_index(drop=False) return self def explode_to_points(self, reach_id_attribute="ID", sampling_size=None, verbose=False): points_gdf = self.copy() - points_gdf.reset_index(inplace=True, drop=True) + points_gdf = points_gdf.reset_index(drop=True) all_exploded_points = [None] * len(points_gdf) for idx, row in tqdm( @@ -1000,7 +1090,7 @@ def explode_to_points(self, reach_id_attribute="ID", sampling_size=None, verbose points_gdf["geometry"] = all_exploded_points points_gdf = points_gdf.explode(index_parts=True) - points_gdf.reset_index(inplace=True, drop=True) + points_gdf = points_gdf.reset_index(drop=True) return points_gdf diff --git a/src/subdiv_chan_obank_src.py b/src/subdiv_chan_obank_src.py index cad5375a8..1a8fa1435 100755 --- a/src/subdiv_chan_obank_src.py +++ b/src/subdiv_chan_obank_src.py @@ -81,7 +81,7 @@ def variable_mannings_calc(args): + '\n' ) else: - df_src_orig.drop( + df_src_orig = df_src_orig.drop( [ 'channel_n', 'overbank_n', @@ -95,7 +95,6 @@ def variable_mannings_calc(args): 'WettedPerimeter_obank (m)', ], axis=1, - inplace=True, errors='ignore', ) # drop these cols (in case vmann was previously performed) @@ -165,7 +164,7 @@ def variable_mannings_calc(args): ) ## drop the previously modified discharge column to be replaced with updated version - df_htable.drop( + df_htable = df_htable.drop( [ 'subdiv_applied', 'discharge_cms', @@ -176,7 +175,6 @@ def variable_mannings_calc(args): ], axis=1, errors='ignore', - inplace=True, ) df_htable = df_htable.merge( df_src_trim, how='left', left_on=['HydroID', 'stage'], right_on=['HydroID', 'stage'] @@ -250,10 +248,9 @@ def subdiv_geometry(df_src): def subdiv_mannings_eq(df_src): ## Calculate discharge (channel) using Manning's equation - df_src.drop( + df_src = df_src.drop( ['WetArea_chan (m2)', 'HydraulicRadius_chan (m)', 'Discharge_chan (m3s-1)', 'Velocity_chan (m/s)'], axis=1, - inplace=True, errors='ignore', ) # drop these cols (in case subdiv was previously performed) df_src['WetArea_chan (m2)'] = df_src['Volume_chan (m3)'] / df_src['LENGTHKM'] / 1000 @@ -269,7 +266,7 @@ def subdiv_mannings_eq(df_src): df_src['Velocity_chan (m/s)'].fillna(0, inplace=True) ## Calculate discharge (overbank) using Manning's equation - df_src.drop( + df_src = df_src.drop( [ 'WetArea_obank (m2)', 'HydraulicRadius_obank (m)', @@ -277,12 +274,11 @@ def subdiv_mannings_eq(df_src): 'Velocity_obank (m/s)', ], axis=1, - inplace=True, errors='ignore', ) # drop these cols (in case subdiv was previously performed) df_src['WetArea_obank (m2)'] = df_src['Volume_obank (m3)'] / df_src['LENGTHKM'] / 1000 df_src['HydraulicRadius_obank (m)'] = df_src['WetArea_obank (m2)'] / df_src['WettedPerimeter_obank (m)'] - df_src.replace([np.inf, -np.inf], np.nan, inplace=True) # need to replace inf instances (divide by 0) + df_src = df_src.replace([np.inf, -np.inf], np.nan) # need to replace inf instances (divide by 0) df_src['HydraulicRadius_obank (m)'].fillna(0, inplace=True) df_src['Discharge_obank (m3s-1)'] = ( df_src['WetArea_obank (m2)'] @@ -294,8 +290,8 @@ def subdiv_mannings_eq(df_src): df_src['Velocity_obank (m/s)'].fillna(0, inplace=True) ## Calcuate the total of the subdivided discharge (channel + overbank) - df_src.drop( - ['Discharge (m3s-1)_subdiv'], axis=1, inplace=True, errors='ignore' + df_src = df_src.drop( + ['Discharge (m3s-1)_subdiv'], axis=1, errors='ignore' ) # drop these cols (in case subdiv was previously performed) df_src['Discharge (m3s-1)_subdiv'] = df_src['Discharge_chan (m3s-1)'] + df_src['Discharge_obank (m3s-1)'] df_src.loc[df_src['Stage'] == 0, ['Discharge (m3s-1)_subdiv']] = 0 diff --git a/src/subset_catch_list_by_branch_id.py b/src/subset_catch_list_by_branch_id.py index 871ad3080..bf80a9da9 100755 --- a/src/subset_catch_list_by_branch_id.py +++ b/src/subset_catch_list_by_branch_id.py @@ -17,7 +17,7 @@ def Subset_catch_list( # loading files catch_list = pd.read_csv(catch_list, sep=" ", header=None, skiprows=1) - catch_list.rename(columns={0: "HydroID", 1: "slopes", 2: "lengthKM", 3: "areasqkm"}, inplace=True) + catch_list = catch_list.rename(columns={0: "HydroID", 1: "slopes", 2: "lengthKM", 3: "areasqkm"}) stream_network = StreamNetwork.from_file(stream_network, branch_id_attribute=branch_id_attribute) stream_network = StreamNetwork( stream_network.astype({'HydroID': int}), branch_id_attribute=branch_id_attribute diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index 3065008b3..b3ec127c9 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -41,7 +41,7 @@ def load_gages(self): # Convert ras locs crs to match usgs gage crs ras_locs.to_crs(usgs_gages.crs, inplace=True) - ras_locs.rename(columns={'huc8': 'HUC8'}, inplace=True) + ras_locs = ras_locs.rename(columns={'huc8': 'HUC8'}) # Convert Multipoint geometry to Point geometry ras_locs['geometry'] = ras_locs.representative_point() @@ -51,7 +51,7 @@ def load_gages(self): # ras_locs['HUC8'] = str(self.huc8) # ras_locs = ras_locs.drop('huc8', axis=1) # elif ras_locs.huc8.dtype == 'int64': - # ras_locs.rename(columns={'huc8':'HUC8'}, inplace=True) + # ras_locs = ras_locs.rename(columns={'huc8':'HUC8'}) # Concat USGS points and RAS2FIM points gages_locs = pd.concat([usgs_gages, ras_locs], axis=0, ignore_index=True) @@ -64,8 +64,8 @@ def load_gages(self): if self.ahps_filename: ahps_sites = gpd.read_file(self.ahps_filename) ahps_sites = ahps_sites[ahps_sites.HUC8 == self.huc8] # filter to HUC8 - ahps_sites.rename( - columns={'nwm_feature_id': 'feature_id', 'usgs_site_code': 'location_id'}, inplace=True + ahps_sites = ahps_sites.rename( + columns={'nwm_feature_id': 'feature_id', 'usgs_site_code': 'location_id'} ) ahps_sites = ahps_sites[ ahps_sites.location_id.isna() @@ -86,7 +86,7 @@ def load_gages(self): def sort_into_branch(self, nwm_subset_streams_levelPaths): nwm_reaches = gpd.read_file(nwm_subset_streams_levelPaths) - nwm_reaches.rename(columns={'ID': 'feature_id'}, inplace=True) + nwm_reaches = nwm_reaches.rename(columns={'ID': 'feature_id'}) if not self.gages[self.gages.feature_id.isnull()].empty: missing_feature_id = self.gages.loc[self.gages.feature_id.isnull()].copy() @@ -132,14 +132,13 @@ def filter_gage_branches(fim_inputs_filename): for huc_dir in [d for d in os.listdir(fim_dir) if re.search(r'^\d{8}$', d)]: gage_file = os.path.join(fim_dir, huc_dir, 'usgs_subset_gages.gpkg') if not os.path.isfile(gage_file): - fim_inputs.drop(fim_inputs.loc[fim_inputs.huc == huc_dir].index, inplace=True) + fim_inputs = fim_inputs.drop(fim_inputs.loc[fim_inputs.huc == huc_dir].index) continue gages = gpd.read_file(gage_file) level_paths = gages.levpa_id - fim_inputs.drop( - fim_inputs.loc[(fim_inputs.huc == huc_dir) & (~fim_inputs.levpa_id.isin(level_paths))].index, - inplace=True, + fim_inputs = fim_inputs.drop( + fim_inputs.loc[(fim_inputs.huc == huc_dir) & (~fim_inputs.levpa_id.isin(level_paths))].index ) fim_inputs.to_csv(fim_inputs_filename, index=False, header=False) diff --git a/src/utils/shared_functions.py b/src/utils/shared_functions.py index 7f0eacc37..f0b7dfaf5 100644 --- a/src/utils/shared_functions.py +++ b/src/utils/shared_functions.py @@ -3,8 +3,6 @@ import glob import inspect import os -import re -import sys from concurrent.futures import as_completed from datetime import datetime, timezone from os.path import splitext @@ -16,8 +14,6 @@ import pandas as pd import rasterio from memory_profiler import profile -from pyproj.crs import CRS -from rasterio.warp import Resampling, calculate_default_transform, reproject from tqdm import tqdm import utils.shared_variables as sv @@ -97,7 +93,7 @@ def subset_wbd_gpkg(wbd_gpkg, multilayer_wbd_geopackage): keep_flag = True break if not keep_flag: - gdf.drop(index, inplace=True) # Delete from dataframe. + gdf = gdf.drop(index) # Delete from dataframe. # Overwrite geopackage. layer_name = os.path.split(wbd_gpkg)[1].strip('.gpkg') diff --git a/tools/adjust_rc_with_feedback.py b/tools/adjust_rc_with_feedback.py index 429c6da97..dfd16229e 100644 --- a/tools/adjust_rc_with_feedback.py +++ b/tools/adjust_rc_with_feedback.py @@ -39,8 +39,8 @@ def update_rating_curve(fim_directory, output_csv, htable_path, output_src_json_ 'LakeID', ] ] - df_htable.rename( - columns={'orig_discharge_cms': 'discharge_cms', 'default_ManningN': 'ManningN'}, inplace=True + df_htable = df_htable.rename( + columns={'orig_discharge_cms': 'discharge_cms', 'default_ManningN': 'ManningN'} ) else: df_htable = df_htable[ @@ -79,8 +79,8 @@ def update_rating_curve(fim_directory, output_csv, htable_path, output_src_json_ # print(df_hydro_feat.to_string()) ## Calculate roughness using Manning's equation - df_gmed.rename( - columns={'ManningN': 'ManningN_default', 'hydroid': 'HydroID'}, inplace=True + df_gmed = df_gmed.rename( + columns={'ManningN': 'ManningN_default', 'hydroid': 'HydroID'} ) # rename the previous ManningN column df_gmed['hydroid_ManningN'] = ( df_gmed['WetArea_m2'] @@ -116,7 +116,7 @@ def update_rating_curve(fim_directory, output_csv, htable_path, output_src_json_ # Create df with the most recent collection time entry df_updated = df_gmed.groupby(["HydroID"])[['coll_time']].max() - df_updated.rename(columns={'coll_time': 'last_updated'}, inplace=True) + df_updated = df_updated.rename(columns={'coll_time': 'last_updated'}) # cacluate median ManningN to handle cases with multiple hydroid entries df_mann = df_gmed.groupby(["HydroID"])[['hydroid_ManningN']].median() @@ -125,11 +125,11 @@ def update_rating_curve(fim_directory, output_csv, htable_path, output_src_json_ # Create a df with the median hydroid_ManningN value per feature_id df_mann_featid = df_gmed.groupby(["feature_id"])[['hydroid_ManningN']].median() - df_mann_featid.rename(columns={'hydroid_ManningN': 'featid_ManningN'}, inplace=True) + df_mann_featid = df_mann_featid.rename(columns={'hydroid_ManningN': 'featid_ManningN'}) # Rename the original hydrotable variables to allow new calculations to use the primary var name - df_htable.rename( - columns={'ManningN': 'default_ManningN', 'discharge_cms': 'orig_discharge_cms'}, inplace=True + df_htable = df_htable.rename( + columns={'ManningN': 'default_ManningN', 'discharge_cms': 'orig_discharge_cms'} ) # Check for large variabilty in the calculated Manning's N values diff --git a/tools/aggregate_csv_files.py b/tools/aggregate_csv_files.py index 0efeafe59..9373ab4d4 100644 --- a/tools/aggregate_csv_files.py +++ b/tools/aggregate_csv_files.py @@ -37,7 +37,7 @@ def read_csvs_to_df(files_to_merge, head_row): # header=0, # ) # df = df[df['adjust_ManningN'].notna()] - # df.drop_duplicates(subset=['HydroID'], inplace=True) + # df = df.drop_duplicates(subset=['HydroID'], inplace=True) df = pd.read_csv(file_in, index_col=None, header=head_row) # dtype={'feature_id': 'int64'} df = df[df['Unnamed: 0'] != 'HydroID'] li.append(df) diff --git a/tools/combine_crosswalk_tables.py b/tools/combine_crosswalk_tables.py index 6251966c5..9acc2292e 100644 --- a/tools/combine_crosswalk_tables.py +++ b/tools/combine_crosswalk_tables.py @@ -21,8 +21,8 @@ def combine_crosswalk_tables(data_directory, output_filename): file_df = pd.read_csv( filename, usecols=['HUC', 'HydroID', 'feature_id', 'LakeID'], dtype={'HUC': str} ) - file_df.drop_duplicates(inplace=True) - file_df.rename(columns={'HUC': 'huc8'}, inplace=True) + file_df = file_df.drop_duplicates() + file_df = file_df.rename(columns={'HUC': 'huc8'}) file_df['BranchID'] = os.path.split(os.path.dirname(filename))[1] dfs.append(file_df) diff --git a/tools/inundation.py b/tools/inundation.py index 0babdb6c9..b39d9d191 100755 --- a/tools/inundation.py +++ b/tools/inundation.py @@ -575,7 +575,7 @@ def __subset_hydroTable_to_forecast(hydroTable, forecast, subset_hucs=None): usecols=htable_req_cols, ) # huc_error = hydroTable.HUC.unique() - hydroTable.set_index(['HUC', 'feature_id', 'HydroID'], inplace=True) + hydroTable = hydroTable.set_index(['HUC', 'feature_id', 'HydroID']) elif isinstance(hydroTable, pd.DataFrame): pass # consider checking for correct dtypes, indices, and columns @@ -593,7 +593,7 @@ def __subset_hydroTable_to_forecast(hydroTable, forecast, subset_hucs=None): if isinstance(forecast, str): try: forecast = pd.read_csv(forecast, dtype={'feature_id': str, 'discharge': float}) - forecast.set_index('feature_id', inplace=True) + forecast = forecast.set_index('feature_id') except UnicodeDecodeError: forecast = read_nwm_forecast_file(forecast) @@ -619,7 +619,7 @@ def __subset_hydroTable_to_forecast(hydroTable, forecast, subset_hucs=None): if not hydroTable.empty: if isinstance(forecast, str): forecast = pd.read_csv(forecast, dtype={'feature_id': str, 'discharge': float}) - forecast.set_index('feature_id', inplace=True) + forecast = forecast.set_index('feature_id') elif isinstance(forecast, pd.DataFrame): pass # consider checking for dtypes, indices, and columns else: @@ -687,7 +687,7 @@ def read_nwm_forecast_file(forecast_file, rename_headers=True): flows_nc = xr.open_dataset(forecast_file, decode_cf='feature_id', engine='netcdf4') flows_df = flows_nc.to_dataframe() - flows_df.reset_index(inplace=True) + flows_df = flows_df.reset_index() flows_df = flows_df[['streamflow', 'feature_id']] @@ -697,9 +697,9 @@ def read_nwm_forecast_file(forecast_file, rename_headers=True): convert_dict = {'feature_id': str, 'discharge': float} flows_df = flows_df.astype(convert_dict) - flows_df.set_index('feature_id', inplace=True, drop=True) + flows_df = flows_df.set_index('feature_id', drop=True) - flows_df.dropna(inplace=True) + flows_df = flows_df.dropna() return flows_df @@ -711,7 +711,7 @@ def __vprint(message, verbose): def create_src_subset_csv(hydro_table, catchmentStagesDict, src_table): src_df = pd.DataFrame.from_dict(catchmentStagesDict, orient='index') - src_df.reset_index(inplace=True) + src_df = src_df.reset_index() src_df.columns = ['HydroID', 'stage_inund'] htable_req_cols = ['HUC', 'feature_id', 'HydroID', 'stage', 'discharge_cms', 'LakeID'] df_htable = pd.read_csv( diff --git a/tools/make_boxes_from_bounds.py b/tools/make_boxes_from_bounds.py index 4959a21e4..2810cac37 100755 --- a/tools/make_boxes_from_bounds.py +++ b/tools/make_boxes_from_bounds.py @@ -43,15 +43,15 @@ def find_hucs_of_bounding_boxes( lambda bbdf: gpd.read_file(wbd, layer=wbd_layer, mask=bbdf.geometry)[wbdcol_name], axis=1 ) - bounding_boxes.drop(columns=['geometry', 'minx', 'miny', 'maxx', 'maxy'], inplace=True) + bounding_boxes = bounding_boxes.drop(columns=['geometry', 'minx', 'miny', 'maxx', 'maxy']) hucs_columns = hucs.columns bb_columns = bounding_boxes.columns bounding_boxes = hucs.join(bounding_boxes) bounding_boxes = pd.melt(bounding_boxes, id_vars=bb_columns, value_vars=hucs_columns, value_name='HUC8') - bounding_boxes.drop(columns=['variable'], inplace=True) - bounding_boxes.dropna(inplace=True) - bounding_boxes.reset_index(drop=True, inplace=True) + bounding_boxes = bounding_boxes.drop(columns=['variable']) + bounding_boxes = bounding_boxes.dropna() + bounding_boxes = bounding_boxes.reset_index(drop=True) hucs_series = pd.Series(hucs.stack().reset_index(drop=True).unique()) diff --git a/tools/mosaic_inundation.py b/tools/mosaic_inundation.py index 601b389e4..6229b9907 100755 --- a/tools/mosaic_inundation.py +++ b/tools/mosaic_inundation.py @@ -43,7 +43,7 @@ def Mosaic_inundation( raise TypeError("Pass Pandas Dataframe or file path string to csv for map_file argument") # remove NaNs - inundation_maps_df.dropna(axis=0, how="all", inplace=True) + inundation_maps_df = inundation_maps_df.dropna(axis=0, how="all") # subset if subset is not None: @@ -53,7 +53,7 @@ def Mosaic_inundation( # unique aggregation units aggregation_units = inundation_maps_df.loc[:, unit_attribute_name].unique() - inundation_maps_df.set_index(unit_attribute_name, drop=True, inplace=True) + inundation_maps_df = inundation_maps_df.set_index(unit_attribute_name, drop=True) # decide upon whether to display if verbose & len(aggregation_units) == 1: diff --git a/tools/plots.py b/tools/plots.py index 86b7ee6b4..67aea2415 100755 --- a/tools/plots.py +++ b/tools/plots.py @@ -153,8 +153,8 @@ def set_axes(facetgrid): def preparing_data_for_plotting(metrics_table): - metrics_table.rename( - columns={'extent_config': 'Model', 'magnitude': 'Magnitude', 'TPR': 'POD'}, inplace=True + metrics_table = metrics_table.rename( + columns={'extent_config': 'Model', 'magnitude': 'Magnitude', 'TPR': 'POD'} ) # set_mannings = lambda df: 0.06 if 'n_6' in df['version'] else 0.12 @@ -189,8 +189,8 @@ def robust_linear_model(metrics_table): # metric_indices = {m: metrics_table.loc[:, 'Metric'] == m for m in metrics} # mannings_indices = {m: metrics_table.loc[:, 'Mannings N'] == m for m in mannings} - metrics_table.set_index(['Metric', 'Mannings N'], inplace=True, drop=False) - metrics_table.sort_index(inplace=True) + metrics_table = metrics_table.set_index(['Metric', 'Mannings N'], drop=False) + metrics_table = metrics_table.sort_index() for met, man in product(metrics, mannings): y = metrics_table.loc[(met, man), 'Metric Value'].to_numpy() @@ -207,14 +207,14 @@ def robust_linear_model(metrics_table): metrics_table.loc[(met, man), 'beta1'] = beta1 metrics_table.loc[(met, man), 'beta1_pvalue'] = pval_beta1 - metrics_table.reset_index(drop=True, inplace=True) + metrics_table = metrics_table.reset_index(drop=True) return metrics_table def annotate_rlm(facetgrid, metrics_table): - metrics_table.set_index(['Metric', 'Mannings N'], inplace=True, drop=False) - metrics_table.sort_index(inplace=True) + metrics_table = metrics_table.set_index(['Metric', 'Mannings N'], drop=False) + metrics_table = metrics_table.sort_index() metric_index_dict = {'CSI': 0, 'POD': 1, 'FAR': 2} mannings_index_dict = {0.06: 0, 0.12: 1} diff --git a/tools/rating_curve_comparison.py b/tools/rating_curve_comparison.py index 2364e48f7..2df1c179b 100755 --- a/tools/rating_curve_comparison.py +++ b/tools/rating_curve_comparison.py @@ -96,7 +96,7 @@ def generate_rating_curve_metrics(args): ) # Filter out null and non-integer location_id entries (the crosswalk steps tries to fill AHPS only sites with the nws_lid) - elev_table.dropna(subset=['location_id'], inplace=True) + elev_table = elev_table.dropna(subset=['location_id']) elev_table = elev_table[elev_table['location_id'].apply(lambda x: str(x).isdigit())] # Read in the USGS gages rating curve database csv @@ -122,9 +122,9 @@ def generate_rating_curve_metrics(args): branch_hydrotable = branch_hydrotable.loc[ branch_hydrotable.HydroID.isin(branch_elev_table.HydroID) ] - branch_hydrotable.drop(columns=['order_'], inplace=True) + branch_hydrotable = branch_hydrotable.drop(columns=['order_']) # Join SRC with elevation data - branch_elev_table.rename(columns={'feature_id': 'fim_feature_id'}, inplace=True) + branch_elev_table = branch_elev_table.rename(columns={'feature_id': 'fim_feature_id'}) branch_hydrotable = branch_hydrotable.merge(branch_elev_table, on="HydroID") # Append to full rating curve dataframe if hydrotable.empty: @@ -133,7 +133,7 @@ def generate_rating_curve_metrics(args): hydrotable = pd.concat([hydrotable, branch_hydrotable]) # Join rating curves with elevation data - # elev_table.rename(columns={'feature_id':'fim_feature_id'}, inplace=True) + # elev_table = elev_table.rename(columns={'feature_id':'fim_feature_id'}) # hydrotable = hydrotable.merge(elev_table, on="HydroID") if 'location_id' in hydrotable.columns: relevant_gages = list(hydrotable.location_id.unique()) @@ -230,7 +230,7 @@ def generate_rating_curve_metrics(args): # Identify unique gages usgs_crosswalk = hydrotable.filter(items=['location_id', 'feature_id']).drop_duplicates() - usgs_crosswalk.dropna(subset=['location_id'], inplace=True) + usgs_crosswalk = usgs_crosswalk.dropna(subset=['location_id']) nwm_recurr_data_table = pd.DataFrame() # usgs_recurr_data = pd.DataFrame() @@ -1131,7 +1131,7 @@ def calculate_rc_diff(rc): # Calculate water surface elevation difference at recurrence intervals rc_unmelt["yhat_minus_y"] = rc_unmelt[src_elev] - rc_unmelt[usgs_elev] # Remove duplicate location_id-recurr_interval pairs and pivot - rc_unmelt.set_index(['location_id', 'recurr_interval'], inplace=True, verify_integrity=False) + rc_unmelt = rc_unmelt.set_index(['location_id', 'recurr_interval'], verify_integrity=False) rc_unmelt = ( rc_unmelt[~rc_unmelt.index.duplicated(keep='first')] .reset_index() diff --git a/tools/vary_mannings_n_composite.py b/tools/vary_mannings_n_composite.py index 1a69ab28e..bdc2151a9 100755 --- a/tools/vary_mannings_n_composite.py +++ b/tools/vary_mannings_n_composite.py @@ -3,14 +3,10 @@ import datetime as dt import os import re -import shutil -import sys import traceback import warnings -from functools import reduce from multiprocessing import Pool -from os.path import dirname, isdir, isfile, join -from pathlib import Path +from os.path import isdir, isfile, join import matplotlib.pyplot as plt import numpy as np @@ -83,10 +79,9 @@ def variable_mannings_calc(args): else: try: if 'comp_ManningN' in df_src.columns: - df_src.drop( + df_src = df_src.drop( ['channel_n', 'overbank_n', 'comp_ManningN', 'vmann_on', 'Discharge (m3s-1)_varMann'], axis=1, - inplace=True, ) # drop these cols (in case vmann was previously performed) ## Merge (crosswalk) the df of Manning's n with the SRC df @@ -135,7 +130,7 @@ def variable_mannings_calc(args): ## Calculate Q using Manning's equation # Uncomment below to rename the previous Discharge column - # df_src.rename(columns={'Discharge (m3s-1)'}, inplace=True) + # df_src = df_src.rename(columns={'Discharge (m3s-1)'}) df_src['Discharge (m3s-1)_varMann'] = ( df_src[wet_area] * pow(df_src[hydr_radius], 2.0 / 3) @@ -185,15 +180,14 @@ def variable_mannings_calc(args): ## Check if BARC ran # if not set(['orig_discharge_cms']).issubset(df_htable.columns): - # df_htable.rename(columns={'discharge_cms':'orig_discharge_cms'},inplace=True) - # df_htable.rename(columns={'ManningN':'orig_ManningN'},inplace=True) + # df_htable = df_htable.rename(columns={'discharge_cms':'orig_discharge_cms'}) + # df_htable = df_htable.rename(columns={'ManningN':'orig_ManningN'}) # else: ## drop the previously modified discharge column to be replaced with updated version - df_htable.drop( + df_htable = df_htable.drop( ['vmann_on', 'discharge_cms', 'ManningN', 'vmann_discharge_cms', 'vmann_ManningN'], axis=1, - inplace=True, ) df_htable = df_htable.merge( df_src_trim, how='left', left_on=['HydroID', 'stage'], right_on=['HydroID', 'stage'] From bd793002c08486fcad26bfe5b0774ea35f956d7f Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Wed, 20 Sep 2023 18:34:06 -0400 Subject: [PATCH 03/51] v4.4.2.1 Bug fix: set geometry after `GeoDataFrame.update()` (#990) --- CITATION.cff | 2 +- docs/CHANGELOG.md | 10 ++++++++++ src/usgs_gage_unit_setup.py | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 0c47bf8d3..cfa1f10b7 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -4,5 +4,5 @@ authors: - family-names: "NOAA Office of Water Prediction" title: "Inundation Mapping" url: "https://github.com/NOAA-OWP/inundation-mapping" -version: 4.4.1.1 +version: 4.4.2.1 date-released: 2023 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index eebbb5703..6075991de 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,16 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.2.1 - 2023-09-20 - [PR#990](https://github.com/NOAA-OWP/inundation-mapping/pull/990) + +Corrects a bug in `src/usgs_gage_unit_setup.py` caused by missing geometry field after `GeoDataFrame.update()`. + +### Changes + +- `src/usgs_gage_unit_setup.py`: Sets geometry field in `self.gages`. + +

+ ## v4.4.2.0 - 2023-09-20 - [PR#993](https://github.com/NOAA-OWP/inundation-mapping/pull/993) Resolves the causes of two warnings in pandas and geopandas: (1) `FutureWarning` from taking the `int()` of single-length Series and (2) `SettingWithCopyWarning` resulting from the use of `inplace=True`. diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index b3ec127c9..246803a02 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -96,6 +96,7 @@ def sort_into_branch(self, nwm_subset_streams_levelPaths): ) self.gages.update(missing_feature_id) + self.gages = self.gages.set_geometry("geometry") del nwm_reaches_union From 6ab186d4ec13f58692521e9ff15859502fd01754 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Thu, 21 Sep 2023 09:32:53 -0600 Subject: [PATCH 04/51] Update README.md (#996) --- README.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index fb6872d86..85c071822 100644 --- a/README.md +++ b/README.md @@ -25,21 +25,20 @@ AWS Resource Name: `arn:aws:s3:::noaa-nws-owp-fim` ### Accessing Data using the AWS CLI -This S3 Bucket (`s3://noaa-nws-owp-fim`) is set to avoid having AWS credentials loaded. Read more about the use of the `--no-sign-request` [here](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#:~:text=%2D%2Dno%2Dsign%2Drequest,prevents%20credentials%20from%20being%20loaded.). There should be no cost associated with using this S3 Bucket. - +This S3 Bucket (`s3://noaa-nws-owp-fim`) is set up as a "Requester Pays" bucket. Read more about what that means [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html). If you are using compute resources in the same region as the S3 Bucket, then there is no cost. ### Examples **Note:** All examples are based on linux pathing. Also, for each sample below, remove the line breaks [backslash(s) "\"] before running the command. The available inputs, test cases, and versioned FIM outputs can be found by running: ``` -aws s3 ls s3://noaa-nws-owp-fim/hand_fim/ --no-sign-request +aws s3 ls s3://noaa-nws-owp-fim/hand_fim/ --request-payer ``` Download a directory of sample outputs for a single HUC8: ``` -aws s3 cp --recursive s3://noaa-nws-owp-fim/hand_fim/outputs/fim_4_3_11_0/12090301 \ - /your_local_folder_name/12090301 --no-sign-request +aws s3 sync s3://noaa-nws-owp-fim/hand_fim/outputs/fim_4_3_11_0/12090301 \ + /your_local_folder_name/12090301 --request-payer ``` By adjusting pathing, you can also download entire directories such as the `fim_4_3_11_0` folder. An entire output FIM set (e.g. `fim_4_3_11_0`) is approximately 1.1 TB. @@ -84,7 +83,7 @@ Git will auto create a subfolder named `inundation-mapping` where the code will Input data can be found on the ESIP S3 Bucket (see "Accessing Data through ESIP S3 Bucket" section above). The FIM inputs directory can be found at `s3://noaa-nws-owp-fim/hand_fim/inputs`. It is appx 400GB and it needs to be in your `data` folder. ``` -aws s3 cp --recursive s3://noaa-nws-owp-fim/hand_fim/inputs /home/projects/fim/data/inputs --no-sign-request --dryrun +aws s3 sync s3://noaa-nws-owp-fim/hand_fim/inputs /home/projects/fim/data/inputs --request-payer --dryrun ``` **Note**: When you include the `--dryrun` argument in the command, a large list will be returned showing you exactly which files are to be downloaded and where they will be saved. We recommend including this argument the first time you run the command, then quickly aborting it (CTRL-C) so you don't get the full list. However, you can see that your chosen target path on your machine is correct. When you are happy with the pathing, run the `aws s3` command again and leave off the `--dryrun` argument. From 99a121013b903db3a7c8a0da387ab071fd8f1237 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Thu, 21 Sep 2023 17:20:11 -0400 Subject: [PATCH 05/51] v4.4.2.2 Bug fix for reindexing error (#997) --- docs/CHANGELOG.md | 10 ++++++++++ src/stream_branches.py | 3 --- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6075991de..043e86924 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,16 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.2.2 - 2023-09-21 - [PR#997](https://github.com/NOAA-OWP/inundation-mapping/pull/997) + +Bug fix for an error related to reindexing in `StreamNetwork.drop()`. + +### Changes + +- `src/stream_branches.py`: Fixes reindexing error. + +

+ ## v4.4.2.1 - 2023-09-20 - [PR#990](https://github.com/NOAA-OWP/inundation-mapping/pull/990) Corrects a bug in `src/usgs_gage_unit_setup.py` caused by missing geometry field after `GeoDataFrame.update()`. diff --git a/src/stream_branches.py b/src/stream_branches.py index 3491f40be..fada36a6d 100755 --- a/src/stream_branches.py +++ b/src/stream_branches.py @@ -174,12 +174,9 @@ def drop(self, labels=None, axis=0): branch_id_attribute = self.branch_id_attribute attribute_excluded = self.attribute_excluded values_excluded = self.values_excluded - crs = self.crs - geometry = self.geometry self = super(gpd.GeoDataFrame, self) self = self.drop(labels=labels, axis=axis) - self = gpd.GeoDataFrame(self, crs=crs, geometry=geometry) self = StreamNetwork( self, From 90ed7dded53f9c818509ae031d9d8259d527135f Mon Sep 17 00:00:00 2001 From: Rob Gonzalez-Pita Date: Thu, 21 Sep 2023 15:22:20 -0600 Subject: [PATCH 06/51] v4.4.2.3 Remove exclude list for black, re-run black on repository (#998) --- .pre-commit-config.yaml | 9 +++------ docs/CHANGELOG.md | 18 ++++++++++++++++++ pyproject.toml | 8 +------- src/add_crosswalk.py | 7 ++++--- src/bathy_src_adjust_topwidth.py | 2 +- src/bathymetric_adjustment.py | 2 +- src/identify_src_bankfull.py | 14 ++++++-------- src/src_roughness_optimization.py | 12 +++++------- tools/vary_mannings_n_composite.py | 3 +-- 9 files changed, 40 insertions(+), 35 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5d4df4c20..2aebea2c3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,23 +12,20 @@ repos: - id: check-added-large-files args: ['--maxkb=5000'] - id: check-json + - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 hooks: - id: flake8 entry: pflake8 additional_dependencies: [pyproject-flake8] + - repo: https://github.com/psf/black rev: 23.7.0 hooks: - id: black args: ['--line-length=110', '--skip-magic-trailing-comma', '--skip-string-normalization'] - exclude: | - (?x)^( - src/add_crosswalk.py| - src/bathymetric_adjustment.py| - src/identify_src_bankfull.py - )$ + - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 043e86924..dfff11dd7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,24 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.2.3 - 2023-09-21 - [PR#998](https://github.com/NOAA-OWP/inundation-mapping/pull/998) + +Removes exclude list for black formatter in `.pre-commit-config.yaml` as well as in `pyproject.toml`. Ran the `black` executable on the +whole repository, the re-formatted files in `src/` & `tools/` are included. + +### Changes + +- `.pre-commit-config.yaml` +- `pyproject.toml` +- `src/add_crosswalk.py` +- `src/bathy_src_adjust_topwidth.py` +- `src/bathymetric_adjustment.py` +- `src/identify_src_bankfull.py` +- `src/src_roughness_optimization.py` +- `tools/vary_mannings_n_composite.py` + +

+ ## v4.4.2.2 - 2023-09-21 - [PR#997](https://github.com/NOAA-OWP/inundation-mapping/pull/997) Bug fix for an error related to reindexing in `StreamNetwork.drop()`. diff --git a/pyproject.toml b/pyproject.toml index af8b9d9e3..f6d623ec0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,13 +46,7 @@ Wiki = "https://github.com/NOAA-OWP/inundation-mapping/wiki" line_length = 110 skip-string-normalization = true skip-magic-trailing-comma = true -force-exclude = ''' - \.git - | src/add_crosswalk.py - | src/bathymetric_adjustment.py - | src/identify_src_bankfull.py - | -''' + [tool.isort] profile = 'black' diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index 283f0ff30..3f0a5f5c0 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -53,7 +53,7 @@ def add_crosswalk( input_catchments, input_nwmcatras_fileName, stats=['majority'], geojson_out=True ) input_majorities = gpd.GeoDataFrame.from_features(majority_calc) - input_majorities = input_majorities.rename(columns={'majority' : 'feature_id'}) + input_majorities = input_majorities.rename(columns={'majority': 'feature_id'}) input_majorities = input_majorities[:][input_majorities['feature_id'].notna()] if input_majorities.feature_id.dtype != 'int': @@ -321,7 +321,8 @@ def add_crosswalk( for src_index, src_stage in new_values.iterrows(): output_src.loc[ (output_src['HydroID'] == short_id) & (output_src['Stage'] == src_stage[0]), - ['Discharge (m3s-1)']] = src_stage[1] + ['Discharge (m3s-1)'], + ] = src_stage[1] if extent == 'FR': output_src = output_src.merge(input_majorities[['HydroID', 'feature_id']], on='HydroID') @@ -352,7 +353,7 @@ def add_crosswalk( 'SLOPE', 'ManningN', 'Stage', - 'Discharge (m3s-1)' + 'Discharge (m3s-1)', ], ] output_hydro_table.rename(columns={'Stage': 'stage', 'Discharge (m3s-1)': 'discharge_cms'}, inplace=True) diff --git a/src/bathy_src_adjust_topwidth.py b/src/bathy_src_adjust_topwidth.py index 72e86441f..4ce6ccf9c 100644 --- a/src/bathy_src_adjust_topwidth.py +++ b/src/bathy_src_adjust_topwidth.py @@ -430,7 +430,7 @@ def bathy_rc_lookup(args): 'Volume (m3)': 'orig_Volume (m3)', 'WetArea (m2)': 'orig_WetArea (m2)', 'HydraulicRadius (m)': 'orig_HydraulicRadius (m)', - }, + } ) else: df_htable = df_htable.drop( diff --git a/src/bathymetric_adjustment.py b/src/bathymetric_adjustment.py index b0421bc4f..a102d0a80 100644 --- a/src/bathymetric_adjustment.py +++ b/src/bathymetric_adjustment.py @@ -74,7 +74,7 @@ def correct_rating_for_bathymetry(fim_dir, huc, bathy_file, verbose): ], on='feature_id', how='left', - validate='many_to_one' + validate='many_to_one', ) # If there's more than one feature_id in the bathy data, just take the mean except pd.errors.MergeError: diff --git a/src/identify_src_bankfull.py b/src/identify_src_bankfull.py index 8b99e295d..5fe955ea4 100755 --- a/src/identify_src_bankfull.py +++ b/src/identify_src_bankfull.py @@ -129,9 +129,7 @@ def src_bankfull_lookup(args): # find the index of the Q_bfull_find (closest matching flow) df_bankfull_calc = df_bankfull_calc.loc[ df_bankfull_calc.groupby('HydroID')['Q_bfull_find'].idxmin() - ].reset_index( - drop=True - ) + ].reset_index(drop=True) # rename volume to use later for channel portion calc df_bankfull_calc = df_bankfull_calc.rename( columns={ @@ -139,7 +137,7 @@ def src_bankfull_lookup(args): bedarea_var: 'BedArea_bankfull', volume_var: 'Volume_bankfull', hradius_var: 'HRadius_bankfull', - surface_area_var: 'SurfArea_bankfull' + surface_area_var: 'SurfArea_bankfull', } ) df_src = df_src.merge( @@ -150,11 +148,11 @@ def src_bankfull_lookup(args): 'BedArea_bankfull', 'Volume_bankfull', 'HRadius_bankfull', - 'SurfArea_bankfull' + 'SurfArea_bankfull', ] ], how='left', - on='HydroID' + on='HydroID', ) df_src = df_src.drop(['Q_bfull_find'], axis=1) @@ -332,7 +330,7 @@ def run_prep(fim_dir, bankfull_flow_filepath, number_of_jobs, verbose, src_plot_ 'HydraulicRadius (m)', 'Discharge (m3s-1)', 'feature_id', - 'Bathymetry_source' + 'Bathymetry_source', ] df_bflows = pd.read_csv(bankfull_flow_filepath, dtype={'feature_id': int}) @@ -359,7 +357,7 @@ def run_prep(fim_dir, bankfull_flow_filepath, number_of_jobs, verbose, src_plot_ huc, branch_id, src_plot_option, - huc_output_dir + huc_output_dir, ] ) else: diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index e417753f6..fd8d502aa 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -388,9 +388,7 @@ def update_rating_curve( df_nmerge[calb_type] = np.select(conditions, choices, default=df_nmerge['hydroid_calb_coef']) df_nmerge['obs_source'] = np.where(df_nmerge[calb_type].notnull(), source_tag, pd.NA) df_nmerge = df_nmerge.drop( - ['feature_id', 'NextDownID', 'LENGTHKM', 'LakeID', 'order_'], - axis=1, - errors='ignore', + ['feature_id', 'NextDownID', 'LENGTHKM', 'LakeID', 'order_'], axis=1, errors='ignore' ) # drop these columns to avoid duplicates where merging with the full hydroTable df ## Merge in previous SRC adjustments (where available) for hydroIDs that do not have a new @@ -433,9 +431,7 @@ def update_rating_curve( 'src_calibrated' in input_catchments.columns ): # check if this attribute already exists and drop if needed input_catchments = input_catchments.drop( - ['src_calibrated', 'obs_source', 'calb_coef_final'], - axis=1, - errors='ignore', + ['src_calibrated', 'obs_source', 'calb_coef_final'], axis=1, errors='ignore' ) df_nmerge['src_calibrated'] = np.where( df_nmerge['calb_coef_final'].notnull(), 'True', 'False' @@ -615,7 +611,9 @@ def branch_network_tracer(df_input_htable): # starting hydroid continue Q.append(nextid) - df_input_htable = df_input_htable.reset_index(drop=True) # reset index (previously using hydroid as index) + df_input_htable = df_input_htable.reset_index( + drop=True + ) # reset index (previously using hydroid as index) # sort the dataframe by branch_id and then by route_count # (need this ordered to ensure upstream to downstream ranking for each branch) df_input_htable = df_input_htable.sort_values(['branch_id', 'route_count']) diff --git a/tools/vary_mannings_n_composite.py b/tools/vary_mannings_n_composite.py index bdc2151a9..e451eb5dd 100755 --- a/tools/vary_mannings_n_composite.py +++ b/tools/vary_mannings_n_composite.py @@ -186,8 +186,7 @@ def variable_mannings_calc(args): ## drop the previously modified discharge column to be replaced with updated version df_htable = df_htable.drop( - ['vmann_on', 'discharge_cms', 'ManningN', 'vmann_discharge_cms', 'vmann_ManningN'], - axis=1, + ['vmann_on', 'discharge_cms', 'ManningN', 'vmann_discharge_cms', 'vmann_ManningN'], axis=1 ) df_htable = df_htable.merge( df_src_trim, how='left', left_on=['HydroID', 'stage'], right_on=['HydroID', 'stage'] From c0eda055beb8aebe65cb0b34c937b7cc691c1631 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 11:32:26 -0500 Subject: [PATCH 07/51] Bump urllib3 from 1.26.16 to 1.26.17 (#1002) --- Pipfile.lock | 1609 ++++++++++++++++++++++++++------------------------ 1 file changed, 838 insertions(+), 771 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 9937efe2c..4e66c9db4 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -42,11 +42,11 @@ }, "anyio": { "hashes": [ - "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780", - "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5" + "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f", + "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.1" + "markers": "python_version >= '3.8'", + "version": "==4.0.0" }, "appdirs": { "hashes": [ @@ -92,18 +92,18 @@ }, "arrow": { "hashes": [ - "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1", - "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2" + "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", + "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" ], - "markers": "python_version >= '3.6'", - "version": "==1.2.3" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "asttokens": { "hashes": [ - "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3", - "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c" + "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e", + "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69" ], - "version": "==2.2.1" + "version": "==2.4.0" }, "attrs": { "hashes": [ @@ -133,7 +133,7 @@ "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==4.12.2" }, "black": { @@ -162,6 +162,7 @@ "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==23.7.0" }, "bleach": { @@ -196,7 +197,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4.0'", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.0.0" }, "boto3": { @@ -205,6 +206,7 @@ "sha256:d388cb7f54f1a3056f91ffcfb5cf18b226454204e5df7a5c10774718c3fbb166" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.26.109" }, "botocore": { @@ -217,91 +219,92 @@ }, "brotli": { "hashes": [ - "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019", - "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df", - "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d", - "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8", - "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b", - "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c", - "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c", - "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70", - "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f", - "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181", - "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130", - "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19", - "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be", - "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be", - "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a", - "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa", - "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429", - "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126", - "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7", - "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad", - "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679", - "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4", - "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0", - "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b", - "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6", - "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438", - "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f", - "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389", - "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6", - "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26", - "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337", - "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7", - "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14", - "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2", - "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430", - "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296", - "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12", - "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f", - "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7", - "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d", - "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a", - "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452", - "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c", - "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761", - "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649", - "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b", - "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea", - "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c", - "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f", - "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a", - "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031", - "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267", - "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5", - "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7", - "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d", - "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c", - "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43", - "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa", - "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde", - "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17", - "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f", - "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8", - "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb", - "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb", - "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d", - "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b", - "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4", - "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755", - "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a", - "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d", - "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a", - "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3", - "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7", - "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1", - "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb", - "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a", - "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91", - "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b", - "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1", - "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806", - "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3", - "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1" + "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208", + "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48", + "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354", + "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a", + "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128", + "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c", + "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088", + "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9", + "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a", + "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3", + "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438", + "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578", + "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b", + "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b", + "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68", + "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d", + "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd", + "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409", + "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da", + "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50", + "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0", + "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180", + "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d", + "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112", + "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc", + "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265", + "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327", + "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95", + "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd", + "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914", + "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0", + "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a", + "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7", + "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0", + "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451", + "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f", + "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e", + "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248", + "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91", + "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724", + "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966", + "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97", + "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d", + "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf", + "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac", + "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951", + "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74", + "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60", + "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c", + "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1", + "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8", + "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d", + "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc", + "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61", + "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460", + "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751", + "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9", + "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1", + "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474", + "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2", + "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6", + "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9", + "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2", + "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467", + "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619", + "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf", + "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408", + "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579", + "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84", + "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b", + "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59", + "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752", + "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80", + "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0", + "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2", + "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3", + "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64", + "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643", + "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e", + "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985", + "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596", + "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2", + "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064" ], "markers": "platform_python_implementation == 'CPython'", - "version": "==1.0.9" + "version": "==1.1.0" }, "cachetools": { "hashes": [ @@ -317,76 +320,66 @@ "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2023.7.22" }, "cffi": { "hashes": [ - "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", - "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", - "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", - "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", - "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", - "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", - "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", - "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", - "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", - "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", - "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", - "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", - "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", - "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", - "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", - "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", - "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", - "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", - "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", - "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", - "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", - "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", - "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", - "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", - "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", - "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", - "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", - "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", - "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", - "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", - "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", - "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", - "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", - "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", - "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", - "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", - "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", - "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", - "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", - "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", - "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", - "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", - "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", - "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", - "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", - "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", - "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", - "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", - "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", - "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", - "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", - "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", - "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", - "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", - "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", - "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", - "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", - "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", - "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", - "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", - "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", - "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", - "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", - "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" - ], - "version": "==1.15.1" + "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", + "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", + "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", + "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", + "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", + "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", + "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", + "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", + "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", + "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", + "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", + "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", + "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", + "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", + "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", + "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", + "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", + "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", + "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", + "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", + "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", + "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", + "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", + "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", + "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", + "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", + "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", + "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", + "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", + "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", + "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", + "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", + "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", + "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", + "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", + "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", + "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", + "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", + "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", + "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", + "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", + "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", + "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", + "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", + "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", + "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", + "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", + "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", + "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", + "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", + "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", + "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + ], + "markers": "python_version >= '3.8'", + "version": "==1.16.0" }, "cfgv": { "hashes": [ @@ -425,84 +418,99 @@ }, "charset-normalizer": { "hashes": [ - "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96", - "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c", - "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710", - "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706", - "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020", - "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252", - "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad", - "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329", - "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a", - "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f", - "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6", - "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4", - "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a", - "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46", - "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2", - "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23", - "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace", - "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd", - "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982", - "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10", - "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2", - "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea", - "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09", - "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5", - "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149", - "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489", - "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9", - "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80", - "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592", - "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3", - "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6", - "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed", - "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c", - "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200", - "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a", - "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e", - "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d", - "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6", - "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623", - "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669", - "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3", - "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa", - "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9", - "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2", - "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f", - "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1", - "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4", - "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a", - "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8", - "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3", - "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029", - "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f", - "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959", - "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22", - "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7", - "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952", - "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346", - "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e", - "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d", - "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299", - "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd", - "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a", - "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3", - "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037", - "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94", - "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c", - "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858", - "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a", - "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449", - "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c", - "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918", - "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1", - "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c", - "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac", - "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa" - ], - "markers": "python_version >= '3.7'", - "version": "==3.2.0" + "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", + "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", + "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", + "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", + "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", + "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", + "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", + "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", + "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", + "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", + "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", + "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", + "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", + "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", + "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", + "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", + "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", + "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", + "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", + "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", + "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", + "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", + "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", + "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", + "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", + "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", + "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", + "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", + "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", + "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", + "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", + "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", + "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", + "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", + "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", + "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", + "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", + "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", + "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", + "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", + "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", + "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", + "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", + "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", + "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", + "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", + "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", + "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", + "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", + "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", + "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", + "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", + "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", + "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", + "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", + "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", + "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", + "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", + "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", + "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", + "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", + "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", + "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", + "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", + "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", + "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", + "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", + "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", + "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", + "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", + "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", + "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", + "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", + "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", + "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", + "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", + "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", + "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", + "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", + "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", + "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", + "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", + "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", + "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", + "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", + "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", + "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", + "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", + "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", + "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.0" }, "click": { "hashes": [ @@ -524,7 +532,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { @@ -561,56 +569,69 @@ }, "contourpy": { "hashes": [ - "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e", - "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104", - "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70", - "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882", - "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f", - "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48", - "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e", - "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a", - "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37", - "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a", - "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2", - "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655", - "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545", - "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027", - "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15", - "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94", - "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439", - "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d", - "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa", - "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae", - "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103", - "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc", - "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa", - "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f", - "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18", - "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9", - "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76", - "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493", - "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9", - "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed", - "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4", - "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f", - "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3", - "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21", - "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e", - "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1", - "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a", - "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002", - "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256" + "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6", + "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33", + "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8", + "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d", + "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d", + "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c", + "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf", + "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e", + "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e", + "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163", + "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532", + "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2", + "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8", + "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1", + "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b", + "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9", + "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916", + "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23", + "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb", + "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a", + "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e", + "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442", + "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684", + "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34", + "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d", + "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d", + "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9", + "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45", + "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718", + "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab", + "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3", + "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae", + "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb", + "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5", + "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba", + "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0", + "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217", + "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887", + "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887", + "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62", + "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431", + "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b", + "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce", + "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b", + "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f", + "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85", + "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e", + "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7", + "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251", + "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970", + "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0", + "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7" ], "markers": "python_version >= '3.8'", - "version": "==1.1.0" + "version": "==1.1.1" }, "cycler": { "hashes": [ - "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3", - "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f" + "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947", + "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a" ], - "markers": "python_version >= '3.6'", - "version": "==0.11.0" + "markers": "python_version >= '3.8'", + "version": "==0.12.0" }, "cython": { "hashes": [ @@ -700,27 +721,27 @@ }, "debugpy": { "hashes": [ - "sha256:038c51268367c9c935905a90b1c2d2dbfe304037c27ba9d19fe7409f8cdc710c", - "sha256:1093a5c541af079c13ac8c70ab8b24d1d35c8cacb676306cf11e57f699c02926", - "sha256:3370ef1b9951d15799ef7af41f8174194f3482ee689988379763ef61a5456426", - "sha256:38651c3639a4e8bbf0ca7e52d799f6abd07d622a193c406be375da4d510d968d", - "sha256:3de5d0f97c425dc49bce4293df6a04494309eedadd2b52c22e58d95107e178d9", - "sha256:4b9eba71c290852f959d2cf8a03af28afd3ca639ad374d393d53d367f7f685b2", - "sha256:65b28435a17cba4c09e739621173ff90c515f7b9e8ea469b92e3c28ef8e5cdfb", - "sha256:72f5d2ecead8125cf669e62784ef1e6300f4067b0f14d9f95ee00ae06fc7c4f7", - "sha256:85969d864c45f70c3996067cfa76a319bae749b04171f2cdeceebe4add316155", - "sha256:890f7ab9a683886a0f185786ffbda3b46495c4b929dab083b8c79d6825832a52", - "sha256:903bd61d5eb433b6c25b48eae5e23821d4c1a19e25c9610205f5aeaccae64e32", - "sha256:92b6dae8bfbd497c90596bbb69089acf7954164aea3228a99d7e43e5267f5b36", - "sha256:973a97ed3b434eab0f792719a484566c35328196540676685c975651266fccf9", - "sha256:d16882030860081e7dd5aa619f30dec3c2f9a421e69861125f83cc372c94e57d", - "sha256:d4ac7a4dba28801d184b7fc0e024da2635ca87d8b0a825c6087bb5168e3c0d28", - "sha256:eea8d8cfb9965ac41b99a61f8e755a8f50e9a20330938ad8271530210f54e09c", - "sha256:f0851403030f3975d6e2eaa4abf73232ab90b98f041e3c09ba33be2beda43fcf", - "sha256:fe87ec0182ef624855d05e6ed7e0b7cb1359d2ffa2a925f8ec2d22e98b75d0ca" - ], - "markers": "python_version >= '3.7'", - "version": "==1.6.7.post1" + "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332", + "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0", + "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f", + "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa", + "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6", + "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637", + "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6", + "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8", + "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb", + "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b", + "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4", + "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153", + "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f", + "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd", + "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595", + "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926", + "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e", + "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada" + ], + "markers": "python_version >= '3.8'", + "version": "==1.8.0" }, "decorator": { "hashes": [ @@ -763,25 +784,25 @@ }, "executing": { "hashes": [ - "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", - "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107" + "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657", + "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08" ], - "version": "==1.2.0" + "version": "==2.0.0" }, "fastjsonschema": { "hashes": [ - "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799", - "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd" + "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea", + "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8" ], - "version": "==2.18.0" + "version": "==2.18.1" }, "filelock": { "hashes": [ - "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81", - "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec" + "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4", + "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd" ], - "markers": "python_version >= '3.7'", - "version": "==3.12.2" + "markers": "python_version >= '3.8'", + "version": "==3.12.4" }, "fiona": { "hashes": [ @@ -814,47 +835,56 @@ "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0" }, "fonttools": { "hashes": [ - "sha256:0eb79a2da5eb6457a6f8ab904838454accc7d4cccdaff1fd2bd3a0679ea33d64", - "sha256:113337c2d29665839b7d90b39f99b3cac731f72a0eda9306165a305c7c31d341", - "sha256:12a7c247d1b946829bfa2f331107a629ea77dc5391dfd34fdcd78efa61f354ca", - "sha256:179737095eb98332a2744e8f12037b2977f22948cf23ff96656928923ddf560a", - "sha256:19b7db825c8adee96fac0692e6e1ecd858cae9affb3b4812cdb9d934a898b29e", - "sha256:37983b6bdab42c501202500a2be3a572f50d4efe3237e0686ee9d5f794d76b35", - "sha256:3a35981d90feebeaef05e46e33e6b9e5b5e618504672ca9cd0ff96b171e4bfff", - "sha256:46a0ec8adbc6ff13494eb0c9c2e643b6f009ce7320cf640de106fb614e4d4360", - "sha256:4aa79366e442dbca6e2c8595645a3a605d9eeabdb7a094d745ed6106816bef5d", - "sha256:515607ec756d7865f23070682622c49d922901943697871fc292277cf1e71967", - "sha256:53eb5091ddc8b1199330bb7b4a8a2e7995ad5d43376cadce84523d8223ef3136", - "sha256:5d18fc642fd0ac29236ff88ecfccff229ec0386090a839dd3f1162e9a7944a40", - "sha256:5fb289b7a815638a7613d46bcf324c9106804725b2bb8ad913c12b6958ffc4ec", - "sha256:62f481ac772fd68901573956231aea3e4b1ad87b9b1089a61613a91e2b50bb9b", - "sha256:689508b918332fb40ce117131633647731d098b1b10d092234aa959b4251add5", - "sha256:68a02bbe020dc22ee0540e040117535f06df9358106d3775e8817d826047f3fd", - "sha256:6ed2662a3d9c832afa36405f8748c250be94ae5dfc5283d668308391f2102861", - "sha256:7286aed4ea271df9eab8d7a9b29e507094b51397812f7ce051ecd77915a6e26b", - "sha256:7cc7d685b8eeca7ae69dc6416833fbfea61660684b7089bca666067cb2937dcf", - "sha256:8708b98c278012ad267ee8a7433baeb809948855e81922878118464b274c909d", - "sha256:9398f244e28e0596e2ee6024f808b06060109e33ed38dcc9bded452fd9bbb853", - "sha256:9e36344e48af3e3bde867a1ca54f97c308735dd8697005c2d24a86054a114a71", - "sha256:a398bdadb055f8de69f62b0fc70625f7cbdab436bbb31eef5816e28cab083ee8", - "sha256:acb47f6f8680de24c1ab65ebde39dd035768e2a9b571a07c7b8da95f6c8815fd", - "sha256:be24fcb80493b2c94eae21df70017351851652a37de514de553435b256b2f249", - "sha256:c391cd5af88aacaf41dd7cfb96eeedfad297b5899a39e12f4c2c3706d0a3329d", - "sha256:c95b0724a6deea2c8c5d3222191783ced0a2f09bd6d33f93e563f6f1a4b3b3a4", - "sha256:c9b1ce7a45978b821a06d375b83763b27a3a5e8a2e4570b3065abad240a18760", - "sha256:db372213d39fa33af667c2aa586a0c1235e88e9c850f5dd5c8e1f17515861868", - "sha256:db55cbaea02a20b49fefbd8e9d62bd481aaabe1f2301dabc575acc6b358874fa", - "sha256:ed1a13a27f59d1fc1920394a7f596792e9d546c9ca5a044419dca70c37815d7c", - "sha256:f2b82f46917d8722e6b5eafeefb4fb585d23babd15d8246c664cd88a5bddd19c", - "sha256:f2f806990160d1ce42d287aa419df3ffc42dfefe60d473695fb048355fe0c6a0", - "sha256:f720fa82a11c0f9042376fd509b5ed88dab7e3cd602eee63a1af08883b37342b" + "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836", + "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38", + "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a", + "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef", + "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e", + "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803", + "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f", + "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe", + "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92", + "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1", + "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7", + "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92", + "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662", + "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186", + "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da", + "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c", + "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69", + "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348", + "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb", + "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213", + "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e", + "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f", + "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3", + "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3", + "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3", + "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646", + "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef", + "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126", + "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce", + "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9", + "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1", + "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a", + "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e", + "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84", + "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544", + "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465", + "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd", + "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289", + "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384", + "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1", + "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64", + "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f" ], "markers": "python_version >= '3.8'", - "version": "==4.42.1" + "version": "==4.43.0" }, "fqdn": { "hashes": [ @@ -865,11 +895,11 @@ }, "fsspec": { "hashes": [ - "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a", - "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af" + "sha256:603dbc52c75b84da501b9b2ec8c11e1f61c25984c4a0dda1f129ef391fbfc9b4", + "sha256:80bfb8c70cc27b2178cc62a935ecf242fc6e8c3fb801f9c571fc01b1e715ba7d" ], "markers": "python_version >= '3.8'", - "version": "==2023.6.0" + "version": "==2023.9.2" }, "geocube": { "hashes": [ @@ -893,6 +923,7 @@ "sha256:0acdacddefa176525e4da6d9aeeece225da26055c4becdc6e97cf40fa97c27f4" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==0.12.2" }, "geopy": { @@ -909,15 +940,16 @@ "sha256:880d0bb3cdb1d366d9e18423d4478b74f72010d120a2b53cb53603163c790bc0" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==0.1.2" }, "identify": { "hashes": [ - "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f", - "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54" + "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54", + "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d" ], "markers": "python_version >= '3.8'", - "version": "==2.5.26" + "version": "==2.5.30" }, "idna": { "hashes": [ @@ -937,11 +969,11 @@ }, "importlib-resources": { "hashes": [ - "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf", - "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4" + "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9", + "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83" ], "markers": "python_version < '3.10'", - "version": "==6.0.1" + "version": "==6.1.0" }, "inflate64": { "hashes": [ @@ -1028,11 +1060,11 @@ }, "ipykernel": { "hashes": [ - "sha256:050391364c0977e768e354bdb60cbbfbee7cbb943b1af1618382021136ffd42f", - "sha256:c8a2430b357073b37c76c21c52184db42f6b4b0e438e1eb7df3c4440d120497c" + "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77", + "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b" ], "markers": "python_version >= '3.8'", - "version": "==6.25.1" + "version": "==6.25.2" }, "ipympl": { "hashes": [ @@ -1044,11 +1076,11 @@ }, "ipython": { "hashes": [ - "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea", - "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc" + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" ], "markers": "python_version >= '3.8'", - "version": "==8.12.2" + "version": "==8.12.3" }, "ipython-genutils": { "hashes": [ @@ -1059,11 +1091,11 @@ }, "ipywidgets": { "hashes": [ - "sha256:6c8396cc7b8c95dfb4e9ab0054f48c002f045e7e5d7ae523f559d64e525a98ab", - "sha256:ce97dd90525b3066fd00094690964e7eac14cf9b7745d35565b5eeac20cce687" + "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f", + "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8" ], "markers": "python_version >= '3.7'", - "version": "==8.1.0" + "version": "==8.1.1" }, "isoduration": { "hashes": [ @@ -1078,15 +1110,16 @@ "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" ], "index": "pypi", + "markers": "python_full_version >= '3.8.0'", "version": "==5.12.0" }, "jedi": { "hashes": [ - "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4", - "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e" + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "markers": "python_version >= '3.6'", - "version": "==0.19.0" + "version": "==0.19.1" }, "jinja2": { "hashes": [ @@ -1131,11 +1164,11 @@ "format-nongpl" ], "hashes": [ - "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb", - "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f" + "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e", + "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf" ], "markers": "python_version >= '3.8'", - "version": "==4.19.0" + "version": "==4.19.1" }, "jsonschema-specifications": { "hashes": [ @@ -1172,11 +1205,11 @@ }, "jupyter-core": { "hashes": [ - "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba", - "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce" + "sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f", + "sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6" ], "markers": "python_version >= '3.8'", - "version": "==5.3.1" + "version": "==5.3.2" }, "jupyter-events": { "hashes": [ @@ -1188,11 +1221,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:98a375347b580e837e7016007c24680a4261ed8ad7cd35196ac087d229f48e5a", - "sha256:d64fb4e593907290e5df916e3c9399c15ab2cd7bdb71cbcd1d36452dbfb30523" + "sha256:8e4b90380b59d7a1e31086c4692231f2a2ea4cb269f5516e60aba72ce8317fc9", + "sha256:d4916c8581c4ebbc534cebdaa8eca2478d9f3bfdd88eae29fcab0120eac57649" ], - "index": "pypi", - "version": "==2.7.2" + "markers": "python_version >= '3.8'", + "version": "==2.7.3" }, "jupyter-server-fileid": { "hashes": [ @@ -1232,6 +1265,7 @@ "sha256:6aba0caa771697d02fbf409f9767b2fdb4ee32ce935940e3b9a0d5d48d994d0f" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==3.6.3" }, "jupyterlab-pygments": { @@ -1244,19 +1278,19 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07", - "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876" + "sha256:77c2f1f282d610f95e496e20d5bf1d2a7706826dfb7b18f3378ae2870d272fb7", + "sha256:c9f67a98b295c5dee87f41551b0558374e45d449f3edca153dd722140630dcb2" ], - "markers": "python_version >= '3.7'", - "version": "==2.24.0" + "markers": "python_version >= '3.8'", + "version": "==2.25.0" }, "jupyterlab-widgets": { "hashes": [ - "sha256:4715912d6ceab839c9db35953c764b3214ebbc9161c809f6e0510168845dfdf5", - "sha256:d428ab97b8d87cc7c54cbf37644d6e0f0e662f23876e05fa460a73ec3257252a" + "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d", + "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c" ], "markers": "python_version >= '3.7'", - "version": "==3.0.8" + "version": "==3.0.9" }, "kiwisolver": { "hashes": [ @@ -1416,8 +1450,11 @@ "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", + "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", + "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", + "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", @@ -1425,6 +1462,7 @@ "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", + "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", @@ -1433,6 +1471,7 @@ "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", + "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", @@ -1440,9 +1479,12 @@ "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", + "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", + "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", + "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", @@ -1461,7 +1503,9 @@ "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2" + "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", + "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", + "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" ], "markers": "python_version >= '3.7'", "version": "==2.1.3" @@ -1535,6 +1579,7 @@ "sha256:4e5b73d7864a1d1292fb76a03e82a3e78ef934d06828a698d9dada76da2067b0" ], "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==0.61.0" }, "mercantile": { @@ -1546,11 +1591,11 @@ }, "mistune": { "hashes": [ - "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6", - "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c" + "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", + "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" ], "markers": "python_version >= '3.7'", - "version": "==3.0.1" + "version": "==3.0.2" }, "morecantile": { "hashes": [ @@ -1562,79 +1607,73 @@ }, "msgpack": { "hashes": [ - "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164", - "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b", - "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c", - "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf", - "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd", - "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d", - "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c", - "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a", - "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e", - "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd", - "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025", - "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5", - "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705", - "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a", - "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d", - "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb", - "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11", - "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f", - "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c", - "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d", - "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea", - "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba", - "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87", - "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a", - "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c", - "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080", - "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198", - "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9", - "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a", - "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b", - "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f", - "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437", - "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f", - "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7", - "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2", - "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0", - "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48", - "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898", - "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0", - "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57", - "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8", - "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282", - "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1", - "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82", - "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc", - "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb", - "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6", - "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7", - "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9", - "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c", - "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1", - "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed", - "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c", - "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c", - "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77", - "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81", - "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a", - "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3", - "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086", - "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9", - "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f", - "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b", - "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d" - ], - "version": "==1.0.5" + "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", + "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d", + "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3", + "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", + "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0", + "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", + "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", + "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", + "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524", + "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819", + "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc", + "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc", + "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", + "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", + "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81", + "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", + "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", + "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2", + "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", + "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", + "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", + "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", + "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95", + "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f", + "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", + "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", + "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", + "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61", + "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", + "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", + "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d", + "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c", + "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", + "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", + "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", + "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", + "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", + "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", + "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", + "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f", + "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7", + "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", + "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", + "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", + "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf", + "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c", + "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", + "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", + "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", + "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", + "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", + "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad", + "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd", + "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7", + "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", + "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.7" }, "multimethod": { "hashes": [ - "sha256:1589bf52ca294667fd15527ea830127c763f5bfc38562e3642591ffd0fd9d56f", - "sha256:52f8f1f2b9d5a4c7adfdcc114dbeeebe3245a4420801e8807e26522a79fb6bc2" + "sha256:afd84da9c3d0445c84f827e4d63ad42d17c6d29b122427c6dee9032ac2d2a0d4", + "sha256:daa45af3fe257f73abb69673fd54ddeaf31df0eb7363ad6e1251b7c9b192d8c5" ], - "markers": "python_version >= '3.7'", - "version": "==1.9.1" + "markers": "python_version >= '3.8'", + "version": "==1.10" }, "multipledispatch": { "hashes": [ @@ -1673,6 +1712,7 @@ "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.3.1" }, "nbclassic": { @@ -1688,7 +1728,7 @@ "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548", "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55" ], - "markers": "python_version >= '3.8'", + "markers": "python_full_version >= '3.8.0'", "version": "==0.8.0" }, "nbconvert": { @@ -1709,11 +1749,11 @@ }, "nest-asyncio": { "hashes": [ - "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657", - "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10" + "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb", + "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d" ], "markers": "python_version >= '3.5'", - "version": "==1.5.7" + "version": "==1.5.8" }, "netcdf4": { "hashes": [ @@ -1746,6 +1786,7 @@ "sha256:f94a89db78f34fdf68342840efb064fe1474310e8359dffce42e90a9ddf88f2f" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.6.3" }, "nodeenv": { @@ -1758,11 +1799,11 @@ }, "notebook": { "hashes": [ - "sha256:171039245a5b1a8f8233165091210632c21250ce2a652daed38fe8f94389984f", - "sha256:457caa1fa1c647395420945b2b7559f603eedbc9aeb2a59a0c286c8029e31efa" + "sha256:b4625a4b7a597839dd3156b140d5ba2c7123761f98245a3290f67a8b8ee048d9", + "sha256:c1e2eb2e3b6079a0552a04974883a48d04c3c05792170d64a4b23d707d453181" ], "markers": "python_version >= '3.7'", - "version": "==6.5.5" + "version": "==6.5.6" }, "notebook-shim": { "hashes": [ @@ -1804,43 +1845,44 @@ "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.56.4" }, "numexpr": { "hashes": [ - "sha256:1510da20e6f5f45333610b1ded44c566e2690c6c437c84f2a212ca09627c7e01", - "sha256:178b85ad373c6903e55d75787d61b92380439b70d94b001cb055a501b0821335", - "sha256:183d5430db76826e54465c69db93a3c6ecbf03cda5aa1bb96eaad0147e9b68dc", - "sha256:283ce8609a7ccbadf91a68f3484558b3e36d27c93c98a41ec205efb0ab43c872", - "sha256:34af2a0e857d02a4bc5758bc037a777d50dacb13bcd57c7905268a3e44994ed6", - "sha256:39ce106f92ccea5b07b1d6f2f3c4370f05edf27691dc720a63903484a2137e48", - "sha256:3c00be69f747f44a631830215cab482f0f77f75af2925695adff57c1cc0f9a68", - "sha256:45ed41e55a0abcecf3d711481e12a5fb7a904fe99d42bc282a17cc5f8ea510be", - "sha256:4ed0e1c1ef5f34381448539f1fe9015906d21c9cfa2797c06194d4207dadb465", - "sha256:51f3ab160c3847ebcca93cd88f935a7802b54a01ab63fe93152994a64d7a6cf2", - "sha256:558390fea6370003ac749ed9d0f38d708aa096f5dcb707ddb6e0ca5a0dd37da1", - "sha256:55983806815035eb63c5039520688c49536bb7f3cc3fc1d7d64c6a00cf3f353e", - "sha256:578fe4008e4d5d6ff01bbeb2d7b7ba1ec658a5cda9c720cd26a9a8325f8ef438", - "sha256:5a8dad2bfaad5a5c34a2e8bbf62b9df1dfab266d345fda1feb20ff4e264b347a", - "sha256:62b4faf8e0627673b0210a837792bddd23050ecebc98069ab23eb0633ff1ef5f", - "sha256:6df184d40d4cf9f21c71f429962f39332f7398147762588c9f3a5c77065d0c06", - "sha256:783324ba40eb804ecfc9ebae86120a1e339ab112d0ab8a1f0d48a26354d5bf9b", - "sha256:894b027438b8ec88dea32a19193716c79f4ff8ddb92302dcc9731b51ba3565a8", - "sha256:9e8b5bf7bcb4e8dcd66522d8fc96e1db7278f901cb4fd2e155efbe62a41dde08", - "sha256:aea6ab45c87c0a7041183c08a798f0ad4d7c5eccbce20cfe79ce6f1a45ef3702", - "sha256:b594dc9e2d6291a0bc5c065e6d9caf3eee743b5663897832e9b17753c002947a", - "sha256:b93f5a866cd13a808bc3d3a9c487d94cd02eec408b275ff0aa150f2e8e5191f8", - "sha256:bf85ba1327eb87ec82ae7936f13c8850fb969a0ca34f3ba9fa3897c09d5c80d7", - "sha256:c46350dcdb93e32f033eea5a21269514ffcaf501d9abd6036992d37e48a308b0", - "sha256:cbfd833ee5fdb0efb862e152aee7e6ccea9c596d5c11d22604c2e6307bff7cad", - "sha256:db5c65417d69414f1ab31302ea01d3548303ef31209c38b4849d145be4e1d1ba", - "sha256:dd57ab1a3d3aaa9274aff1cefbf93b8ddacc7973afef5b125905f6bf18fabab0", - "sha256:de29c77f674e4eb8f0846525a475cab64008c227c8bc4ba5153ab3f72441cc63", - "sha256:eb36ffcfa1606e41aa08d559b4277bcad0e16b83941d1a4fee8d2bd5a34f8e0e", - "sha256:ef621b4ee366a5c6a484f6678c9259f5b826569f8bfa0b89ba2306d5055468bb" - ], - "markers": "python_version >= '3.7'", - "version": "==2.8.5" + "sha256:15469dc722b5ceb92324ec8635411355ebc702303db901ae8cc87f47c5e3a124", + "sha256:18b1804923cfa3be7bbb45187d01c0540c8f6df4928c22a0f786e15568e9ebc5", + "sha256:1967c16f61c27df1cdc43ba3c0ba30346157048dd420b4259832276144d0f64e", + "sha256:211804ec25a9f6d188eadf4198dd1a92b2f61d7d20993c6c7706139bc4199c5b", + "sha256:27782177a0081bd0aab229be5d37674e7f0ab4264ef576697323dd047432a4cd", + "sha256:31cf610c952eec57081171f0b4427f9bed2395ec70ec432bbf45d260c5c0cdeb", + "sha256:38b8b90967026bbc36c7aa6e8ca3b8906e1990914fd21f446e2a043f4ee3bc06", + "sha256:47b45da5aa25600081a649f5e8b2aa640e35db3703f4631f34bb1f2f86d1b5b4", + "sha256:6336f8dba3f456e41a4ffc3c97eb63d89c73589ff6e1707141224b930263260d", + "sha256:681812e2e71ff1ba9145fac42d03f51ddf6ba911259aa83041323f68e7458002", + "sha256:6d7003497d82ef19458dce380b36a99343b96a3bd5773465c2d898bf8f5a38f9", + "sha256:6e884687da8af5955dc9beb6a12d469675c90b8fb38b6c93668c989cfc2cd982", + "sha256:80acbfefb68bd92e708e09f0a02b29e04d388b9ae72f9fcd57988aca172a7833", + "sha256:84979bf14143351c2db8d9dd7fef8aca027c66ad9df9cb5e75c93bf5f7b5a338", + "sha256:8564186aad5a2c88d597ebc79b8171b52fd33e9b085013e1ff2208f7e4b387e3", + "sha256:8e3e6f1588d6c03877cb3b3dcc3096482da9d330013b886b29cb9586af5af3eb", + "sha256:95b9da613761e4fc79748535b2a1f58cada22500e22713ae7d9571fa88d1c2e2", + "sha256:95c09e814b0d6549de98b5ded7cdf7d954d934bb6b505432ff82e83a6d330bda", + "sha256:9ef7e8aaa84fce3aba2e65f243d14a9f8cc92aafd5d90d67283815febfe43eeb", + "sha256:aa0f661f5f4872fd7350cc9895f5d2594794b2a7e7f1961649a351724c64acc9", + "sha256:b5f96c89aa0b1f13685ec32fa3d71028db0b5981bfd99a0bbc271035949136b3", + "sha256:c48221b6a85494a7be5a022899764e58259af585dff031cecab337277278cc93", + "sha256:c8f37f7a6af3bdd61f2efd1cafcc083a9525ab0aaf5dc641e7ec8fc0ae2d3aa1", + "sha256:d126938c2c3784673c9c58d94e00b1570aa65517d9c33662234d442fc9fb5795", + "sha256:d36528a33aa9c23743b3ea686e57526a4f71e7128a1be66210e1511b09c4e4e9", + "sha256:d6a88d71c166e86b98d34701285d23e3e89d548d9f5ae3f4b60919ac7151949f", + "sha256:dee04d72307c09599f786b9231acffb10df7d7a74b2ce3681d74a574880d13ce", + "sha256:e640bc0eaf1b59f3dde52bc02bbfda98e62f9950202b0584deba28baf9f36bbb", + "sha256:e93d64cd20940b726477c3cb64926e683d31b778a1e18f9079a5088fd0d8e7c8", + "sha256:ef6e8896457a60a539cb6ba27da78315a9bb31edb246829b25b5b0304bfcee91" + ], + "markers": "python_version >= '3.7'", + "version": "==2.8.6" }, "numpy": { "hashes": [ @@ -1874,6 +1916,7 @@ "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.23.5" }, "odc-geo": { @@ -1894,11 +1937,11 @@ }, "packaging": { "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" + "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", + "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], "markers": "python_version >= '3.7'", - "version": "==23.1" + "version": "==23.2" }, "pandas": { "hashes": [ @@ -1929,6 +1972,7 @@ "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.0.2" }, "pandera": { @@ -1965,11 +2009,11 @@ }, "partd": { "hashes": [ - "sha256:7a63529348cf0dff14b986db641cd1b83c16b5cb9fc647c2851779db03282ef8", - "sha256:aa0ff35dbbcc807ae374db56332f4c1b39b46f67bf2975f5151e0b4186aed0d5" + "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6", + "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67" ], "markers": "python_version >= '3.7'", - "version": "==1.4.0" + "version": "==1.4.1" }, "pathspec": { "hashes": [ @@ -1996,65 +2040,63 @@ }, "pillow": { "hashes": [ - "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5", - "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530", - "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d", - "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca", - "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891", - "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992", - "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7", - "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3", - "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba", - "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3", - "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3", - "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f", - "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538", - "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3", - "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d", - "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c", - "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017", - "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3", - "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223", - "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e", - "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3", - "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6", - "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640", - "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334", - "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1", - "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba", - "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa", - "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0", - "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396", - "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d", - "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485", - "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf", - "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43", - "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37", - "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2", - "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd", - "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86", - "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967", - "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629", - "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568", - "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed", - "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f", - "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551", - "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3", - "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614", - "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff", - "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d", - "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883", - "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684", - "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0", - "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de", - "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b", - "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3", - "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199", - "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51", - "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90" + "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff", + "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f", + "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21", + "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635", + "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a", + "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f", + "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1", + "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d", + "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db", + "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849", + "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7", + "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876", + "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3", + "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317", + "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91", + "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d", + "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b", + "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd", + "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed", + "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500", + "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7", + "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a", + "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a", + "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0", + "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf", + "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f", + "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1", + "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088", + "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971", + "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a", + "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205", + "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54", + "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08", + "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21", + "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d", + "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08", + "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e", + "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf", + "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b", + "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145", + "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2", + "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d", + "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d", + "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf", + "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad", + "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d", + "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1", + "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4", + "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2", + "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19", + "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37", + "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4", + "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68", + "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1" ], "markers": "python_version >= '3.8'", - "version": "==10.0.0" + "version": "==10.0.1" }, "pkgutil-resolve-name": { "hashes": [ @@ -2066,11 +2108,11 @@ }, "platformdirs": { "hashes": [ - "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d", - "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d" + "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3", + "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e" ], "markers": "python_version >= '3.7'", - "version": "==3.10.0" + "version": "==3.11.0" }, "pluggy": { "hashes": [ @@ -2086,6 +2128,7 @@ "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.3.3" }, "prometheus-client": { @@ -2101,7 +2144,7 @@ "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.39" }, "psutil": { @@ -2121,7 +2164,7 @@ "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30", "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48" ], - "markers": "sys_platform != 'cygwin'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==5.9.5" }, "psycopg2-binary": { @@ -2190,6 +2233,7 @@ "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.9.6" }, "ptyprocess": { @@ -2219,6 +2263,7 @@ "sha256:94d0c24217f6582741813ee94490a4ca82bd5f9bf35e4f8610cb588cf7445764" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.20.4" }, "pyarrow": { @@ -2250,6 +2295,7 @@ "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==11.0.0" }, "pybcj": { @@ -2353,41 +2399,41 @@ }, "pycryptodomex": { "hashes": [ - "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6", - "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c", - "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646", - "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470", - "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74", - "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a", - "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c", - "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422", - "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e", - "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37", - "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb", - "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8", - "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196", - "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef", - "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b", - "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb", - "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194", - "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7", - "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d", - "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff", - "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35", - "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7", - "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8", - "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f", - "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a", - "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e", - "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419", - "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222", - "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2", - "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278", - "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88", - "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5" + "sha256:09c9401dc06fb3d94cb1ec23b4ea067a25d1f4c6b7b118ff5631d0b5daaab3cc", + "sha256:0b2f1982c5bc311f0aab8c293524b861b485d76f7c9ab2c3ac9a25b6f7655975", + "sha256:136b284e9246b4ccf4f752d435c80f2c44fc2321c198505de1d43a95a3453b3c", + "sha256:1789d89f61f70a4cd5483d4dfa8df7032efab1118f8b9894faae03c967707865", + "sha256:2126bc54beccbede6eade00e647106b4f4c21e5201d2b0a73e9e816a01c50905", + "sha256:258c4233a3fe5a6341780306a36c6fb072ef38ce676a6d41eec3e591347919e8", + "sha256:263de9a96d2fcbc9f5bd3a279f14ea0d5f072adb68ebd324987576ec25da084d", + "sha256:50cb18d4dd87571006fd2447ccec85e6cec0136632a550aa29226ba075c80644", + "sha256:5b883e1439ab63af976656446fb4839d566bb096f15fc3c06b5a99cde4927188", + "sha256:5d73e9fa3fe830e7b6b42afc49d8329b07a049a47d12e0ef9225f2fd220f19b2", + "sha256:61056a1fd3254f6f863de94c233b30dd33bc02f8c935b2000269705f1eeeffa4", + "sha256:67c8eb79ab33d0fbcb56842992298ddb56eb6505a72369c20f60bc1d2b6fb002", + "sha256:6e45bb4635b3c4e0a00ca9df75ef6295838c85c2ac44ad882410cb631ed1eeaa", + "sha256:7cb51096a6a8d400724104db8a7e4f2206041a1f23e58924aa3d8d96bcb48338", + "sha256:800a2b05cfb83654df80266692f7092eeefe2a314fa7901dcefab255934faeec", + "sha256:8df69e41f7e7015a90b94d1096ec3d8e0182e73449487306709ec27379fff761", + "sha256:917033016ecc23c8933205585a0ab73e20020fdf671b7cd1be788a5c4039840b", + "sha256:a12144d785518f6491ad334c75ccdc6ad52ea49230b4237f319dbb7cef26f464", + "sha256:a3866d68e2fc345162b1b9b83ef80686acfe5cec0d134337f3b03950a0a8bf56", + "sha256:a588a1cb7781da9d5e1c84affd98c32aff9c89771eac8eaa659d2760666f7139", + "sha256:a77b79852175064c822b047fee7cf5a1f434f06ad075cc9986aa1c19a0c53eb0", + "sha256:af83a554b3f077564229865c45af0791be008ac6469ef0098152139e6bd4b5b6", + "sha256:b801216c48c0886742abf286a9a6b117e248ca144d8ceec1f931ce2dd0c9cb40", + "sha256:bfb040b5dda1dff1e197d2ef71927bd6b8bfcb9793bc4dfe0bb6df1e691eaacb", + "sha256:c01678aee8ac0c1a461cbc38ad496f953f9efcb1fa19f5637cbeba7544792a53", + "sha256:c74eb1f73f788facece7979ce91594dc177e1a9b5d5e3e64697dd58299e5cb4d", + "sha256:c9a68a2f7bd091ccea54ad3be3e9d65eded813e6d79fdf4cc3604e26cdd6384f", + "sha256:d4dd3b381ff5a5907a3eb98f5f6d32c64d319a840278ceea1dcfcc65063856f3", + "sha256:e8e5ecbd4da4157889fce8ba49da74764dd86c891410bfd6b24969fa46edda51", + "sha256:eb2fc0ec241bf5e5ef56c8fbec4a2634d631e4c4f616a59b567947a0f35ad83c", + "sha256:edbe083c299835de7e02c8aa0885cb904a75087d35e7bab75ebe5ed336e8c3e2", + "sha256:ff64fd720def623bf64d8776f8d0deada1cc1bf1ec3c1f9d6f5bb5bd098d034f" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.18.0" + "version": "==3.19.0" }, "pyct": { "hashes": [ @@ -2586,6 +2632,7 @@ "sha256:fde5ece4d2436b5a57c8f5f97b49b5de06a856d03959f836c957d3e609f2de7e" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.5.0" }, "pyproject-flake8": { @@ -2594,6 +2641,7 @@ "sha256:d43421caca0ef8a672874405fe63c722b0333e3c22c41648c6df60f21bab2b6b" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0.post1" }, "pytest": { @@ -2602,6 +2650,7 @@ "sha256:933051fa1bfbd38a21e73c3960cebdad4cf59483ddba7696c48509727e17f201" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==7.3.0" }, "python-dateutil": { @@ -2618,6 +2667,7 @@ "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.0" }, "python-json-logger": { @@ -2630,10 +2680,10 @@ }, "pytz": { "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" + "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", + "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" ], - "version": "==2023.3" + "version": "==2023.3.post1" }, "pyyaml": { "hashes": [ @@ -2889,11 +2939,11 @@ }, "qtconsole": { "hashes": [ - "sha256:35fd6e87b1f6d1fd41801b07e69339f8982e76afd4fa8ef35595bc6036717189", - "sha256:5e4082a86a201796b2a5cfd4298352d22b158b51b57736531824715fc2a979dd" + "sha256:a3b69b868e041c2c698bdc75b0602f42e130ffb256d6efa48f9aa756c97672aa", + "sha256:b7ffb53d74f23cee29f4cdb55dd6fabc8ec312d94f3c46ba38e1dde458693dfb" ], "markers": "python_version >= '3.7'", - "version": "==5.4.3" + "version": "==5.4.4" }, "qtpy": { "hashes": [ @@ -2924,6 +2974,7 @@ "sha256:eaaeb2e661d1ffc07a7ae4fd997bb326d3561f641178126102842d608a010cc3" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.3.6" }, "rasterstats": { @@ -2932,6 +2983,7 @@ "sha256:29389bfcbeac1a4206aba6e1d795058ec8a64d560efad48156c27fad97c2e09a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.18.0" }, "referencing": { @@ -3003,106 +3055,106 @@ }, "rpds-py": { "hashes": [ - "sha256:00215f6a9058fbf84f9d47536902558eb61f180a6b2a0fa35338d06ceb9a2e5a", - "sha256:0028eb0967942d0d2891eae700ae1a27b7fd18604cfcb16a1ef486a790fee99e", - "sha256:0155c33af0676fc38e1107679be882077680ad1abb6303956b97259c3177e85e", - "sha256:063411228b852fb2ed7485cf91f8e7d30893e69b0acb207ec349db04cccc8225", - "sha256:0700c2133ba203c4068aaecd6a59bda22e06a5e46255c9da23cbf68c6942215d", - "sha256:08e08ccf5b10badb7d0a5c84829b914c6e1e1f3a716fdb2bf294e2bd01562775", - "sha256:0d292cabd7c8335bdd3237ded442480a249dbcdb4ddfac5218799364a01a0f5c", - "sha256:15932ec5f224b0e35764dc156514533a4fca52dcfda0dfbe462a1a22b37efd59", - "sha256:18f87baa20e02e9277ad8960cd89b63c79c05caf106f4c959a9595c43f2a34a5", - "sha256:1a6420a36975e0073acaeee44ead260c1f6ea56812cfc6c31ec00c1c48197173", - "sha256:1b401e8b9aece651512e62c431181e6e83048a651698a727ea0eb0699e9f9b74", - "sha256:1d7b7b71bcb82d8713c7c2e9c5f061415598af5938666beded20d81fa23e7640", - "sha256:23750a9b8a329844ba1fe267ca456bb3184984da2880ed17ae641c5af8de3fef", - "sha256:23a059143c1393015c68936370cce11690f7294731904bdae47cc3e16d0b2474", - "sha256:26d9fd624649a10e4610fab2bc820e215a184d193e47d0be7fe53c1c8f67f370", - "sha256:291c9ce3929a75b45ce8ddde2aa7694fc8449f2bc8f5bd93adf021efaae2d10b", - "sha256:298e8b5d8087e0330aac211c85428c8761230ef46a1f2c516d6a2f67fb8803c5", - "sha256:2c7c4266c1b61eb429e8aeb7d8ed6a3bfe6c890a1788b18dbec090c35c6b93fa", - "sha256:2d68a8e8a3a816629283faf82358d8c93fe5bd974dd2704152394a3de4cec22a", - "sha256:344b89384c250ba6a4ce1786e04d01500e4dac0f4137ceebcaad12973c0ac0b3", - "sha256:3455ecc46ea443b5f7d9c2f946ce4017745e017b0d0f8b99c92564eff97e97f5", - "sha256:3d544a614055b131111bed6edfa1cb0fb082a7265761bcb03321f2dd7b5c6c48", - "sha256:3e5c26905aa651cc8c0ddc45e0e5dea2a1296f70bdc96af17aee9d0493280a17", - "sha256:3f5cc8c7bc99d2bbcd704cef165ca7d155cd6464c86cbda8339026a42d219397", - "sha256:4992266817169997854f81df7f6db7bdcda1609972d8ffd6919252f09ec3c0f6", - "sha256:4d55528ef13af4b4e074d067977b1f61408602f53ae4537dccf42ba665c2c7bd", - "sha256:576da63eae7809f375932bfcbca2cf20620a1915bf2fedce4b9cc8491eceefe3", - "sha256:58fc4d66ee349a23dbf08c7e964120dc9027059566e29cf0ce6205d590ed7eca", - "sha256:5b9bf77008f2c55dabbd099fd3ac87009471d223a1c7ebea36873d39511b780a", - "sha256:5e7996aed3f65667c6dcc8302a69368435a87c2364079a066750a2eac75ea01e", - "sha256:5f7487be65b9c2c510819e744e375bd41b929a97e5915c4852a82fbb085df62c", - "sha256:6388e4e95a26717b94a05ced084e19da4d92aca883f392dffcf8e48c8e221a24", - "sha256:65af12f70355de29e1092f319f85a3467f4005e959ab65129cb697169ce94b86", - "sha256:668d2b45d62c68c7a370ac3dce108ffda482b0a0f50abd8b4c604a813a59e08f", - "sha256:71333c22f7cf5f0480b59a0aef21f652cf9bbaa9679ad261b405b65a57511d1e", - "sha256:7150b83b3e3ddaac81a8bb6a9b5f93117674a0e7a2b5a5b32ab31fdfea6df27f", - "sha256:748e472345c3a82cfb462d0dff998a7bf43e621eed73374cb19f307e97e08a83", - "sha256:75dbfd41a61bc1fb0536bf7b1abf272dc115c53d4d77db770cd65d46d4520882", - "sha256:7618a082c55cf038eede4a918c1001cc8a4411dfe508dc762659bcd48d8f4c6e", - "sha256:780fcb855be29153901c67fc9c5633d48aebef21b90aa72812fa181d731c6b00", - "sha256:78d10c431073dc6ebceed35ab22948a016cc2b5120963c13a41e38bdde4a7212", - "sha256:7a3a3d3e4f1e3cd2a67b93a0b6ed0f2499e33f47cc568e3a0023e405abdc0ff1", - "sha256:7b6975d3763d0952c111700c0634968419268e6bbc0b55fe71138987fa66f309", - "sha256:80772e3bda6787510d9620bc0c7572be404a922f8ccdfd436bf6c3778119464c", - "sha256:80992eb20755701753e30a6952a96aa58f353d12a65ad3c9d48a8da5ec4690cf", - "sha256:841128a22e6ac04070a0f84776d07e9c38c4dcce8e28792a95e45fc621605517", - "sha256:861d25ae0985a1dd5297fee35f476b60c6029e2e6e19847d5b4d0a43a390b696", - "sha256:872f3dcaa8bf2245944861d7311179d2c0c9b2aaa7d3b464d99a7c2e401f01fa", - "sha256:87c93b25d538c433fb053da6228c6290117ba53ff6a537c133b0f2087948a582", - "sha256:8856aa76839dc234d3469f1e270918ce6bec1d6a601eba928f45d68a15f04fc3", - "sha256:885e023e73ce09b11b89ab91fc60f35d80878d2c19d6213a32b42ff36543c291", - "sha256:899b5e7e2d5a8bc92aa533c2d4e55e5ebba095c485568a5e4bedbc163421259a", - "sha256:8ce8caa29ebbdcde67e5fd652c811d34bc01f249dbc0d61e5cc4db05ae79a83b", - "sha256:8e1c68303ccf7fceb50fbab79064a2636119fd9aca121f28453709283dbca727", - "sha256:8e7e2b3577e97fa43c2c2b12a16139b2cedbd0770235d5179c0412b4794efd9b", - "sha256:92f05fc7d832e970047662b3440b190d24ea04f8d3c760e33e7163b67308c878", - "sha256:97f5811df21703446b42303475b8b855ee07d6ab6cdf8565eff115540624f25d", - "sha256:9affee8cb1ec453382c27eb9043378ab32f49cd4bc24a24275f5c39bf186c279", - "sha256:a2da4a8c6d465fde36cea7d54bf47b5cf089073452f0e47c8632ecb9dec23c07", - "sha256:a6903cdca64f1e301af9be424798328c1fe3b4b14aede35f04510989fc72f012", - "sha256:a8ab1adf04ae2d6d65835995218fd3f3eb644fe20655ca8ee233e2c7270ff53b", - "sha256:a8edd467551c1102dc0f5754ab55cd0703431cd3044edf8c8e7d9208d63fa453", - "sha256:ac00c41dd315d147b129976204839ca9de699d83519ff1272afbe4fb9d362d12", - "sha256:ad277f74b1c164f7248afa968700e410651eb858d7c160d109fb451dc45a2f09", - "sha256:ae46a50d235f1631d9ec4670503f7b30405103034830bc13df29fd947207f795", - "sha256:afe6b5a04b2ab1aa89bad32ca47bf71358e7302a06fdfdad857389dca8fb5f04", - "sha256:b1cb078f54af0abd835ca76f93a3152565b73be0f056264da45117d0adf5e99c", - "sha256:b25136212a3d064a8f0b9ebbb6c57094c5229e0de76d15c79b76feff26aeb7b8", - "sha256:b3226b246facae14909b465061ddcfa2dfeadb6a64f407f24300d42d69bcb1a1", - "sha256:b98e75b21fc2ba5285aef8efaf34131d16af1c38df36bdca2f50634bea2d3060", - "sha256:bbd7b24d108509a1b9b6679fcc1166a7dd031dbef1f3c2c73788f42e3ebb3beb", - "sha256:bed57543c99249ab3a4586ddc8786529fbc33309e5e8a1351802a06ca2baf4c2", - "sha256:c0583f69522732bdd79dca4cd3873e63a29acf4a299769c7541f2ca1e4dd4bc6", - "sha256:c1e0e9916301e3b3d970814b1439ca59487f0616d30f36a44cead66ee1748c31", - "sha256:c651847545422c8131660704c58606d841e228ed576c8f1666d98b3d318f89da", - "sha256:c7853f27195598e550fe089f78f0732c66ee1d1f0eaae8ad081589a5a2f5d4af", - "sha256:cbae50d352e4717ffc22c566afc2d0da744380e87ed44a144508e3fb9114a3f4", - "sha256:cdbed8f21204398f47de39b0a9b180d7e571f02dfb18bf5f1b618e238454b685", - "sha256:d08395595c42bcd82c3608762ce734504c6d025eef1c06f42326a6023a584186", - "sha256:d4639111e73997567343df6551da9dd90d66aece1b9fc26c786d328439488103", - "sha256:d63787f289944cc4bde518ad2b5e70a4f0d6e2ce76324635359c74c113fd188f", - "sha256:d6d5f061f6a2aa55790b9e64a23dfd87b6664ab56e24cd06c78eb43986cb260b", - "sha256:d7865df1fb564092bcf46dac61b5def25342faf6352e4bc0e61a286e3fa26a3d", - "sha256:db6585b600b2e76e98131e0ac0e5195759082b51687ad0c94505970c90718f4a", - "sha256:e36d7369363d2707d5f68950a64c4e025991eb0177db01ccb6aa6facae48b69f", - "sha256:e7947d9a6264c727a556541b1630296bbd5d0a05068d21c38dde8e7a1c703ef0", - "sha256:eb2d59bc196e6d3b1827c7db06c1a898bfa0787c0574af398e65ccf2e97c0fbe", - "sha256:ee9c2f6ca9774c2c24bbf7b23086264e6b5fa178201450535ec0859739e6f78d", - "sha256:f4760e1b02173f4155203054f77a5dc0b4078de7645c922b208d28e7eb99f3e2", - "sha256:f70bec8a14a692be6dbe7ce8aab303e88df891cbd4a39af091f90b6702e28055", - "sha256:f869e34d2326e417baee430ae998e91412cc8e7fdd83d979277a90a0e79a5b47", - "sha256:f8b9a7cd381970e64849070aca7c32d53ab7d96c66db6c2ef7aa23c6e803f514", - "sha256:f99d74ddf9d3b6126b509e81865f89bd1283e3fc1b568b68cd7bd9dfa15583d7", - "sha256:f9e7e493ded7042712a374471203dd43ae3fff5b81e3de1a0513fa241af9fd41", - "sha256:fc72ae476732cdb7b2c1acb5af23b478b8a0d4b6fcf19b90dd150291e0d5b26b", - "sha256:fccbf0cd3411719e4c9426755df90bf3449d9fc5a89f077f4a7f1abd4f70c910", - "sha256:ffcf18ad3edf1c170e27e88b10282a2c449aa0358659592462448d71b2000cfc" + "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9", + "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637", + "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5", + "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9", + "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c", + "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957", + "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6", + "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154", + "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8", + "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569", + "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2", + "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c", + "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453", + "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1", + "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7", + "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b", + "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9", + "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496", + "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3", + "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b", + "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6", + "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da", + "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842", + "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd", + "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294", + "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71", + "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093", + "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e", + "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c", + "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e", + "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b", + "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97", + "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac", + "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf", + "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a", + "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc", + "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0", + "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623", + "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6", + "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8", + "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b", + "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d", + "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff", + "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb", + "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08", + "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33", + "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5", + "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a", + "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a", + "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762", + "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860", + "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73", + "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a", + "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065", + "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c", + "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c", + "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec", + "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515", + "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72", + "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd", + "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec", + "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12", + "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1", + "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557", + "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25", + "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff", + "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8", + "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9", + "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d", + "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a", + "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e", + "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c", + "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0", + "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48", + "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e", + "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314", + "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717", + "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95", + "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8", + "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57", + "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33", + "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1", + "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f", + "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f", + "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9", + "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599", + "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41", + "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391", + "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475", + "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882", + "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740", + "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f", + "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee", + "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836", + "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c", + "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a", + "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb" ], "markers": "python_version >= '3.8'", - "version": "==0.10.0" + "version": "==0.10.3" }, "rtree": { "hashes": [ @@ -3153,6 +3205,7 @@ "sha256:f5120da3a1b96f3a7a17dd6af0afdd4e6f3cc9baa87e9ee0a272882f01f980bb" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.0.1" }, "s3transfer": { @@ -3188,6 +3241,7 @@ "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1" ], "index": "pypi", + "markers": "python_version < '3.12' and python_version >= '3.8'", "version": "==1.10.1" }, "seaborn": { @@ -3196,6 +3250,7 @@ "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.12.2" }, "send2trash": { @@ -3208,11 +3263,11 @@ }, "setuptools": { "hashes": [ - "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d", - "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b" + "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", + "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" ], "markers": "python_version >= '3.8'", - "version": "==68.1.2" + "version": "==68.2.2" }, "shapely": { "hashes": [ @@ -3256,6 +3311,7 @@ "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.0.1" }, "simplejson": { @@ -3374,18 +3430,18 @@ }, "soupsieve": { "hashes": [ - "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8", - "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea" + "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", + "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" + "markers": "python_version >= '3.8'", + "version": "==2.5" }, "stack-data": { "hashes": [ - "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", - "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8" + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" ], - "version": "==0.6.2" + "version": "==0.6.3" }, "tables": { "hashes": [ @@ -3408,6 +3464,7 @@ "sha256:f0821007048f2af8c1a21eb3d832072046c5df366e39587a7c7e4afad14e73fc" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.8.0" }, "terminado": { @@ -3472,31 +3529,39 @@ "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==4.65.0" }, "traitlets": { "hashes": [ - "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8", - "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9" + "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116", + "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542" ], - "markers": "python_version >= '3.7'", - "version": "==5.9.0" + "markers": "python_version >= '3.8'", + "version": "==5.10.1" }, "typeguard": { "hashes": [ - "sha256:5b7453b1e3b35fcfe2d62fa4ec500d05e6f2f2eb46f4126ae964677fcc384fff", - "sha256:7d4264cd631ac1157c5bb5ec992281b4f1e2ba7a35db91bc15f442235e244803" + "sha256:8923e55f8873caec136c892c3bed1f676eae7be57cdb94819281b3d3bc9c0953", + "sha256:ea0a113bbc111bcffc90789ebb215625c963411f7096a7e9062d4e4630c155fd" ], "markers": "python_version >= '3.8'", - "version": "==4.1.3" + "version": "==4.1.5" + }, + "types-python-dateutil": { + "hashes": [ + "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b", + "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9" + ], + "version": "==2.8.19.14" }, "typing-extensions": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], "markers": "python_version < '3.10'", - "version": "==4.7.1" + "version": "==4.8.0" }, "typing-inspect": { "hashes": [ @@ -3522,26 +3587,27 @@ }, "urllib3": { "hashes": [ - "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f", - "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14" + "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21", + "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b" ], + "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.16" + "version": "==1.26.17" }, "virtualenv": { "hashes": [ - "sha256:95a6e9398b4967fbcb5fef2acec5efaf9aa4972049d9ae41f95e0972a683fd02", - "sha256:e5c3b4ce817b0b328af041506a2a299418c98747c4b1e68cb7527e74ced23efc" + "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b", + "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752" ], "markers": "python_version >= '3.7'", - "version": "==20.24.3" + "version": "==20.24.5" }, "wcwidth": { "hashes": [ - "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", - "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" + "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704", + "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4" ], - "version": "==0.2.6" + "version": "==0.2.8" }, "webcolors": { "hashes": [ @@ -3559,11 +3625,11 @@ }, "websocket-client": { "hashes": [ - "sha256:53e95c826bf800c4c465f50093a8c4ff091c7327023b10bfaff40cf1ef170eaa", - "sha256:ce54f419dfae71f4bdba69ebe65bf7f0a93fe71bc009ad3a010aacc3eebad537" + "sha256:3aad25d31284266bcfcfd1fd8a743f63282305a364b8d0948a43bd606acc652f", + "sha256:6cfc30d051ebabb73a5fa246efdcc14c8fbebbd0330f8984ac3bb6d9edd2ad03" ], "markers": "python_version >= '3.8'", - "version": "==1.6.2" + "version": "==1.6.3" }, "whitebox": { "hashes": [ @@ -3575,11 +3641,11 @@ }, "widgetsnbextension": { "hashes": [ - "sha256:2e37f0ce9da11651056280c7efe96f2db052fe8fc269508e3724f5cbd6c93018", - "sha256:9ec291ba87c2dfad42c3d5b6f68713fa18be1acd7476569516b2431682315c17" + "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385", + "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175" ], "markers": "python_version >= '3.7'", - "version": "==4.0.8" + "version": "==4.0.9" }, "wrapt": { "hashes": [ @@ -3668,6 +3734,7 @@ "sha256:7e530b1deafdd43e5c2b577d0944e6b528fbe88045fd849e49a8d11871ecd522" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2023.1.0" }, "xarray-spatial": { @@ -3767,20 +3834,20 @@ }, "zipp": { "hashes": [ - "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0", - "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147" + "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", + "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" ], "markers": "python_version >= '3.8'", - "version": "==3.16.2" + "version": "==3.17.0" } }, "develop": { "asttokens": { "hashes": [ - "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3", - "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c" + "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e", + "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69" ], - "version": "==2.2.1" + "version": "==2.4.0" }, "backcall": { "hashes": [ @@ -3799,26 +3866,26 @@ }, "executing": { "hashes": [ - "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc", - "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107" + "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657", + "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08" ], - "version": "==1.2.0" + "version": "==2.0.0" }, "ipython": { "hashes": [ - "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea", - "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc" + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" ], "markers": "python_version >= '3.8'", - "version": "==8.12.2" + "version": "==8.12.3" }, "jedi": { "hashes": [ - "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4", - "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e" + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "markers": "python_version >= '3.6'", - "version": "==0.19.0" + "version": "==0.19.1" }, "matplotlib-inline": { "hashes": [ @@ -3856,7 +3923,7 @@ "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.39" }, "ptyprocess": { @@ -3891,33 +3958,33 @@ }, "stack-data": { "hashes": [ - "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815", - "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8" + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" ], - "version": "==0.6.2" + "version": "==0.6.3" }, "traitlets": { "hashes": [ - "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8", - "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9" + "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116", + "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542" ], - "markers": "python_version >= '3.7'", - "version": "==5.9.0" + "markers": "python_version >= '3.8'", + "version": "==5.10.1" }, "typing-extensions": { "hashes": [ - "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", - "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", + "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" ], "markers": "python_version < '3.10'", - "version": "==4.7.1" + "version": "==4.8.0" }, "wcwidth": { "hashes": [ - "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e", - "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0" + "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704", + "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4" ], - "version": "==0.2.6" + "version": "==0.2.8" } } } From 4d403cfbaff26986cad5f4396a19fe0ebbdac949 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 13 Oct 2023 12:58:32 -0400 Subject: [PATCH 08/51] 4.4.3.0 Revise stream clipping to WBD (#1005) --- docs/CHANGELOG.md | 14 ++++++++++++++ src/bash_variables.env | 2 +- src/clip_vectors_to_wbd.py | 18 ++++++++++++++++-- src/derive_level_paths.py | 4 +--- src/stream_branches.py | 4 +--- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dfff11dd7..254e6ccb5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.3.0 - 2023-10-13 - [PR#1005](https://github.com/NOAA-OWP/inundation-mapping/pull/1005) + +Revise stream clipping to WBD by (1) reducing the buffer to clip streams away from the edge of the DEM (to prevent reverse flow issues) from 3 cells to 8 cells to account for the 70m AGREE buffer; (2) splitting MultiLineStrings formed by NWM streams being clipped by the DEM edge and then re-entering the DEM, and retaining only the lowest segment. Also changes the value of `input_WBD_gdb` to use the WBD clipped to the DEM domain. + +### Changes + +- `src/` + - `bash_variables.env`: Update WBD to the WBD clipped to the DEM domain + - `clip_vectors_to_wbd.py`: Decrease stream buffer from 3 to 8 cells inside of the WBD buffer; select the lowest segment of any incoming levelpaths that are split by the DEM edge. + - `derive_level_paths.py`: Remove unused argument + - `stream_branches.py`: Remove unused argument + +

+ ## v4.4.2.3 - 2023-09-21 - [PR#998](https://github.com/NOAA-OWP/inundation-mapping/pull/998) Removes exclude list for black formatter in `.pre-commit-config.yaml` as well as in `pyproject.toml`. Ran the `black` executable on the diff --git a/src/bash_variables.env b/src/bash_variables.env index b581dc439..db6430d4e 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -12,7 +12,7 @@ export input_nwm_catchments=${inputsDir}/nwm_hydrofabric/nwm_catchmen export input_nwm_flows=${inputsDir}/nwm_hydrofabric/nwm_flows.gpkg export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwaters.gpkg export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg -export input_WBD_gdb=${inputsDir}/wbd/WBD_National.gpkg +export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ # Styling diff --git a/src/clip_vectors_to_wbd.py b/src/clip_vectors_to_wbd.py index 081728506..a5fd025fc 100644 --- a/src/clip_vectors_to_wbd.py +++ b/src/clip_vectors_to_wbd.py @@ -53,7 +53,7 @@ def subset_vector_layers( # Make the streams buffer smaller than the wbd_buffer so streams don't reach the edge of the DEM wbd_streams_buffer = wbd_buffer.copy() - wbd_streams_buffer.geometry = wbd_streams_buffer.geometry.buffer(-3 * dem_cellsize, resolution=32) + wbd_streams_buffer.geometry = wbd_streams_buffer.geometry.buffer(-8 * dem_cellsize, resolution=32) wbd_buffer = wbd_buffer[['geometry']] wbd_streams_buffer = wbd_streams_buffer[['geometry']] @@ -174,7 +174,21 @@ def subset_vector_layers( nwm_streams_nonoutlets = nwm_streams[nwm_streams['to'].isin(nwm_streams['ID'])] if len(nwm_streams) > 0: - nwm_streams_nonoutlets = gpd.clip(nwm_streams_nonoutlets, wbd_streams_buffer) + # Address issue where NWM streams exit the HUC boundary and then re-enter, creating a MultiLineString + nwm_streams_nonoutlets = ( + gpd.clip(nwm_streams_nonoutlets, wbd_streams_buffer).explode(index_parts=True).reset_index() + ) + + # Find and keep the downstream segment of the NWM stream + max_parts = nwm_streams_nonoutlets[['level_0', 'level_1']].groupby('level_0').max() + + nwm_streams_nonoutlets = nwm_streams_nonoutlets.merge(max_parts, on='level_0', suffixes=('', '_max')) + + nwm_streams_nonoutlets = nwm_streams_nonoutlets[ + nwm_streams_nonoutlets['level_1'] == nwm_streams_nonoutlets['level_1_max'] + ] + + nwm_streams_nonoutlets = nwm_streams_nonoutlets.drop(columns=['level_1_max']) nwm_streams = pd.concat([nwm_streams_nonoutlets, nwm_streams_outlets]) diff --git a/src/derive_level_paths.py b/src/derive_level_paths.py index 5236a0d8f..01a405437 100755 --- a/src/derive_level_paths.py +++ b/src/derive_level_paths.py @@ -152,9 +152,7 @@ def Derive_level_paths( # derive headwaters if headwaters_outfile is not None: headwaters = stream_network.derive_headwater_points_with_inlets( - fromNode_attribute=fromNode_attribute, - inlets_attribute=inlets_attribute, - outlet_linestring_index=outlet_linestring_index, + inlets_attribute=inlets_attribute, outlet_linestring_index=outlet_linestring_index ) # headwaters write headwaters.to_file(headwaters_outfile, index=False, driver="GPKG") diff --git a/src/stream_branches.py b/src/stream_branches.py index fada36a6d..849d6e92f 100755 --- a/src/stream_branches.py +++ b/src/stream_branches.py @@ -468,9 +468,7 @@ def derive_inlet_points_by_feature(self, feature_attribute, outlet_linestring_in return feature_inlet_points_gdf - def derive_headwater_points_with_inlets( - self, inlets_attribute="inlet_id", fromNode_attribute="FromNode", outlet_linestring_index=0 - ): + def derive_headwater_points_with_inlets(self, inlets_attribute="inlet_id", outlet_linestring_index=0): """Derives headwater points file given inlets""" # get inlet linestring index From 6db3be492b985b9069be14c51cfa34d4c65f52f9 Mon Sep 17 00:00:00 2001 From: Rob Gonzalez-Pita Date: Fri, 20 Oct 2023 10:52:36 -0600 Subject: [PATCH 09/51] v4.4.4.0 Pre clip wbd8 (#1012) --- {src => data/wbd}/clip_vectors_to_wbd.py | 18 +- data/wbd/generate_pre_clip_fim_huc8.py | 406 +++++++++++++++++++++++ data/write_parquet_from_calib_pts.py | 2 +- docs/CHANGELOG.md | 20 +- src/bash_variables.env | 1 + src/run_unit_wb.sh | 65 +--- 6 files changed, 439 insertions(+), 73 deletions(-) rename {src => data/wbd}/clip_vectors_to_wbd.py (94%) mode change 100644 => 100755 create mode 100755 data/wbd/generate_pre_clip_fim_huc8.py diff --git a/src/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py old mode 100644 new mode 100755 similarity index 94% rename from src/clip_vectors_to_wbd.py rename to data/wbd/clip_vectors_to_wbd.py index a5fd025fc..44e877291 --- a/src/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -38,7 +38,7 @@ def subset_vector_layers( levee_protected_areas, subset_levee_protected_areas, ): - print("Getting Cell Size", flush=True) + print(f"Getting Cell Size for {hucCode}", flush=True) with rio.open(dem_filename) as dem_raster: dem_cellsize = max(dem_raster.res) @@ -46,7 +46,7 @@ def subset_vector_layers( dem_domain = gpd.read_file(dem_domain) # Get wbd buffer - print("Create wbd buffer", flush=True) + print(f"Create wbd buffer for {hucCode}", flush=True) wbd_buffer = wbd.copy() wbd_buffer.geometry = wbd_buffer.geometry.buffer(wbd_buffer_distance, resolution=32) wbd_buffer = gpd.clip(wbd_buffer, dem_domain) @@ -73,14 +73,14 @@ def subset_vector_layers( # Clip ocean water polygon for future masking ocean areas (where applicable) landsea = gpd.read_file(landsea, mask=wbd_buffer) if not landsea.empty: - print("Create landsea gpkg", flush=True) + print(f"Create landsea gpkg for {hucCode}", flush=True) landsea.to_file( subset_landsea, driver=getDriver(subset_landsea), index=False, crs=DEFAULT_FIM_PROJECTION_CRS ) del landsea # Clip levee-protected areas polygons for future masking ocean areas (where applicable) - print("Subsetting Levee Protected Areas", flush=True) + print(f"Subsetting Levee Protected Areas for {hucCode}", flush=True) levee_protected_areas = gpd.read_file(levee_protected_areas, mask=wbd_buffer) if not levee_protected_areas.empty: levee_protected_areas.to_file( @@ -92,7 +92,7 @@ def subset_vector_layers( del levee_protected_areas # Find intersecting lakes and writeout - print("Subsetting NWM Lakes", flush=True) + print(f"Subsetting NWM Lakes for {hucCode}", flush=True) nwm_lakes = gpd.read_file(nwm_lakes, mask=wbd_buffer) nwm_lakes = nwm_lakes.loc[nwm_lakes.Shape_Area < 18990454000.0] @@ -111,7 +111,7 @@ def subset_vector_layers( del nwm_lakes # Find intersecting levee lines - print("Subsetting NLD levee lines", flush=True) + print(f"Subsetting NLD levee lines for {hucCode}", flush=True) nld_lines = gpd.read_file(nld_lines, mask=wbd_buffer) if not nld_lines.empty: nld_lines.to_file( @@ -131,7 +131,7 @@ def subset_vector_layers( del nld_lines_preprocessed # Subset NWM headwaters - print("Subsetting NWM Headwater Points", flush=True) + print(f"Subsetting NWM Headwater Points for {hucCode}", flush=True) nwm_headwaters = gpd.read_file(nwm_headwaters, mask=wbd_streams_buffer) if len(nwm_headwaters) > 0: @@ -147,7 +147,7 @@ def subset_vector_layers( del nwm_headwaters # Find intersecting nwm_catchments - print("Subsetting NWM Catchments", flush=True) + print(f"Subsetting NWM Catchments for {hucCode}", flush=True) nwm_catchments = gpd.read_file(nwm_catchments, mask=wbd_buffer) if len(nwm_catchments) > 0: @@ -163,7 +163,7 @@ def subset_vector_layers( del nwm_catchments # Subset nwm streams - print("Subsetting NWM Streams", flush=True) + print(f"Subsetting NWM Streams for {hucCode}", flush=True) nwm_streams = gpd.read_file(nwm_streams, mask=wbd_buffer) diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py new file mode 100755 index 000000000..b0197de74 --- /dev/null +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -0,0 +1,406 @@ +#!/usr/bin/env python3 + +import argparse +import datetime as dt +import logging +import os +import shutil +import subprocess +from multiprocessing import Pool + +from clip_vectors_to_wbd import subset_vector_layers +from dotenv import load_dotenv + + +''' + Overview: + This script was created to absolve run_unit_wb.sh from getting the huc level WBD layer, calling + clip_vectors_to_wbd.py, and clipping the WBD for every run, which added a significant amount of + processing time for each HUC8. Using this script, we generate the necessary pre-clipped .gpkg files + for the rest of the processing steps. + + Read in environment variables from src/bash_variabls.env & config/params_template.env. + Parallelize the creation of .gpkg files per HUC: + Get huc level WBD layer from National, call the subset_vector_layers function, and clip the wbd. + A plethora gpkg files per huc are generated (see args to subset_vector_layers) + and placed within the output directory specified as the argument. + + Usage: + generate_pre_clip_fim_huc8.py + -wbd /data/inputs/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg + -n /data/inputs/pre_clip_huc8/24_3_20 + -u /data/inputs/huc_lists/included_huc8.lst + -j 6 + -o + + Notes: + If running this script to generate new data, modify the pre_clip_huc_dir variable in + src/bash_variables.env to the corresponding outputs_dir argument after running and testing this script. + The newly generated data should be created in a new folder using the format + (i.e. September 26, 2023 would be 23_9_26) +''' + +srcDir = os.getenv('srcDir') +projectDir = os.getenv('projectDir') + +load_dotenv(f'{srcDir}/bash_variables.env') +load_dotenv(f'{projectDir}/config/params_template.env') + +# Variables from src/bash_variables.env +DEFAULT_FIM_PROJECTION_CRS = os.getenv('DEFAULT_FIM_PROJECTION_CRS') +inputsDir = os.getenv('inputsDir') +input_WBD_gdb = os.getenv('input_WBD_gdb') +input_DEM = os.getenv('input_DEM') +input_DEM_domain = os.getenv('input_DEM_domain') +input_nwm_lakes = os.getenv('input_nwm_lakes') +input_nwm_catchments = os.getenv('input_nwm_catchments') +input_NLD = os.getenv('input_NLD') +input_levees_preprocessed = os.getenv('input_levees_preprocessed') +input_GL_boundaries = os.getenv('input_GL_boundaries') +input_nwm_flows = os.getenv('input_nwm_flows') +input_nwm_headwaters = os.getenv('input_nwm_headwaters') +input_nld_levee_protected_areas = os.getenv('input_nld_levee_protected_areas') + +# Variables from config/params_template.env +wbd_buffer = os.getenv('wbd_buffer') +wbd_buffer_int = int(wbd_buffer) + + +def __setup_logger(outputs_dir): + ''' + Set up logging to file. Since log file includes the date, it will be overwritten if this + script is run more than once on the same day. + ''' + datetime_now = dt.datetime.now(dt.timezone.utc) + curr_date = datetime_now.strftime("%m_%d_%Y") + + log_file_name = f"generate_pre_clip_fim_huc8_{curr_date}.log" + + log_file_path = os.path.join(outputs_dir, log_file_name) + + if not os.path.exists(outputs_dir): + os.mkdir(outputs_dir) + + if os.path.exists(log_file_path): + os.remove(log_file_path) + + file_handler = logging.FileHandler(log_file_path) + file_handler.setLevel(logging.INFO) + console_handler = logging.StreamHandler() + console_handler.setLevel(logging.INFO) + + logger = logging.getLogger() + logger.addHandler(file_handler) + logger.setLevel(logging.INFO) + + # Print start time + start_time_string = datetime_now.strftime("%m/%d/%Y %H:%M:%S") + logging.info('==========================================================================') + logging.info("\n generate_pre_clip_fim_huc8.py") + logging.info(f"\n \t Started: {start_time_string} \n") + + +def pre_clip_hucs_from_wbd(wbd_file, outputs_dir, huc_list, number_of_jobs, overwrite): + ''' + The function is the main driver of the program to iterate and parallelize writing + pre-clipped HUC8 vector files. + + Inputs: + - wbd_file: Default take from src/bash_variables.env, or provided as argument. + - outputs_dir: Output directory to stage pre-clipped vectors. + - huc_list: List of Hucs to generate pre-clipped .gpkg files. + - number_of_jobs: Amount of cpus used for parallelization. + - overwrite: Overwrite existing HUC directories containing stage vectors. + + + Processing: + - Validate number_of_jobs based on cpus availabe on current system. + - Set up logging. + - Read in HUC list. + - If HUC level output directory is existant, delete it, if not, create a new directory. + - Parallelize the processing of .gpkg creation of the hucs_to_pre_clip_list using multiprocessing.Pool. + (call to huc_level_clip_vectors_to_wbd) + + Outputs: + - New directory for each HUC, which contains 10-12 .gpkg files + - Write to log file in $pre_clip_huc_dir + ''' + + # Validation + total_cpus_available = os.cpu_count() + if number_of_jobs > total_cpus_available: + print( + f'Provided: -j {number_of_jobs}, which is greater than than amount of available cpus -2: ' + f'{total_cpus_available -2} will be used instead.' + ) + number_of_jobs = total_cpus_available - 2 + + # Set up logging and set start_time + __setup_logger(outputs_dir) + start_time = dt.datetime.now(dt.timezone.utc) + + # Read in huc_list file and turn into a list data structure + if os.path.exists(huc_list): + hucs_to_pre_clip_list = open(huc_list).read().splitlines() + else: + logging.info("The huclist is not valid. Please check arguemnt.") + raise Exception("The huclist is not valid. Please check arguemnt.") + + if os.path.exists(outputs_dir) and not overwrite: + raise Exception( + f"The directory: {outputs_dir} already exists. Use 'overwrite' argument if the intent" + " is to re-generate all of the data. " + ) + + # Iterate over the huc_list argument and create a directory for each huc. + for huc in hucs_to_pre_clip_list: + if os.path.isdir(os.path.join(outputs_dir, huc)): + shutil.rmtree(os.path.join(outputs_dir, huc)) + os.mkdir(os.path.join(outputs_dir, huc)) + logging.info( + f"\n\t Output Directory: {outputs_dir}/{huc} exists. It will be overwritten, and the " + f"newly generated huc level files will be output there. \n" + ) + print( + f"\n\t Output Directory: {outputs_dir}/{huc} exists. It will be overwritten, and the " + f"newly generated huc level files will be output there. \n" + ) + + elif not os.path.isdir(os.path.join(outputs_dir, huc)): + os.mkdir(os.path.join(outputs_dir, huc)) + logging.info(f"Created directory: {outputs_dir}/{huc}, huc level files will be written there.") + print(f"Created directory: {outputs_dir}/{huc}, huc level files will be written there.") + + # Build arguments (procs_list) for each process to execute (huc_level_clip_vectors_to_wbd) + procs_list = [] + for huc in hucs_to_pre_clip_list: + print(f"Generating vectors for {huc}. ") + procs_list.append([huc, outputs_dir, wbd_file]) + + # Parallelize each huc in hucs_to_parquet_list + logging.info('Parallelizing HUC level wbd pre-clip vector creation. ') + print('Parallelizing HUC level wbd pre-clip vector creation. ') + with Pool(processes=number_of_jobs) as pool: + pool.map(huc_level_clip_vectors_to_wbd, procs_list) + + # Get time metrics + end_time = dt.datetime.now(dt.timezone.utc) + end_time_string = end_time.strftime("%m/%d/%Y %H:%M:%S") + logging.info(f"\n Ended: {end_time_string} \n") + + # Calculate duration + time_duration = end_time - start_time + logging.info('==========================================================================') + logging.info( + f"\t Completed writing all huc level files \n" + f"\t \t TOTAL RUN TIME: {str(time_duration).split('.')[0]}" + ) + logging.info('==========================================================================') + + print("\n\t Completed writing all huc level files \n") + print(f"\t \t TOTAL RUN TIME: {str(time_duration).split('.')[0]}") + + +def huc_level_clip_vectors_to_wbd(args): + ''' + Create pre-clipped vectors at the huc level. Necessary to have this as an additional + function for multiprocessing. This is mostly a wrapper for the subset_vector_layers() method in + clip_vectors_to_wbd.py. + + Inputs: + - huc: Individual HUC to generate vector files for. + - outputs_dir: Output directory to stage pre-clipped vectors. + - input_WBD_filename: Filename of WBD to generate pre-clipped .gpkg files. + + Processing: + - Define (unpack) arguments. + - Define LandSea water body mask. + - Use subprocess.run to get the WBD for specified HUC - (ogr2ogr called to generate wbd.gpkg) + - Subset Vector Layers - (call subset_vector_layers function in data/wbd/clip_vectors_to_wbd.py file) + - Clip WBD - + Creation of wbd8_clp.gpkg & wbd_buffered.gpkg using the executable: "ogr2ogr .... -clipsrc ..." + + Outputs: + - .gpkg files* dependant on HUC's WBD (*differing amount based on individual huc) + ''' + + # We have to explicitly unpack the args from pool.map() + huc = args[0] + outputs_dir = args[1] + input_WBD_filename = args[2] + + huc_directory = os.path.join(outputs_dir, huc) + + # SET VARIABLES AND FILE INPUTS # + hucUnitLength = len(huc) + huc2Identifier = huc[:2] + input_NHD_WBHD_layer = f"WBDHU{hucUnitLength}" + + # Define the landsea water body mask using either Great Lakes or Ocean polygon input # + if huc2Identifier == "04": + input_LANDSEA = f"{input_GL_boundaries}" + print(f'Using {input_LANDSEA} for water body mask (Great Lakes)') + else: + input_LANDSEA = f"{inputsDir}/landsea/water_polygons_us.gpkg" + + print(f"\n Get WBD {huc}") + + # TODO: Use Python API (osgeo.ogr) instead of using ogr2ogr executable + get_wbd_subprocess = subprocess.run( + [ + 'ogr2ogr', + '-f', + 'GPKG', + '-t_srs', + DEFAULT_FIM_PROJECTION_CRS, + f'{huc_directory}/wbd.gpkg', + input_WBD_filename, + input_NHD_WBHD_layer, + '-where', + f"HUC{hucUnitLength}='{huc}'", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, + ) + + msg = get_wbd_subprocess.stdout + print(msg) + logging.info(msg) + + if get_wbd_subprocess.stderr != "": + if "ERROR" in get_wbd_subprocess.stderr.upper(): + msg = ( + f" - Creating -- {huc_directory}/wbd.gpkg" + f" ERROR -- details: ({get_wbd_subprocess.stderr})" + ) + print(msg) + logging.error(msg) + else: + msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete \n" + print(msg) + logging.info(msg) + + msg = f"Get Vector Layers and Subset {huc}" + print(msg) + logging.info(msg) + + # Subset Vector Layers + subset_vector_layers( + subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", + subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", + hucCode=huc, + subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", + wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", + wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", + wbd_filename=f"{huc_directory}/wbd.gpkg", + dem_filename=input_DEM, + dem_domain=input_DEM_domain, + nwm_lakes=input_nwm_lakes, + nwm_catchments=input_nwm_catchments, + subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", + nld_lines=input_NLD, + nld_lines_preprocessed=input_levees_preprocessed, + landsea=input_LANDSEA, + nwm_streams=input_nwm_flows, + subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", + nwm_headwaters=input_nwm_headwaters, + subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", + subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", + wbd_buffer_distance=wbd_buffer_int, + levee_protected_areas=input_nld_levee_protected_areas, + subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + ) + + msg = f"\n\t Completing Get Vector Layers and Subset: {huc} \n" + print(msg) + logging.info(msg) + + ## Clip WBD8 ## + print(f" Clip WBD {huc}") + + clip_wbd8_subprocess = subprocess.run( + [ + 'ogr2ogr', + '-f', + 'GPKG', + '-t_srs', + DEFAULT_FIM_PROJECTION_CRS, + '-clipsrc', + f'{huc_directory}/wbd_buffered.gpkg', + f'{huc_directory}/wbd8_clp.gpkg', + f'{inputsDir}/wbd/WBD_National.gpkg', + 'WBDHU8', + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, + ) + + msg = clip_wbd8_subprocess.stdout + print(msg) + logging.info(msg) + + if clip_wbd8_subprocess.stderr != "": + if "ERROR" in clip_wbd8_subprocess.stderr.upper(): + msg = ( + f" - Creating -- {huc_directory}/wbd.gpkg" + f" ERROR -- details: ({clip_wbd8_subprocess.stderr})" + ) + print(msg) + logging.error(msg) + else: + msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete" + print(msg) + logging.info(msg) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description='This script gets WBD layer, calls the clip_vectors_to_wbd.py script, and clips the wbd. ' + 'A plethora gpkg files per huc are generated (see args to subset_vector_layers), and placed within ' + 'the output directory specified as the argument.', + usage=''' + ./generate_pre_clip_fim_huc8.py + -wbd /data/inputs/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg + -n /data/inputs/pre_clip_huc8/24_3_20 + -u /data/inputs/huc_lists/included_huc8.lst + -j 6 + -o + ''', + ) + parser.add_argument( + '-wbd', + '--wbd_file', + help='.wbd file to clip into individual HUC.gpkg files. Default is $input_WBD_gdb from src/bash_variables.env.', + default=input_WBD_gdb, + ) + parser.add_argument( + '-n', + '--outputs_dir', + help='Directory to output all of the HUC level .gpkg files. Use the format: ' + ' (i.e. September 26, 2023 would be 23_9_26)', + ) + parser.add_argument('-u', '--huc_list', help='List of HUCs to genereate pre-clipped vectors for.') + parser.add_argument( + '-j', + '--number_of_jobs', + help='OPTIONAL: number of cores/processes (default=4). This is a memory intensive ' + 'script, and the multiprocessing will crash if too many CPUs are used. It is recommended to provide ' + 'half the amount of available CPUs.', + type=int, + required=False, + default=4, + ) + parser.add_argument( + '-o', + '--overwrite', + help='Overwrite the file if already existing? (default false)', + action='store_true', + ) + + args = vars(parser.parse_args()) + + pre_clip_hucs_from_wbd(**args) diff --git a/data/write_parquet_from_calib_pts.py b/data/write_parquet_from_calib_pts.py index ee8c9fbc2..5d1f903b3 100644 --- a/data/write_parquet_from_calib_pts.py +++ b/data/write_parquet_from_calib_pts.py @@ -190,7 +190,7 @@ def create_parquet_directory(output_dir): os.mkdir(output_dir, exist_ok=True) logging.info(f"Created directory: {output_dir}, .parquet files will be written there.") elif os.path.isdir(output_dir) is True: - logging.info(f"Output Direcrtory: {output_dir} exists, .parquet files will be written there.") + logging.info(f"Output Directory: {output_dir} exists, .parquet files will be written there.") def create_parquet_files( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 254e6ccb5..2d0844de4 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,7 +1,25 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. -## v4.4.3.0 - 2023-10-13 - [PR#1005](https://github.com/NOAA-OWP/inundation-mapping/pull/1005) +## v4.4.4.0 - 2023-10-20 - [PR#1012](https://github.com/NOAA-OWP/inundation-mapping/pull/1012) + +The way in which watershed boundary data (WBD) is generated and processed has been modified. Instead of generating those files "on the fly" for every run, a script has been added that will take a huclist and create the .gpkg files per HUC in a specified directory (`$pre_clip_huc_dir`). During a `fim_pipeline.sh` run, the pre-clipped staged vectors will be copied over to the containers' working directory. This reduces runtime and the repetitive computation needed to generate those files every run. + +### Changes + +- `src/` + - `bash_variables.env`: Add pre_clip_huc_dir env variable. + - `clip_vectors_to_wbd.py`: Moved to `/data/wbd/clip_vectors_to_wbd.py`. + - `src/run_unit_wb.sh`: Remove ogr2ogr calls to get & clip WBD, remove call to clip_vectors_to_wbd.py, and replace with copying staged .gpkg files. + +### Additions + +- `data/wbd/` + - `generate_pre_clip_fim_huc8.py`: This script generates the pre-clipped vectors at the huc level. + +

+ +## v4.4.3.0 - 2023-10-10 - [PR#1005](https://github.com/NOAA-OWP/inundation-mapping/pull/1005) Revise stream clipping to WBD by (1) reducing the buffer to clip streams away from the edge of the DEM (to prevent reverse flow issues) from 3 cells to 8 cells to account for the 70m AGREE buffer; (2) splitting MultiLineStrings formed by NWM streams being clipped by the DEM edge and then re-entering the DEM, and retaining only the lowest segment. Also changes the value of `input_WBD_gdb` to use the WBD clipped to the DEM domain. diff --git a/src/bash_variables.env b/src/bash_variables.env index db6430d4e..01a1cf4f3 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -14,6 +14,7 @@ export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwate export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ +export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 # Styling export startDiv="\n-----------------------------------------------------------------\n" diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 7baf258e0..13be08314 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -21,70 +21,11 @@ branchSummaryLogFile=$outputDestDir/logs/branch/"$hucNumber"_summary_branch.log T_total_start huc_start_time=`date +%s` -## SET VARIABLES AND FILE INPUTS ## -hucUnitLength=${#hucNumber} -huc4Identifier=${hucNumber:0:4} -huc2Identifier=${hucNumber:0:2} -input_NHD_WBHD_layer=WBDHU$hucUnitLength - -# Define the landsea water body mask using either Great Lakes or Ocean polygon input # -if [[ $huc2Identifier == "04" ]] ; then - input_LANDSEA=$input_GL_boundaries - #echo -e "Using $input_LANDSEA for water body mask (Great Lakes)" -else - input_LANDSEA=$inputsDir/landsea/water_polygons_us.gpkg -fi -## GET WBD ## -echo -e $startDiv"Get WBD $hucNumber" -date -u -Tstart -ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS \ - $tempHucDataDir/wbd.gpkg $input_WBD_gdb $input_NHD_WBHD_layer \ - -where "HUC$hucUnitLength='$hucNumber'" -Tcount +## Copy HUC's pre-clipped .gpkg files from $pre_clip_huc_dir (use -a & /. -- only copies folder's contents) +echo -e $startDiv"Copying staged wbd and .gpkg files from $pre_clip_huc_dir/$hucNumber" +cp -a $pre_clip_huc_dir/$hucNumber/. $tempHucDataDir -## Subset Vector Layers ## -echo -e $startDiv"Get Vector Layers and Subset $hucNumber" -date -u -Tstart - -cmd_args=" -a $tempHucDataDir/nwm_lakes_proj_subset.gpkg" -cmd_args+=" -b $tempHucDataDir/nwm_subset_streams.gpkg" -cmd_args+=" -d $hucNumber" -cmd_args+=" -e $tempHucDataDir/nwm_headwater_points_subset.gpkg" -cmd_args+=" -f $tempHucDataDir/wbd_buffered.gpkg" -cmd_args+=" -s $tempHucDataDir/wbd_buffered_streams.gpkg" -cmd_args+=" -g $tempHucDataDir/wbd.gpkg" -cmd_args+=" -i $input_DEM" -cmd_args+=" -j $input_DEM_domain" -cmd_args+=" -l $input_nwm_lakes" -cmd_args+=" -m $input_nwm_catchments" -cmd_args+=" -n $tempHucDataDir/nwm_catchments_proj_subset.gpkg" -cmd_args+=" -r $input_NLD" -cmd_args+=" -rp $input_levees_preprocessed" -cmd_args+=" -v $input_LANDSEA" -cmd_args+=" -w $input_nwm_flows" -cmd_args+=" -x $tempHucDataDir/LandSea_subset.gpkg" -cmd_args+=" -y $input_nwm_headwaters" -cmd_args+=" -z $tempHucDataDir/nld_subset_levees.gpkg" -cmd_args+=" -zp $tempHucDataDir/3d_nld_subset_levees_burned.gpkg" -cmd_args+=" -wb $wbd_buffer" -cmd_args+=" -lpf $input_nld_levee_protected_areas" -cmd_args+=" -lps $tempHucDataDir/LeveeProtectedAreas_subset.gpkg" - -#echo "$cmd_args" -python3 $srcDir/clip_vectors_to_wbd.py $cmd_args -Tcount - -## Clip WBD8 ## -echo -e $startDiv"Clip WBD8" -date -u -Tstart -ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS \ - -clipsrc $tempHucDataDir/wbd_buffered.gpkg $tempHucDataDir/wbd8_clp.gpkg \ - $inputsDir/wbd/WBD_National.gpkg WBDHU8 -Tcount ## DERIVE LEVELPATH ## echo -e $startDiv"Generating Level Paths for $hucNumber" From c2a6b3bea972a52d3420dcde32940bb7afbbcd6f Mon Sep 17 00:00:00 2001 From: Gregory Petrochenkov <30809186+GregoryPetrochenkov-NOAA@users.noreply.github.com> Date: Thu, 26 Oct 2023 07:56:21 -0700 Subject: [PATCH 10/51] v4.4.4.1 Synthesize testcases hotfix for GVAL memory/performance issues (#1007) --- Pipfile | 2 +- Pipfile.lock | 1011 ++++++++++++++++-------------- docs/CHANGELOG.md | 15 + pyproject.toml | 3 +- tools/inundate_mosaic_wrapper.py | 4 +- tools/run_test_case.py | 181 +++--- tools/synthesize_test_cases.py | 24 +- tools/tools_shared_functions.py | 283 +++++---- 8 files changed, 802 insertions(+), 721 deletions(-) diff --git a/Pipfile b/Pipfile index 3a4e3c353..636fbe26c 100755 --- a/Pipfile +++ b/Pipfile @@ -37,7 +37,7 @@ pyarrow = "==11.0.0" rtree = "==1.0.1" py7zr = "==0.20.4" scipy = "==1.10.1" -gval = "==0.1.2" +gval = "==0.2.3" flake8 = "==6.0.0" black = "==23.7.0" pyproject-flake8 = "==6.0.0.post1" diff --git a/Pipfile.lock b/Pipfile.lock index 4e66c9db4..78c257106 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "32dc0ff07bc71eeec7a7bc1c64d580d05ce81cceaa3ecfc2e3b4f067e4f5c396" + "sha256": "c05e13cee1824291db432c5f40d2ed7eed74349a1bba77ddb2deb852cd533734" }, "pipfile-spec": 6, "requires": { @@ -115,11 +115,11 @@ }, "babel": { "hashes": [ - "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610", - "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455" + "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210", + "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec" ], "markers": "python_version >= '3.7'", - "version": "==2.12.1" + "version": "==2.13.0" }, "backcall": { "hashes": [ @@ -167,11 +167,11 @@ }, "bleach": { "hashes": [ - "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414", - "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4" + "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe", + "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6" ], - "markers": "python_version >= '3.7'", - "version": "==6.0.0" + "markers": "python_version >= '3.8'", + "version": "==6.1.0" }, "blosc2": { "hashes": [ @@ -532,16 +532,16 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { "hashes": [ - "sha256:61f594d1f4c295fa5cd9014ceb3a1fc4a70b0de1164b94fbc2d854ccba056f9f", - "sha256:d89684b8de9e34a2a43b3460fbca07d09d6e25ce858df4d5a44240403b6178f5" + "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", + "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" ], - "markers": "python_version >= '3.6'", - "version": "==2.2.1" + "markers": "python_version >= '3.8'", + "version": "==3.0.0" }, "colorcet": { "hashes": [ @@ -627,75 +627,75 @@ }, "cycler": { "hashes": [ - "sha256:7896994252d006771357777d0251f3e34d266f4fa5f2c572247a80ab01440947", - "sha256:8cc3a7b4861f91b1095157f9916f748549a617046e67eb7619abed9b34d2c94a" + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" ], "markers": "python_version >= '3.8'", - "version": "==0.12.0" + "version": "==0.12.1" }, "cython": { "hashes": [ - "sha256:011c4e0b75baee1843334562487eb4fbc0c59ddb2cc32a978b972a81eedcbdcc", - "sha256:05cb2a73810f045d328b7579cf98f550a9e601df5e282d1fea0512d8ad589011", - "sha256:067b2b9eb487bd61367b296f11b7c1c70a084b3eb7d5a572f607cd1fc5ca5586", - "sha256:08d67c7225a09eeb77e090c8d4f60677165b052ccf76e3a57d8237064e5c2de2", - "sha256:10cbfb37f31938371a6213cc8b5459c639954aed053efeded3c012d4c5915db9", - "sha256:147cc1d3dda8b06de9d86df5e59cdf15f0a522620168b7349a5ec88b48104d7d", - "sha256:1b12a8f23270675b537d1c3b988f845bea4bbcc66ae0468857f5ede0526d4522", - "sha256:213ff9f95de319e54b520bf31edd6aa7a1fa4fbf617c2beb0f92362595e6476a", - "sha256:22ba78e48bdb65977928ecb275ac8c82df7b0eefa075078a1363a5af4606b42e", - "sha256:2f84bd6cefa5130750c492038170c44f1cbd6f42e9ed85e168fd9cb453f85160", - "sha256:302281b927409b3e0ef8cd9251eab782cf1acd2578eab305519fbae5d184b7e9", - "sha256:34f7b014ebce5d325c8084e396c81cdafbd8d82be56780dffe6b67b28c891f1b", - "sha256:38085523fa7a299638d051ae08144222785639882f6291bd275c0b12db1034ff", - "sha256:477cd3549597f09a1608da7b05e16ba641e9aedd171b868533a5a07790ed886f", - "sha256:4bebbca13078125a35937966137af4bd0300a0c66fd7ae4ce36adc049b13bdf3", - "sha256:4db017b104f47b1185237702f6ed2651839c8124614683efa7c489f3fa4e19d9", - "sha256:4dca13c86d6cd523c7d8bbf8db1b2bbf8faedd0addedb229158d8015ad1819e1", - "sha256:4fe806d154b6b7f0ab746dac36c022889e2e7cf47546ff9afdc29a62cfa692d0", - "sha256:54d41a1dfbaab74449873e7f8e6cd4239850fe7a50f7f784dd99a560927f3bac", - "sha256:550b3fbe9b3c555b44ded934f4822f9fcc04dfcee512167ebcbbd370ccede20e", - "sha256:5682293d344b7dbad97ce6eceb9e887aca6e53499709db9da726ca3424e5559d", - "sha256:62dd78afdf748a58dae9c9b9c42a1519ae30787b28ce5f84a0e1bb54144142ca", - "sha256:6b75e9c9d7ad7c9dd85d45241d1d4e3c5f66079c1f84eec91689c26d98bc3349", - "sha256:75a2395cc7b78cff59be6e9b7f92bbb5d7b8d25203f6d3fb6f72bdb7d3f49777", - "sha256:77ec0134fc1b10aebef2013936a91c07bff2498ec283bc2eca099ee0cb94d12e", - "sha256:786b6034a91e886116bb562fe42f8bf0f97c3e00c02e56791d02675959ed65b1", - "sha256:78e2853d484643c6b7ac3bdb48392753442da1c71b689468fa3176b619bebe54", - "sha256:7e08ff5da5f5b969639784b1bffcd880a0c0f048d182aed7cba9945ee8b367c2", - "sha256:7f43c4d3ecd9e3b8b7afe834e519f55cf4249b1088f96d11b96f02c55cbaeff7", - "sha256:809617cf4825b2138ce0ec827e1f28e39668743c81ac8286373f8d148c05f088", - "sha256:832bbee87bca760efeae248ddf19ccd77f9a2355cb6f8a64f20cc377e56957b3", - "sha256:8850269ff59f77a1629e26d0576701925360d732011d6d3516ccdc5b2c2bc310", - "sha256:8948504338d7a140ce588333177dcabf0743a68dbc83b0174f214f5b959634d5", - "sha256:8ccb91d2254e34724f1541b2a6fcdfacdb88284185b0097ae84e0ddf476c7a38", - "sha256:8f1c9e4b8e413da211dd7942440cf410ff0eafb081309e04e81f4fafbb146bf2", - "sha256:9594818dca8bb22ae6580c5222da2bc5cc32334350bd2d294a00d8669bcc61b5", - "sha256:989787fc24a95100a26918b6577d06e15a8868a3ed267009c5cfcf1a906179ac", - "sha256:9e625eec8c5c9a8cb062a318b257cc469d301bed952c7daf86e38bbd3afe7c91", - "sha256:a1c3675394b81024aaf56e4f53c2b4f81d9a116c7049e9d4706f810899c9134e", - "sha256:a49dde9f9e29ea82f29aaf3bb1a270b6eb90b75d627c7ff2f5dd3764540ae646", - "sha256:a51efba0e136b2af358e5a347bae09678b17460c35cf1eab24f0476820348991", - "sha256:ae453cfa933b919c0a19d2cc5dc9fb28486268e95dc2ab7a11ab7f99cf8c3883", - "sha256:b032cb0c69082f0665b2c5fb416d041157062f1538336d0edf823b9ee500e39c", - "sha256:b1f023d36a3829069ed11017c670128be3f135a9c17bd64c35d3b3442243b05c", - "sha256:bc1c8013fad0933f5201186eccc5f2be223cafd6a8dcd586d3f7bb6ba84dc845", - "sha256:c298b1589205ecaaed0457ad05e0c8a43e7db2053607f48ed4a899cb6aa114df", - "sha256:c5e722732e9aa9bde667ed6d87525234823eb7766ca234cfb19d7e0c095a2ef4", - "sha256:c90eeb94395315e65fd758a2f86b92904fce7b50060b4d45a878ef6767f9276e", - "sha256:cc9d173ab8b167cae674f6deed8c65ba816574797a2bd6d8aa623277d1fa81ca", - "sha256:d0d0cc4ecc05f41c5e02af14ac0083552d22efed976f79eb7bade55fed63b25d", - "sha256:d21801981db44b7e9f9768f121317946461d56b51de1e6eff3c42e8914048696", - "sha256:d5e5587128e8c2423aefcffa4ded4ddf60d44898938fbb7c0f236636a750a94f", - "sha256:dab6a923e21e212aa3dc6dde9b22a190f5d7c449315a94e57ddc019ea74a979b", - "sha256:dd30826ca8b27b2955a63c8ffe8aacc9f0779582b4bd154cf7b441ac10dae2cb", - "sha256:e486331a29e7700b1ad5f4f753bef483c81412a5e64a873df46d6cb66f9a65de", - "sha256:e663c237579c033deaa2cb362b74651da7712f56e441c11382510a8c4c4f2dd7", - "sha256:e825e682cef76d0c33384f38b56b7e87c76152482a914dfc78faed6ff66ce05a", - "sha256:f37e4287f520f3748a06ad5eaae09ba4ac68f52e155d70de5f75780d83575c43" + "sha256:0147a31fb73a063bb7b6c69fd843c1a2bad18f326f58048d4ee5bdaef87c9fbf", + "sha256:056340c49bf7861eb1eba941423e67620b7c85e264e9a5594163f1d1e8b95acc", + "sha256:0630527a8c9e8fed815c38524e418dab713f5d66f6ac9dc2151b41f3a7727304", + "sha256:0e1c9385e99eef299396b9a1e39790e81819446c6a83e249f6f0fc71a64f57a0", + "sha256:14b898ec2fdeea68f81bd3838b035800b173b59ed532674f65a82724bab35d3b", + "sha256:1571b045ec1cb15c152c3949f3bd53ee0fa66d434271ea3d225658d99b7e721a", + "sha256:176953a8a2532e34a589625a40c934ff339088f2bf4ddaa2e5cb77b05ca0c25c", + "sha256:188705eeae094bb716bc3e3d0da4e13469f0a0de803b65dfd63fe7eb78ec6173", + "sha256:18f4fb7cc6ad8e99e8f387ebbcded171a701bfbfd8cd3fd46156bf44bb4fd968", + "sha256:1d3416c24a1b7bf3a2d9615a7f9f12b00fac0b94fb2e61449e0c1ecf20d6ed52", + "sha256:1ec9e15b821ef7e3c38abe9e4df4e6dda7af159325bc358afd5a3c2d5027ccfe", + "sha256:22d268c3023f405e13aa0c1600389794694ab3671614f8e782d89a1055da0858", + "sha256:30c1d9bd2bcb9b1a195dd23b359771857df8ebd4a1038fb37dd155d3ea38c09c", + "sha256:3192cd780435fca5ae5d79006b48cbf0ea674853b5a7b0055a122045bff9d84e", + "sha256:327309301b01f729f173a94511cb2280c87ba03c89ed428e88f913f778245030", + "sha256:3cfbd60137f6fca9c29101d7517d4e341e0fd279ffc2489634e5e2dd592457c2", + "sha256:3db04801fd15d826174f63ff45878d4b1e62aff27cf1ea96b186581052d24446", + "sha256:42b1ff0e19fb4d1fe68b60f55d46942ed246a323f6bbeec302924b78b4c3b637", + "sha256:48bae87b657009e5648c21d4a92de9f3dc6fed3e35e92957fa8a07a18cea2313", + "sha256:4c8e5afcc19861c3b22faafbe906c7e1b23f0595073ac10e21a80dec9e60e7dd", + "sha256:4cc0f7244da06fdc6a4a7240df788805436b6fb7f20edee777eb77777d9d2eb1", + "sha256:4e956383e57d00b1fa6449b5ec03b9fa5fce2afd41ef3e518bee8e7c89f1616c", + "sha256:51850f277660f67171135515e45edfc8815f723ff20768e39cb9785b2671062f", + "sha256:5545d20d7a1c0cf17559152f7f4a465c3d5caace82dd051f82e2d753ae9fd956", + "sha256:587d664ff6bd5b03611ddc6ef320b7f8677d824c45d15553f16a69191a643843", + "sha256:59bf689409b0e51ef673e3dd0348727aef5b67e40f23f806be64c49cee321de0", + "sha256:5d6af87a787d5ce063e28e508fee34755a945e438c68ecda50eb4ea34c30e13f", + "sha256:66b7e71c16cab0814945014ffb101ead2b173259098bbb1b8138e7a547da3709", + "sha256:6ccde14ddc4b424435cb5722aa1529c254bbf3611e1ad9baea12d25e9c049361", + "sha256:6f05889eb1b5a95a7adf97303279c2d13819ff62292e10337e6c940dbf570b5d", + "sha256:6f63e959d13775472d37e731b2450d120e8db87e956e2de74475e8f17a89b1fb", + "sha256:74ba0f11b384246b7965169f08bf67d426e4957fee5c165571340217a9b43cfc", + "sha256:75d42c8423ab299396f3c938445730600e32e4a2f0298f6f9df4d4a698fe8e16", + "sha256:77a920ae19fa1db5adb8a618cebb095ca4f56adfbf9fc32cb7008a590607b62b", + "sha256:80bd3167e689419cdaf7ede0d20a9f126b9698a43b1f8d3e8f54b970c7a6cd07", + "sha256:84084fa05cf9a67a85818fa72a741d1cae2e3096551158730730a3bafc3b2f52", + "sha256:845e24ee70c204062e03f813114751387abf454b29410336797582e04abbc07b", + "sha256:85073ab414ff432d2a39d36cb49c39ce69f30b53daccc7699bfad0ce3d1b539a", + "sha256:8a6a9a2d98758768052e4ac1bea4ebc20fae69b4c19cb2bc5457c9174532d302", + "sha256:8e78fc42a6e846941d23aba1aca587520ad38c8970255242f08f9288b0eeba85", + "sha256:9296f332523d5c550ebae694483874d255264cff3281372f25ea5f2739b96651", + "sha256:94fa403de3a413cd41b8eb4ddb4adcbd66aa0a64f9a84d1c5f696c93572c83aa", + "sha256:9eb128fa40305f18eaa4d8dd0980033b92db86aada927181d3c3d561aa0634db", + "sha256:9f40b27545d583fd7df0d3c1b76b3bcaf8a72dbd8d83d5486af2384015660de8", + "sha256:b50f4f75f89e7eef2ed9c9b60746bc4ab1ba2bc0dff64587133db2b63e068f09", + "sha256:be1a679c7ad90813f9206c9d62993f3bd0cba9330668e97bb3f70c87ae94d5f5", + "sha256:bff1fec968a6b2ca452ae9bff6d6d0bf8486427d4d791e85543240266b6915e0", + "sha256:d0c7b315f6feb75e2c949dc7816da5626cdca097fea1c0d9f4fdb20d2f4ffc2a", + "sha256:d12591939af93c59defea6fc5320ca099eb44e4694e3b2cbe72fb24406079b97", + "sha256:d49d20db27c9cfcf45bb1fbf68f777bd1e04e4b949e4e5172d9ee8c9419bc792", + "sha256:d52ed47edbf48392dd0f419135e7ff59673f6b32d27d3ffc9e61a515571c050d", + "sha256:db9d4de4cd6cd3ad1c3f455aae877ad81a92b92b7cbb01dfb32b6306b873932b", + "sha256:e3ad109bdf40f55318e001cad12bcc00e8119569b49f72e442c082355617b036", + "sha256:e40ac8bd6d11355d354bb4975bb88f6e923ba30f85e38f1f1234b642634e4fc4", + "sha256:e729fd633a5225570c5480b36e7c530c8a82e2ab6d2944ddbe1ddfff5bf181b1", + "sha256:f0ac9ec822fad010248b4a59ac197975de38c95378d0f13201c181dd9b0a2624", + "sha256:f7578b59ffd0d9c95ae6f7ae852309918915998b7fe0ed2f8725a683de8da276", + "sha256:fa08259f4d176b86561eeff6954f9924099c0b0c128fc2cbfc18343c068ad8ca" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.2" + "version": "==3.0.3" }, "dask": { "hashes": [ @@ -838,53 +838,61 @@ "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0" }, + "flox": { + "hashes": [ + "sha256:44b0ce5aea13485126cb69bf4ab1aad0cfe131ddadc577f1f244d48d856fd08d", + "sha256:d4f34a9debbde67c9ae5e9b2bef6d5c236879be8b18b48fb1eb3bf71aa154236" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.2" + }, "fonttools": { "hashes": [ - "sha256:030355fbb0cea59cf75d076d04d3852900583d1258574ff2d7d719abf4513836", - "sha256:05056a8c9af048381fdb17e89b17d45f6c8394176d01e8c6fef5ac96ea950d38", - "sha256:206808f9717c9b19117f461246372a2c160fa12b9b8dbdfb904ab50ca235ba0a", - "sha256:20fc43783c432862071fa76da6fa714902ae587bc68441e12ff4099b94b1fcef", - "sha256:25620b738d4533cfc21fd2a4f4b667e481f7cb60e86b609799f7d98af657854e", - "sha256:33c40a657fb87ff83185828c0323032d63a4df1279d5c1c38e21f3ec56327803", - "sha256:3d7adfa342e6b3a2b36960981f23f480969f833d565a4eba259c2e6f59d2674f", - "sha256:48078357984214ccd22d7fe0340cd6ff7286b2f74f173603a1a9a40b5dc25afe", - "sha256:5056f69a18f3f28ab5283202d1efcfe011585d31de09d8560f91c6c88f041e92", - "sha256:52e77f23a9c059f8be01a07300ba4c4d23dc271d33eed502aea5a01ab5d2f4c1", - "sha256:57c22e5f9f53630d458830f710424dce4f43c5f0d95cb3368c0f5178541e4db7", - "sha256:5aa67d1e720fdd902fde4a59d0880854ae9f19fc958f3e1538bceb36f7f4dc92", - "sha256:5f9660e70a2430780e23830476332bc3391c3c8694769e2c0032a5038702a662", - "sha256:635658464dccff6fa5c3b43fe8f818ae2c386ee6a9e1abc27359d1e255528186", - "sha256:6a530fa28c155538d32214eafa0964989098a662bd63e91e790e6a7a4e9c02da", - "sha256:70f021a6b9eb10dfe7a411b78e63a503a06955dd6d2a4e130906d8760474f77c", - "sha256:77e5113233a2df07af9dbf493468ce526784c3b179c0e8b9c7838ced37c98b69", - "sha256:7c76f32051159f8284f1a5f5b605152b5a530736fb8b55b09957db38dcae5348", - "sha256:812142a0e53cc853964d487e6b40963df62f522b1b571e19d1ff8467d7880ceb", - "sha256:82d8e687a42799df5325e7ee12977b74738f34bf7fde1c296f8140efd699a213", - "sha256:8dfd8edfce34ad135bd69de20c77449c06e2c92b38f2a8358d0987737f82b49e", - "sha256:93c5b6d77baf28f306bc13fa987b0b13edca6a39dc2324eaca299a74ccc6316f", - "sha256:9d654d3e780e0ceabb1f4eff5a3c042c67d4428d0fe1ea3afd238a721cf171b3", - "sha256:a682fb5cbf8837d1822b80acc0be5ff2ea0c49ca836e468a21ffd388ef280fd3", - "sha256:a68b71adc3b3a90346e4ac92f0a69ab9caeba391f3b04ab6f1e98f2c8ebe88e3", - "sha256:a6a2e99bb9ea51e0974bbe71768df42c6dd189308c22f3f00560c3341b345646", - "sha256:ab80e7d6bb01316d5fc8161a2660ca2e9e597d0880db4927bc866c76474472ef", - "sha256:ace0fd5afb79849f599f76af5c6aa5e865bd042c811e4e047bbaa7752cc26126", - "sha256:ace51902ab67ef5fe225e8b361039e996db153e467e24a28d35f74849b37b7ce", - "sha256:af38f5145258e9866da5881580507e6d17ff7756beef175d13213a43a84244e9", - "sha256:b3813f57f85bbc0e4011a0e1e9211f9ee52f87f402e41dc05bc5135f03fa51c1", - "sha256:b5e760198f0b87e42478bb35a6eae385c636208f6f0d413e100b9c9c5efafb6a", - "sha256:b62a53a4ca83c32c6b78cac64464f88d02929779373c716f738af6968c8c821e", - "sha256:d08a694b280d615460563a6b4e2afb0b1b9df708c799ec212bf966652b94fc84", - "sha256:d27d960e10cf7617d70cf3104c32a69b008dde56f2d55a9bed4ba6e3df611544", - "sha256:da78f39b601ed0b4262929403186d65cf7a016f91ff349ab18fdc5a7080af465", - "sha256:dcc01cea0a121fb0c009993497bad93cae25e77db7dee5345fec9cce1aaa09cd", - "sha256:e3f8acc6ef4a627394021246e099faee4b343afd3ffe2e517d8195b4ebf20289", - "sha256:e4bc589d8da09267c7c4ceaaaa4fc01a7908ac5b43b286ac9279afe76407c384", - "sha256:e5d53eddaf436fa131042f44a76ea1ead0a17c354ab9de0d80e818f0cb1629f1", - "sha256:ee728d5af70f117581712966a21e2e07031e92c687ef1fdc457ac8d281016f64", - "sha256:f19c2b1c65d57cbea25cabb80941fea3fbf2625ff0cdcae8900b5fb1c145704f" + "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad", + "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c", + "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba", + "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212", + "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86", + "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477", + "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f", + "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef", + "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02", + "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860", + "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72", + "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3", + "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b", + "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184", + "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7", + "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5", + "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9", + "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7", + "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b", + "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933", + "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0", + "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6", + "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8", + "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c", + "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590", + "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215", + "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680", + "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8", + "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0", + "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b", + "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca", + "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3", + "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6", + "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13", + "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204", + "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f", + "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273", + "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b", + "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd", + "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a", + "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d", + "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896" ], "markers": "python_version >= '3.8'", - "version": "==4.43.0" + "version": "==4.43.1" }, "fqdn": { "hashes": [ @@ -936,12 +944,12 @@ }, "gval": { "hashes": [ - "sha256:4074fce7cb2cda26f5cc610b88da0d9d4c9559d52d75074154948b1dbe4b9bac", - "sha256:880d0bb3cdb1d366d9e18423d4478b74f72010d120a2b53cb53603163c790bc0" + "sha256:d1a560f9e8b9b7727c618a56d7a04f3621ceb71477f18410c811a6dc0bd9b05d", + "sha256:d9f26aa88f164b77a47cb7d7eafc1641e48abe4152501657cb173c44dc84a8fd" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==0.1.2" + "version": "==0.2.3" }, "identify": { "hashes": [ @@ -1047,7 +1055,7 @@ "sha256:fd04764d0bb830414788cae897d082bf6ad92324e571a5511bd7e1de4a0cdc67", "sha256:fde3f85864c84badb26f42d95639360e627fd09c529a76c46a06dbd7a5735c51" ], - "markers": "python_version >= '3.7'", + "markers": "python_version > '3.6'", "version": "==0.3.1" }, "iniconfig": { @@ -1160,9 +1168,6 @@ "version": "==2.4" }, "jsonschema": { - "extras": [ - "format-nongpl" - ], "hashes": [ "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e", "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf" @@ -1205,27 +1210,27 @@ }, "jupyter-core": { "hashes": [ - "sha256:0c28db6cbe2c37b5b398e1a1a5b22f84fd64cd10afc1f6c05b02fb09481ba45f", - "sha256:a4af53c3fa3f6330cebb0d9f658e148725d15652811d1c32dc0f63bb96f2e6d6" + "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571", + "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d" ], "markers": "python_version >= '3.8'", - "version": "==5.3.2" + "version": "==5.4.0" }, "jupyter-events": { "hashes": [ - "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e", - "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615" + "sha256:81f07375c7673ff298bfb9302b4a981864ec64edaed75ca0fe6f850b9b045525", + "sha256:fda08f0defce5e16930542ce60634ba48e010830d50073c3dfd235759cee77bf" ], "markers": "python_version >= '3.8'", - "version": "==0.7.0" + "version": "==0.8.0" }, "jupyter-server": { "hashes": [ - "sha256:8e4b90380b59d7a1e31086c4692231f2a2ea4cb269f5516e60aba72ce8317fc9", - "sha256:d4916c8581c4ebbc534cebdaa8eca2478d9f3bfdd88eae29fcab0120eac57649" + "sha256:b11e2ba80667c75f55630faf8ac3d5809f8734f9006d65cce117c46a0a516ab8", + "sha256:c57270faa6530393ae69783a2d2f1874c718b9f109080581ea076b05713249fa" ], "markers": "python_version >= '3.8'", - "version": "==2.7.3" + "version": "==2.8.0" }, "jupyter-server-fileid": { "hashes": [ @@ -1733,11 +1738,11 @@ }, "nbconvert": { "hashes": [ - "sha256:aec605e051fa682ccc7934ccc338ba1e8b626cfadbab0db592106b630f63f0f2", - "sha256:f5bc15a1247e14dd41ceef0c0a3bc70020e016576eb0578da62f1c5b4f950479" + "sha256:39fe4b8bdd1b0104fdd86fc8a43a9077ba64c720bda4c6132690d917a0a154ee", + "sha256:e56cc7588acc4f93e2bb5a34ec69028e4941797b2bfaf6462f18a41d1cc258c9" ], "markers": "python_version >= '3.8'", - "version": "==7.8.0" + "version": "==7.9.2" }, "nbformat": { "hashes": [ @@ -1919,6 +1924,12 @@ "markers": "python_version >= '3.8'", "version": "==1.23.5" }, + "numpy-groupies": { + "hashes": [ + "sha256:fd50026552280ca717722f17d4231390667505bb572de564de1362b40487d34a" + ], + "version": "==0.9.22" + }, "odc-geo": { "hashes": [ "sha256:0b04d0835e783685f128453e4b4169d86d322632887bfee9c7dbde364a3c324d", @@ -2040,63 +2051,63 @@ }, "pillow": { "hashes": [ - "sha256:0462b1496505a3462d0f35dc1c4d7b54069747d65d00ef48e736acda2c8cbdff", - "sha256:186f7e04248103482ea6354af6d5bcedb62941ee08f7f788a1c7707bc720c66f", - "sha256:19e9adb3f22d4c416e7cd79b01375b17159d6990003633ff1d8377e21b7f1b21", - "sha256:28444cb6ad49726127d6b340217f0627abc8732f1194fd5352dec5e6a0105635", - "sha256:2872f2d7846cf39b3dbff64bc1104cc48c76145854256451d33c5faa55c04d1a", - "sha256:2cc6b86ece42a11f16f55fe8903595eff2b25e0358dec635d0a701ac9586588f", - "sha256:2d7e91b4379f7a76b31c2dda84ab9e20c6220488e50f7822e59dac36b0cd92b1", - "sha256:2fa6dd2661838c66f1a5473f3b49ab610c98a128fc08afbe81b91a1f0bf8c51d", - "sha256:32bec7423cdf25c9038fef614a853c9d25c07590e1a870ed471f47fb80b244db", - "sha256:3855447d98cced8670aaa63683808df905e956f00348732448b5a6df67ee5849", - "sha256:3a04359f308ebee571a3127fdb1bd01f88ba6f6fb6d087f8dd2e0d9bff43f2a7", - "sha256:3a0d3e54ab1df9df51b914b2233cf779a5a10dfd1ce339d0421748232cea9876", - "sha256:44e7e4587392953e5e251190a964675f61e4dae88d1e6edbe9f36d6243547ff3", - "sha256:459307cacdd4138edee3875bbe22a2492519e060660eaf378ba3b405d1c66317", - "sha256:4ce90f8a24e1c15465048959f1e94309dfef93af272633e8f37361b824532e91", - "sha256:50bd5f1ebafe9362ad622072a1d2f5850ecfa44303531ff14353a4059113b12d", - "sha256:522ff4ac3aaf839242c6f4e5b406634bfea002469656ae8358644fc6c4856a3b", - "sha256:552912dbca585b74d75279a7570dd29fa43b6d93594abb494ebb31ac19ace6bd", - "sha256:5d6c9049c6274c1bb565021367431ad04481ebb54872edecfcd6088d27edd6ed", - "sha256:697a06bdcedd473b35e50a7e7506b1d8ceb832dc238a336bd6f4f5aa91a4b500", - "sha256:71671503e3015da1b50bd18951e2f9daf5b6ffe36d16f1eb2c45711a301521a7", - "sha256:723bd25051454cea9990203405fa6b74e043ea76d4968166dfd2569b0210886a", - "sha256:764d2c0daf9c4d40ad12fbc0abd5da3af7f8aa11daf87e4fa1b834000f4b6b0a", - "sha256:787bb0169d2385a798888e1122c980c6eff26bf941a8ea79747d35d8f9210ca0", - "sha256:7f771e7219ff04b79e231d099c0a28ed83aa82af91fd5fa9fdb28f5b8d5addaf", - "sha256:847e8d1017c741c735d3cd1883fa7b03ded4f825a6e5fcb9378fd813edee995f", - "sha256:84efb46e8d881bb06b35d1d541aa87f574b58e87f781cbba8d200daa835b42e1", - "sha256:898f1d306298ff40dc1b9ca24824f0488f6f039bc0e25cfb549d3195ffa17088", - "sha256:8b451d6ead6e3500b6ce5c7916a43d8d8d25ad74b9102a629baccc0808c54971", - "sha256:8f06be50669087250f319b706decf69ca71fdecd829091a37cc89398ca4dc17a", - "sha256:92a23b0431941a33242b1f0ce6c88a952e09feeea9af4e8be48236a68ffe2205", - "sha256:93139acd8109edcdeffd85e3af8ae7d88b258b3a1e13a038f542b79b6d255c54", - "sha256:98533fd7fa764e5f85eebe56c8e4094db912ccbe6fbf3a58778d543cadd0db08", - "sha256:9f665d1e6474af9f9da5e86c2a3a2d2d6204e04d5af9c06b9d42afa6ebde3f21", - "sha256:b059ac2c4c7a97daafa7dc850b43b2d3667def858a4f112d1aa082e5c3d6cf7d", - "sha256:b1be1c872b9b5fcc229adeadbeb51422a9633abd847c0ff87dc4ef9bb184ae08", - "sha256:b7cf63d2c6928b51d35dfdbda6f2c1fddbe51a6bc4a9d4ee6ea0e11670dd981e", - "sha256:bc2e3069569ea9dbe88d6b8ea38f439a6aad8f6e7a6283a38edf61ddefb3a9bf", - "sha256:bcf1207e2f2385a576832af02702de104be71301c2696d0012b1b93fe34aaa5b", - "sha256:ca26ba5767888c84bf5a0c1a32f069e8204ce8c21d00a49c90dabeba00ce0145", - "sha256:cbe68deb8580462ca0d9eb56a81912f59eb4542e1ef8f987405e35a0179f4ea2", - "sha256:d6caf3cd38449ec3cd8a68b375e0c6fe4b6fd04edb6c9766b55ef84a6e8ddf2d", - "sha256:d72967b06be9300fed5cfbc8b5bafceec48bf7cdc7dab66b1d2549035287191d", - "sha256:d889b53ae2f030f756e61a7bff13684dcd77e9af8b10c6048fb2c559d6ed6eaf", - "sha256:de596695a75496deb3b499c8c4f8e60376e0516e1a774e7bc046f0f48cd620ad", - "sha256:e6a90167bcca1216606223a05e2cf991bb25b14695c518bc65639463d7db722d", - "sha256:ed2d9c0704f2dc4fa980b99d565c0c9a543fe5101c25b3d60488b8ba80f0cce1", - "sha256:ee7810cf7c83fa227ba9125de6084e5e8b08c59038a7b2c9045ef4dde61663b4", - "sha256:f0b4b06da13275bc02adfeb82643c4a6385bd08d26f03068c2796f60d125f6f2", - "sha256:f11c9102c56ffb9ca87134bd025a43d2aba3f1155f508eff88f694b33a9c6d19", - "sha256:f5bb289bb835f9fe1a1e9300d011eef4d69661bb9b34d5e196e5e82c4cb09b37", - "sha256:f6d3d4c905e26354e8f9d82548475c46d8e0889538cb0657aa9c6f0872a37aa4", - "sha256:fcb59711009b0168d6ee0bd8fb5eb259c4ab1717b2f538bbf36bacf207ef7a68", - "sha256:fd2a5403a75b54661182b75ec6132437a181209b901446ee5724b589af8edef1" + "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d", + "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de", + "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616", + "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839", + "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099", + "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a", + "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219", + "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106", + "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b", + "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412", + "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b", + "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7", + "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2", + "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7", + "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14", + "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f", + "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27", + "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57", + "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262", + "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28", + "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610", + "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172", + "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273", + "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e", + "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d", + "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818", + "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f", + "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9", + "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01", + "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7", + "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651", + "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312", + "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80", + "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666", + "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061", + "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b", + "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992", + "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593", + "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4", + "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db", + "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba", + "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd", + "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e", + "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212", + "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb", + "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2", + "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34", + "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256", + "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f", + "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2", + "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38", + "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996", + "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a", + "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793" ], "markers": "python_version >= '3.8'", - "version": "==10.0.1" + "version": "==10.1.0" }, "pkgutil-resolve-name": { "hashes": [ @@ -2149,23 +2160,25 @@ }, "psutil": { "hashes": [ - "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d", - "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217", - "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4", - "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c", - "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f", - "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da", - "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4", - "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42", - "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5", - "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4", - "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9", - "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f", - "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30", - "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48" + "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28", + "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017", + "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602", + "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac", + "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a", + "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9", + "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4", + "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c", + "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c", + "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c", + "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a", + "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c", + "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57", + "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a", + "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d", + "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==5.9.5" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==5.9.6" }, "psycopg2-binary": { "hashes": [ @@ -2658,7 +2671,7 @@ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.8.2" }, "python-dotenv": { @@ -2825,9 +2838,11 @@ "hashes": [ "sha256:00c188704141c709da96cc4a79f058d51f5318e839d6f904c7cc9badcf78e98e", "sha256:013321ddaff083b24e43a8b06303446771978343b488ed73adf56c70a46e2783", + "sha256:02c95d7109052c985b7d90dac6f6010bc0630227f15aec16302162107137bdbc", "sha256:0a4334e972109bdd17fb40dbdd9fcca6137648cab416fca505a2dcd186f50533", "sha256:12668ceb8329aaa908b4d907d3a77bb748ff28b309c3b105c995a8715d535d2b", "sha256:14121a4d95070f54bdc9a80dab1dd8fd9093907a1e687926447ca69b5b40a4d5", + "sha256:145ca5ed6240af2cbfc09faa50aada8aacf1e2928ed6dd9da1d6b8ebe39cdc4c", "sha256:1b9cda5314982d64c856f9298be0d9bf69fbff0ca514d1651037616354b473ff", "sha256:1cbf212253abd65e6451acdfb608adafe98ad8f05462fb9a054ddab816545caa", "sha256:1dbe76b6d8fe75f6dbec24793fc07b1d1ae9464de9941138d5b9668f7670e6b0", @@ -2848,6 +2863,7 @@ "sha256:3f0fe2ef7ebc6e9b347585e414c4fefd32270ba8bdf9eb82496f3030cbdca465", "sha256:3f72f310b10b730cddfb654006ae497e7706c81e6a7642d3da7fd2439df7d88d", "sha256:40bdb468281a5cd525e2e990b97344f0974e0589bd1b395501c25471fcd7edda", + "sha256:418e9a676cc7ce00edd2fd044ee063c8639fd8cd6897ffda395a152cdc66ec97", "sha256:4358dd80b315c82d760b44c6df7857c9c898d04e7b0c14abb0eb3692354e9379", "sha256:441078bfd3b508597415338af667c3575980364f1286eedde58291558b9c2832", "sha256:47c2a4c319300c381f194274203f47b12c433e1fd86b90ecdc7fb258c630f93b", @@ -2856,8 +2872,10 @@ "sha256:4ed01beb31d5177456ec2c4b66591a0df83dbc72df29f05f40502bfefe47bbe4", "sha256:50ccbaafee80b4f1c5c55bbe07f80871b9b8fe3499bf7357dde2c23fb1c2ac0e", "sha256:51607d7d44f94a364ef0e3ccf9a92390def0faf6e7572eef082f15c657b5d03a", + "sha256:52dcae42f32f7a25c6b90bd479f3d04902700e3214e8fffe1bfe70053eb35ccb", "sha256:5345c7a697327e2fa7c37534bb2968ea84595d8ec7fc8c4a60216ec1be6e65bd", "sha256:542808d88464d538f5d2c6b48b545a7fe15f0d20c7fa703b469d039a08c9fa10", + "sha256:5453ebe42a2c7462fa532fd03cbf64e5c6baf5508b3089736c78444148d3c593", "sha256:5819d502dacd54114c30bc24efcb76e723b93f8f528be70851056a396a792c46", "sha256:5aed5fc86d0bfc5f16e871cbb35ec93df61476d7fde4c1c6081015a075ecfbc1", "sha256:5d9ec8634ab0cbfbcff535ac07555ebdae0282ad66762f0471fad11c16181e33", @@ -2876,6 +2894,7 @@ "sha256:74455bd918e7bc9883e3178a1a8fe796308670f0ee4488c80a0d9514e13807a1", "sha256:7452ae7e6d80e697d78d3f56d1b4d2a350286eea229afb35f55ab88b934b6acd", "sha256:77294f0f797c97a46ffb3daff1fe097c9d5aa9f96867333978e6791286963e50", + "sha256:78c38850af6b990e8ec1bc87b48f73ed5cc633f4baaa7bbc78f9b2f4449cf081", "sha256:7ac886e04f253960ae82e38ded8352085c61d78de99412d178a94ecf475b5e5f", "sha256:7c420878726d677da7484f6021dbe7e1f9345a791b155de632c6ce36678fb621", "sha256:836f1d85a4b5d3689d455aeb1dc6c42acb96aaf8e5282825c00ccf2545ad5630", @@ -2886,8 +2905,11 @@ "sha256:8d3a1b6fa71a0ae7abc320d9db91b5a96a71eef1dbee0d62a6232b71c97af962", "sha256:8f9eb97fb6fd4551ff9d5012b4fcee9abeea9c8af6b9e3ebc3c76cc2bd0a43a7", "sha256:91453ce9476363d777b2ea2e9c6dccecd2073cf35697e048de2e8d47e1f36c7c", + "sha256:922f1bb8ef80c42a2fca297ba0b03442c143a9a1f717e83db79f190514888803", + "sha256:937f118fdd7a23654886634f650d6502a2dd12c8a8e2bf14beb2fa5fa95058bf", "sha256:9596aeb8c71192f4fba1ca25cec420da195219398d2df811d5082559efd9561f", "sha256:960ab83a977a44284c4ffab2820ccd6c9b332571a3d622fefa4b29b0a5de72b0", + "sha256:9638d40ec02a5b194a4c98a5b6e36cdfde4e9d6b721ae6167ef8e57d2e69002f", "sha256:97e05f66c5847e6889594508298d78ddb84a0115e9234d598415dc5a06d3a4a7", "sha256:9ac634753f6d26cba503cea7bb5b350aec7c5366f44fa68c79e9c90be9fd0ebc", "sha256:9e1097d8b57f64878a3f176f4cd6b9a1bbe9fb2d236f1a85a4357722626d8f25", @@ -2907,16 +2929,20 @@ "sha256:c249741b10eb714578d765487b767e0e7fcc2ac84a299209a6073566e730dbea", "sha256:c2b093a74b10232c70b5d29814fcee6544bb6f30e2d922d26db9ab4b4cd00c04", "sha256:c31f6dd5bd60688d51487a3f5e2ae29ed1948926e44d7a2316b193b083f80d5d", + "sha256:c36dbbf71480f1fffeaeca901adb31e0c7d59270a239eca63fe26e4647b7aca8", "sha256:c41e5457f4de5d38a270bc44619873589bbe6fe251225deec583ed20199df0f3", "sha256:c46e77c2ad614a0399503dc675d72436cbf6332a20d49a0e5bad03058d6cbfad", + "sha256:c8d1966e38c220d5940f8cb6303651af261f0bcfce77218a030b1a24ec986e2f", "sha256:c9589cb79d4e401630481755c92b072aa7ba5505ec81dec865ef43932ec037e4", "sha256:ca19213785f864781848e0216cba07e97f563f60a50bbc7885b54461d8c64873", "sha256:cbfdde6c5768ffa5d2f14127bbc1d7c3c2d03c0ceaeb0736946197e06275ccc7", "sha256:cd6a8d43a0c294918e3afb7e4b1d8c04d2e4c3ea9ddf05475fdaf366c7e5b3a6", + "sha256:cfa981cedd54bb8862d9033440a0afac38845db89e7099ceeb4f4d064dffd2f8", "sha256:cffaab46f9e04856dc3daa6097bfb3d3bea0b1771237e869c57b13f3dcc2c238", "sha256:d0929302d187bfeca335b7f710f774f1b2ea3f610b2a80e8a1ac2da216cd9766", "sha256:d44a7d4586f02b630658298c089ff755e74d0677b93c71e09d33dd35bdd4987a", "sha256:d7ddbf234c9adc72189bb552d830e9a0c2c4401b5baf7b003eacd5c552ddcc00", + "sha256:da070933d4bcfcbf58472da12ffa77c9fbc90efb39e21a9b74eb04b5af4b412a", "sha256:dca286c6c1ca5febf13f5f2ae7e8aa7536e49bd07f4232796651a43ff741ceca", "sha256:dcb2172ca8b62f82af9d1f8db80c21c64c5ba3991935caefde88bb378f0afb51", "sha256:e4e00c1600022b47ef0e9e1f893cb0c2322209ec6c1581a3e3f63ed78330ddf0", @@ -2930,6 +2956,7 @@ "sha256:f2839c13e486e4a23b19b1d2dc4624565cec6c228bbf803c066be1106515966b", "sha256:f66790e4b2dcfcabc0aa54dd89317ea5671cabf06aa93cbef7cbdd4d2fdb7ee3", "sha256:f6d8a881b50bb2015e9bdba5edb0331e85d41ff44ab33cde551047480b98d748", + "sha256:f73821d429bfbb04645b80ec491ab05b35078f031f9fa3273fbf9027d1406233", "sha256:f7cfc683d320402d61205a196ace77f15dcfd16b5771f8b9ffaf406868c98e78", "sha256:f9c5fc29a5b9d61a8f0a3494172107e0e6cf23d0cb800d6285c6722ba7fc3535", "sha256:fc92a718bccb8ce5c9eb63fca743c38f3fa4c4e47f58f0c4ada51b2474668184" @@ -3055,106 +3082,108 @@ }, "rpds-py": { "hashes": [ - "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9", - "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637", - "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5", - "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9", - "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c", - "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957", - "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6", - "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154", - "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8", - "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569", - "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2", - "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c", - "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453", - "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1", - "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7", - "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b", - "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9", - "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496", - "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3", - "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b", - "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6", - "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da", - "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842", - "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd", - "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294", - "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71", - "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093", - "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e", - "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c", - "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e", - "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b", - "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97", - "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac", - "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf", - "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a", - "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc", - "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0", - "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623", - "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6", - "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8", - "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b", - "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d", - "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff", - "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb", - "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08", - "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33", - "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5", - "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a", - "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a", - "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762", - "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860", - "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73", - "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a", - "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065", - "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c", - "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c", - "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec", - "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515", - "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72", - "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd", - "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec", - "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12", - "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1", - "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557", - "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25", - "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff", - "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8", - "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9", - "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d", - "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a", - "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e", - "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c", - "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0", - "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48", - "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e", - "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314", - "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717", - "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95", - "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8", - "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57", - "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33", - "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1", - "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f", - "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f", - "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9", - "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599", - "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41", - "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391", - "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475", - "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882", - "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740", - "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f", - "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee", - "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836", - "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c", - "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a", - "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb" + "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed", + "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8", + "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417", + "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801", + "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31", + "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116", + "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5", + "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393", + "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532", + "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc", + "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2", + "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df", + "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3", + "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf", + "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647", + "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3", + "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721", + "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247", + "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c", + "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42", + "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014", + "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65", + "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e", + "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02", + "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb", + "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c", + "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043", + "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403", + "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57", + "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50", + "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6", + "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071", + "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487", + "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138", + "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2", + "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063", + "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6", + "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35", + "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a", + "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238", + "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba", + "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175", + "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6", + "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8", + "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396", + "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d", + "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9", + "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977", + "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3", + "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55", + "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977", + "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80", + "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4", + "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c", + "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4", + "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac", + "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1", + "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0", + "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5", + "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469", + "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d", + "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f", + "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c", + "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2", + "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf", + "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5", + "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7", + "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e", + "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7", + "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336", + "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4", + "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed", + "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9", + "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094", + "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f", + "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b", + "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13", + "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722", + "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53", + "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4", + "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38", + "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e", + "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31", + "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586", + "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad", + "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7", + "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482", + "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d", + "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066", + "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b", + "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b", + "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d", + "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9", + "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069", + "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971", + "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18", + "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1", + "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d", + "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281" ], "markers": "python_version >= '3.8'", - "version": "==0.10.3" + "version": "==0.10.6" }, "rtree": { "hashes": [ @@ -3316,101 +3345,114 @@ }, "simplejson": { "hashes": [ - "sha256:081ea6305b3b5e84ae7417e7f45956db5ea3872ec497a584ec86c3260cda049e", - "sha256:08be5a241fdf67a8e05ac7edbd49b07b638ebe4846b560673e196b2a25c94b92", - "sha256:0c16ec6a67a5f66ab004190829eeede01c633936375edcad7cbf06d3241e5865", - "sha256:0ccb2c1877bc9b25bc4f4687169caa925ffda605d7569c40e8e95186e9a5e58b", - "sha256:17a963e8dd4d81061cc05b627677c1f6a12e81345111fbdc5708c9f088d752c9", - "sha256:199a0bcd792811c252d71e3eabb3d4a132b3e85e43ebd93bfd053d5b59a7e78b", - "sha256:1cb19eacb77adc5a9720244d8d0b5507421d117c7ed4f2f9461424a1829e0ceb", - "sha256:203412745fed916fc04566ecef3f2b6c872b52f1e7fb3a6a84451b800fb508c1", - "sha256:2098811cd241429c08b7fc5c9e41fcc3f59f27c2e8d1da2ccdcf6c8e340ab507", - "sha256:22b867205cd258050c2625325fdd9a65f917a5aff22a23387e245ecae4098e78", - "sha256:23fbb7b46d44ed7cbcda689295862851105c7594ae5875dce2a70eeaa498ff86", - "sha256:2541fdb7467ef9bfad1f55b6c52e8ea52b3ce4a0027d37aff094190a955daa9d", - "sha256:3231100edee292da78948fa0a77dee4e5a94a0a60bcba9ed7a9dc77f4d4bb11e", - "sha256:344a5093b71c1b370968d0fbd14d55c9413cb6f0355fdefeb4a322d602d21776", - "sha256:37724c634f93e5caaca04458f267836eb9505d897ab3947b52f33b191bf344f3", - "sha256:3844305bc33d52c4975da07f75b480e17af3558c0d13085eaa6cc2f32882ccf7", - "sha256:390f4a8ca61d90bcf806c3ad644e05fa5890f5b9a72abdd4ca8430cdc1e386fa", - "sha256:3a4480e348000d89cf501b5606415f4d328484bbb431146c2971123d49fd8430", - "sha256:3b652579c21af73879d99c8072c31476788c8c26b5565687fd9db154070d852a", - "sha256:3e0902c278243d6f7223ba3e6c5738614c971fd9a887fff8feaa8dcf7249c8d4", - "sha256:412e58997a30c5deb8cab5858b8e2e5b40ca007079f7010ee74565cc13d19665", - "sha256:44cdb4e544134f305b033ad79ae5c6b9a32e7c58b46d9f55a64e2a883fbbba01", - "sha256:46133bc7dd45c9953e6ee4852e3de3d5a9a4a03b068bd238935a5c72f0a1ce34", - "sha256:46e89f58e4bed107626edce1cf098da3664a336d01fc78fddcfb1f397f553d44", - "sha256:4710806eb75e87919b858af0cba4ffedc01b463edc3982ded7b55143f39e41e1", - "sha256:476c8033abed7b1fd8db62a7600bf18501ce701c1a71179e4ce04ac92c1c5c3c", - "sha256:48600a6e0032bed17c20319d91775f1797d39953ccfd68c27f83c8d7fc3b32cb", - "sha256:4d3025e7e9ddb48813aec2974e1a7e68e63eac911dd5e0a9568775de107ac79a", - "sha256:547ea86ca408a6735335c881a2e6208851027f5bfd678d8f2c92a0f02c7e7330", - "sha256:54fca2b26bcd1c403146fd9461d1da76199442297160721b1d63def2a1b17799", - "sha256:5673d27806085d2a413b3be5f85fad6fca4b7ffd31cfe510bbe65eea52fff571", - "sha256:58ee5e24d6863b22194020eb62673cf8cc69945fcad6b283919490f6e359f7c5", - "sha256:5ca922c61d87b4c38f37aa706520328ffe22d7ac1553ef1cadc73f053a673553", - "sha256:5db86bb82034e055257c8e45228ca3dbce85e38d7bfa84fa7b2838e032a3219c", - "sha256:6277f60848a7d8319d27d2be767a7546bc965535b28070e310b3a9af90604a4c", - "sha256:6424d8229ba62e5dbbc377908cfee9b2edf25abd63b855c21f12ac596cd18e41", - "sha256:65dafe413b15e8895ad42e49210b74a955c9ae65564952b0243a18fb35b986cc", - "sha256:66389b6b6ee46a94a493a933a26008a1bae0cfadeca176933e7ff6556c0ce998", - "sha256:66d780047c31ff316ee305c3f7550f352d87257c756413632303fc59fef19eac", - "sha256:69a8b10a4f81548bc1e06ded0c4a6c9042c0be0d947c53c1ed89703f7e613950", - "sha256:6a561320485017ddfc21bd2ed5de2d70184f754f1c9b1947c55f8e2b0163a268", - "sha256:6aa7ca03f25b23b01629b1c7f78e1cd826a66bfb8809f8977a3635be2ec48f1a", - "sha256:6b79642a599740603ca86cf9df54f57a2013c47e1dd4dd2ae4769af0a6816900", - "sha256:6e7c70f19405e5f99168077b785fe15fcb5f9b3c0b70b0b5c2757ce294922c8c", - "sha256:70128fb92932524c89f373e17221cf9535d7d0c63794955cc3cd5868e19f5d38", - "sha256:73d0904c2471f317386d4ae5c665b16b5c50ab4f3ee7fd3d3b7651e564ad74b1", - "sha256:74bf802debe68627227ddb665c067eb8c73aa68b2476369237adf55c1161b728", - "sha256:79c748aa61fd8098d0472e776743de20fae2686edb80a24f0f6593a77f74fe86", - "sha256:79d46e7e33c3a4ef853a1307b2032cfb7220e1a079d0c65488fbd7118f44935a", - "sha256:7e78d79b10aa92f40f54178ada2b635c960d24fc6141856b926d82f67e56d169", - "sha256:8090e75653ea7db75bc21fa5f7bcf5f7bdf64ea258cbbac45c7065f6324f1b50", - "sha256:87b190e6ceec286219bd6b6f13547ca433f977d4600b4e81739e9ac23b5b9ba9", - "sha256:889328873c35cb0b2b4c83cbb83ec52efee5a05e75002e2c0c46c4e42790e83c", - "sha256:8f8d179393e6f0cf6c7c950576892ea6acbcea0a320838c61968ac7046f59228", - "sha256:919bc5aa4d8094cf8f1371ea9119e5d952f741dc4162810ab714aec948a23fe5", - "sha256:926957b278de22797bfc2f004b15297013843b595b3cd7ecd9e37ccb5fad0b72", - "sha256:93f5ac30607157a0b2579af59a065bcfaa7fadeb4875bf927a8f8b6739c8d910", - "sha256:96ade243fb6f3b57e7bd3b71e90c190cd0f93ec5dce6bf38734a73a2e5fa274f", - "sha256:9f14ecca970d825df0d29d5c6736ff27999ee7bdf5510e807f7ad8845f7760ce", - "sha256:a755f7bfc8adcb94887710dc70cc12a69a454120c6adcc6f251c3f7b46ee6aac", - "sha256:a79b439a6a77649bb8e2f2644e6c9cc0adb720fc55bed63546edea86e1d5c6c8", - "sha256:aa9d614a612ad02492f704fbac636f666fa89295a5d22b4facf2d665fc3b5ea9", - "sha256:ad071cd84a636195f35fa71de2186d717db775f94f985232775794d09f8d9061", - "sha256:b0e9a5e66969f7a47dc500e3dba8edc3b45d4eb31efb855c8647700a3493dd8a", - "sha256:b438e5eaa474365f4faaeeef1ec3e8d5b4e7030706e3e3d6b5bee6049732e0e6", - "sha256:b46aaf0332a8a9c965310058cf3487d705bf672641d2c43a835625b326689cf4", - "sha256:c39fa911e4302eb79c804b221ddec775c3da08833c0a9120041dd322789824de", - "sha256:ca56a6c8c8236d6fe19abb67ef08d76f3c3f46712c49a3b6a5352b6e43e8855f", - "sha256:cb502cde018e93e75dc8fc7bb2d93477ce4f3ac10369f48866c61b5e031db1fd", - "sha256:cd4d50a27b065447c9c399f0bf0a993bd0e6308db8bbbfbc3ea03b41c145775a", - "sha256:d125e754d26c0298715bdc3f8a03a0658ecbe72330be247f4b328d229d8cf67f", - "sha256:d300773b93eed82f6da138fd1d081dc96fbe53d96000a85e41460fe07c8d8b33", - "sha256:d396b610e77b0c438846607cd56418bfc194973b9886550a98fd6724e8c6cfec", - "sha256:d61482b5d18181e6bb4810b4a6a24c63a490c3a20e9fbd7876639653e2b30a1a", - "sha256:d9f2c27f18a0b94107d57294aab3d06d6046ea843ed4a45cae8bd45756749f3a", - "sha256:dc2b3f06430cbd4fac0dae5b2974d2bf14f71b415fb6de017f498950da8159b1", - "sha256:dc935d8322ba9bc7b84f99f40f111809b0473df167bf5b93b89fb719d2c4892b", - "sha256:e333c5b62e93949f5ac27e6758ba53ef6ee4f93e36cc977fe2e3df85c02f6dc4", - "sha256:e765b1f47293dedf77946f0427e03ee45def2862edacd8868c6cf9ab97c8afbd", - "sha256:ed18728b90758d171f0c66c475c24a443ede815cf3f1a91e907b0db0ebc6e508", - "sha256:eff87c68058374e45225089e4538c26329a13499bc0104b52b77f8428eed36b2", - "sha256:f05d05d99fce5537d8f7a0af6417a9afa9af3a6c4bb1ba7359c53b6257625fcb", - "sha256:f253edf694ce836631b350d758d00a8c4011243d58318fbfbe0dd54a6a839ab4", - "sha256:f41915a4e1f059dfad614b187bc06021fefb5fc5255bfe63abf8247d2f7a646a", - "sha256:f96def94576f857abf58e031ce881b5a3fc25cbec64b2bc4824824a8a4367af9" - ], - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.19.1" + "sha256:0405984f3ec1d3f8777c4adc33eac7ab7a3e629f3b1c05fdded63acc7cf01137", + "sha256:0436a70d8eb42bea4fe1a1c32d371d9bb3b62c637969cb33970ad624d5a3336a", + "sha256:061e81ea2d62671fa9dea2c2bfbc1eec2617ae7651e366c7b4a2baf0a8c72cae", + "sha256:064300a4ea17d1cd9ea1706aa0590dcb3be81112aac30233823ee494f02cb78a", + "sha256:08889f2f597ae965284d7b52a5c3928653a9406d88c93e3161180f0abc2433ba", + "sha256:0a48679310e1dd5c9f03481799311a65d343748fe86850b7fb41df4e2c00c087", + "sha256:0b0a3eb6dd39cce23801a50c01a0976971498da49bc8a0590ce311492b82c44b", + "sha256:0d2d5119b1d7a1ed286b8af37357116072fc96700bce3bec5bb81b2e7057ab41", + "sha256:0d551dc931638e2102b8549836a1632e6e7cf620af3d093a7456aa642bff601d", + "sha256:1018bd0d70ce85f165185d2227c71e3b1e446186f9fa9f971b69eee223e1e3cd", + "sha256:11c39fbc4280d7420684494373b7c5904fa72a2b48ef543a56c2d412999c9e5d", + "sha256:11cc3afd8160d44582543838b7e4f9aa5e97865322844b75d51bf4e0e413bb3e", + "sha256:1537b3dd62d8aae644f3518c407aa8469e3fd0f179cdf86c5992792713ed717a", + "sha256:16ca9c90da4b1f50f089e14485db8c20cbfff2d55424062791a7392b5a9b3ff9", + "sha256:176a1b524a3bd3314ed47029a86d02d5a95cc0bee15bd3063a1e1ec62b947de6", + "sha256:18955c1da6fc39d957adfa346f75226246b6569e096ac9e40f67d102278c3bcb", + "sha256:1bb5b50dc6dd671eb46a605a3e2eb98deb4a9af787a08fcdddabe5d824bb9664", + "sha256:1c768e7584c45094dca4b334af361e43b0aaa4844c04945ac7d43379eeda9bc2", + "sha256:1dd4f692304854352c3e396e9b5f0a9c9e666868dd0bdc784e2ac4c93092d87b", + "sha256:25785d038281cd106c0d91a68b9930049b6464288cea59ba95b35ee37c2d23a5", + "sha256:287e39ba24e141b046812c880f4619d0ca9e617235d74abc27267194fc0c7835", + "sha256:2c1467d939932901a97ba4f979e8f2642415fcf02ea12f53a4e3206c9c03bc17", + "sha256:2c433a412e96afb9a3ce36fa96c8e61a757af53e9c9192c97392f72871e18e69", + "sha256:2d022b14d7758bfb98405672953fe5c202ea8a9ccf9f6713c5bd0718eba286fd", + "sha256:2f98d918f7f3aaf4b91f2b08c0c92b1774aea113334f7cde4fe40e777114dbe6", + "sha256:2fc697be37585eded0c8581c4788fcfac0e3f84ca635b73a5bf360e28c8ea1a2", + "sha256:3194cd0d2c959062b94094c0a9f8780ffd38417a5322450a0db0ca1a23e7fbd2", + "sha256:332c848f02d71a649272b3f1feccacb7e4f7e6de4a2e6dc70a32645326f3d428", + "sha256:346820ae96aa90c7d52653539a57766f10f33dd4be609206c001432b59ddf89f", + "sha256:3471e95110dcaf901db16063b2e40fb394f8a9e99b3fe9ee3acc6f6ef72183a2", + "sha256:3848427b65e31bea2c11f521b6fc7a3145d6e501a1038529da2391aff5970f2f", + "sha256:39b6d79f5cbfa3eb63a869639cfacf7c41d753c64f7801efc72692c1b2637ac7", + "sha256:3e74355cb47e0cd399ead3477e29e2f50e1540952c22fb3504dda0184fc9819f", + "sha256:3f39bb1f6e620f3e158c8b2eaf1b3e3e54408baca96a02fe891794705e788637", + "sha256:40847f617287a38623507d08cbcb75d51cf9d4f9551dd6321df40215128325a3", + "sha256:4280e460e51f86ad76dc456acdbfa9513bdf329556ffc8c49e0200878ca57816", + "sha256:445a96543948c011a3a47c8e0f9d61e9785df2544ea5be5ab3bc2be4bd8a2565", + "sha256:4969d974d9db826a2c07671273e6b27bc48e940738d768fa8f33b577f0978378", + "sha256:49aaf4546f6023c44d7e7136be84a03a4237f0b2b5fb2b17c3e3770a758fc1a0", + "sha256:49e0e3faf3070abdf71a5c80a97c1afc059b4f45a5aa62de0c2ca0444b51669b", + "sha256:49f9da0d6cd17b600a178439d7d2d57c5ef01f816b1e0e875e8e8b3b42db2693", + "sha256:4a8c3cc4f9dfc33220246760358c8265dad6e1104f25f0077bbca692d616d358", + "sha256:4d36081c0b1c12ea0ed62c202046dca11438bee48dd5240b7c8de8da62c620e9", + "sha256:4edcd0bf70087b244ba77038db23cd98a1ace2f91b4a3ecef22036314d77ac23", + "sha256:554313db34d63eac3b3f42986aa9efddd1a481169c12b7be1e7512edebff8eaf", + "sha256:5675e9d8eeef0aa06093c1ff898413ade042d73dc920a03e8cea2fb68f62445a", + "sha256:60848ab779195b72382841fc3fa4f71698a98d9589b0a081a9399904487b5832", + "sha256:66e5dc13bfb17cd6ee764fc96ccafd6e405daa846a42baab81f4c60e15650414", + "sha256:6779105d2fcb7fcf794a6a2a233787f6bbd4731227333a072d8513b252ed374f", + "sha256:6ad331349b0b9ca6da86064a3599c425c7a21cd41616e175ddba0866da32df48", + "sha256:6f0a0b41dd05eefab547576bed0cf066595f3b20b083956b1405a6f17d1be6ad", + "sha256:73a8a4653f2e809049999d63530180d7b5a344b23a793502413ad1ecea9a0290", + "sha256:778331444917108fa8441f59af45886270d33ce8a23bfc4f9b192c0b2ecef1b3", + "sha256:7cb98be113911cb0ad09e5523d0e2a926c09a465c9abb0784c9269efe4f95917", + "sha256:7d74beca677623481810c7052926365d5f07393c72cbf62d6cce29991b676402", + "sha256:7f2398361508c560d0bf1773af19e9fe644e218f2a814a02210ac2c97ad70db0", + "sha256:8434dcdd347459f9fd9c526117c01fe7ca7b016b6008dddc3c13471098f4f0dc", + "sha256:8a390e56a7963e3946ff2049ee1eb218380e87c8a0e7608f7f8790ba19390867", + "sha256:92c4a4a2b1f4846cd4364855cbac83efc48ff5a7d7c06ba014c792dd96483f6f", + "sha256:9300aee2a8b5992d0f4293d88deb59c218989833e3396c824b69ba330d04a589", + "sha256:9453419ea2ab9b21d925d0fd7e3a132a178a191881fab4169b6f96e118cc25bb", + "sha256:9652e59c022e62a5b58a6f9948b104e5bb96d3b06940c6482588176f40f4914b", + "sha256:972a7833d4a1fcf7a711c939e315721a88b988553fc770a5b6a5a64bd6ebeba3", + "sha256:9c1a4393242e321e344213a90a1e3bf35d2f624aa8b8f6174d43e3c6b0e8f6eb", + "sha256:9e038c615b3906df4c3be8db16b3e24821d26c55177638ea47b3f8f73615111c", + "sha256:9e4c166f743bb42c5fcc60760fb1c3623e8fda94f6619534217b083e08644b46", + "sha256:9eb117db8d7ed733a7317c4215c35993b815bf6aeab67523f1f11e108c040672", + "sha256:9eb442a2442ce417801c912df68e1f6ccfcd41577ae7274953ab3ad24ef7d82c", + "sha256:a3cd18e03b0ee54ea4319cdcce48357719ea487b53f92a469ba8ca8e39df285e", + "sha256:a8617625369d2d03766413bff9e64310feafc9fc4f0ad2b902136f1a5cd8c6b0", + "sha256:a970a2e6d5281d56cacf3dc82081c95c1f4da5a559e52469287457811db6a79b", + "sha256:aad7405c033d32c751d98d3a65801e2797ae77fac284a539f6c3a3e13005edc4", + "sha256:adcb3332979cbc941b8fff07181f06d2b608625edc0a4d8bc3ffc0be414ad0c4", + "sha256:af9c7e6669c4d0ad7362f79cb2ab6784d71147503e62b57e3d95c4a0f222c01c", + "sha256:b01fda3e95d07a6148702a641e5e293b6da7863f8bc9b967f62db9461330562c", + "sha256:b8d940fd28eb34a7084877747a60873956893e377f15a32ad445fe66c972c3b8", + "sha256:bccb3e88ec26ffa90f72229f983d3a5d1155e41a1171190fa723d4135523585b", + "sha256:bcedf4cae0d47839fee7de344f96b5694ca53c786f28b5f773d4f0b265a159eb", + "sha256:be893258d5b68dd3a8cba8deb35dc6411db844a9d35268a8d3793b9d9a256f80", + "sha256:c0521e0f07cb56415fdb3aae0bbd8701eb31a9dfef47bb57206075a0584ab2a2", + "sha256:c594642d6b13d225e10df5c16ee15b3398e21a35ecd6aee824f107a625690374", + "sha256:c87c22bd6a987aca976e3d3e23806d17f65426191db36d40da4ae16a6a494cbc", + "sha256:c9ac1c2678abf9270e7228133e5b77c6c3c930ad33a3c1dfbdd76ff2c33b7b50", + "sha256:d0e5ffc763678d48ecc8da836f2ae2dd1b6eb2d27a48671066f91694e575173c", + "sha256:d0f402e787e6e7ee7876c8b05e2fe6464820d9f35ba3f172e95b5f8b699f6c7f", + "sha256:d222a9ed082cd9f38b58923775152003765016342a12f08f8c123bf893461f28", + "sha256:d94245caa3c61f760c4ce4953cfa76e7739b6f2cbfc94cc46fff6c050c2390c5", + "sha256:de9a2792612ec6def556d1dc621fd6b2073aff015d64fba9f3e53349ad292734", + "sha256:e2f5a398b5e77bb01b23d92872255e1bcb3c0c719a3be40b8df146570fe7781a", + "sha256:e8dd53a8706b15bc0e34f00e6150fbefb35d2fd9235d095b4f83b3c5ed4fa11d", + "sha256:e9eb3cff1b7d71aa50c89a0536f469cb8d6dcdd585d8f14fb8500d822f3bdee4", + "sha256:ed628c1431100b0b65387419551e822987396bee3c088a15d68446d92f554e0c", + "sha256:ef7938a78447174e2616be223f496ddccdbf7854f7bf2ce716dbccd958cc7d13", + "sha256:f1c70249b15e4ce1a7d5340c97670a95f305ca79f376887759b43bb33288c973", + "sha256:f3c7363a8cb8c5238878ec96c5eb0fc5ca2cb11fc0c7d2379863d342c6ee367a", + "sha256:fbbcc6b0639aa09b9649f36f1bcb347b19403fe44109948392fbb5ea69e48c3e", + "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff", + "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded" + ], + "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2'", + "version": "==3.19.2" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "sniffio": { @@ -3477,10 +3519,10 @@ }, "texttable": { "hashes": [ - "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2", - "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c" + "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638", + "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917" ], - "version": "==1.6.7" + "version": "==1.7.0" }, "tinycss2": { "hashes": [ @@ -3534,11 +3576,11 @@ }, "traitlets": { "hashes": [ - "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116", - "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542" + "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e", + "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae" ], "markers": "python_version >= '3.8'", - "version": "==5.10.1" + "version": "==5.11.2" }, "typeguard": { "hashes": [ @@ -3590,7 +3632,6 @@ "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21", "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b" ], - "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.26.17" }, @@ -3625,11 +3666,11 @@ }, "websocket-client": { "hashes": [ - "sha256:3aad25d31284266bcfcfd1fd8a743f63282305a364b8d0948a43bd606acc652f", - "sha256:6cfc30d051ebabb73a5fa246efdcc14c8fbebbd0330f8984ac3bb6d9edd2ad03" + "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24", + "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df" ], "markers": "python_version >= '3.8'", - "version": "==1.6.3" + "version": "==1.6.4" }, "whitebox": { "hashes": [ @@ -3747,82 +3788,90 @@ }, "xyzservices": { "hashes": [ - "sha256:0ec928742227d6f5d4367ea7b457fcfed943429f4de2949b5b02a82cdf5569d6", - "sha256:88e9cbf22b31a2f9c1b242e2b18690f5c705f0e539c9bfd37a10399e1037731b" + "sha256:70b9910f6c8e46f6ca92dea21e9b8cf89edf0ead35a870198fb59a7d63579525", + "sha256:eee203e91955782fd8bfc2f05846830c289139dc0ab4eaf733bfa8f0be71861f" ], "markers": "python_version >= '3.8'", - "version": "==2023.7.0" + "version": "==2023.10.0" }, "y-py": { "hashes": [ - "sha256:035ba7ce31bb87bd7b5977eee71ee2ff71e54d347a35e2079362b1c23731dccd", - "sha256:0624a5adf29d29330a336eecdf15874871f559d50944d542012665e1c3a18265", - "sha256:11345294820908d5b8af9c6616ea908dda8b3e554ee6f6d50be6a2e15940f63e", - "sha256:1667b8a67ace756c04f03778e86fc359028c98905212f8686afb48c26c252bda", - "sha256:19b7c3eaf65b162e59486a48bea5dd2035937952f15e008a14813e8cb7c24d7b", - "sha256:1ea7d796bb55d08dd1a60736beb724004f2cbdc207592b5f301a5ff314b17137", - "sha256:1eefb6371cd6e072cf467b897f85bd0d7575f3a3e944fb8675f84fb59aedd071", - "sha256:1fb03947937b0fcb09eb2b94eb08d8e8030ef0ed70af777684ab670bd369bc3c", - "sha256:281535bb4f18fe09e5517a63b8206dd6f26ad6fb7e7c25c62bf785e594adab4d", - "sha256:2c230bc01b96081550b7583b77d00404fd39825657f4064b919a10515f660cdf", - "sha256:304e88a3deaff9906faa7ba514cf82f4ca4bad1ea88728206ff906e66179abd3", - "sha256:30b9337e4f3d541879a8187af121be1bd42ea110372a21895a1a3f800a6bd1c3", - "sha256:374ffef1939c42286ea18e2a413c9974430226227f8f1480bbee469933aa675b", - "sha256:37b9f24b00972e5685d0b9bbd01413d9c33d124145343fb92667f0e076f040ad", - "sha256:391a232c328c2be1de4cb152ed3e9427826e4cbd9d645feacb3dbb344b122e10", - "sha256:4181b28f736cae3bb4517090ae5eeca318c075c0106466f13a4ed6682265fc8a", - "sha256:418aaa796a22b0102de09b36b6c6294d0a485f04bc8866c3b28f17e7022c44ba", - "sha256:46836169f7dc2957df8513cfe4bc2009175b3a473e630af421a8e75ee1c48f98", - "sha256:479da40ef1205de52d87209534bf8e713a782e01eeed3df8dff44d21085e3f63", - "sha256:47b3604c874d25616a097adaaabcad6e77729e23c5d029092b8149af1a08b2a5", - "sha256:49adf7e25c3b3bac9f19bee181ef5253659ebe5747a7141860692015222b2007", - "sha256:4c16d50d0728abd915bd9e2e0c3ce982005ba78b60e4b6666aadc592d9982c79", - "sha256:4cac9259839b32706336b3f521cacfd16fc7cefee609bd9c2b5123099328d696", - "sha256:4f025c50301d9ddbbc2384f98d3ff1dbfe43606146b747e23a17774a02faffe9", - "sha256:513a2fe1318c247fc3b3c3ad208488e870a216784f2a3e6dbe2688c92f671c86", - "sha256:51f1997dae6d77b12b50502871c7a9aae22e84048e83b64fe6d4f18dec2e4700", - "sha256:5743e94c982585f05e02d9a3345dd9b1f28d90fa128df9f60b0eb357a76d2c32", - "sha256:6377e3cbab8f5b8b918130e9f924358f98ca1bea12a8096d3fadea191f7137f1", - "sha256:69e05e01594e99c934562124b159720533b7ad887dde7762d460916aac47a8e4", - "sha256:6a5a882591c8e1b1d6fbdb7ab43884907cef2b6a18e36c7ae85589e5f55371e5", - "sha256:71f7689c25bd7608e1e7a76a13138cb202455fac165018693a3e8e5675f54b82", - "sha256:74d5ebb5f9ef0c4c1f7bdd9ab5e53b9d8be4c7464905f39761b22b6ce0d327d3", - "sha256:76e2b14004cadb237499a8a068fd7a8b805b5c1fd0508530473e087c7dd25163", - "sha256:83115cbbd4f6d3b38ebe06d80b1d0dbf1b10e53947f71df16f6145a4f0d14716", - "sha256:8f143fdcda7a6a89bf96d9b359142a7ca3315e8a9018aa46b0abbdeb47d7192e", - "sha256:9242f3a5c6293e634817d9984c60523ffb34cf5b41501c5958681a75745946e6", - "sha256:95083c4cdbd593497a695e841b2ad050c0b9a8a9e374f8496aa478cebfcf9cc9", - "sha256:97812f9443fd846012d60ecacffa2a11992d02ad9f8618d4faae8e596736c646", - "sha256:9a920bf096d1eecb0f30afc38ee56bfcb9e2c863c33db96fc9d30d4ac0dbee58", - "sha256:9dad6af2d83a2b0618ba3c1a2fc6657c5303cf4e9f1a65cc3fea40ffbcc552e2", - "sha256:9f56888aeb07ca76a5cd552581bb3735fcd2d8c18165b946fdb6e4507b10e76c", - "sha256:a027c39296c925f0b81e28a0fefab8c5964a0ea2b50fa05cbddf5e5ab167a380", - "sha256:a20a4d10c8f0ee2b6df265d182d0be0ecd2ba7348c0a20b9df7d4d39df895801", - "sha256:a4b488be17d83173acb7f07c7e3430d2c66d0bd55b821683089311699562b58b", - "sha256:a752ba8875ed2038dfc7d62738536cb22b4e308951cb925a7fe8fef782c6db08", - "sha256:aaaec9718f8a23924c95294d41d87829b113bc9a606a3667dfb995afc45c9920", - "sha256:b44fdd64598e9ed4008158e5e60be5e1e2daeed6fae0ab2bf0002461e960709d", - "sha256:b5f5975c1a8c2ca99980571b8811d151db8590de9cc96346572a81e0f6f1e30e", - "sha256:b6273d84605ee55b3ac52742018f94602dab9b0457f29e6f787021c473b02fed", - "sha256:b71cd495d322da25a53a6a830b591a2c0c46db22bb0b3556fca0bbdb1d45a18e", - "sha256:b75c2199a125ef8926f3216fb324c3bcd8b1b4b6c0b428888cc753ee4c85f81f", - "sha256:c0505e2ca36408b754774a2bb20d93b5c7def3873406c13e1855de6f007f8a94", - "sha256:c276a7eb3ae3360f5a2fc503f1e4535d4a2f1c8cfc22af4595ad752e9a94fd77", - "sha256:cca539c3804a580992304b18a33f1980282d9097a723f0bd01971477cb365b28", - "sha256:d1301bfeaa26f78f4b0e5f96e0f22761b38cc407713f70550a1be490945fd6d7", - "sha256:e48b5b30242c7d517be85b48246b21e4e26540505a1ffe4fe473e239a8ec56d3", - "sha256:e5126786f914ff53ea2f04f9da790db168db172521cc4f114d5501badd2f6b96", - "sha256:e5f89cf9ef1daf12f438a075415a02f227594e4b0494c78d3b83cb83651631f5", - "sha256:e76be7258010ce8cbb93a841f78f52901bba1253a51213d3535972d13aa4e89e", - "sha256:eb60fe68774117378efdbd368ef83cf1417e61d4bc39c6be8e7f4ee91fb7428a", - "sha256:ebbebc4f6a9e0c89c7b57035f91043b038e804dd1953845d8a66066f4526c853", - "sha256:eccf67d09a4df42a7be2a5427c1b2e0b89bec862f519ded754bd452df516b380", - "sha256:ef0f08edb2094869e4d12346ee68d5154cb3d23bc3b1e7679222fae12228261c", - "sha256:efb3225b58dc67152c004da3c26ae5bad0afebbb3c7509d853bdd87eaa655137", - "sha256:f79ef7303e332e91d738e66e9bb7fce0243d0407a02631a58ebc0bf2fb8743d0", - "sha256:fc48db294d327a5cc10ee49f73f1fa1478240cc827c9029e0871106e327353ac" - ], - "version": "==0.6.0" + "sha256:015f7f6c1ce8a83d57955d1dc7ddd57cb633ae00576741a4fc9a0f72ed70007d", + "sha256:032365dfe932bfab8e80937ad6093b4c22e67d63ad880096b5fa8768f8d829ba", + "sha256:0649a41cd3c98e290c16592c082dbe42c7ffec747b596172eebcafb7fd8767b0", + "sha256:0787e85645bb4986c27e271715bc5ce21bba428a17964e5ec527368ed64669bc", + "sha256:0cd6213c3cf2b9eee6f2c9867f198c39124c557f4b3b77d04a73f30fd1277a59", + "sha256:0f2d881f0f8bf5674f8fe4774a438c545501e40fa27320c73be4f22463af4b05", + "sha256:17bce637a89f6e75f0013be68becac3e38dc082e7aefaf38935e89215f0aa64a", + "sha256:17edd21eef863d230ea00004ebc6d582cc91d325e7132deb93f0a90eb368c855", + "sha256:1d5b544e79ace93fdbd0b36ed329c86e346898153ac7ba2ec62bc9b4c6b745c9", + "sha256:1f798165158b76365a463a4f8aa2e3c2a12eb89b1fc092e7020e93713f2ad4dc", + "sha256:266ec46ab9f9cb40fbb5e649f55c329fc4620fa0b1a8117bdeefe91595e182dc", + "sha256:26cb1307c3ca9e21a3e307ab2c2099677e071ae9c26ec10ddffb3faceddd76b3", + "sha256:2a497ebe617bec6a420fc47378856caae40ab0652e756f3ed40c5f1fe2a12220", + "sha256:2b4fac4ea2ce27b86d173ae45765ced7f159120687d4410bb6d0846cbdb170a3", + "sha256:2cf817a72ffec4295def5c5be615dd8f1e954cdf449d72ebac579ff427951328", + "sha256:2d2b054a1a5f4004967532a4b82c6d1a45421ef2a5b41d35b6a8d41c7142aabe", + "sha256:316e5e1c40259d482883d1926fd33fa558dc87b2bd2ca53ce237a6fe8a34e473", + "sha256:35fcb9def6ce137540fdc0e91b08729677548b9c393c0151a6359fd199da3bd7", + "sha256:376c5cc0c177f03267340f36aec23e5eaf19520d41428d87605ca2ca3235d845", + "sha256:3ba99d0bdbd9cabd65f914cd07b4fb2e939ce199b54ae5ace1639ce1edf8e0a2", + "sha256:3c011303eb2b360695d2bd4bd7ca85f42373ae89fcea48e7fa5b8dc6fc254a98", + "sha256:4757a82a50406a0b3a333aa0122019a331bd6f16e49fed67dca423f928b3fd4d", + "sha256:47fcc19158150dc4a6ae9a970c5bc12f40b0298a2b7d0c573a510a7b6bead3f3", + "sha256:4c28d977f516d4928f6bc0cd44561f6d0fdd661d76bac7cdc4b73e3c209441d9", + "sha256:5415083f7f10eac25e1c434c87f07cb9bfa58909a6cad6649166fdad21119fc5", + "sha256:613f83713714972886e81d71685403098a83ffdacf616f12344b52bc73705107", + "sha256:69cfbcbe0a05f43e780e6a198080ba28034bf2bb4804d7d28f71a0379bfd1b19", + "sha256:6c2f2831c5733b404d2f2da4bfd02bb4612ae18d0822e14ae79b0b92436b816d", + "sha256:7227f232f2daf130ba786f6834548f2cfcfa45b7ec4f0d449e72560ac298186c", + "sha256:72875641a907523d37f4619eb4b303611d17e0a76f2ffc423b62dd1ca67eef41", + "sha256:7c7302619fc962e53093ba4a94559281491c045c925e5c4defec5dac358e0568", + "sha256:7cbefd4f1060f05768227ddf83be126397b1d430b026c64e0eb25d3cf50c5734", + "sha256:80a827e173372682959a57e6b8cc4f6468b1a4495b4bc7a775ef6ca05ae3e8e8", + "sha256:82f2e5b31678065e7a7fa089ed974af5a4f076673cf4f414219bdadfc3246a21", + "sha256:82f5ca62bedbf35aaf5a75d1f53b4457a1d9b6ff033497ca346e2a0cedf13d14", + "sha256:8448da4092265142662bbd3fc46cb8b0796b1e259189c020bc8f738899abd0b5", + "sha256:863e175ce5585f9ff3eba2aa16626928387e2a576157f02c8eb247a218ecdeae", + "sha256:86422c6090f34906c062fd3e4fdfdccf3934f2922021e979573ae315050b4288", + "sha256:898fede446ca1926b8406bdd711617c2aebba8227ee8ec1f0c2f8568047116f7", + "sha256:8f5c14d25611b263b876e9ada1701415a13c3e9f02ea397224fbe4ca9703992b", + "sha256:8f6071328aad06fdcc0a4acc2dc4839396d645f5916de07584af807eb7c08407", + "sha256:932abb560fe739416b50716a72ba6c6c20b219edded4389d1fc93266f3505d4b", + "sha256:9b7cafbe946b4cafc1e5709957e6dd5c6259d241d48ed75713ded42a5e8a4663", + "sha256:9b8822a5c0fd9a8cffcabfcc0cd7326bad537ee614fc3654e413a03137b6da1a", + "sha256:a21148b8ea09a631b752d975f9410ee2a31c0e16796fdc113422a6d244be10e5", + "sha256:a3932f53418b408fa03bd002e6dc573a74075c2c092926dde80657c39aa2e054", + "sha256:a70aee572da3994238c974694767365f237fc5949a550bee78a650fe16f83184", + "sha256:ae80d505aee7b3172cdcc2620ca6e2f85586337371138bb2b71aa377d2c31e9a", + "sha256:b2686d7d8ca31531458a48e08b0344a8eec6c402405446ce7d838e2a7e43355a", + "sha256:bae1b1ad8d2b8cf938a60313f8f7461de609621c5dcae491b6e54975f76f83c5", + "sha256:bd302c6d46a3be57664571a5f0d4224646804be9890a01d73a0b294f2d3bbff1", + "sha256:beea5ad9bd9e56aa77a6583b6f4e347d66f1fe7b1a2cb196fff53b7634f9dc84", + "sha256:bf6020560584671e76375b7a0539e0d5388fc70fa183c99dc769895f7ef90233", + "sha256:c011997f62d0c3b40a617e61b7faaaf6078e4eeff2e95ce4c45838db537816eb", + "sha256:c08311db17647a47d4898fc6f8d9c1f0e58b927752c894877ff0c38b3db0d6e1", + "sha256:c26bada6cd109095139237a46f50fc4308f861f0d304bc9e70acbc6c4503d158", + "sha256:c31240e30d5636ded02a54b7280aa129344fe8e964fd63885e85d9a8a83db206", + "sha256:ce0ae49879d10610cf3c40f4f376bb3cc425b18d939966ac63a2a9c73eb6f32a", + "sha256:ce15a842c2a0bf46180ae136743b561fa276300dd7fa61fe76daf00ec7dc0c2d", + "sha256:ce7c20b9395696d3b5425dccf2706d374e61ccf8f3656bff9423093a6df488f5", + "sha256:cfc8381df1f0f873da8969729974f90111cfb61a725ef0a2e0e6215408fe1217", + "sha256:d1dca48687f41efd862355e58b0aa31150586219324901dbea2989a506e291d4", + "sha256:d3bbe2f925cc587545c8d01587b4523177408edd252a32ce6d61b97113fe234d", + "sha256:d917f5bc27b85611ceee4eb85f0e4088b0a03b4eed22c472409933a94ee953cf", + "sha256:dab84c52f64e10adc79011a08673eb80286c159b14e8fb455524bf2994f0cb38", + "sha256:de9cfafe97c75cd3ea052a24cd4aabf9fb0cfc3c0f9f810f00121cdf123db9e4", + "sha256:df35ea436592eb7e30e59c5403ec08ec3a5e7759e270cf226df73c47b3e739f5", + "sha256:e13cba03c7af8c8a846c4495875a09d64362cc4caeed495ada5390644411bbe7", + "sha256:e1935d12e503780b859d343161a80df65205d23cad7b4f6c3df6e50321e188a3", + "sha256:e42258f66ad9f16d9b62e9c9642742982acb1f30b90f5061522048c1cb99814f", + "sha256:e794e44fa260300b8850246c6371d94014753c73528f97f6ccb42f5e7ce698ae", + "sha256:e8638355ae2f996356f7f281e03a3e3ce31f1259510f9d551465356532e0302c", + "sha256:e92878cc05e844c8da937204bc34c2e6caf66709ce5936802fbfb35f04132892", + "sha256:ff32548e45e45bf3280ac1d28b3148337a5c6714c28db23aeb0693e33eba257e" + ], + "version": "==0.6.2" }, "ypy-websocket": { "hashes": [ @@ -3953,7 +4002,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "stack-data": { @@ -3965,11 +4014,11 @@ }, "traitlets": { "hashes": [ - "sha256:07ab9c5bf8a0499fd7b088ba51be899c90ffc936ffc797d7b6907fc516bcd116", - "sha256:db9c4aa58139c3ba850101913915c042bdba86f7c8a0dda1c6f7f92c5da8e542" + "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e", + "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae" ], "markers": "python_version >= '3.8'", - "version": "==5.10.1" + "version": "==5.11.2" }, "typing-extensions": { "hashes": [ diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 2d0844de4..1f09873dd 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,21 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.4.1 - 2023-10-26 - [PR#1007](https://github.com/NOAA-OWP/inundation-mapping/pull/1007) + +Updates GVAL to address memory and performance issues associated with running synthesize test cases. + +### Changes + +- `tools/tools_shared_functions.py` +- `Pipfile` +- `pyproject.toml` +- `tools/run_test_case.py` +- `tools/synthesize_test_cases.py` +- `tools/inundate_mosaic_wrapper` + +

+ ## v4.4.4.0 - 2023-10-20 - [PR#1012](https://github.com/NOAA-OWP/inundation-mapping/pull/1012) The way in which watershed boundary data (WBD) is generated and processed has been modified. Instead of generating those files "on the fly" for every run, a script has been added that will take a huclist and create the .gpkg files per HUC in a specified directory (`$pre_clip_huc_dir`). During a `fim_pipeline.sh` run, the pre-clipped staged vectors will be copied over to the containers' working directory. This reduces runtime and the repetitive computation needed to generate those files every run. diff --git a/pyproject.toml b/pyproject.toml index f6d623ec0..0476fe148 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,9 +74,10 @@ per-file-ignores = """ src/agreedem.py: E712 src/build_stream_traversal.py: E722 tools/vary_mannings_n_composite.py: E712 - tools/tools_shared_functions.py: F821, F841 + tools/tools_shared_functions.py: F821, F841, E711 tools/rating_curve_get_usgs_curves.py: F841 tools/rating_curve_comparison.py: F821, F841 + tools/run_test_case.py: E711 tools/inundation.py: F821 tools/eval_alt_catfim.py: F841 tools/check_deep_flooding.py: E712 diff --git a/tools/inundate_mosaic_wrapper.py b/tools/inundate_mosaic_wrapper.py index 48da26996..1620a7820 100644 --- a/tools/inundate_mosaic_wrapper.py +++ b/tools/inundate_mosaic_wrapper.py @@ -1,7 +1,6 @@ import argparse import errno import os -import sys from timeit import default_timer as timer from inundate_gms import Inundate_gms @@ -70,6 +69,9 @@ def produce_mosaicked_inundation( if not os.path.exists(hydrofabric_dir): raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), hydrofabric_dir) + # If the "hucs" argument is really one huc, convert it to a list + if type(hucs) == str: + hucs = [hucs] # Check that huc folder exists in the hydrofabric_dir. for huc in hucs: if not os.path.exists(os.path.join(hydrofabric_dir, huc)): diff --git a/tools/run_test_case.py b/tools/run_test_case.py index 89fe04da2..a7cb7701e 100755 --- a/tools/run_test_case.py +++ b/tools/run_test_case.py @@ -5,6 +5,7 @@ import re import shutil import sys +import traceback import pandas as pd from inundate_mosaic_wrapper import produce_mosaicked_inundation @@ -24,7 +25,7 @@ from utils.shared_functions import FIM_Helpers as fh -class benchmark(object): +class Benchmark(object): AHPS_BENCHMARK_CATEGORIES = AHPS_BENCHMARK_CATEGORIES MAGNITUDE_DICT = MAGNITUDE_DICT @@ -42,27 +43,27 @@ def __init__(self, category): self.MAGNITUDE_DICT.keys() ), f"Category must be one of {list(self.MAGNITUDE_DICT.keys())}" self.validation_data = os.path.join( - TEST_CASES_DIR, f"{self.category}_test_cases", f"validation_data_{self.category}" + TEST_CASES_DIR, f'{self.category}_test_cases', f'validation_data_{self.category}' ) self.is_ahps = True if self.category in self.AHPS_BENCHMARK_CATEGORIES else False def magnitudes(self): - """Returns the magnitudes associated with the benchmark category.""" + '''Returns the magnitudes associated with the benchmark category.''' return self.MAGNITUDE_DICT[self.category] def huc_data(self): - """Returns a dict of HUC8, magnitudes, and sites.""" + '''Returns a dict of HUC8, magnitudes, and sites.''' huc_mags = {} for huc in os.listdir(self.validation_data): - if not re.match(r"\d{8}", huc): + if not re.match(r'\d{8}', huc): continue huc_mags[huc] = self.data(huc) return huc_mags def data(self, huc): - """Returns a dict of magnitudes and sites for a given huc. Sites will be AHPS lids for + '''Returns a dict of magnitudes and sites for a given huc. Sites will be AHPS lids for AHPS sites and empty strings for non-AHPS sites. - """ + ''' huc_dir = os.path.join(self.validation_data, huc) if not os.path.isdir(huc_dir): return {} @@ -80,10 +81,10 @@ def data(self, huc): return mag_dict else: mags = list(os.listdir(huc_dir)) - return {mag: [""] for mag in mags} + return {mag: [''] for mag in mags} -class Test_Case(benchmark): +class Test_Case(Benchmark): def __init__(self, test_id, version, archive=True): """Class that handles test cases, specifically running the alpha test. @@ -92,7 +93,7 @@ def __init__(self, test_id, version, archive=True): test_id : str ID of the test case in huc8_category format, e.g. `12090201_ble`. version : str - Version of FIM to which this Test_Case belongs. This should correspond to the fim directory + Version of FIM to which this test_case belongs. This should correspond to the fim directory name in either `/data/previous_fim/` or `/outputs/`. archive : bool If true, this test case outputs will be placed into the `official_versions` folder @@ -102,7 +103,7 @@ def __init__(self, test_id, version, archive=True): """ self.test_id = test_id - self.huc, self.benchmark_cat = test_id.split("_") + self.huc, self.benchmark_cat = test_id.split('_') super().__init__(self.benchmark_cat) self.version = version self.archive = archive @@ -110,14 +111,14 @@ def __init__(self, test_id, version, archive=True): self.fim_dir = os.path.join( PREVIOUS_FIM_DIR if archive else OUTPUTS_DIR, self.version, - self.huc if not re.search("^fim_[1,2]", version, re.IGNORECASE) else self.huc[:6], + self.huc if not re.search('^fim_[1,2]', version, re.IGNORECASE) else self.huc[:6], ) # Test case directory path self.dir = os.path.join( TEST_CASES_DIR, - f"{self.benchmark_cat}_test_cases", + f'{self.benchmark_cat}_test_cases', test_id, - "official_versions" if archive else "testing_versions", + 'official_versions' if archive else 'testing_versions', version, ) if not os.path.exists(self.dir): @@ -127,15 +128,15 @@ def __init__(self, test_id, version, archive=True): # Create list of shapefile paths to use as exclusion areas. self.mask_dict = { - "levees": { - "path": "/data/inputs/nld_vectors/Levee_protected_areas.gpkg", - "buffer": None, - "operation": "exclude", + 'levees': { + 'path': '/data/inputs/nld_vectors/Levee_protected_areas.gpkg', + 'buffer': None, + 'operation': 'exclude', }, - "waterbodies": { - "path": "/data/inputs/nwm_hydrofabric/nwm_lakes.gpkg", - "buffer": None, - "operation": "exclude", + 'waterbodies': { + 'path': '/data/inputs/nwm_hydrofabric/nwm_lakes.gpkg', + 'buffer': None, + 'operation': 'exclude', }, } @@ -159,26 +160,26 @@ def list_all_test_cases(cls, version, archive, benchmark_categories=[]): test_case_list = [] for bench_cat in benchmark_categories: - benchmark_class = benchmark(bench_cat) + benchmark_class = Benchmark(bench_cat) benchmark_data = benchmark_class.huc_data() for huc in benchmark_data.keys(): - test_case_list.append(cls(f"{huc}_{bench_cat}", version, archive)) + test_case_list.append(cls(f'{huc}_{bench_cat}', version, archive)) return test_case_list def alpha_test( self, calibrated=False, - model="", - mask_type="huc", - inclusion_area="", + model='', + mask_type='huc', + inclusion_area='', inclusion_area_buffer=0, overwrite=True, verbose=False, gms_workers=1, ): - """Compares a FIM directory with benchmark data from a variety of sources. + '''Compares a FIM directory with benchmark data from a variety of sources. Parameters ---------- @@ -198,7 +199,7 @@ def alpha_test( If True, prints out all pertinent data. gms_workers : int Number of worker processes assigned to GMS processing. - """ + ''' try: if not overwrite and os.path.isdir(self.dir): @@ -207,47 +208,47 @@ def alpha_test( fh.vprint(f"Starting alpha test for {self.dir}", verbose) - self.stats_modes_list = ["total_area"] + self.stats_modes_list = ['total_area'] # Create paths to fim_run outputs for use in inundate() - if model != "GMS": - self.rem = os.path.join(self.fim_dir, "rem_zeroed_masked.tif") + if model != 'GMS': + self.rem = os.path.join(self.fim_dir, 'rem_zeroed_masked.tif') if not os.path.exists(self.rem): - self.rem = os.path.join(self.fim_dir, "rem_clipped_zeroed_masked.tif") + self.rem = os.path.join(self.fim_dir, 'rem_clipped_zeroed_masked.tif') self.catchments = os.path.join( - self.fim_dir, "gw_catchments_reaches_filtered_addedAttributes.tif" + self.fim_dir, 'gw_catchments_reaches_filtered_addedAttributes.tif' ) if not os.path.exists(self.catchments): self.catchments = os.path.join( - self.fim_dir, "gw_catchments_reaches_clipped_addedAttributes.tif" + self.fim_dir, 'gw_catchments_reaches_clipped_addedAttributes.tif' ) self.mask_type = mask_type - if mask_type == "huc": - self.catchment_poly = "" + if mask_type == 'huc': + self.catchment_poly = '' else: self.catchment_poly = os.path.join( - self.fim_dir, "gw_catchments_reaches_filtered_addedAttributes_crosswalked.gpkg" + self.fim_dir, 'gw_catchments_reaches_filtered_addedAttributes_crosswalked.gpkg' ) - self.hydro_table = os.path.join(self.fim_dir, "hydroTable.csv") + self.hydro_table = os.path.join(self.fim_dir, 'hydroTable.csv') # Map necessary inputs for inundate(). - self.hucs, self.hucs_layerName = (os.path.join(INPUTS_DIR, "wbd", "WBD_National.gpkg"), "WBDHU8") + self.hucs, self.hucs_layerName = os.path.join(INPUTS_DIR, 'wbd', 'WBD_National.gpkg'), 'WBDHU8' - if inclusion_area != "": - inclusion_area_name = os.path.split(inclusion_area)[1].split(".")[0] # Get layer name + if inclusion_area != '': + inclusion_area_name = os.path.split(inclusion_area)[1].split('.')[0] # Get layer name self.mask_dict.update( { inclusion_area_name: { - "path": inclusion_area, - "buffer": int(inclusion_area_buffer), - "operation": "include", + 'path': inclusion_area, + 'buffer': int(inclusion_area_buffer), + 'operation': 'include', } } ) # Append the concatenated inclusion_area_name and buffer. - if inclusion_area_buffer is None: + if inclusion_area_buffer == None: inclusion_area_buffer = 0 - self.stats_modes_list.append(inclusion_area_name + "_b" + str(inclusion_area_buffer) + "m") + self.stats_modes_list.append(inclusion_area_name + '_b' + str(inclusion_area_buffer) + 'm') # Delete the directory if it exists if os.path.exists(self.dir): @@ -277,12 +278,14 @@ def alpha_test( sys.exit(1) except Exception as ex: print(ex) + # Temporarily adding stack trace + print(f"trace for {self.test_id} -------------\n", traceback.format_exc()) sys.exit(1) def _inundate_and_compute( - self, magnitude, lid, compute_only=False, model="", verbose=False, gms_workers=1 + self, magnitude, lid, compute_only=False, model='', verbose=False, gms_workers=1 ): - """Method for inundating and computing contingency rasters as part of the alpha_test. + '''Method for inundating and computing contingency rasters as part of the alpha_test. Used by both the alpha_test() and composite() methods. Parameters @@ -293,19 +296,19 @@ def _inundate_and_compute( lid of the current benchmark site. For non-AHPS sites, this should be an empty string (''). compute_only : bool If true, skips inundation and only computes contingency stats. - """ + ''' # Output files fh.vprint("Creating output files", verbose) test_case_out_dir = os.path.join(self.dir, magnitude) - inundation_prefix = lid + "_" if lid else "" - inundation_path = os.path.join(test_case_out_dir, f"{inundation_prefix}inundation_extent.tif") - predicted_raster_path = inundation_path.replace(".tif", f"_{self.huc}.tif") + inundation_prefix = lid + '_' if lid else '' + inundation_path = os.path.join(test_case_out_dir, f'{inundation_prefix}inundation_extent.tif') + predicted_raster_path = inundation_path.replace('.tif', f'_{self.huc}.tif') agreement_raster = os.path.join( - test_case_out_dir, (f"ahps_{lid}" if lid else "") + "total_area_agreement.tif" + test_case_out_dir, (f'ahps_{lid}' if lid else '') + 'total_area_agreement.tif' ) - stats_json = os.path.join(test_case_out_dir, "stats.json") - stats_csv = os.path.join(test_case_out_dir, "stats.csv") + stats_json = os.path.join(test_case_out_dir, 'stats.json') + stats_csv = os.path.join(test_case_out_dir, 'stats.csv') # Create directory if not os.path.isdir(test_case_out_dir): @@ -313,14 +316,14 @@ def _inundate_and_compute( # Benchmark raster and flow files benchmark_rast = ( - f"ahps_{lid}" if lid else self.benchmark_cat - ) + f"_huc_{self.huc}_extent_{magnitude}.tif" + f'ahps_{lid}' if lid else self.benchmark_cat + ) + f'_huc_{self.huc}_extent_{magnitude}.tif' benchmark_rast = os.path.join(self.benchmark_dir, lid, magnitude, benchmark_rast) - benchmark_flows = benchmark_rast.replace(f"_extent_{magnitude}.tif", f"_flows_{magnitude}.csv") + benchmark_flows = benchmark_rast.replace(f'_extent_{magnitude}.tif', f'_flows_{magnitude}.csv') mask_dict_indiv = self.mask_dict.copy() if self.is_ahps: # add domain shapefile to mask for AHPS sites - domain = os.path.join(self.benchmark_dir, lid, f"{lid}_domain.shp") - mask_dict_indiv.update({lid: {"path": domain, "buffer": None, "operation": "include"}}) + domain = os.path.join(self.benchmark_dir, lid, f'{lid}_domain.shp') + mask_dict_indiv.update({lid: {'path': domain, 'buffer': None, 'operation': 'include'}}) # Check to make sure all relevant files exist if ( not os.path.isfile(benchmark_rast) @@ -388,15 +391,15 @@ def run_alpha_test( calibrated, model, archive_results=False, - mask_type="huc", - inclusion_area="", + mask_type='huc', + inclusion_area='', inclusion_area_buffer=0, light_run=False, overwrite=True, verbose=False, gms_workers=1, ): - """Class method for instantiating the Test_Case class and running alpha_test directly""" + '''Class method for instantiating the test_case class and running alpha_test directly''' alpha_class = cls(test_id, version, archive_results) alpha_class.alpha_test( @@ -411,7 +414,7 @@ def run_alpha_test( ) def composite(self, version_2, calibrated=False, overwrite=True, verbose=False): - """Class method for compositing MS and FR inundation and creating an agreement raster with stats + '''Class method for compositing MS and FR inundation and creating an agreement raster with stats Parameters ---------- @@ -421,12 +424,12 @@ def composite(self, version_2, calibrated=False, overwrite=True, verbose=False): Whether or not this FIM version is calibrated. overwrite : bool If True, overwites pre-existing test cases within the test_cases directory. - """ + ''' - if re.match(r"(.*)(_ms|_fr)", self.version): - composite_version_name = re.sub(r"(.*)(_ms|_fr)", r"\1_comp", self.version, count=1) + if re.match(r'(.*)(_ms|_fr)', self.version): + composite_version_name = re.sub(r'(.*)(_ms|_fr)', r'\1_comp', self.version, count=1) else: - composite_version_name = re.sub(r"(.*)(_ms|_fr)", r"\1_comp", version_2, count=1) + composite_version_name = re.sub(r'(.*)(_ms|_fr)', r'\1_comp', version_2, count=1) fh.vprint(f"Begin composite for version : {composite_version_name}", verbose) @@ -446,28 +449,28 @@ def composite(self, version_2, calibrated=False, overwrite=True, verbose=False): for instance in validation_data[ magnitude ]: # instance will be the lid for AHPS sites and '' for other sites (ble/ifc/ras2fim) - inundation_prefix = instance + "_" if instance else "" + inundation_prefix = instance + '_' if instance else '' input_inundation = os.path.join( - self.dir, magnitude, f"{inundation_prefix}inundation_extent_{self.huc}.tif" + self.dir, magnitude, f'{inundation_prefix}inundation_extent_{self.huc}.tif' ) input_inundation_2 = os.path.join( input_test_case_2.dir, magnitude, - f"{inundation_prefix}inundation_extent_{input_test_case_2.huc}.tif", + f'{inundation_prefix}inundation_extent_{input_test_case_2.huc}.tif', ) output_inundation = os.path.join( - composite_test_case.dir, magnitude, f"{inundation_prefix}inundation_extent.tif" + composite_test_case.dir, magnitude, f'{inundation_prefix}inundation_extent.tif' ) if os.path.isfile(input_inundation) and os.path.isfile(input_inundation_2): inundation_map_file = pd.DataFrame( { - "huc8": [composite_test_case.huc] * 2, - "branchID": [None] * 2, - "inundation_rasters": [input_inundation, input_inundation_2], - "depths_rasters": [None] * 2, - "inundation_polygons": [None] * 2, + 'huc8': [composite_test_case.huc] * 2, + 'branchID': [None] * 2, + 'inundation_rasters': [input_inundation, input_inundation_2], + 'depths_rasters': [None] * 2, + 'inundation_polygons': [None] * 2, } ) os.makedirs(os.path.dirname(output_inundation), exist_ok=True) @@ -475,10 +478,10 @@ def composite(self, version_2, calibrated=False, overwrite=True, verbose=False): fh.vprint(f"Begin mosaic inundation for version : {composite_version_name}", verbose) Mosaic_inundation( inundation_map_file, - mosaic_attribute="inundation_rasters", + mosaic_attribute='inundation_rasters', mosaic_output=output_inundation, mask=None, - unit_attribute_name="huc8", + unit_attribute_name='huc8', nodata=elev_raster_ndv, workers=1, remove_inputs=False, @@ -492,32 +495,32 @@ def composite(self, version_2, calibrated=False, overwrite=True, verbose=False): single_test_case = self if os.path.isfile(input_inundation) else input_test_case_2 shutil.copytree( single_test_case.dir, - re.sub(r"(.*)(_ms|_fr)", r"\1_comp", single_test_case.dir, count=1), + re.sub(r'(.*)(_ms|_fr)', r'\1_comp', single_test_case.dir, count=1), ) - composite_test_case.write_metadata(calibrated, "COMP") + composite_test_case.write_metadata(calibrated, 'COMP') return # Clean up 'total_area' outputs from AHPS sites if composite_test_case.is_ahps: composite_test_case.clean_ahps_outputs(os.path.join(composite_test_case.dir, magnitude)) - composite_test_case.write_metadata(calibrated, "COMP") + composite_test_case.write_metadata(calibrated, 'COMP') def write_metadata(self, calibrated, model): - """Writes metadata files for a test_case directory.""" - with open(os.path.join(self.dir, "eval_metadata.json"), "w") as meta: - eval_meta = {"calibrated": calibrated, "model": model} + '''Writes metadata files for a test_case directory.''' + with open(os.path.join(self.dir, 'eval_metadata.json'), 'w') as meta: + eval_meta = {'calibrated': calibrated, 'model': model} meta.write(json.dumps(eval_meta, indent=2)) def clean_ahps_outputs(self, magnitude_directory): - """Cleans up `total_area` files from an input AHPS magnitude directory.""" + '''Cleans up `total_area` files from an input AHPS magnitude directory.''' output_file_list = [os.path.join(magnitude_directory, of) for of in os.listdir(magnitude_directory)] for output_file in output_file_list: if "total_area" in output_file: os.remove(output_file) def get_current_agreements(self): - """Returns a list of all agreement rasters currently existing for the test_case.""" + '''Returns a list of all agreement rasters currently existing for the test_case.''' agreement_list = [] for mag in os.listdir(self.dir): mag_dir = os.path.join(self.dir, mag) @@ -525,6 +528,6 @@ def get_current_agreements(self): continue for f in os.listdir(mag_dir): - if "agreement.tif" in f: + if 'agreement.tif' in f: agreement_list.append(os.path.join(mag_dir, f)) return agreement_list diff --git a/tools/synthesize_test_cases.py b/tools/synthesize_test_cases.py index ceb7e427f..dfe0dac7e 100755 --- a/tools/synthesize_test_cases.py +++ b/tools/synthesize_test_cases.py @@ -123,11 +123,11 @@ def create_master_metrics_csv( magnitude_list = MAGNITUDE_DICT[benchmark_source] # Iterate through available test cases - for test_case in test_cases_list: + for each_test_case in test_cases_list: try: # Get HUC id - int(test_case.split('_')[0]) - huc = test_case.split('_')[0] + int(each_test_case.split('_')[0]) + huc = each_test_case.split('_')[0] # Update filepaths based on whether the official or dev versions should be included for iteration in iteration_list: @@ -135,7 +135,7 @@ def create_master_metrics_csv( iteration == "official" ): # and str(pfiles) == "True": # "official" refers to previous finalized model versions versions_to_crawl = os.path.join( - benchmark_test_case_dir, test_case, 'official_versions' + benchmark_test_case_dir, each_test_case, 'official_versions' ) versions_to_aggregate = prev_versions_to_include_list @@ -143,7 +143,7 @@ def create_master_metrics_csv( iteration == "testing" ): # "testing" refers to the development model version(s) being evaluated versions_to_crawl = os.path.join( - benchmark_test_case_dir, test_case, 'testing_versions' + benchmark_test_case_dir, each_test_case, 'testing_versions' ) versions_to_aggregate = dev_versions_to_include_list @@ -190,17 +190,17 @@ def create_master_metrics_csv( if benchmark_source in AHPS_BENCHMARK_CATEGORIES: test_cases_list = os.listdir(benchmark_test_case_dir) - for test_case in test_cases_list: + for each_test_case in test_cases_list: try: # Get HUC id - int(test_case.split('_')[0]) - huc = test_case.split('_')[0] + int(each_test_case.split('_')[0]) + huc = each_test_case.split('_')[0] # Update filepaths based on whether the official or dev versions should be included for iteration in iteration_list: if iteration == "official": # "official" refers to previous finalized model versions versions_to_crawl = os.path.join( - benchmark_test_case_dir, test_case, 'official_versions' + benchmark_test_case_dir, each_test_case, 'official_versions' ) versions_to_aggregate = prev_versions_to_include_list @@ -208,7 +208,7 @@ def create_master_metrics_csv( iteration == "testing" ): # "testing" refers to the development model version(s) being evaluated versions_to_crawl = os.path.join( - benchmark_test_case_dir, test_case, 'testing_versions' + benchmark_test_case_dir, each_test_case, 'testing_versions' ) versions_to_aggregate = dev_versions_to_include_list @@ -448,7 +448,9 @@ def progress_bar_handler(executor_dict, verbose, desc): required=False, default=None, ) - parser.add_argument('-vr', '--verbose', help='Verbose', required=False, default=None, action='store_true') + parser.add_argument( + '-vr', '--verbose', help='Verbose output', required=False, default=None, action='store_true' + ) parser.add_argument( '-vg', '--gms-verbose', diff --git a/tools/tools_shared_functions.py b/tools/tools_shared_functions.py index 08af7ee9e..96a7e24bd 100755 --- a/tools/tools_shared_functions.py +++ b/tools/tools_shared_functions.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 + import json import os import pathlib @@ -16,7 +17,9 @@ from dotenv import load_dotenv from geocube.api.core import make_geocube from gval import CatStats +from rasterio import features from rasterio.warp import Resampling, calculate_default_transform, reproject +from shapely.geometry import MultiPolygon, Polygon, shape def get_env_paths(): @@ -29,15 +32,14 @@ def get_env_paths(): def filter_nwm_segments_by_stream_order(unfiltered_segments, desired_order, nwm_flows_df): """ - This function uses the WRDS API to filter out NWM segments from a list if their stream order is - different than the target stream order. + This function uses the WRDS API to filter out NWM segments from a list if their stream order is different than + the target stream order. Args: unfiltered_segments (list): A list of NWM feature_id strings. - desired_order (str): The desired stream order. + desired_order (str): The desired stream order. Returns: - filtered_segments (list): A list of NWM feature_id strings, paired down to only those that - share the target order. + filtered_segments (list): A list of NWM feature_id strings, paired down to only those that share the target order. """ @@ -90,8 +92,7 @@ def compute_contingency_stats_from_rasters( """ This function contains FIM-specific logic to prepare raster datasets for use in the generic get_stats_table_from_binary_rasters() function. This function also calls the generic - compute_stats_from_contingency_table() function and writes the results to CSV and/or JSON, - depending on user input. + compute_stats_from_contingency_table() function and writes the results to CSV and/or JSON, depending on user input. Parameters ---------- @@ -100,24 +101,26 @@ def compute_contingency_stats_from_rasters( benchmark_raster_path: str The path to the benchmark, or truth, FIM extent raster. agreement_raster: str, optional - An agreement raster will be written to this path. 0: True Negatives, 1: False Negative, - 2: False Positive, 3: True Positive. + An agreement raster will be written to this path. 0: True Negatives, 1: False Negative, 2: False Positive, + 3: True Positive. stats_csv: str, optional - Performance statistics will be written to this path. CSV allows for readability and - other tabular processes. + Performance statistics will be written to this path. CSV allows for readability and other tabular processes. stats_json: str, optional - Performance statistics will be written to this path. JSON allows for quick ingestion into Python - dictionary in other processes. + Performance statistics will be written to this path. JSON allows for quick ingestion into Python dictionary + in other processes. mask_dict: dict Dictionary with inclusionary and/or exclusionary masks asn options. Returns ------- dict - A dictionary of statistics produced by compute_stats_from_contingency_table(). Statistic names are - keys and statistic values are the values. + A dictionary of statistics produced by compute_stats_from_contingency_table(). Statistic names are keys and + statistic values are the values. """ + # print('candidate', predicted_raster_path) + # print('benchmark', benchmark_raster_path) + # Get statistics table from two rasters. stats_dictionary = get_stats_table_from_binary_rasters( benchmark_raster_path, predicted_raster_path, agreement_raster, mask_dict=mask_dict @@ -125,13 +128,13 @@ def compute_contingency_stats_from_rasters( for stats_mode in stats_dictionary: # Write the mode_stats_dictionary to the stats_csv. - if stats_csv is not None: + if stats_csv != None: stats_csv = os.path.join(os.path.split(stats_csv)[0], stats_mode + '_stats.csv') df = pd.DataFrame.from_dict(stats_dictionary[stats_mode], orient="index", columns=['value']) df.to_csv(stats_csv) # Write the mode_stats_dictionary to the stats_json. - if stats_json is not None: + if stats_json != None: stats_json = os.path.join(os.path.split(stats_csv)[0], stats_mode + '_stats.json') with open(stats_json, "w") as outfile: json.dump(stats_dictionary[stats_mode], outfile) @@ -144,15 +147,13 @@ def profile_test_case_archive(archive_to_check, magnitude, stats_mode): This function searches multiple directories and locates previously produced performance statistics. Args: - archive_to_check (str): The directory path to search. - magnitude (str): Because a benchmark dataset may have multiple magnitudes, - this argument defines which magnitude is to be used when searching for - previous statistics. + archive_to_check (str): The directory path to search. + magnitude (str): Because a benchmark dataset may have multiple magnitudes, this argument defines + which magnitude is to be used when searching for previous statistics. Returns: - archive_dictionary (dict): A dictionary of available statistics for previous versions of the domain - and magnitude. {version: {agreement_raster: agreement_raster_path, - stats_csv: stats_csv_path, stats_json: stats_json_path}} - *Will only add the paths to files that exist. + archive_dictionary (dict): A dictionary of available statistics for previous versions of the domain and magnitude. + {version: {agreement_raster: agreement_raster_path, stats_csv: stats_csv_path, stats_json: stats_json_path}} + *Will only add the paths to files that exist. """ @@ -179,23 +180,30 @@ def compute_stats_from_contingency_table( true_negatives, false_negatives, false_positives, true_positives, cell_area=None, masked_count=None ): """ - This generic function takes contingency table metrics as arguments and returns a dictionary of contingency - table statistics. Much of the calculations below were taken from older Python files. - This is evident in the inconsistent use of case. + This generic function takes contingency table metrics as arguments and returns a dictionary of contingency table statistics. + Much of the calculations below were taken from older Python files. This is evident in the inconsistent use of case. - Args: - true_negatives (int): The true negatives from a contingency table. - false_negatives (int): The false negatives from a contingency table. - false_positives (int): The false positives from a contingency table. - true_positives (int): The true positives from a contingency table. - cell_area (float or None): This optional argument allows for area-based statistics to be calculated, - in the case that contingency table metrics were derived from areal - analysis. + Parameters + ---------- + true_negatives: int + The true negatives from a contingency table. + false_negatives: int + The false negatives from a contingency table. + false_positives: int + The false positives from a contingency table. + true_positives: int + The true positives from a contingency table. + cell_area: float, default = None + This optional argument allows for area-based statistics to be calculated, in the case that contingency + table metrics were derived from areal analysis. + masked_count: int, default = None + Amount of pixels masked out of array - Returns: - stats_dictionary (dict): A dictionary of statistics. Statistic names are keys and statistic values - are the values. Refer to dictionary definition in bottom of function for - statistic names. + Returns + ------- + dict + A dictionary of statistics. Statistic names are keys and statistic values are the values. + Refer to dictionary definition in bottom of function for statistic names. """ @@ -337,8 +345,7 @@ def get_stats_table_from_binary_rasters( benchmark_raster_path: str, candidate_raster_path: str, agreement_raster: str = None, mask_dict: dict = {} ): """ - Produces categorical statistics table from 2 rasters and returns it. - Also exports an agreement raster classified as: + Produces categorical statistics table from 2 rasters and returns it. Also exports an agreement raster classified as: 0: True Negatives 1: False Negative 2: False Positive @@ -349,8 +356,7 @@ def get_stats_table_from_binary_rasters( Parameters ---------- benchmark_raster_path: str - Path to the binary benchmark raster. 0 = phenomena not present, 1 = phenomena present, - NoData = NoData. + Path to the binary benchmark raster. 0 = phenomena not present, 1 = phenomena present, NoData = NoData. candidate_raster_path: str Path to the predicted raster. 0 = phenomena not present, 1 = phenomena present, NoData = NoData. agreement_raster: str, default = None. @@ -367,36 +373,44 @@ def get_stats_table_from_binary_rasters( """ # Load benchmark and candidate data - benchmark_raster = rxr.open_rasterio(benchmark_raster_path, mask_and_scale=True) + benchmark_raster = rxr.open_rasterio(benchmark_raster_path) cell_area = np.abs(np.prod(benchmark_raster.rio.resolution())) - candidate_raster = rxr.open_rasterio(candidate_raster_path, mask_and_scale=True) - candidate_raster.data = xr.where(candidate_raster >= 0, 1, candidate_raster) - candidate_raster.data = xr.where(candidate_raster < 0, 0, candidate_raster) + candidate_raster = rxr.open_rasterio(candidate_raster_path) + candidate_raster.data = xr.where( + (candidate_raster != candidate_raster.rio.nodata) & (candidate_raster >= 0), 1, candidate_raster + ) + candidate_raster.data = xr.where( + (candidate_raster != candidate_raster.rio.nodata) & (candidate_raster < 0), 0, candidate_raster + ) + candidate_raster.data = xr.where(candidate_raster == candidate_raster.rio.nodata, 10, candidate_raster) + candidate_raster = candidate_raster.rio.write_nodata(10) + benchmark_raster.data = xr.where(benchmark_raster == benchmark_raster.rio.nodata, 10, benchmark_raster) + benchmark_raster = benchmark_raster.rio.write_nodata(10) pairing_dictionary = { (0, 0): 0, (0, 1): 1, - (0, np.nan): np.nan, + (0, 10): 10, (1, 0): 2, (1, 1): 3, - (1, np.nan): np.nan, + (1, 10): 10, (4, 0): 4, (4, 1): 4, - (4, np.nan): np.nan, - (np.nan, 0): np.nan, - (np.nan, 1): np.nan, - (np.nan, np.nan): np.nan, + (4, 10): 10, + (10, 0): 10, + (10, 1): 10, + (10, 10): 10, } # Loop through exclusion masks and mask the agreement_array. - rasterized_mask_list = [] + all_masks_df = None if mask_dict != {}: for poly_layer in mask_dict: operation = mask_dict[poly_layer]['operation'] if operation == 'exclude': poly_path = mask_dict[poly_layer]['path'] - buffer_val = mask_dict[poly_layer]['buffer'] + buffer_val = 0 if mask_dict[poly_layer]['buffer'] is None else mask_dict[poly_layer]['buffer'] # Read mask bounds with candidate boundary box poly_all = gpd.read_file(poly_path, bbox=candidate_raster.rio.bounds()) @@ -411,38 +425,48 @@ def get_stats_table_from_binary_rasters( poly_all_proj = poly_all.to_crs(candidate_raster.rio.crs) # Buffer if buffer val exists - poly_all_proj = poly_all_proj.buffer(buffer_val) if buffer_val else poly_all_proj - - poly_all_proj['mask'] = 4 + poly_all_proj = poly_all_proj.buffer(buffer_val) if buffer_val != 0 else poly_all_proj - rasterized_mask_list.append(make_geocube(poly_all_proj, ['mask'], like=candidate_raster)) + if all_masks_df is not None: + all_masks_df = pd.concat([all_masks_df, poly_all_proj]) + else: + all_masks_df = poly_all_proj del poly_all, poly_all_proj - og_data = candidate_raster.data - if len(rasterized_mask_list) > 0: - all_masks = xr.merge(rasterized_mask_list).to_array() - # Hold on to original data + stats_table_dictionary = {} # Initialize empty dictionary. + + c_aligned, b_aligned = candidate_raster.gval.homogenize(benchmark_raster, target_map="candidate") + del candidate_raster, benchmark_raster - candidate_raster.data = xr.where( - (all_masks.data == 4) & (candidate_raster.isnull() == 0), 4, candidate_raster + agreement_map = c_aligned.gval.compute_agreement_map( + b_aligned, comparison_function='pairing_dict', pairing_dict=pairing_dictionary + ) + del c_aligned, b_aligned + + agreement_map_og = agreement_map.copy() + agreement_map.rio.write_nodata(4, inplace=True) + + # Mask if mask_dict is provided + if all_masks_df is not None: + agreement_map = agreement_map.rio.clip(all_masks_df['geometry'], invert=True) + agreement_map.data = xr.where( + agreement_map_og.sel({'x': agreement_map.coords['x'], 'y': agreement_map.coords['y']}) == 10, + 10, + agreement_map, ) - stats_table_dictionary = {} # Initialize empty dictionary. + crosstab_table = agreement_map.gval.compute_crosstab() - (agreement_map, crosstab_table, metrics_table) = candidate_raster.gval.categorical_compare( - benchmark_map=benchmark_raster, - positive_categories=[1], - target_map="candidate", - negative_categories=[0], - comparison_function='pairing_dict', - pairing_dict=pairing_dictionary, + metrics_table = crosstab_table.gval.compute_categorical_metrics( + positive_categories=[1], negative_categories=[0], metrics="all" ) # Only write the agreement raster if user-specified. - if agreement_raster is not None: - agreement_map = agreement_map.rio.write_nodata(10, encoded=True) - agreement_map.rio.to_raster(agreement_raster, dtype=np.int32, driver="COG") + if agreement_raster != None: + agreement_map_write = agreement_map.rio.write_nodata(10, encoded=True) + agreement_map_write.rio.to_raster(agreement_raster, dtype=np.int32, driver="COG") + del agreement_map_write # Write legend text file legend_txt = os.path.join(os.path.split(agreement_raster)[0], 'read_me.txt') @@ -472,7 +496,7 @@ def get_stats_table_from_binary_rasters( } ) - del agreement_map, crosstab_table, metrics_table, all_masks, rasterized_mask_list + del crosstab_table, metrics_table # After agreement_array is masked with default mask layers, check for inclusion masks in mask_dict. if mask_dict != {}: @@ -481,10 +505,10 @@ def get_stats_table_from_binary_rasters( if operation == 'include': poly_path = mask_dict[poly_layer]['path'] - buffer_val = mask_dict[poly_layer]['buffer'] + buffer_val = 0 if mask_dict[poly_layer]['buffer'] is None else mask_dict[poly_layer]['buffer'] # Read mask bounds with candidate boundary box - poly_all = gpd.read_file(poly_path, bbox=candidate_raster.rio.bounds()) + poly_all = gpd.read_file(poly_path, bbox=agreement_map.rio.bounds()) # Make sure features are present in bounding box area before projecting. # Continue to next layer if features are absent. @@ -492,37 +516,38 @@ def get_stats_table_from_binary_rasters( del poly_all continue - poly_all_proj = poly_all.to_crs(candidate_raster.rio.crs) + poly_all_proj = poly_all.to_crs(agreement_map.rio.crs) # Buffer if buffer val exists - poly_all_proj = poly_all_proj.buffer(buffer_val) if buffer_val else poly_all_proj + poly_all_proj = poly_all_proj.buffer(buffer_val) if buffer_val != 0 else poly_all_proj - poly_all_proj['mask'] = 4 + poly_handle = poly_layer + '_b' + str(buffer_val) + 'm' - mask = make_geocube(poly_all_proj, ['mask'], like=candidate_raster).to_array() - candidate_raster.data = og_data - candidate_raster.data = xr.where( - (mask.data != 4) & (candidate_raster.isnull() == 0), 4, candidate_raster + # Do analysis on inclusion masked area + agreement_map_include = agreement_map.rio.clip(poly_all_proj['geometry']) + agreement_map_include.data = xr.where( + agreement_map_og.sel( + {'x': agreement_map_include.coords['x'], 'y': agreement_map_include.coords['y']} + ) + == 10, + 10, + agreement_map_include, ) - poly_handle = poly_layer + '_b' + str(buffer_val) + 'm' + crosstab_table = agreement_map_include.gval.compute_crosstab() - # Do analysis on inclusion masked area - (agreement_map, crosstab_table, metrics_table) = candidate_raster.gval.categorical_compare( - benchmark_map=benchmark_raster, - positive_categories=[1], - target_map="candidate", - negative_categories=[0], - comparison_function='pairing_dict', - pairing_dict=pairing_dictionary, + metrics_table = crosstab_table.gval.compute_categorical_metrics( + positive_categories=[1], negative_categories=[0], metrics="all" ) + if agreement_raster: # Write the layer_agreement_raster. layer_agreement_raster = os.path.join( os.path.split(agreement_raster)[0], poly_handle + '_agreement.tif' ) - agreement_map = agreement_map.rio.write_nodata(10, encoded=True) - agreement_map.rio.to_raster(layer_agreement_raster, dtype=np.int32, driver="COG") + agreement_map_write = agreement_map_include.rio.write_nodata(10, encoded=True) + agreement_map_write.rio.to_raster(layer_agreement_raster, dtype=np.int32, driver="COG") + del agreement_map_write # Update stats table dictionary stats_table_dictionary.update( @@ -530,14 +555,15 @@ def get_stats_table_from_binary_rasters( poly_handle: cross_walk_gval_fim( metric_df=metrics_table, cell_area=cell_area, - masked_count=np.sum(agreement_map.data == 4), + masked_count=np.sum(agreement_map_include.data == 4), ) } ) + del agreement_map_include - del poly_all, poly_all_proj, agreement_map, metrics_table, crosstab_table + del poly_all, poly_all_proj, metrics_table, crosstab_table - del candidate_raster, benchmark_raster, og_data + del agreement_map return stats_table_dictionary @@ -696,8 +722,7 @@ def aggregate_wbd_hucs(metadata_list, wbd_huc8_path, retain_attributes=False): dict_crs = crs_lookup.get(h_datum, 'EPSG:4269_ Assumed') # We want to know what sites were assumed, hence the split. src_crs, *message = dict_crs.split('_') - # Convert dataframe to geodataframe using lat/lon (USGS). - # Add attribute of assigned crs (label ones that are assumed) + # Convert dataframe to geodataframe using lat/lon (USGS). Add attribute of assigned crs (label ones that are assumed) site_gdf = gpd.GeoDataFrame( df, geometry=gpd.points_from_xy(df['usgs_preferred_longitude'], df['usgs_preferred_latitude']), @@ -740,12 +765,10 @@ def mainstem_nwm_segs(metadata_url, list_of_sites): ''' Define the mainstems network. Currently a 4 pass approach that probably needs refined. Once a final method is decided the code can be shortened. Passes are: - 1) Search downstream of gages designated as upstream. - This is done to hopefully reduce the issue of mapping starting at the nws_lid. 91038 segments + 1) Search downstream of gages designated as upstream. This is done to hopefully reduce the issue of mapping starting at the nws_lid. 91038 segments 2) Search downstream of all LID that are rfc_forecast_point = True. Additional 48,402 segments 3) Search downstream of all evaluated sites (sites with detailed FIM maps) Additional 222 segments - 4) Search downstream of all sites in HI/PR (locations have no rfc_forecast_point = True) - Additional 408 segments + 4) Search downstream of all sites in HI/PR (locations have no rfc_forecast_point = True) Additional 408 segments Parameters ---------- @@ -933,8 +956,7 @@ def get_thresholds(threshold_url, select_by, selector, threshold='all'): if threshold_data: stages = threshold_data['stage_values'] flows = threshold_data['calc_flow_values'] - # Add source information to stages and flows. Flows source inside a nested dictionary. - # Remove key once source assigned to flows. + # Add source information to stages and flows. Flows source inside a nested dictionary. Remove key once source assigned to flows. stages['source'] = threshold_data.get('metadata').get('threshold_source') flows['source'] = flows.get('rating_curve', {}).get('source') flows.pop('rating_curve', None) @@ -1028,8 +1050,7 @@ def get_datum(metadata): nws_datums['crs'] = metadata['nws_data']['horizontal_datum_name'] nws_datums['source'] = 'nws_data' - # Get site and datum information from usgs_data sub-dictionary. - # Use consistent naming between USGS and NWS sources. + # Get site and datum information from usgs_data sub-dictionary. Use consistent naming between USGS and NWS sources. usgs_datums = {} usgs_datums['nws_lid'] = metadata['identifiers']['nws_lid'] usgs_datums['usgs_site_code'] = metadata['identifiers']['usgs_site_code'] @@ -1220,29 +1241,25 @@ def get_rating_curve(rating_curve_url, location_ids): def select_grids(dataframe, stages, datum88, buffer): ''' Given a DataFrame (in a specific format), and a dictionary of stages, and the datum (in navd88). - loop through the available inundation datasets and find the datasets that are equal to or immediately - above the thresholds and only return 1 dataset per threshold (if any). + loop through the available inundation datasets and find the datasets that are equal to or immediately above the thresholds and only return 1 dataset per threshold (if any). Parameters ---------- dataframe : DataFrame - DataFrame that has to be in a specific format and contains the stages and paths to the - inundation datasets. + DataFrame that has to be in a specific format and contains the stages and paths to the inundation datasets. stages : DICT Dictionary of thresholds (key) and stages (values) datum88: FLOAT The datum associated with the LID that is pre-converted to NAVD88 (if needed) buffer: Float - Interval which the uppder bound can be assigned. For example, Threshold + buffer = upper bound. - Recommended to make buffer 0.1 greater than desired interval as code selects maps < and not <= + Interval which the uppder bound can be assigned. For example, Threshold + buffer = upper bound. Recommended to make buffer 0.1 greater than desired interval as code selects maps < and not <= Returns ------- maps : DICT Dictionary of threshold (key) and inundation dataset path (value) map_flows: DICT - Dictionary of threshold (key) and flows in CFS rounded to the nearest whole number associated - with the selected maps (value) + Dictionary of threshold (key) and flows in CFS rounded to the nearest whole number associated with the selected maps (value) ''' # Define threshold categories @@ -1289,9 +1306,7 @@ def select_grids(dataframe, stages, datum88, buffer): map_path = 'No Flow' map_flow = 'No Flow' - # If the selected value is not a number - # (or interpolated flow is nan caused by elevation of map which is beyond rating curve range), - # then map_path and map_flows are both set to 'No Map'. + # If the selected value is not a number (or interpolated flow is nan caused by elevation of map which is beyond rating curve range), then map_path and map_flows are both set to 'No Map'. else: map_path = 'No Map' map_flow = 'No Map' @@ -1318,8 +1333,7 @@ def select_grids(dataframe, stages, datum88, buffer): ####################################################################### def process_extent(extent, profile, output_raster=False): ''' - Convert raster to feature (using raster_to_feature), the footprint is used so all raster values are set - to 1 where there is data. + Convert raster to feature (using raster_to_feature), the footprint is used so all raster values are set to 1 where there is data. fill all donut holes in resulting feature. Filled geometry is then converted back to raster using same raster properties as input profile. Output raster will have be encoded as follows: @@ -1400,8 +1414,7 @@ def raster_to_feature(grid, profile_override=False, footprint_only=False): profile_override: rasterio Profile Default is False, If a rasterio Profile is supplied, it will dictate the transform and crs. footprint_only: BOOL - If true, dataset will be divided by itself to remove all unique values. If False, all values in - grid will be carried through on raster to feature conversion. default = False + If true, dataset will be divided by itself to remove all unique values. If False, all values in grid will be carried through on raster to feature conversion. default = False Returns ------- @@ -1502,25 +1515,22 @@ def process_grid(benchmark, benchmark_profile, domain, domain_profile, reference ) # Convert fitted benchmark dataset to boolean. 0 = NODATA Regions and 1 = Data Regions benchmark_fit_to_domain_bool = np.where(benchmark_fit_to_domain == benchmark.nodata, 0, 1) - # Merge domain datamask and benchmark data mask. New_nodata_value (2) = Domain NO DATA footprint, - # 0 = NO DATA for benchmark (within data region of domain), 1 = DATA region of benchmark. + # Merge domain datamask and benchmark data mask. New_nodata_value (2) = Domain NO DATA footprint, 0 = NO DATA for benchmark (within data region of domain), 1 = DATA region of benchmark. new_nodata_value = 2 classified_benchmark = np.where( domain_arr == domain.nodata, new_nodata_value, benchmark_fit_to_domain_bool ) - # Reproject classified benchmark to reference raster crs and resolution. + ## Reproject classified benchmark to reference raster crs and resolution. # Read in reference raster reference = rasterio.open(reference_raster) - # Determine the new transform and dimensions of reprojected/resampled classified benchmark dataset whose - # width, height, and bounds are same as domain dataset. - (new_benchmark_transform, new_benchmark_width, new_benchmark_height) = calculate_default_transform( + # Determine the new transform and dimensions of reprojected/resampled classified benchmark dataset whos width, height, and bounds are same as domain dataset. + new_benchmark_transform, new_benchmark_width, new_benchmark_height = calculate_default_transform( source_crs, reference.crs, domain.width, domain.height, *domain.bounds, resolution=reference.res ) # Define an empty array that is same dimensions as output by the "calculate_default_transform" command. classified_benchmark_projected = np.empty((new_benchmark_height, new_benchmark_width), dtype=np.uint8) - # Reproject and resample the classified benchmark dataset. Nearest Neighbor resampling due to integer - # values of classified benchmark. + # Reproject and resample the classified benchmark dataset. Nearest Neighbor resampling due to integer values of classified benchmark. reproject( classified_benchmark, destination=classified_benchmark_projected, @@ -1562,9 +1572,8 @@ def calculate_metrics_from_agreement_raster(agreement_raster): for idx, wind in agreement_raster.block_windows(1): window_data = agreement_raster.read(1, window=wind) values, counts = np.unique(window_data, return_counts=True) - # TODO values_counts is not defined, so commented for now... - # for val, cts in values_counts: - # totals[val] += cts + for val, cts in values_counts: + totals[val] += cts results = dict() for digit, count in totals.items(): From af093f9c89f71f11781299d1ecce69db8ffef0c8 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Thu, 26 Oct 2023 09:10:18 -0600 Subject: [PATCH 11/51] v4.4.5.0 Remove memory profile system (#1018) --- CONTRIBUTING.md | 2 +- Pipfile | 2 +- Pipfile.lock | 474 +++++++++----------- data/wbd/clip_vectors_to_wbd.py | 3 +- docs/CHANGELOG.md | 41 +- src/add_crosswalk.py | 3 +- src/adjust_thalweg_lateral.py | 3 - src/aggregate_by_huc.py | 6 +- src/agreedem.py | 3 - src/bathy_src_adjust_topwidth.py | 1 - src/burn_in_levees.py | 3 - src/check_huc_inputs.py | 7 +- src/delineate_hydros_and_produce_HAND.sh | 10 +- src/filter_catchments_and_add_attributes.py | 2 - src/make_stages_and_catchlist.py | 3 - src/mask_dem.py | 3 - src/reachID_grid_to_vector_points.py | 3 +- src/run_unit_wb.sh | 8 +- src/split_flows.py | 3 +- src/unique_pixel_and_allocation.py | 3 - src/usgs_gage_crosswalk.py | 2 - src/usgs_gage_unit_setup.py | 1 - src/utils/shared_functions.py | 11 - unit_tests/clip_vectors_to_wbd_test.py | 3 +- 24 files changed, 283 insertions(+), 317 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5cb51d7b5..f51276063 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ > All contributions to this project will be released to the public domain. > By submitting a pull request or filing a bug, issue, or > feature request, you are agreeing to comply with this waiver of copyright interest. -> Details can be found in our [TERMS](TERMS.md) and [LICENSE](LICENSE). +> Details can be found in our [LICENSE](LICENSE). There are two primary ways to help: diff --git a/Pipfile b/Pipfile index 636fbe26c..85d6d7fe8 100755 --- a/Pipfile +++ b/Pipfile @@ -20,7 +20,6 @@ tqdm = "==4.65.0" seaborn = "==0.12.2" python-dotenv = "==1.0.0" natsort = "==8.3.1" -memory-profiler = "==0.61.0" xarray = "==2023.1.0" netcdf4 = "==1.6.3" tables = "==3.8.0" @@ -43,6 +42,7 @@ black = "==23.7.0" pyproject-flake8 = "==6.0.0.post1" pre-commit = "==3.3.3" isort = "==5.12.0" +urllib3 = "==1.26.18" [requires] python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index 78c257106..cdb131185 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c05e13cee1824291db432c5f40d2ed7eed74349a1bba77ddb2deb852cd533734" + "sha256": "c7f9ee645e067007d14cfcb885a4a4a4c8c720ed6b17f42c07328378ee8c1121" }, "pipfile-spec": 6, "requires": { @@ -29,7 +29,7 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version >= '3.7' and python_version < '4.0'", + "markers": "python_version >= '3.7' and python_version < '4'", "version": "==22.1.0" }, "aiosqlite": { @@ -115,11 +115,11 @@ }, "babel": { "hashes": [ - "sha256:04c3e2d28d2b7681644508f836be388ae49e0cfe91465095340395b60d00f210", - "sha256:fbfcae1575ff78e26c7449136f1abbefc3c13ce542eeb13d43d50d8b047216ec" + "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", + "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" ], "markers": "python_version >= '3.7'", - "version": "==2.13.0" + "version": "==2.13.1" }, "backcall": { "hashes": [ @@ -133,7 +133,7 @@ "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==4.12.2" }, "black": { @@ -162,7 +162,6 @@ "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==23.7.0" }, "bleach": { @@ -206,7 +205,6 @@ "sha256:d388cb7f54f1a3056f91ffcfb5cf18b226454204e5df7a5c10774718c3fbb166" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.26.109" }, "botocore": { @@ -308,11 +306,11 @@ }, "cachetools": { "hashes": [ - "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590", - "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b" + "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2", + "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1" ], "markers": "python_version >= '3.7'", - "version": "==5.3.1" + "version": "==5.3.2" }, "certifi": { "hashes": [ @@ -320,7 +318,6 @@ "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2023.7.22" }, "cffi": { @@ -391,126 +388,126 @@ }, "cftime": { "hashes": [ - "sha256:055d5d60a756c6c1857cf84d77655bb707057bb6c4a4fbb104a550e76c40aad9", - "sha256:07fdef2f75a0f0952b0376fa4cd08ef8a1dad3b963976ac07517811d434936b7", - "sha256:0955e1f3e1c09a9e0296b50f135ff9719cb2466f81c8ad4a10ef06fa394de984", - "sha256:29c18601abea0fd160fbe423e05c7a56fe1d38dd250a6b010de499a132d3fe18", - "sha256:2abdac6ca5b8b6102f319122546739dfc42406b816c16f2a98a8f0cd406d3bf0", - "sha256:2ba7909a0cd4adcb16797d8d6ab2767e7ddb980b2bf9dbabfc71b3bdd94f072b", - "sha256:3042048324b4d6a1066c978ec78101effdd84320e8862bfdbf8122d7ad7588ec", - "sha256:455cec3627e6ca8694b0d9201da6581eb4381b58389f1fbcb51a14fa0e2b3d94", - "sha256:56d0242fc4990584b265622622b25bb262a178097711d2d95e53ef52a9d23e7e", - "sha256:8614c00fb8a5046de304fdd86dbd224f99408185d7b245ac6628d0276596e6d2", - "sha256:86fe550b94525c327578a90b2e13418ca5ba6c636d5efe3edec310e631757eea", - "sha256:892d5dc38f8b998c83a2a01f131e63896d020586de473e1878f9e85acc70ad44", - "sha256:8d49d69c64cee2c175478eed84c3a57fce083da4ceebce16440f72be561a8489", - "sha256:93f00f454329c1f2588ebca2650e8edf7607d6189dbdcc81b5f3be2080155cc4", - "sha256:acb294fdb80e33545ae54b4421df35c4e578708a5ffce1c00408b2294e70ecef", - "sha256:aedfb7a783d19d7a30cb41951310f3bfe98f9f21fffc723c8af08a11962b0b17", - "sha256:afb5b38b51b8bc02f1656a9f15c52b0b20a3999adbe1ab9ac57f926e0065b48a", - "sha256:b4d2a1920f0aad663f25700b30621ff64af373499e52b544da1148dd8c09409a", - "sha256:e83db2fdda900eb154a9f79dfb665ac6190781c61d2e18151996de5ee7ffd8a2", - "sha256:eb7f8cd0996640b83020133b5ef6b97fc9216c3129eaeeaca361abdff5d82166", - "sha256:ee70fa069802652cf534de1dd3fc590b7d22d4127447bf96ac9849abcdadadf1" + "sha256:022dabf1610cdd04a693e730fa8f71d307059717f29dba921e7486e553412bb4", + "sha256:0a38eb9f5c733a23e1714bd3ef2762ed5acee34f127670f8fb4ad6464946f6b3", + "sha256:2d113a01ab924445e61d65c26bbd95bc08e4a22878d3b947064bba056c884c4a", + "sha256:3b86be8c2f254147be4ba88f12099466dde457a4a3a21de6c69d52a7224c13ae", + "sha256:3cf6e216a4c06f9a628cdf8e9c9d5e8097fb3eb02dd087dd14ab3b18478a7271", + "sha256:4d6fbd5f41b322cfa7b0ac3aaadeceb4450100a164b5bccbbb9e7c5048489a88", + "sha256:523b9a6bf03f5e36407979e248381d0fcab2d225b915bbde77d00c6dde192b90", + "sha256:5f11685663a6af97418908060492a07663c16d42519c139ca03c2ffb1377fd25", + "sha256:80eb1170ce1639016f55760847f4aadd04b0312496c5bac2797e930914bba48d", + "sha256:8a14d2c7d22fd2a6dfa6ad563283b6d6679f1df95e0ed8d14b8f284dad402887", + "sha256:8d2c01456d9d7b46aa710a41d1c711a50d5ea259aff4a987d0e973d1093bc922", + "sha256:9eb177a02db7cd84aa6962278e4bd2d3106a545de82e6aacd9404f1e153661db", + "sha256:a98abb1d46d118e52b0611ce668a0b714b407be26177ef0581ecf5e95f894725", + "sha256:b62d42546fa5c914dfea5b15a9aaed2087ea1211cc36d08c374502ef95892038", + "sha256:bbf782ab4ac0605bdec2b941952c897595613203942b7f8c2fccd17efa5147df", + "sha256:bedb577bc8b8f3f10f5336c0792e5dae88605781890f50f36b45bb46907968e8", + "sha256:d0a6b29f72a13f08e008b9becff247cc75c84acb213332ede18879c5b6aa4dfd", + "sha256:d87dadd0824262bdd7493babd2a44447da0a22175ded8ae9e060a3aebec7c5d7", + "sha256:d9b00c2844c7a1701d8ede5336b6321dfee256ceab81a34a1aff0483d56891a6", + "sha256:eb6dd70b2ccabfe1a14b7fbb0bbdce0418e71697094373c0d573c880790fa291", + "sha256:f9878bfd8c1c3f24184ecbd528f739ba46ebaceaf1c8a24d348d7befb117a285" ], - "markers": "python_version >= '3.7'", - "version": "==1.6.2" + "markers": "python_version >= '3.8'", + "version": "==1.6.3" }, "charset-normalizer": { "hashes": [ - "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843", - "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786", - "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e", - "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8", - "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4", - "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa", - "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d", - "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82", - "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7", - "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895", - "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d", - "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a", - "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382", - "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678", - "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b", - "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e", - "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741", - "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4", - "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596", - "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9", - "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69", - "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c", - "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77", - "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13", - "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459", - "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e", - "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7", - "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908", - "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a", - "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f", - "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8", - "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482", - "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d", - "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d", - "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545", - "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34", - "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86", - "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6", - "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe", - "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e", - "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc", - "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7", - "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd", - "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c", - "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557", - "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a", - "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89", - "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078", - "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e", - "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4", - "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403", - "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0", - "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89", - "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115", - "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9", - "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05", - "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a", - "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec", - "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56", - "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38", - "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479", - "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c", - "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e", - "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd", - "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186", - "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455", - "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c", - "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65", - "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78", - "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287", - "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df", - "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43", - "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1", - "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7", - "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989", - "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a", - "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63", - "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884", - "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649", - "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810", - "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828", - "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4", - "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2", - "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd", - "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5", - "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe", - "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293", - "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e", - "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e", - "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.0" + "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5", + "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93", + "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a", + "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d", + "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c", + "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1", + "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58", + "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2", + "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557", + "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147", + "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041", + "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2", + "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2", + "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7", + "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296", + "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690", + "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67", + "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57", + "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597", + "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846", + "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b", + "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97", + "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c", + "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62", + "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa", + "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f", + "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e", + "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821", + "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3", + "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4", + "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb", + "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727", + "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514", + "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d", + "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761", + "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55", + "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f", + "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c", + "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034", + "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6", + "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae", + "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1", + "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14", + "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1", + "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228", + "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708", + "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48", + "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f", + "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5", + "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f", + "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4", + "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8", + "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff", + "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61", + "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b", + "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97", + "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b", + "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605", + "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728", + "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d", + "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c", + "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf", + "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673", + "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1", + "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b", + "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41", + "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8", + "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f", + "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4", + "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008", + "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9", + "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5", + "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f", + "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e", + "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273", + "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45", + "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e", + "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656", + "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e", + "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c", + "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2", + "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72", + "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056", + "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397", + "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42", + "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd", + "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3", + "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213", + "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf", + "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67" + ], + "markers": "python_version >= '3.7'", + "version": "==3.3.1" }, "click": { "hashes": [ @@ -635,67 +632,67 @@ }, "cython": { "hashes": [ - "sha256:0147a31fb73a063bb7b6c69fd843c1a2bad18f326f58048d4ee5bdaef87c9fbf", - "sha256:056340c49bf7861eb1eba941423e67620b7c85e264e9a5594163f1d1e8b95acc", - "sha256:0630527a8c9e8fed815c38524e418dab713f5d66f6ac9dc2151b41f3a7727304", - "sha256:0e1c9385e99eef299396b9a1e39790e81819446c6a83e249f6f0fc71a64f57a0", - "sha256:14b898ec2fdeea68f81bd3838b035800b173b59ed532674f65a82724bab35d3b", - "sha256:1571b045ec1cb15c152c3949f3bd53ee0fa66d434271ea3d225658d99b7e721a", - "sha256:176953a8a2532e34a589625a40c934ff339088f2bf4ddaa2e5cb77b05ca0c25c", - "sha256:188705eeae094bb716bc3e3d0da4e13469f0a0de803b65dfd63fe7eb78ec6173", - "sha256:18f4fb7cc6ad8e99e8f387ebbcded171a701bfbfd8cd3fd46156bf44bb4fd968", - "sha256:1d3416c24a1b7bf3a2d9615a7f9f12b00fac0b94fb2e61449e0c1ecf20d6ed52", - "sha256:1ec9e15b821ef7e3c38abe9e4df4e6dda7af159325bc358afd5a3c2d5027ccfe", - "sha256:22d268c3023f405e13aa0c1600389794694ab3671614f8e782d89a1055da0858", - "sha256:30c1d9bd2bcb9b1a195dd23b359771857df8ebd4a1038fb37dd155d3ea38c09c", - "sha256:3192cd780435fca5ae5d79006b48cbf0ea674853b5a7b0055a122045bff9d84e", - "sha256:327309301b01f729f173a94511cb2280c87ba03c89ed428e88f913f778245030", - "sha256:3cfbd60137f6fca9c29101d7517d4e341e0fd279ffc2489634e5e2dd592457c2", - "sha256:3db04801fd15d826174f63ff45878d4b1e62aff27cf1ea96b186581052d24446", - "sha256:42b1ff0e19fb4d1fe68b60f55d46942ed246a323f6bbeec302924b78b4c3b637", - "sha256:48bae87b657009e5648c21d4a92de9f3dc6fed3e35e92957fa8a07a18cea2313", - "sha256:4c8e5afcc19861c3b22faafbe906c7e1b23f0595073ac10e21a80dec9e60e7dd", - "sha256:4cc0f7244da06fdc6a4a7240df788805436b6fb7f20edee777eb77777d9d2eb1", - "sha256:4e956383e57d00b1fa6449b5ec03b9fa5fce2afd41ef3e518bee8e7c89f1616c", - "sha256:51850f277660f67171135515e45edfc8815f723ff20768e39cb9785b2671062f", - "sha256:5545d20d7a1c0cf17559152f7f4a465c3d5caace82dd051f82e2d753ae9fd956", - "sha256:587d664ff6bd5b03611ddc6ef320b7f8677d824c45d15553f16a69191a643843", - "sha256:59bf689409b0e51ef673e3dd0348727aef5b67e40f23f806be64c49cee321de0", - "sha256:5d6af87a787d5ce063e28e508fee34755a945e438c68ecda50eb4ea34c30e13f", - "sha256:66b7e71c16cab0814945014ffb101ead2b173259098bbb1b8138e7a547da3709", - "sha256:6ccde14ddc4b424435cb5722aa1529c254bbf3611e1ad9baea12d25e9c049361", - "sha256:6f05889eb1b5a95a7adf97303279c2d13819ff62292e10337e6c940dbf570b5d", - "sha256:6f63e959d13775472d37e731b2450d120e8db87e956e2de74475e8f17a89b1fb", - "sha256:74ba0f11b384246b7965169f08bf67d426e4957fee5c165571340217a9b43cfc", - "sha256:75d42c8423ab299396f3c938445730600e32e4a2f0298f6f9df4d4a698fe8e16", - "sha256:77a920ae19fa1db5adb8a618cebb095ca4f56adfbf9fc32cb7008a590607b62b", - "sha256:80bd3167e689419cdaf7ede0d20a9f126b9698a43b1f8d3e8f54b970c7a6cd07", - "sha256:84084fa05cf9a67a85818fa72a741d1cae2e3096551158730730a3bafc3b2f52", - "sha256:845e24ee70c204062e03f813114751387abf454b29410336797582e04abbc07b", - "sha256:85073ab414ff432d2a39d36cb49c39ce69f30b53daccc7699bfad0ce3d1b539a", - "sha256:8a6a9a2d98758768052e4ac1bea4ebc20fae69b4c19cb2bc5457c9174532d302", - "sha256:8e78fc42a6e846941d23aba1aca587520ad38c8970255242f08f9288b0eeba85", - "sha256:9296f332523d5c550ebae694483874d255264cff3281372f25ea5f2739b96651", - "sha256:94fa403de3a413cd41b8eb4ddb4adcbd66aa0a64f9a84d1c5f696c93572c83aa", - "sha256:9eb128fa40305f18eaa4d8dd0980033b92db86aada927181d3c3d561aa0634db", - "sha256:9f40b27545d583fd7df0d3c1b76b3bcaf8a72dbd8d83d5486af2384015660de8", - "sha256:b50f4f75f89e7eef2ed9c9b60746bc4ab1ba2bc0dff64587133db2b63e068f09", - "sha256:be1a679c7ad90813f9206c9d62993f3bd0cba9330668e97bb3f70c87ae94d5f5", - "sha256:bff1fec968a6b2ca452ae9bff6d6d0bf8486427d4d791e85543240266b6915e0", - "sha256:d0c7b315f6feb75e2c949dc7816da5626cdca097fea1c0d9f4fdb20d2f4ffc2a", - "sha256:d12591939af93c59defea6fc5320ca099eb44e4694e3b2cbe72fb24406079b97", - "sha256:d49d20db27c9cfcf45bb1fbf68f777bd1e04e4b949e4e5172d9ee8c9419bc792", - "sha256:d52ed47edbf48392dd0f419135e7ff59673f6b32d27d3ffc9e61a515571c050d", - "sha256:db9d4de4cd6cd3ad1c3f455aae877ad81a92b92b7cbb01dfb32b6306b873932b", - "sha256:e3ad109bdf40f55318e001cad12bcc00e8119569b49f72e442c082355617b036", - "sha256:e40ac8bd6d11355d354bb4975bb88f6e923ba30f85e38f1f1234b642634e4fc4", - "sha256:e729fd633a5225570c5480b36e7c530c8a82e2ab6d2944ddbe1ddfff5bf181b1", - "sha256:f0ac9ec822fad010248b4a59ac197975de38c95378d0f13201c181dd9b0a2624", - "sha256:f7578b59ffd0d9c95ae6f7ae852309918915998b7fe0ed2f8725a683de8da276", - "sha256:fa08259f4d176b86561eeff6954f9924099c0b0c128fc2cbfc18343c068ad8ca" + "sha256:0021350f6d7022a37f598320460b84b2c0daccf6bb65641bbdbc8b990bdf4ad2", + "sha256:003ccc40e0867770db0018274977d1874e4df64983d5e3e36937f107e0b2fdf6", + "sha256:0422a40a58dcfbb54c8b4e125461d741031ff046bc678475cc7a6c801d2a7721", + "sha256:0612439f810cc281e51fead69de0545c4d9772a1e82149c119d1aafc1f6210ba", + "sha256:061dec1be8d8b601b160582609a78eb08324a4ccf21bee0d04853a3e9dfcbefd", + "sha256:0650460b5fd6f16da4186e0a769b47db5532601e306f3b5d17941283d5e36d24", + "sha256:07d0e69959f267b79ffd18ece8599711ad2f3d3ed1eddd0d4812d2a97de2b912", + "sha256:096cb461bf8d913a4327d93ea38d18bc3dbc577a71d805be04754e4b2cc2c45d", + "sha256:0aa2a6bb3ff67794d8d1dafaed22913adcbb327e96eca3ac44e2f3ba4a0ae446", + "sha256:0fc9e974419cc0393072b1e9a669f71c3b34209636d2005ff8620687daa82b8c", + "sha256:0fe227d6d8e2ea030e82abc8a3e361e31447b66849f8c069caa783999e54a8f2", + "sha256:10b426adc3027d66303f5c7aa8b254d10ed80827ff5cce9e892d550b708dc044", + "sha256:146bfaab567157f4aa34114a37e3f98a3d9c4527ee99d4fd730cab56482bd3cf", + "sha256:15d52f7f9d08b264c042aa508bf457f53654b55f533e0262e146002b1c15d1cd", + "sha256:19a64bf2591272348ab08bcd4a5f884259cc3186f008c9038b8ec7d01f847fd5", + "sha256:207f53893ca22d8c8f5db533f38382eb7ddc2d0b4ab51699bf052423a6febdad", + "sha256:28af4e7dff1742cb0f0a4823102c89c62a2d94115b68f718145fcfe0763c6e21", + "sha256:28de18f0d07eb34e2dd7b022ac30beab0fdd277846d07b7a08e69e6294f0762b", + "sha256:2e379b491ee985d31e5faaf050f79f4a8f59f482835906efe4477b33b4fbe9ff", + "sha256:36299ffd5663203c25d3a76980f077e23b6d4f574d142f0f43943f57be445639", + "sha256:4355a2cb03b257773c0d2bb6af9818c72e836a9b09986e28f52e323d87b1fc67", + "sha256:48b35ab009227ee6188991b5666aae1936b82a944f707c042cef267709de12b5", + "sha256:48cda82eb82ad2014d2ad194442ed3c46156366be98e4e02f3e29742cdbf94a0", + "sha256:4e8c144e2c5814e46868d1f81e2f4265ca1f314a8187d0420cd76e9563294cf8", + "sha256:58cdfdd942cf5ffcee974aabfe9b9e26c0c1538fd31c1b03596d40405f7f4d40", + "sha256:5b906997e7b98d7d29b84d10a5318993eba1aaff82ff7e1a0ac00254307913d7", + "sha256:6603a287188dcbc36358a73a7be43e8a2ecf0c6a06835bdfdd1b113943afdd6f", + "sha256:6619264ed43d8d8819d4f1cdb8a62ab66f87e92f06f3ff3e2533fd95a9945e59", + "sha256:6a0b92adfcac68dcf549daddec83c87a86995caa6f87bfb6f72de4797e1a6ad6", + "sha256:6da74000a672eac0d7cf02adc140b2f9c7d54eae6c196e615a1b5deb694d9203", + "sha256:8529cf09919263a6826adc04c5dde9f1406dd7920929b16be19ee9848110e353", + "sha256:861979428f749faa9883dc4e11e8c3fc2c29bd0031cf49661604459b53ea7c66", + "sha256:8692249732d62e049df3884fa601b70fad3358703e137aceeb581e5860e7d9b7", + "sha256:8a9262408f05eef039981479b38b38252d5b853992e5bc54a2d2dd05a2a0178e", + "sha256:8ada3659608795bb36930d9a206b8dd6b865d85e2999a02ce8b34f3195d88301", + "sha256:9d31d76ed777a8a85be3f8f7f1cfef09b3bc33f6ec4abee1067dcef107f49778", + "sha256:b3ddfc6f05410095ec11491dde05f50973e501567d21cbfcf5832d95f141878a", + "sha256:b72c426df1586f967b1c61d2f8236702d75c6bbf34abdc258a59e09155a16414", + "sha256:b86871862bd65806ba0d0aa2b9c77fcdcc6cbd8d36196688f4896a34bb626334", + "sha256:bc42004f181373cd3b39bbacfb71a5b0606ed6e4c199c940cca2212ba0f79525", + "sha256:beb367fd88fc6ba8c204786f680229106d99da72a60f5906c85fc8d73640b01a", + "sha256:bf671d712816b48fa2731799017ed68e5e440922d0c7e13dc825c226639ff766", + "sha256:c0fb9e7cf9db38918f19a803fab9bc7b2ed3f33a9e8319c616c464a0a8501b8d", + "sha256:c214f6e88ecdc8ff5d13f0914890445fdaad21bddc34a90cd14aeb3ad5e55e2e", + "sha256:c2215f436ce3cce49e6e318cb8f7253cfc4d3bea690777c2a5dd52ae93342504", + "sha256:c7a7dd7c50d07718a5ac2bdea166085565f7217cf1e030cc07c22a8b80a406a7", + "sha256:c8e0f98d950987b0f9d5e10c41236bef5cb4fba701c6e680af0b9734faa3a85e", + "sha256:c9b1322f0d8ce5445fcc3a625b966f10c4182190026713e217d6f38d29930cb1", + "sha256:d40d4135f76fb0ed4caa2d422fdb4231616615698709d3c421ecc733f1ac7ca0", + "sha256:d5a55749509c7f9f8a33bf9cc02cf76fd6564fcb38f486e43d2858145d735953", + "sha256:e5e2859f97e9cceb8e70b0934c56157038b8b083245898593008162a70536d7e", + "sha256:e84988d384dfba678387ea7e4f68786c3703543018d473605d9299c69a07f197", + "sha256:ef4b144c5b29b4ea0b40c401458b86df8d75382b2e5d03e9f67f607c05b516a9", + "sha256:f124ac9ee41e1bfdfb16f53f1db85de296cd2144a4e8fdee8c3560a8fe9b6d5d", + "sha256:f234bc46043856d118ebd94b13ea29df674503bc94ced3d81ca46a1ad5b5b9ae", + "sha256:f24114e1777604a28ae1c7a56a2c9964655f1031edecc448ad51e5abb19a279b", + "sha256:f7fcd93d15deceb2747b10266a39deccd94f257d610f3bbd52a7e16bc5908eda", + "sha256:fc96efa617184b8581a02663e261b41c13a605da8ef4ba1ed735bf46184f815e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.3" + "version": "==3.0.4" }, "dask": { "hashes": [ @@ -835,7 +832,6 @@ "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0" }, "flox": { @@ -903,11 +899,11 @@ }, "fsspec": { "hashes": [ - "sha256:603dbc52c75b84da501b9b2ec8c11e1f61c25984c4a0dda1f129ef391fbfc9b4", - "sha256:80bfb8c70cc27b2178cc62a935ecf242fc6e8c3fb801f9c571fc01b1e715ba7d" + "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5", + "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529" ], "markers": "python_version >= '3.8'", - "version": "==2023.9.2" + "version": "==2023.10.0" }, "geocube": { "hashes": [ @@ -931,7 +927,6 @@ "sha256:0acdacddefa176525e4da6d9aeeece225da26055c4becdc6e97cf40fa97c27f4" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.12.2" }, "geopy": { @@ -1068,11 +1063,11 @@ }, "ipykernel": { "hashes": [ - "sha256:2e2ee359baba19f10251b99415bb39de1e97d04e1fab385646f24f0596510b77", - "sha256:f468ddd1f17acb48c8ce67fcfa49ba6d46d4f9ac0438c1f441be7c3d1372230b" + "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c", + "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404" ], "markers": "python_version >= '3.8'", - "version": "==6.25.2" + "version": "==6.26.0" }, "ipympl": { "hashes": [ @@ -1118,7 +1113,6 @@ "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==5.12.0" }, "jedi": { @@ -1226,11 +1220,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:b11e2ba80667c75f55630faf8ac3d5809f8734f9006d65cce117c46a0a516ab8", - "sha256:c57270faa6530393ae69783a2d2f1874c718b9f109080581ea076b05713249fa" + "sha256:21ad1a3d455d5a79ce4bef5201925cd17510c17898cf9d54e3ccfb6b12734948", + "sha256:9ba71be4b9c16e479e4c50c929f8ac4b1015baf90237a08681397a98c76c7e5e" ], "markers": "python_version >= '3.8'", - "version": "==2.8.0" + "version": "==2.9.1" }, "jupyter-server-fileid": { "hashes": [ @@ -1270,7 +1264,6 @@ "sha256:6aba0caa771697d02fbf409f9767b2fdb4ee32ce935940e3b9a0d5d48d994d0f" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.6.3" }, "jupyterlab-pygments": { @@ -1578,15 +1571,6 @@ "markers": "python_version >= '3.6'", "version": "==0.7.0" }, - "memory-profiler": { - "hashes": [ - "sha256:400348e61031e3942ad4d4109d18753b2fb08c2f6fb8290671c5513a34182d84", - "sha256:4e5b73d7864a1d1292fb76a03e82a3e78ef934d06828a698d9dada76da2067b0" - ], - "index": "pypi", - "markers": "python_version >= '3.5'", - "version": "==0.61.0" - }, "mercantile": { "hashes": [ "sha256:30f457a73ee88261aab787b7069d85961a5703bb09dc57a170190bc042cd023f", @@ -1717,7 +1701,6 @@ "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==8.3.1" }, "nbclassic": { @@ -1733,7 +1716,7 @@ "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548", "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55" ], - "markers": "python_full_version >= '3.8.0'", + "markers": "python_version >= '3.8'", "version": "==0.8.0" }, "nbconvert": { @@ -1791,7 +1774,6 @@ "sha256:f94a89db78f34fdf68342840efb064fe1474310e8359dffce42e90a9ddf88f2f" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.6.3" }, "nodeenv": { @@ -1850,7 +1832,6 @@ "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.56.4" }, "numexpr": { @@ -1921,7 +1902,6 @@ "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.23.5" }, "numpy-groupies": { @@ -1983,7 +1963,6 @@ "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.0.2" }, "pandera": { @@ -2004,11 +1983,11 @@ }, "param": { "hashes": [ - "sha256:59d55048d42a85e148a69837df42bd11c3391d47fad15ba57d118e145f001ef2", - "sha256:a2e3b7b07ca7dd1adaa4fb3020a3ef4fe434f27ede453a9d94194c5155677e30" + "sha256:0153a06fb0049fab73132d7faf4c468d44ad77ee00d531702b0bf222c069f9b6", + "sha256:19823383b0dac5a794152b85336cb4c6b0d0ef61a2b1eb7cd272aae141be0117" ], - "markers": "python_version >= '2.7'", - "version": "==1.13.0" + "markers": "python_version >= '3.8'", + "version": "==2.0.0" }, "parso": { "hashes": [ @@ -2139,7 +2118,6 @@ "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.3.3" }, "prometheus-client": { @@ -2155,7 +2133,7 @@ "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.39" }, "psutil": { @@ -2177,7 +2155,7 @@ "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d", "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "markers": "sys_platform != 'cygwin'", "version": "==5.9.6" }, "psycopg2-binary": { @@ -2246,7 +2224,6 @@ "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2.9.6" }, "ptyprocess": { @@ -2276,7 +2253,6 @@ "sha256:94d0c24217f6582741813ee94490a4ca82bd5f9bf35e4f8610cb588cf7445764" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.20.4" }, "pyarrow": { @@ -2308,7 +2284,6 @@ "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==11.0.0" }, "pybcj": { @@ -2645,7 +2620,6 @@ "sha256:fde5ece4d2436b5a57c8f5f97b49b5de06a856d03959f836c957d3e609f2de7e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.5.0" }, "pyproject-flake8": { @@ -2654,7 +2628,6 @@ "sha256:d43421caca0ef8a672874405fe63c722b0333e3c22c41648c6df60f21bab2b6b" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0.post1" }, "pytest": { @@ -2663,7 +2636,6 @@ "sha256:933051fa1bfbd38a21e73c3960cebdad4cf59483ddba7696c48509727e17f201" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==7.3.0" }, "python-dateutil": { @@ -2680,7 +2652,6 @@ "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.0.0" }, "python-json-logger": { @@ -2974,11 +2945,11 @@ }, "qtpy": { "hashes": [ - "sha256:4d4f045a41e09ac9fa57fcb47ef05781aa5af294a0a646acc1b729d14225e741", - "sha256:db2d508167aa6106781565c8da5c6f1487debacba33519cedc35fa8997d424d4" + "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", + "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" ], "markers": "python_version >= '3.7'", - "version": "==2.4.0" + "version": "==2.4.1" }, "rasterio": { "hashes": [ @@ -3001,7 +2972,6 @@ "sha256:eaaeb2e661d1ffc07a7ae4fd997bb326d3561f641178126102842d608a010cc3" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.3.6" }, "rasterstats": { @@ -3010,7 +2980,6 @@ "sha256:29389bfcbeac1a4206aba6e1d795058ec8a64d560efad48156c27fad97c2e09a" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.18.0" }, "referencing": { @@ -3234,7 +3203,6 @@ "sha256:f5120da3a1b96f3a7a17dd6af0afdd4e6f3cc9baa87e9ee0a272882f01f980bb" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.0.1" }, "s3transfer": { @@ -3270,7 +3238,6 @@ "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1" ], "index": "pypi", - "markers": "python_version < '3.12' and python_version >= '3.8'", "version": "==1.10.1" }, "seaborn": { @@ -3279,7 +3246,6 @@ "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.12.2" }, "send2trash": { @@ -3340,7 +3306,6 @@ "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==2.0.1" }, "simplejson": { @@ -3444,7 +3409,7 @@ "sha256:febffa5b1eda6622d44b245b0685aff6fb555ce0ed734e2d7b1c3acd018a2cff", "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded" ], - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.19.2" }, "six": { @@ -3506,7 +3471,6 @@ "sha256:f0821007048f2af8c1a21eb3d832072046c5df366e39587a7c7e4afad14e73fc" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.8.0" }, "terminado": { @@ -3571,16 +3535,15 @@ "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.65.0" }, "traitlets": { "hashes": [ - "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e", - "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae" + "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47", + "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35" ], "markers": "python_version >= '3.8'", - "version": "==5.11.2" + "version": "==5.12.0" }, "typeguard": { "hashes": [ @@ -3629,19 +3592,19 @@ }, "urllib3": { "hashes": [ - "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21", - "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b" + "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07", + "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.26.17" + "index": "pypi", + "version": "==1.26.18" }, "virtualenv": { "hashes": [ - "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b", - "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752" + "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af", + "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381" ], "markers": "python_version >= '3.7'", - "version": "==20.24.5" + "version": "==20.24.6" }, "wcwidth": { "hashes": [ @@ -3775,7 +3738,6 @@ "sha256:7e530b1deafdd43e5c2b577d0944e6b528fbe88045fd849e49a8d11871ecd522" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2023.1.0" }, "xarray-spatial": { @@ -3972,7 +3934,7 @@ "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.39" }, "ptyprocess": { @@ -4014,11 +3976,11 @@ }, "traitlets": { "hashes": [ - "sha256:7564b5bf8d38c40fa45498072bf4dc5e8346eb087bbf1e2ae2d8774f6a0f078e", - "sha256:98277f247f18b2c5cabaf4af369187754f4fb0e85911d473f72329db8a7f4fae" + "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47", + "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35" ], "markers": "python_version >= '3.8'", - "version": "==5.11.2" + "version": "==5.12.0" }, "typing-extensions": { "hashes": [ diff --git a/data/wbd/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py index 44e877291..2bf752bbb 100755 --- a/data/wbd/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -8,11 +8,10 @@ import rasterio as rio from shapely.geometry import MultiPolygon, Polygon -from utils.shared_functions import getDriver, mem_profile +from utils.shared_functions import getDriver from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS -@mem_profile def subset_vector_layers( subset_nwm_lakes, subset_nwm_streams, diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1f09873dd..a6b6c8352 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,46 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) + +During a recent BED attempt which added the new pre-clip system, it was erroring out on a number of hucs. It was issuing an error in the add_crosswalk.py script. While a minor bug does exist there, after a wide number of tests, the true culprit is the memory profile system embedded throughout FIM. This system has been around for at least a few years but not in use. It is not 100% clear why it became a problem with the addition of pre-clip, but that changes how records are loaded which likely affected memory at random times. + +This PR removes that system. + +A couple of other minor updates were made: +- Update to the pip files (also carried forward changes from other current PRs) +- When a huc or huc list is provided to fim_pipeline, it goes to a script, check_huc_inputs.py, to ensure that the incoming HUCs are valid and in that list. In the previous code it looks for all files with the file name pattern of "included_huc*.lst". However, we now only want it to check against the file "included_huc8.list". + +### Changes +- `CONTRIBUTING.md`: Text update. +- `Pipfile` and `Pipfile.lock`: updated to remove tghe memory-profiler package, update gval to 0.2.3 and update urllib3 to 1.26.18. +- `data/wbd` + - `clip_vectors_to_wbd.py`: remove profiler + - `src` + - `add_crosswalk.py`: remove profiler + - `add_thalweg_lateral.py`: remove profiler. + - `aggregate_by_huc.py`: remove profiler and small text correction. + - `agreedem.py`: remove profiler. + - `bathy_src_adjust_topwidth.py`: remove profiler. + - `burn_in_levees.py`: remove profiler. + - `check_huc_inputs.py`: changed test pattern to just look against `included_huc8.lst`. + - `delineate_hydros_and_produce_HAND.sh`: remove profiler. + - `filter_catchments_and_add_attributes.py`: remove profiler. + - `make_stages_and_catchlist.py` remove profiler. + - `mask_dem.py`: remove profiler. + - `reachID_grid_to_vector_points.py`: remove profiler. + - `run_unit_wb.sh`: remove profiler. + - `split_flows.py`: remove profiler. + - `unique_pixel_and_allocation.py`: remove profiler. + - `usgs_gage_crosswalk.py`: remove profiler. + - `usgs_gage_unit_setup.py`: remove profiler. + - `utils` + - `shared_functions`: remove profiler. + ` unit_tests` + - `clip_vectors_to_wbd_tests.py`: Linting tools change order of the imports. + +

+ ## v4.4.4.1 - 2023-10-26 - [PR#1007](https://github.com/NOAA-OWP/inundation-mapping/pull/1007) Updates GVAL to address memory and performance issues associated with running synthesize test cases. @@ -13,7 +53,6 @@ Updates GVAL to address memory and performance issues associated with running sy - `tools/run_test_case.py` - `tools/synthesize_test_cases.py` - `tools/inundate_mosaic_wrapper` -

## v4.4.4.0 - 2023-10-20 - [PR#1012](https://github.com/NOAA-OWP/inundation-mapping/pull/1012) diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index 3f0a5f5c0..fd7c8c450 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -9,14 +9,13 @@ from numpy import unique from rasterstats import zonal_stats -from utils.shared_functions import getDriver, mem_profile +from utils.shared_functions import getDriver from utils.shared_variables import FIM_ID # TODO - Feb 17, 2023 - We want to explore using FR methodology as branch zero -@mem_profile def add_crosswalk( input_catchments_fileName, input_flows_fileName, diff --git a/src/adjust_thalweg_lateral.py b/src/adjust_thalweg_lateral.py index dabfbd488..5a55b61fc 100755 --- a/src/adjust_thalweg_lateral.py +++ b/src/adjust_thalweg_lateral.py @@ -7,10 +7,7 @@ import rasterio from numba import njit, typed, types -from utils.shared_functions import mem_profile - -@mem_profile def adjust_thalweg_laterally( elevation_raster, stream_raster, diff --git a/src/aggregate_by_huc.py b/src/aggregate_by_huc.py index a6128869b..5a6912543 100644 --- a/src/aggregate_by_huc.py +++ b/src/aggregate_by_huc.py @@ -292,9 +292,9 @@ def aggregate_by_huc( if num_job_workers > total_cpus_available: raise ValueError( f'The number of jobs {num_job_workers}' - 'exceeds your machine\'s available CPU count minus two. ' - 'Please lower the number of jobs ' - 'values accordingly.' + ' exceeds your machine\'s available CPU count minus two.' + ' Please lower the number of jobs' + ' values accordingly.' ) # create log folder, might end up empty but at least create the folder diff --git a/src/agreedem.py b/src/agreedem.py index 2aae80647..437d129ac 100755 --- a/src/agreedem.py +++ b/src/agreedem.py @@ -6,10 +6,7 @@ import rasterio import whitebox -from utils.shared_functions import mem_profile - -@mem_profile def agreedem( rivers_raster, dem, diff --git a/src/bathy_src_adjust_topwidth.py b/src/bathy_src_adjust_topwidth.py index 4ce6ccf9c..c2db145d0 100644 --- a/src/bathy_src_adjust_topwidth.py +++ b/src/bathy_src_adjust_topwidth.py @@ -15,7 +15,6 @@ sns.set_theme(style="whitegrid") -# from utils.shared_functions import mem_profile """ Estimate feature_id missing bathymetry in the raw channel geometry using input bankfull regression geometry diff --git a/src/burn_in_levees.py b/src/burn_in_levees.py index b7e08c916..17fb460d6 100755 --- a/src/burn_in_levees.py +++ b/src/burn_in_levees.py @@ -5,10 +5,7 @@ import numpy as np import rasterio -from utils.shared_functions import mem_profile - -@mem_profile def burn_in_levees(dem_filename, nld_filename, out_dem_filename): # TODO Document this code with rasterio.open(dem_filename) as dem, rasterio.open(nld_filename) as nld: diff --git a/src/check_huc_inputs.py b/src/check_huc_inputs.py index 83e78100c..ef58280d0 100755 --- a/src/check_huc_inputs.py +++ b/src/check_huc_inputs.py @@ -10,7 +10,12 @@ def __read_included_files(parent_dir_path): - filename_patterns = glob(os.path.join(parent_dir_path, 'included_huc*.lst')) + # TODO: Oct25, 2023: Previously we had this test done against multiple huc lists. + # Now in FIM4 we only want it to check against the one file 'included_huc8.lst'. + # I have just replaced the pattern, but later we might want to clean this up. + + # filename_patterns = glob(os.path.join(parent_dir_path, 'included_huc*.lst')) + filename_patterns = glob(os.path.join(parent_dir_path, 'included_huc8.lst')) accepted_hucs_set = set() for filename in filename_patterns: diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 6c16af193..2b04da494 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -20,7 +20,7 @@ if [ "$mask_leveed_area_toggle" = "True" ] && [ -f $tempHucDataDir/LeveeProtecte echo -e $startDiv"Mask levee-protected areas from DEM (*Overwrite dem_meters.tif output) $hucNumber $branch_zero_id" date -u Tstart - python3 -m memory_profiler $srcDir/mask_dem.py \ + python3 $srcDir/mask_dem.py \ -dem $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -nld $tempHucDataDir/LeveeProtectedAreas_subset.gpkg \ -out $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ @@ -55,7 +55,7 @@ Tcount echo -e $startDiv"Preprocessing for lateral thalweg adjustment $hucNumber $current_branch_id" date -u Tstart -python3 -m memory_profiler $srcDir/unique_pixel_and_allocation.py \ +python3 $srcDir/unique_pixel_and_allocation.py \ -s $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -o $tempCurrentBranchDataDir/demDerived_streamPixels_ids_$current_branch_id.tif Tcount @@ -64,7 +64,7 @@ Tcount echo -e $startDiv"Performing lateral thalweg adjustment $hucNumber $current_branch_id" date -u Tstart -python3 -m memory_profiler $srcDir/adjust_thalweg_lateral.py \ +python3 $srcDir/adjust_thalweg_lateral.py \ -e $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -s $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -a $tempCurrentBranchDataDir/demDerived_streamPixels_ids_"$current_branch_id"_allo.tif \ @@ -210,7 +210,7 @@ Tcount echo -e $startDiv"Process catchments and model streams $hucNumber $current_branch_id" date -u Tstart -python3 -m memory_profiler $srcDir/filter_catchments_and_add_attributes.py \ +python3 $srcDir/filter_catchments_and_add_attributes.py \ -i $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.gpkg \ -f $tempCurrentBranchDataDir/demDerived_reaches_split_$current_branch_id.gpkg \ -c $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.gpkg \ @@ -283,7 +283,7 @@ echo -e $startDiv"Finalize catchments and model streams $hucNumber $current_bran date -u Tstart -python3 -m memory_profiler $srcDir/add_crosswalk.py \ +python3 $srcDir/add_crosswalk.py \ -d $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.gpkg \ -a $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$current_branch_id.gpkg \ -s $tempCurrentBranchDataDir/src_base_$current_branch_id.csv \ diff --git a/src/filter_catchments_and_add_attributes.py b/src/filter_catchments_and_add_attributes.py index a638f7a84..bef42fd35 100755 --- a/src/filter_catchments_and_add_attributes.py +++ b/src/filter_catchments_and_add_attributes.py @@ -7,11 +7,9 @@ import numpy as np from utils.fim_enums import FIM_exit_codes -from utils.shared_functions import mem_profile from utils.shared_variables import FIM_ID -@mem_profile def filter_catchments_and_add_attributes( input_catchments_filename, input_flows_filename, diff --git a/src/make_stages_and_catchlist.py b/src/make_stages_and_catchlist.py index 8c2e7e6da..c8007ed19 100755 --- a/src/make_stages_and_catchlist.py +++ b/src/make_stages_and_catchlist.py @@ -6,10 +6,7 @@ import geopandas as gpd import numpy as np -from utils.shared_functions import mem_profile - -@mem_profile def make_stages_and_catchlist( flows_filename, catchments_filename, diff --git a/src/mask_dem.py b/src/mask_dem.py index 9f441c3b6..a303eb0c2 100755 --- a/src/mask_dem.py +++ b/src/mask_dem.py @@ -9,10 +9,7 @@ import rasterio as rio from rasterio.mask import mask -from utils.shared_functions import mem_profile - -@mem_profile def mask_dem( dem_filename: str, nld_filename: str, diff --git a/src/reachID_grid_to_vector_points.py b/src/reachID_grid_to_vector_points.py index 84ac2eab3..912bc719f 100755 --- a/src/reachID_grid_to_vector_points.py +++ b/src/reachID_grid_to_vector_points.py @@ -7,11 +7,10 @@ import rasterio from shapely.geometry import Point -from utils.shared_functions import getDriver, mem_profile +from utils.shared_functions import getDriver from utils.shared_variables import PREP_PROJECTION -@mem_profile def convert_grid_cells_to_points(raster, index_option, output_points_filename=False): # Input raster if isinstance(raster, str): diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 13be08314..4dc8a4898 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -140,7 +140,7 @@ date -u Tstart # REMAINS UNTESTED FOR AREAS WITH LEVEES [ -f $tempCurrentBranchDataDir/nld_rasterized_elev_$branch_zero_id.tif ] && \ -python3 -m memory_profiler $srcDir/burn_in_levees.py \ +python3 $srcDir/burn_in_levees.py \ -dem $tempHucDataDir/dem_meters.tif \ -nld $tempCurrentBranchDataDir/nld_rasterized_elev_$branch_zero_id.tif \ -out $tempHucDataDir/dem_meters.tif @@ -181,7 +181,7 @@ Tcount echo -e $startDiv"Creating AGREE DEM using $agree_DEM_buffer meter buffer $hucNumber $branch_zero_id" date -u Tstart -python3 -m memory_profiler $srcDir/agreedem.py \ +python3 $srcDir/agreedem.py \ -r $tempCurrentBranchDataDir/flows_grid_boolean_$branch_zero_id.tif \ -d $tempHucDataDir/dem_meters.tif \ -w $tempCurrentBranchDataDir \ @@ -198,7 +198,7 @@ if [ "$levelpaths_exist" = "1" ]; then echo -e $startDiv"Creating AGREE DEM using $agree_DEM_buffer meter buffer $hucNumber (Branches)" date -u Tstart - python3 -m memory_profiler $srcDir/agreedem.py -r $tempHucDataDir/flows_grid_boolean.tif \ + python3 $srcDir/agreedem.py -r $tempHucDataDir/flows_grid_boolean.tif \ -d $tempHucDataDir/dem_meters.tif \ -w $tempHucDataDir \ -o $tempHucDataDir/dem_burned.tif \ @@ -273,7 +273,7 @@ if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then echo -e $startDiv"Assigning USGS gages to branches for $hucNumber" date -u Tstart - python3 -m memory_profiler $srcDir/usgs_gage_unit_setup.py \ + python3 $srcDir/usgs_gage_unit_setup.py \ -gages $inputsDir/usgs_gages/usgs_gages.gpkg \ -nwm $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg \ -ras $inputsDir/rating_curve/ras2fim_exports/reformat_ras_rating_curve_points.gpkg \ diff --git a/src/split_flows.py b/src/split_flows.py index 1cd86abee..b44d59deb 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -26,11 +26,10 @@ import build_stream_traversal from utils.fim_enums import FIM_exit_codes -from utils.shared_functions import getDriver, mem_profile +from utils.shared_functions import getDriver from utils.shared_variables import FIM_ID -@mem_profile def split_flows( flows_filename, dem_filename, diff --git a/src/unique_pixel_and_allocation.py b/src/unique_pixel_and_allocation.py index 3e242a547..e5c71e61d 100755 --- a/src/unique_pixel_and_allocation.py +++ b/src/unique_pixel_and_allocation.py @@ -11,10 +11,7 @@ import rasterio import whitebox -from utils.shared_functions import mem_profile - -@mem_profile def stream_pixel_zones(stream_pixels, unique_stream_pixels): ''' This function will assign a unique ID for each stream pixel and writes to file. It then uses this raster to run GRASS r.grow.distance tool to create the allocation and proximity rasters required to complete the lateral thalweg conditioning. diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index 75af9695a..6adba78d4 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -8,8 +8,6 @@ import geopandas as gpd import rasterio -from utils.shared_functions import mem_profile - warnings.simplefilter("ignore") diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index 246803a02..8ef766aaa 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -10,7 +10,6 @@ import pandas as pd from shapely.geometry import Point -from utils.shared_functions import mem_profile from utils.shared_variables import PREP_CRS diff --git a/src/utils/shared_functions.py b/src/utils/shared_functions.py index f0b7dfaf5..aacc3b687 100644 --- a/src/utils/shared_functions.py +++ b/src/utils/shared_functions.py @@ -13,7 +13,6 @@ import numpy as np import pandas as pd import rasterio -from memory_profiler import profile from tqdm import tqdm import utils.shared_variables as sv @@ -185,16 +184,6 @@ def update_raster_profile(args): return elev_m_filename -def mem_profile(func): - def wrapper(*args, **kwargs): - if os.environ.get('mem') == "1": - profile(func)(*args, **kwargs) - else: - func(*args, **kwargs) - - return wrapper - - ######################################################################## # Function to check the age of a file (use for flagging potentially outdated input) ######################################################################## diff --git a/unit_tests/clip_vectors_to_wbd_test.py b/unit_tests/clip_vectors_to_wbd_test.py index 015d797ae..2930883db 100644 --- a/unit_tests/clip_vectors_to_wbd_test.py +++ b/unit_tests/clip_vectors_to_wbd_test.py @@ -4,11 +4,10 @@ import os import unittest +import clip_vectors_to_wbd as src import pytest from unit_tests_utils import FIM_unit_test_helpers as ut_helpers -import clip_vectors_to_wbd as src - class test_clip_vectors_to_wbd(unittest.TestCase): From c13bff35e8212024dca9153b7b8406ff61a4ac59 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 17 Nov 2023 10:37:46 -0700 Subject: [PATCH 12/51] v4.4.6.0 Add acquire for South Alaska and download them (#1031) --- data/usgs/acquire_and_preprocess_3dep_dems.py | 212 +++++++++++++----- docs/CHANGELOG.md | 24 ++ src/utils/shared_validators.py | 69 ++++++ 3 files changed, 245 insertions(+), 60 deletions(-) create mode 100644 src/utils/shared_validators.py diff --git a/data/usgs/acquire_and_preprocess_3dep_dems.py b/data/usgs/acquire_and_preprocess_3dep_dems.py index 7c3c9e1cd..3e08dc14c 100644 --- a/data/usgs/acquire_and_preprocess_3dep_dems.py +++ b/data/usgs/acquire_and_preprocess_3dep_dems.py @@ -4,6 +4,7 @@ import glob import logging import os +import shutil import subprocess import sys import traceback @@ -14,14 +15,13 @@ import pandas as pd import utils.shared_functions as sf -import utils.shared_variables as sv +import utils.shared_validators as val from utils.shared_functions import FIM_Helpers as fh ''' TODO: - - Change to change resolution (which means URL, block size also ahve to be parameterize) - - if creating polygons, take out some of the hardcoding. + - Add input args for resolution size, which means URL and block size also hve to be parameterized. ''' @@ -36,28 +36,34 @@ def acquire_and_preprocess_3dep_dems( - extent_file_path, target_output_folder_path='', number_of_jobs=1, retry=False, skip_polygons=False + extent_file_path, + target_output_folder_path='', + number_of_jobs=1, + retry=False, + skip_polygons=False, + target_projection='EPSG:5070', ): ''' Overview ---------- This will download 3dep rasters from USGS using USGS vrts. By default USGS 3Dep stores all their rasters in lat/long (northing and easting). - By us downloading the rasters using WBD HUC6 clips and gdal, we an accomplish a few extra - steps. + By us downloading the rasters using WBD HUC8 (or whatever domain) clips and gdal, we can + accomplish a few extra steps. 1) Ensure the projection types that are downloaded are consistant and controlled. - We are going to download them as NAD83 basic (espg: 4269) which is consistant - with other data sources, even though FIM defaults to ESRI:102039. We will - change that as we add the clipped version per HUC8. - 2) ensure we are adjusting blocksizes, compression and other raster params - 3) Create the 3dep rasters in the size we want (default at HUC4 for now) + 2) Ensure we are adjusting blocksizes, compression and other raster params. + 3) Create the 3dep rasters in the size we want. Notes: - - It really can be used for any huc size. + - It really can be used for any huc size or any extent poly as long as it is 10m. - As this is a very low use tool, most values such as the USGS vrt path, output - folder paths, etc are all hardcoded - - You can really submit any polys of any HUC size as it as long as it is 10m - resolution for now. + file names, etc are all hardcoded + - Currently there is no tools to extract the WBD HUC8's that are applicable. You will want + a gkpg for each download extent (ie. HUC8, HUC6, whatever. Make a folder of each extent + file you want. ie) a folder of WBD HUC8's. One gkpg per HUC8 (or whatever size you like) + - When we originally used this tool for CONUS+, we loaded them in HUC6's, but now + with selected HUC8's for South Alaska, we will use input extent files as WBD HUC8. + - We have a separate tool to create a VRT of any folder of rasters. Parameters ---------- @@ -78,7 +84,13 @@ def acquire_and_preprocess_3dep_dems( the projected one, then skip it - skip_polygons (bool) - If True, then we will not attempt to create polygon files for each dem file. + If True, then we will not attempt to create polygon files for each dem file. If false, + an domain gpkg which covers the extent of all included features merged. It will automatically + be named DEM_Domain.gkpg and saved in the same folderd as the target_output_folder_path. + + - target_projection (String) + Projection of the output DEMS and polygons (if included) + ''' # ------------------- @@ -86,10 +98,10 @@ def acquire_and_preprocess_3dep_dems( total_cpus_available = os.cpu_count() - 1 if number_of_jobs > total_cpus_available: raise ValueError( - f'The number of jobs provided: {number_of_jobs} , ' - f'exceeds your machine\'s available CPU count minus one. ' - f'Please lower the number of jobs ' - f'value accordingly.' + f'The number of jobs provided: {number_of_jobs} ,' + ' exceeds your machine\'s available CPU count minus one.' + ' Please lower the number of jobs' + ' value accordingly.' ) if not os.path.exists(extent_file_path): @@ -99,11 +111,55 @@ def acquire_and_preprocess_3dep_dems( target_output_folder_path = os.environ['usgs_3dep_dems_10m'] if not os.path.exists(target_output_folder_path): - raise ValueError(f"Output folder path {target_output_folder_path} does not exist") + # It is ok if the child diretory does not exist, but the parent folder must + # parent directory + parent_dir = os.path.abspath(os.path.join(target_output_folder_path, os.pardir)) + print(parent_dir) + if not os.path.exists(parent_dir): + raise ValueError( + f"For the output path of {target_output_folder_path}, the child directory" + " need not exist but the parent folder must." + ) + os.makedirs(target_output_folder_path) + else: # path exists + if not retry: + file_list = os.listdir(target_output_folder_path) + if len(file_list) > 0: + print() + msg = f"The target output folder of {target_output_folder_path} appears to not be empty.\n\n" + "Do you want to empty the folder first?\n" + " -- Type 'overwrite' if you want to empty the folder and continue.\n" + " -- Type any other value to abort and stop the program.\n" + " ?=" + + resp = input(msg).lower() + if resp == "overwrite": + shutil.rmtree(target_output_folder_path) + os.mkdir(target_output_folder_path) + else: + print("Program stopped\n") + sys.exit(0) + else: # might want to retry but the folder isn't there yet + # It is ok if the child diretory does not exist, but the parent folder must + # parent directory, we want to reset it + parent_dir = os.path.abspath(os.path.join(target_output_folder_path, os.pardir)) + print(parent_dir) + if not os.path.exists(parent_dir): + raise ValueError( + f"For the output path of {target_output_folder_path}, the child directory" + " need not exist but the parent folder must." + ) + shutil.rmtree(target_output_folder_path) + os.mkdir(target_output_folder_path) + + # I don't need the crs_number for now + crs_is_valid, err_msg, crs_number = val.is_valid_crs(target_projection) + if crs_is_valid is False: + raise ValueError(err_msg) # ------------------- # setup logs - start_time = datetime.now() + start_time = datetime.utcnow() fh.print_start_header('Loading 3dep dems', start_time) # print(f"Downloading to {target_output_folder_path}") @@ -120,12 +176,14 @@ def acquire_and_preprocess_3dep_dems( logging.info(msg) # download dems, setting projection, block size, etc - __download_usgs_dems(extent_file_names, target_output_folder_path, number_of_jobs, retry) + __download_usgs_dems( + extent_file_names, target_output_folder_path, number_of_jobs, retry, target_projection + ) if skip_polygons is False: polygonize(target_output_folder_path) - end_time = datetime.now() + end_time = datetime.utcnow() fh.print_end_header('Loading 3dep dems', start_time, end_time) print() @@ -137,7 +195,7 @@ def acquire_and_preprocess_3dep_dems( logging.info(fh.print_date_time_duration(start_time, end_time)) -def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry): +def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry, target_projection): ''' Process: ---------- @@ -167,6 +225,15 @@ def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry base_cmd += ' -co "TILED=YES" -co "COMPRESS=LZW" -co "BIGTIFF=YES" -tr 10 10' base_cmd += ' -t_srs {3} -cblend 6' + """ + e.q. gdalwarp + /vs/icurl/https://prd-tnm.s3.amazonaws.com/StagedProducts/Elevation/13/TIFF/USGS_Seamless_DEM_13.vrt + /data/inputs/usgs/3dep_dems/10m/HUC8_12090301_dem.tif + -cutline /data/inputs/wbd/HUC8/HUC8_12090301.gpkg + -crop_to_cutline -ot Float32 -r bilinear -of "GTiff" -overwrite -co "BLOCKXSIZE=256" -co "BLOCKYSIZE=256" + -co "TILED=YES" -co "COMPRESS=LZW" -co "BIGTIFF=YES" -tr 10 10 -t_srs ESRI:102039 -cblend 6 + """ + with ProcessPoolExecutor(max_workers=number_of_jobs) as executor: executor_dict = {} @@ -175,6 +242,7 @@ def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry 'extent_file': extent_file, 'output_folder_path': output_folder_path, 'download_url': __USGS_3DEP_10M_VRT_URL, + 'target_projection': target_projection, 'base_cmd': base_cmd, 'retry': retry, } @@ -200,7 +268,7 @@ def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry print("==========================================================") -def download_usgs_dem_file(extent_file, output_folder_path, download_url, base_cmd, retry): +def download_usgs_dem_file(extent_file, output_folder_path, download_url, target_projection, base_cmd, retry): ''' Process: ---------- @@ -217,15 +285,10 @@ def download_usgs_dem_file(extent_file, output_folder_path, download_url, base_c - download_url (str) URL for the USGS download site (note: Should include '/vsicurl/' at the front of the URL) + - target_projection (str) + ie) EPSG:5070 or EPSG:2276, etc - base_cmd (str) The basic GDAL command with string formatting wholes for key values. - See the cmd variable below. - ie) - base_cmd = 'gdalwarp {0} {1}' - base_cmd += ' -cutline {2} -crop_to_cutline -ot Float32 -r bilinear' - base_cmd += ' -of "GTiff" -overwrite -co "BLOCKXSIZE=256" -co "BLOCKYSIZE=256"' - base_cmd += ' -co "TILED=YES" -co "COMPRESS=LZW" -co "BIGTIFF=YES" -tr 10 10' - base_cmd += ' -t_srs {3} -cblend 6' - retry (bool) If True, and the file exists, downloading will be skipped. @@ -249,44 +312,59 @@ def download_usgs_dem_file(extent_file, output_folder_path, download_url, base_c print(msg) logging.info(msg) - cmd = base_cmd.format(download_url, target_path_raw, extent_file, sv.DEFAULT_FIM_PROJECTION_CRS) - # PREP_PROJECTION_EPSG - # fh.vprint(f"cmd is {cmd}", self.is_verbose, True) + cmd = base_cmd.format(download_url, target_path_raw, extent_file, target_projection) # print(f"cmd is {cmd}") # didn't use Popen becuase of how it interacts with multi proc # was creating some issues. Run worked much better. - process = subprocess.run( - cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True, universal_newlines=True - ) - msg = process.stdout - print(msg) - logging.info(msg) + try: + process = subprocess.run( + cmd, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, + ) - if process.stderr != "": - if "ERROR" in process.stderr.upper(): - msg = f" - Downloading -- {target_file_name_raw}" f" ERROR -- details: ({process.stderr})" - print(msg) - logging.error(msg) - os.remove(target_path_raw) - else: - msg = f" - Downloading -- {target_file_name_raw} - Complete" + msg = process.stdout print(msg) logging.info(msg) + if process.stderr != "": + if "ERROR" in process.stderr.upper(): + msg = f" - Downloading -- {target_file_name_raw}" f" ERROR -- details: ({process.stderr})" + print(msg) + logging.error(msg) + os.remove(target_path_raw) + else: + msg = f" - Downloading -- {target_file_name_raw} - Complete" + print(msg) + logging.info(msg) + except Exception: + msg = "An exception occurred while downloading files." + print(msg) + print(traceback.format_exc()) + logging.critical(traceback.format_exc()) + sys.exit(1) + def polygonize(target_output_folder_path): """ - Create a polygon of 3DEP domain from individual HUC6 DEMS which are then dissolved into a single polygon + Create a polygon of 3DEP domain from individual HUC DEMS which are then dissolved into a single polygon """ - dem_domain_file = os.path.join(target_output_folder_path, 'HUC6_dem_domain.gpkg') + dem_domain_file = os.path.join(target_output_folder_path, 'DEM_Domain.gpkg') msg = f" - Polygonizing -- {dem_domain_file} - Started" print(msg) logging.info(msg) dem_files = glob.glob(os.path.join(target_output_folder_path, '*_dem.tif')) + + if len(dem_files) == 0: + raise Exception("There are no DEMs to polygonize") + dem_gpkgs = gpd.GeoDataFrame() for n, dem_file in enumerate(dem_files): @@ -328,6 +406,7 @@ def polygonize(target_output_folder_path): dem_gpkgs = pd.concat([dem_gpkgs, gdf]) os.remove(edge_tif) + os.remove(edge_gpkg) dem_gpkgs['DN'] = 1 dem_dissolved = dem_gpkgs.dissolve(by='DN') @@ -344,7 +423,7 @@ def polygonize(target_output_folder_path): def __setup_logger(output_folder_path): - start_time = datetime.now() + start_time = datetime.utcnow() file_dt_string = start_time.strftime("%Y_%m_%d-%H_%M_%S") log_file_name = f"3Dep_downloaded-{file_dt_string}.log" @@ -359,7 +438,7 @@ def __setup_logger(output_folder_path): logger.addHandler(file_handler) logger.setLevel(logging.DEBUG) - logging.info(f'Started : {start_time.strftime("%m/%d/%Y %H:%M:%S")}') + logging.info(f'Started (UTC): {start_time.strftime("%m/%d/%Y %H:%M:%S")}') logging.info("----------------") @@ -393,6 +472,10 @@ def __setup_logger(output_folder_path): We left in HUC2 of 19 (alaska) as we hope to get there in the semi near future They need to be removed from the input src clip directory in the first place. They can not be reliably removed in code. + + (Update Nov 2023): South Alaska (not all of HUC2 = 19) is now included but not all of Alaska. + A separate output directory will be keep for South Alaska and will use EPSG:3338 versus the FIM + default of EPSG:5070 ''' parser = argparse.ArgumentParser(description='Acquires and preprocesses USGS 3Dep dems') @@ -400,8 +483,8 @@ def __setup_logger(output_folder_path): parser.add_argument( '-e', '--extent_file_path', - help='location the gpkg files that will' - ' are being used as clip regions (ie: huc4_*.gpkg).' + help='REQUIRED: location the gpkg files that will' + ' are being used as clip regions (ie: huc8_*.gpkg).' ' All gpkgs in this folder will be used.', required=True, ) @@ -409,7 +492,7 @@ def __setup_logger(output_folder_path): parser.add_argument( '-j', '--number_of_jobs', - help='Number of (jobs) cores/processes to used.', + help='OPTIONAL: Number of (jobs) cores/processes to used.', required=False, default=1, type=int, @@ -418,7 +501,8 @@ def __setup_logger(output_folder_path): parser.add_argument( '-r', '--retry', - help='If included, it will skip files that already exist.' ' Default is all will be loaded/reloaded.', + help='OPTIONAL: If included, it will skip files that already exist.' + 'Default is all will be loaded/reloaded.', required=False, action='store_true', default=False, @@ -427,7 +511,7 @@ def __setup_logger(output_folder_path): parser.add_argument( '-t', '--target_output_folder_path', - help='location of where the 3dep files' ' will be saved', + help='OPTIONAL: location of where the 3dep files will be saved.', required=False, default='', ) @@ -435,12 +519,20 @@ def __setup_logger(output_folder_path): parser.add_argument( '-sp', '--skip_polygons', - help='If this flag is included, polygons of the dems' ' will not be made', + help='OPTIONAL: If this flag is included, polygons of the dems will not be made.', required=False, action='store_true', default=False, ) + parser.add_argument( + '-proj', + '--target_projection', + help='OPTIONAL: Desired output CRS. Defaults to EPSG:5070', + required=False, + default='EPSG:5070', + ) + # Extract to dictionary and assign to variables. args = vars(parser.parse_args()) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a6b6c8352..7d9369013 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,30 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.6.0 - 2023-11-17 - [PR#1031](https://github.com/NOAA-OWP/inundation-mapping/pull/1031) + +Upgrade our acquire 3Dep DEMs script to pull down South Alaska HUCS with its own CRS. + +The previous set of DEMs run for FIM and it's related vrt already included all of Alaska, and those have not been re-run. FIM code will be updated in the near future to detect if the HUC starts with a `19` with slight different logic, so it can preserve the CRS of EPSG:3338 all the way to final FIM outputs. See [792 ](https://github.com/NOAA-OWP/inundation-mapping/issues/792)for new integration into FIM. + +A new vrt for the new South Alaska DEMs was also run with no changes required. + +This issue closes [1028](https://github.com/NOAA-OWP/inundation-mapping/issues/1028). + +### Additions +- `src/utils` + - `shared_validators.py`: A new script where we can put in code to validate more complex arguments for python scripts. Currently has one for validating CRS values. It does valid if the CRS value is legitimate but does check a bunch of formatting including that it starts with either the name of `EPSG` or `ESRI` + +### Changes +- `data/usgs` + - `aquire_and_preprocess_3dep_dems.py`: Changes include: + - Add new input arg for desired target projection and logic to support an incoming CRS. + - Updated logic for pre-existing output folders and `on-the-fly` question to users during execution if they want to overwrite the output folder (if applicable). + - Changed date/times to utc. + - Upgraded error handing for the gdal "processing" call. + +

+ ## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) During a recent BED attempt which added the new pre-clip system, it was erroring out on a number of hucs. It was issuing an error in the add_crosswalk.py script. While a minor bug does exist there, after a wide number of tests, the true culprit is the memory profile system embedded throughout FIM. This system has been around for at least a few years but not in use. It is not 100% clear why it became a problem with the addition of pre-clip, but that changes how records are loaded which likely affected memory at random times. diff --git a/src/utils/shared_validators.py b/src/utils/shared_validators.py new file mode 100644 index 000000000..b51251283 --- /dev/null +++ b/src/utils/shared_validators.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python3 + +#################################################################### +""" +This script is for validation of inputs and objects that can be used in py files. +""" + + +# ------------------------------------------------- +def is_valid_crs(crs): + """ + Processing: + - not counting case, the first for chars must be either EPSG or ESRI + - crs number must be between 4 and 6 digits + Inputs: + - crs (str): in pattern such as EPSG:2277 + + Returns three values + - First is bool (True or False). True meaning it is a valid crs + - Second is a string, which might be empty, but if failed, then this will be the reason for failure + - Third is the raw crs number in case you need it. ie) 2277 or 107239 + + It is up to the calling code to decide if an exception should be raised. + + Usage: + valid_crs, err_msg, crs_number = is_valid_crs(arg_crs) + + (if you choose to hand it this way....) + if (valid_crs == False): + raise ValueError(err_msg) + + """ + + err_msg = "" + + if crs == "": + err_msg = "The crs value can not be blank or empty" + return False, err_msg, "" + + if ":" not in crs: + err_msg = "crs appears to be invalid (missing colon)" + return False, err_msg, "" + + crs_seg = crs.split(":") + + if len(crs_seg) != 2: + err_msg = "crs appears to be invalid" + return False, err_msg, "" + + crs_type = str(crs_seg[0]).upper() + if (crs_type != "ESRI") and (crs_type != "EPSG"): + err_msg = "crs type is not EPSG OR ESRI (not case-senstive)" + return False, err_msg, "" + + crs_number = str(crs_seg[1]) + + if crs_number.isnumeric() is False: + err_msg = "value after the colon is not a number. ie) 2277" + return False, err_msg, "" + + if (len(crs_number) < 4) or (len(crs_number) > 6): + err_msg = "crs_number portion is expected to be between 4 and 6 digits" + return False, err_msg, "" + + if crs_number[0] == "0": + err_msg = "crs_number portion can not start with a zero" + return False, err_msg, "" + + return True, "", crs_number From 89c7023b895c59abd7acb12174ecd032ec7608cb Mon Sep 17 00:00:00 2001 From: Rob Gonzalez-Pita Date: Fri, 17 Nov 2023 10:41:42 -0700 Subject: [PATCH 13/51] v4.4.7.0 Add CI - GitHub Actions Workflow file (#1030) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add GitHub Actions workflow file, update files to remove flake8 E721 errors * Update Changelog, remove pflake8 reference in pre-commit-config.yaml * Pass all unit_tests, skipping 2 * Conform unit_tests/clip_vectors_to_wbd_test.py to isort standard, update CHANGELOG * Update CONTRIBUTING.md * fix encoding issue * Update unit tests, remove unit_tests/tools directory, update README * Adhere to isort auto-fix * Bump pyarrow from 11.0.0 to 14.0.1 Bumps [pyarrow](https://github.com/apache/arrow) from 11.0.0 to 14.0.1. - [Commits](https://github.com/apache/arrow/compare/go/v11.0.0...apache-arrow-14.0.1) --- updated-dependencies: - dependency-name: pyarrow dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update CHANGELOG.md --------- Signed-off-by: dependabot[bot] Co-authored-by: “RobHanna-NOAA” <“Robert.Hanna@NOAA.gov”> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> --- .github/workflows/lint_and_format.yaml | 22 + .pre-commit-config.yaml | 5 +- CONTRIBUTING.md | 2 +- Pipfile | 4 +- Pipfile.lock | 1065 ++++++++--------- data/wbd/generate_pre_clip_fim_huc8.py | 2 +- data/write_parquet_from_calib_pts.py | 2 +- docs/CHANGELOG.md | 47 + src/check_huc_inputs.py | 5 +- src/src_adjust_ras2fim_rating.py | 4 +- tools/eval_plots.py | 4 +- tools/generate_categorical_fim_mapping.py | 2 +- tools/hash_compare.py | 2 +- tools/inundate_mosaic_wrapper.py | 3 +- tools/inundation_wrapper_nwm_flows.py | 2 +- tools/mosaic_inundation.py | 2 +- unit_tests/README.md | 15 +- unit_tests/clip_vectors_to_wbd_test.py | 9 +- ..._catchments_and_add_attributes_params.json | 8 +- .../{tools => }/inundate_gms_params.json | 0 unit_tests/{tools => }/inundate_gms_test.py | 3 +- unit_tests/{tools => }/inundation_params.json | 0 unit_tests/{tools => }/inundation_test.py | 0 unit_tests/outputs_cleanup_params.json | 4 +- unit_tests/outputs_cleanup_test.py | 2 +- unit_tests/split_flows_params.json | 8 +- unit_tests/tools/__init__.py | 0 unit_tests/usgs_gage_crosswalk_params.json | 13 +- unit_tests/usgs_gage_crosswalk_test.py | 2 +- 29 files changed, 638 insertions(+), 599 deletions(-) create mode 100644 .github/workflows/lint_and_format.yaml mode change 100755 => 100644 Pipfile rename unit_tests/{tools => }/inundate_gms_params.json (100%) rename unit_tests/{tools => }/inundate_gms_test.py (97%) rename unit_tests/{tools => }/inundation_params.json (100%) rename unit_tests/{tools => }/inundation_test.py (100%) delete mode 100644 unit_tests/tools/__init__.py diff --git a/.github/workflows/lint_and_format.yaml b/.github/workflows/lint_and_format.yaml new file mode 100644 index 000000000..0032cd083 --- /dev/null +++ b/.github/workflows/lint_and_format.yaml @@ -0,0 +1,22 @@ +name: Lint and Format Using Pre-Commit + +on: + pull_request: + branches: + - dev + - main + workflow_dispatch: + +permissions: + contents: read + +jobs: + lint-and-format: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version-file: pyproject.toml + - uses: pre-commit/action@v3.0.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2aebea2c3..98fbcea77 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,11 +14,10 @@ repos: - id: check-json - repo: https://github.com/PyCQA/flake8 - rev: 6.0.0 + rev: 6.1.0 hooks: - id: flake8 - entry: pflake8 - additional_dependencies: [pyproject-flake8] + additional_dependencies: [flake8-pyproject] - repo: https://github.com/psf/black rev: 23.7.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f51276063..940cfe712 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -65,7 +65,7 @@ If you would like to contribute, please follow these steps: # Check all files in the repo pre-commit run -a - # Run only the black formatting tool + # Run only the flake8 formatting tool pre-commit run -a flake8 ``` diff --git a/Pipfile b/Pipfile old mode 100755 new mode 100644 index 85d6d7fe8..beace0056 --- a/Pipfile +++ b/Pipfile @@ -32,14 +32,14 @@ ipympl = "==0.9.3" pytest = "==7.3.0" whitebox = "==2.3.1" shapely = "==2.0.1" -pyarrow = "==11.0.0" +pyarrow = "==14.0.1" rtree = "==1.0.1" py7zr = "==0.20.4" scipy = "==1.10.1" gval = "==0.2.3" flake8 = "==6.0.0" black = "==23.7.0" -pyproject-flake8 = "==6.0.0.post1" +flake8-pyproject = "==1.2.3" pre-commit = "==3.3.3" isort = "==5.12.0" urllib3 = "==1.26.18" diff --git a/Pipfile.lock b/Pipfile.lock index cdb131185..61853dec6 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c7f9ee645e067007d14cfcb885a4a4a4c8c720ed6b17f42c07328378ee8c1121" + "sha256": "196cd7e33d0458f7b032017fcd2e1940761158c53a4130adb8915f036ed61b49" }, "pipfile-spec": 6, "requires": { @@ -100,10 +100,10 @@ }, "asttokens": { "hashes": [ - "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e", - "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69" + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" ], - "version": "==2.4.0" + "version": "==2.4.1" }, "attrs": { "hashes": [ @@ -415,99 +415,99 @@ }, "charset-normalizer": { "hashes": [ - "sha256:06cf46bdff72f58645434d467bf5228080801298fbba19fe268a01b4534467f5", - "sha256:0c8c61fb505c7dad1d251c284e712d4e0372cef3b067f7ddf82a7fa82e1e9a93", - "sha256:10b8dd31e10f32410751b3430996f9807fc4d1587ca69772e2aa940a82ab571a", - "sha256:1171ef1fc5ab4693c5d151ae0fdad7f7349920eabbaca6271f95969fa0756c2d", - "sha256:17a866d61259c7de1bdadef418a37755050ddb4b922df8b356503234fff7932c", - "sha256:1d6bfc32a68bc0933819cfdfe45f9abc3cae3877e1d90aac7259d57e6e0f85b1", - "sha256:1ec937546cad86d0dce5396748bf392bb7b62a9eeb8c66efac60e947697f0e58", - "sha256:223b4d54561c01048f657fa6ce41461d5ad8ff128b9678cfe8b2ecd951e3f8a2", - "sha256:2465aa50c9299d615d757c1c888bc6fef384b7c4aec81c05a0172b4400f98557", - "sha256:28f512b9a33235545fbbdac6a330a510b63be278a50071a336afc1b78781b147", - "sha256:2c092be3885a1b7899cd85ce24acedc1034199d6fca1483fa2c3a35c86e43041", - "sha256:2c4c99f98fc3a1835af8179dcc9013f93594d0670e2fa80c83aa36346ee763d2", - "sha256:31445f38053476a0c4e6d12b047b08ced81e2c7c712e5a1ad97bc913256f91b2", - "sha256:31bbaba7218904d2eabecf4feec0d07469284e952a27400f23b6628439439fa7", - "sha256:34d95638ff3613849f473afc33f65c401a89f3b9528d0d213c7037c398a51296", - "sha256:352a88c3df0d1fa886562384b86f9a9e27563d4704ee0e9d56ec6fcd270ea690", - "sha256:39b70a6f88eebe239fa775190796d55a33cfb6d36b9ffdd37843f7c4c1b5dc67", - "sha256:3c66df3f41abee950d6638adc7eac4730a306b022570f71dd0bd6ba53503ab57", - "sha256:3f70fd716855cd3b855316b226a1ac8bdb3caf4f7ea96edcccc6f484217c9597", - "sha256:3f9bc2ce123637a60ebe819f9fccc614da1bcc05798bbbaf2dd4ec91f3e08846", - "sha256:3fb765362688821404ad6cf86772fc54993ec11577cd5a92ac44b4c2ba52155b", - "sha256:45f053a0ece92c734d874861ffe6e3cc92150e32136dd59ab1fb070575189c97", - "sha256:46fb9970aa5eeca547d7aa0de5d4b124a288b42eaefac677bde805013c95725c", - "sha256:4cb50a0335382aac15c31b61d8531bc9bb657cfd848b1d7158009472189f3d62", - "sha256:4e12f8ee80aa35e746230a2af83e81bd6b52daa92a8afaef4fea4a2ce9b9f4fa", - "sha256:4f3100d86dcd03c03f7e9c3fdb23d92e32abbca07e7c13ebd7ddfbcb06f5991f", - "sha256:4f6e2a839f83a6a76854d12dbebde50e4b1afa63e27761549d006fa53e9aa80e", - "sha256:4f861d94c2a450b974b86093c6c027888627b8082f1299dfd5a4bae8e2292821", - "sha256:501adc5eb6cd5f40a6f77fbd90e5ab915c8fd6e8c614af2db5561e16c600d6f3", - "sha256:520b7a142d2524f999447b3a0cf95115df81c4f33003c51a6ab637cbda9d0bf4", - "sha256:548eefad783ed787b38cb6f9a574bd8664468cc76d1538215d510a3cd41406cb", - "sha256:555fe186da0068d3354cdf4bbcbc609b0ecae4d04c921cc13e209eece7720727", - "sha256:55602981b2dbf8184c098bc10287e8c245e351cd4fdcad050bd7199d5a8bf514", - "sha256:58e875eb7016fd014c0eea46c6fa92b87b62c0cb31b9feae25cbbe62c919f54d", - "sha256:5a3580a4fdc4ac05f9e53c57f965e3594b2f99796231380adb2baaab96e22761", - "sha256:5b70bab78accbc672f50e878a5b73ca692f45f5b5e25c8066d748c09405e6a55", - "sha256:5ceca5876032362ae73b83347be8b5dbd2d1faf3358deb38c9c88776779b2e2f", - "sha256:61f1e3fb621f5420523abb71f5771a204b33c21d31e7d9d86881b2cffe92c47c", - "sha256:633968254f8d421e70f91c6ebe71ed0ab140220469cf87a9857e21c16687c034", - "sha256:63a6f59e2d01310f754c270e4a257426fe5a591dc487f1983b3bbe793cf6bac6", - "sha256:63accd11149c0f9a99e3bc095bbdb5a464862d77a7e309ad5938fbc8721235ae", - "sha256:6db3cfb9b4fcecb4390db154e75b49578c87a3b9979b40cdf90d7e4b945656e1", - "sha256:71ef3b9be10070360f289aea4838c784f8b851be3ba58cf796262b57775c2f14", - "sha256:7ae8e5142dcc7a49168f4055255dbcced01dc1714a90a21f87448dc8d90617d1", - "sha256:7b6cefa579e1237ce198619b76eaa148b71894fb0d6bcf9024460f9bf30fd228", - "sha256:800561453acdecedaac137bf09cd719c7a440b6800ec182f077bb8e7025fb708", - "sha256:82ca51ff0fc5b641a2d4e1cc8c5ff108699b7a56d7f3ad6f6da9dbb6f0145b48", - "sha256:851cf693fb3aaef71031237cd68699dded198657ec1e76a76eb8be58c03a5d1f", - "sha256:854cc74367180beb327ab9d00f964f6d91da06450b0855cbbb09187bcdb02de5", - "sha256:87071618d3d8ec8b186d53cb6e66955ef2a0e4fa63ccd3709c0c90ac5a43520f", - "sha256:871d045d6ccc181fd863a3cd66ee8e395523ebfbc57f85f91f035f50cee8e3d4", - "sha256:8aee051c89e13565c6bd366813c386939f8e928af93c29fda4af86d25b73d8f8", - "sha256:8af5a8917b8af42295e86b64903156b4f110a30dca5f3b5aedea123fbd638bff", - "sha256:8ec8ef42c6cd5856a7613dcd1eaf21e5573b2185263d87d27c8edcae33b62a61", - "sha256:91e43805ccafa0a91831f9cd5443aa34528c0c3f2cc48c4cb3d9a7721053874b", - "sha256:9505dc359edb6a330efcd2be825fdb73ee3e628d9010597aa1aee5aa63442e97", - "sha256:985c7965f62f6f32bf432e2681173db41336a9c2611693247069288bcb0c7f8b", - "sha256:9a74041ba0bfa9bc9b9bb2cd3238a6ab3b7618e759b41bd15b5f6ad958d17605", - "sha256:9edbe6a5bf8b56a4a84533ba2b2f489d0046e755c29616ef8830f9e7d9cf5728", - "sha256:a15c1fe6d26e83fd2e5972425a772cca158eae58b05d4a25a4e474c221053e2d", - "sha256:a66bcdf19c1a523e41b8e9d53d0cedbfbac2e93c649a2e9502cb26c014d0980c", - "sha256:ae4070f741f8d809075ef697877fd350ecf0b7c5837ed68738607ee0a2c572cf", - "sha256:ae55d592b02c4349525b6ed8f74c692509e5adffa842e582c0f861751701a673", - "sha256:b578cbe580e3b41ad17b1c428f382c814b32a6ce90f2d8e39e2e635d49e498d1", - "sha256:b891a2f68e09c5ef989007fac11476ed33c5c9994449a4e2c3386529d703dc8b", - "sha256:baec8148d6b8bd5cee1ae138ba658c71f5b03e0d69d5907703e3e1df96db5e41", - "sha256:bb06098d019766ca16fc915ecaa455c1f1cd594204e7f840cd6258237b5079a8", - "sha256:bc791ec3fd0c4309a753f95bb6c749ef0d8ea3aea91f07ee1cf06b7b02118f2f", - "sha256:bd28b31730f0e982ace8663d108e01199098432a30a4c410d06fe08fdb9e93f4", - "sha256:be4d9c2770044a59715eb57c1144dedea7c5d5ae80c68fb9959515037cde2008", - "sha256:c0c72d34e7de5604df0fde3644cc079feee5e55464967d10b24b1de268deceb9", - "sha256:c0e842112fe3f1a4ffcf64b06dc4c61a88441c2f02f373367f7b4c1aa9be2ad5", - "sha256:c15070ebf11b8b7fd1bfff7217e9324963c82dbdf6182ff7050519e350e7ad9f", - "sha256:c2000c54c395d9e5e44c99dc7c20a64dc371f777faf8bae4919ad3e99ce5253e", - "sha256:c30187840d36d0ba2893bc3271a36a517a717f9fd383a98e2697ee890a37c273", - "sha256:cb7cd68814308aade9d0c93c5bd2ade9f9441666f8ba5aa9c2d4b389cb5e2a45", - "sha256:cd805513198304026bd379d1d516afbf6c3c13f4382134a2c526b8b854da1c2e", - "sha256:d0bf89afcbcf4d1bb2652f6580e5e55a840fdf87384f6063c4a4f0c95e378656", - "sha256:d9137a876020661972ca6eec0766d81aef8a5627df628b664b234b73396e727e", - "sha256:dbd95e300367aa0827496fe75a1766d198d34385a58f97683fe6e07f89ca3e3c", - "sha256:dced27917823df984fe0c80a5c4ad75cf58df0fbfae890bc08004cd3888922a2", - "sha256:de0b4caa1c8a21394e8ce971997614a17648f94e1cd0640fbd6b4d14cab13a72", - "sha256:debb633f3f7856f95ad957d9b9c781f8e2c6303ef21724ec94bea2ce2fcbd056", - "sha256:e372d7dfd154009142631de2d316adad3cc1c36c32a38b16a4751ba78da2a397", - "sha256:ecd26be9f112c4f96718290c10f4caea6cc798459a3a76636b817a0ed7874e42", - "sha256:edc0202099ea1d82844316604e17d2b175044f9bcb6b398aab781eba957224bd", - "sha256:f194cce575e59ffe442c10a360182a986535fd90b57f7debfaa5c845c409ecc3", - "sha256:f5fb672c396d826ca16a022ac04c9dce74e00a1c344f6ad1a0fdc1ba1f332213", - "sha256:f6a02a3c7950cafaadcd46a226ad9e12fc9744652cc69f9e5534f98b47f3bbcf", - "sha256:fe81b35c33772e56f4b6cf62cf4aedc1762ef7162a31e6ac7fe5e40d0149eb67" + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], "markers": "python_version >= '3.7'", - "version": "==3.3.1" + "version": "==3.3.2" }, "click": { "hashes": [ @@ -529,7 +529,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { @@ -550,11 +550,11 @@ }, "comm": { "hashes": [ - "sha256:354e40a59c9dd6db50c5cc6b4acc887d82e9603787f83b68c01a80a923984d15", - "sha256:6d52794cba11b36ed9860999cd10fd02d6b2eac177068fdd585e1e2f8a96e67a" + "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001", + "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be" ], - "markers": "python_version >= '3.6'", - "version": "==0.1.4" + "markers": "python_version >= '3.8'", + "version": "==0.2.0" }, "contextily": { "hashes": [ @@ -632,67 +632,67 @@ }, "cython": { "hashes": [ - "sha256:0021350f6d7022a37f598320460b84b2c0daccf6bb65641bbdbc8b990bdf4ad2", - "sha256:003ccc40e0867770db0018274977d1874e4df64983d5e3e36937f107e0b2fdf6", - "sha256:0422a40a58dcfbb54c8b4e125461d741031ff046bc678475cc7a6c801d2a7721", - "sha256:0612439f810cc281e51fead69de0545c4d9772a1e82149c119d1aafc1f6210ba", - "sha256:061dec1be8d8b601b160582609a78eb08324a4ccf21bee0d04853a3e9dfcbefd", - "sha256:0650460b5fd6f16da4186e0a769b47db5532601e306f3b5d17941283d5e36d24", - "sha256:07d0e69959f267b79ffd18ece8599711ad2f3d3ed1eddd0d4812d2a97de2b912", - "sha256:096cb461bf8d913a4327d93ea38d18bc3dbc577a71d805be04754e4b2cc2c45d", - "sha256:0aa2a6bb3ff67794d8d1dafaed22913adcbb327e96eca3ac44e2f3ba4a0ae446", - "sha256:0fc9e974419cc0393072b1e9a669f71c3b34209636d2005ff8620687daa82b8c", - "sha256:0fe227d6d8e2ea030e82abc8a3e361e31447b66849f8c069caa783999e54a8f2", - "sha256:10b426adc3027d66303f5c7aa8b254d10ed80827ff5cce9e892d550b708dc044", - "sha256:146bfaab567157f4aa34114a37e3f98a3d9c4527ee99d4fd730cab56482bd3cf", - "sha256:15d52f7f9d08b264c042aa508bf457f53654b55f533e0262e146002b1c15d1cd", - "sha256:19a64bf2591272348ab08bcd4a5f884259cc3186f008c9038b8ec7d01f847fd5", - "sha256:207f53893ca22d8c8f5db533f38382eb7ddc2d0b4ab51699bf052423a6febdad", - "sha256:28af4e7dff1742cb0f0a4823102c89c62a2d94115b68f718145fcfe0763c6e21", - "sha256:28de18f0d07eb34e2dd7b022ac30beab0fdd277846d07b7a08e69e6294f0762b", - "sha256:2e379b491ee985d31e5faaf050f79f4a8f59f482835906efe4477b33b4fbe9ff", - "sha256:36299ffd5663203c25d3a76980f077e23b6d4f574d142f0f43943f57be445639", - "sha256:4355a2cb03b257773c0d2bb6af9818c72e836a9b09986e28f52e323d87b1fc67", - "sha256:48b35ab009227ee6188991b5666aae1936b82a944f707c042cef267709de12b5", - "sha256:48cda82eb82ad2014d2ad194442ed3c46156366be98e4e02f3e29742cdbf94a0", - "sha256:4e8c144e2c5814e46868d1f81e2f4265ca1f314a8187d0420cd76e9563294cf8", - "sha256:58cdfdd942cf5ffcee974aabfe9b9e26c0c1538fd31c1b03596d40405f7f4d40", - "sha256:5b906997e7b98d7d29b84d10a5318993eba1aaff82ff7e1a0ac00254307913d7", - "sha256:6603a287188dcbc36358a73a7be43e8a2ecf0c6a06835bdfdd1b113943afdd6f", - "sha256:6619264ed43d8d8819d4f1cdb8a62ab66f87e92f06f3ff3e2533fd95a9945e59", - "sha256:6a0b92adfcac68dcf549daddec83c87a86995caa6f87bfb6f72de4797e1a6ad6", - "sha256:6da74000a672eac0d7cf02adc140b2f9c7d54eae6c196e615a1b5deb694d9203", - "sha256:8529cf09919263a6826adc04c5dde9f1406dd7920929b16be19ee9848110e353", - "sha256:861979428f749faa9883dc4e11e8c3fc2c29bd0031cf49661604459b53ea7c66", - "sha256:8692249732d62e049df3884fa601b70fad3358703e137aceeb581e5860e7d9b7", - "sha256:8a9262408f05eef039981479b38b38252d5b853992e5bc54a2d2dd05a2a0178e", - "sha256:8ada3659608795bb36930d9a206b8dd6b865d85e2999a02ce8b34f3195d88301", - "sha256:9d31d76ed777a8a85be3f8f7f1cfef09b3bc33f6ec4abee1067dcef107f49778", - "sha256:b3ddfc6f05410095ec11491dde05f50973e501567d21cbfcf5832d95f141878a", - "sha256:b72c426df1586f967b1c61d2f8236702d75c6bbf34abdc258a59e09155a16414", - "sha256:b86871862bd65806ba0d0aa2b9c77fcdcc6cbd8d36196688f4896a34bb626334", - "sha256:bc42004f181373cd3b39bbacfb71a5b0606ed6e4c199c940cca2212ba0f79525", - "sha256:beb367fd88fc6ba8c204786f680229106d99da72a60f5906c85fc8d73640b01a", - "sha256:bf671d712816b48fa2731799017ed68e5e440922d0c7e13dc825c226639ff766", - "sha256:c0fb9e7cf9db38918f19a803fab9bc7b2ed3f33a9e8319c616c464a0a8501b8d", - "sha256:c214f6e88ecdc8ff5d13f0914890445fdaad21bddc34a90cd14aeb3ad5e55e2e", - "sha256:c2215f436ce3cce49e6e318cb8f7253cfc4d3bea690777c2a5dd52ae93342504", - "sha256:c7a7dd7c50d07718a5ac2bdea166085565f7217cf1e030cc07c22a8b80a406a7", - "sha256:c8e0f98d950987b0f9d5e10c41236bef5cb4fba701c6e680af0b9734faa3a85e", - "sha256:c9b1322f0d8ce5445fcc3a625b966f10c4182190026713e217d6f38d29930cb1", - "sha256:d40d4135f76fb0ed4caa2d422fdb4231616615698709d3c421ecc733f1ac7ca0", - "sha256:d5a55749509c7f9f8a33bf9cc02cf76fd6564fcb38f486e43d2858145d735953", - "sha256:e5e2859f97e9cceb8e70b0934c56157038b8b083245898593008162a70536d7e", - "sha256:e84988d384dfba678387ea7e4f68786c3703543018d473605d9299c69a07f197", - "sha256:ef4b144c5b29b4ea0b40c401458b86df8d75382b2e5d03e9f67f607c05b516a9", - "sha256:f124ac9ee41e1bfdfb16f53f1db85de296cd2144a4e8fdee8c3560a8fe9b6d5d", - "sha256:f234bc46043856d118ebd94b13ea29df674503bc94ced3d81ca46a1ad5b5b9ae", - "sha256:f24114e1777604a28ae1c7a56a2c9964655f1031edecc448ad51e5abb19a279b", - "sha256:f7fcd93d15deceb2747b10266a39deccd94f257d610f3bbd52a7e16bc5908eda", - "sha256:fc96efa617184b8581a02663e261b41c13a605da8ef4ba1ed735bf46184f815e" + "sha256:035cb6930a8534f865a3f4616543f78bd27e4de9c3e117b2826e395085ffc4c0", + "sha256:039877e57dc10abf0d30d2de2c7476f0881d8ecef1f29bdeed1a6a06a8d89141", + "sha256:048fe89c2c753c24e1a7a05496907173dab17e238c8dc3c7cad90b3679b0d846", + "sha256:05c4efd36879ff8020af00407e4c14246b894558ea41dc6486f60dd71601fc67", + "sha256:063220a6dc0909b576ef068c7e2acf5c608d64423a6d231aacb72d06352cd95b", + "sha256:0759868b4a4d103578375e031e89abd578c26774d957ee4f591764ef8003b363", + "sha256:077d9a61e6042174dabf68b8e92c0a80f5aff529439ed314aa6e6a233af80b95", + "sha256:0a9206b0720f0cad3e70c018722f6d10e81b32e65477e14ffedd3fbfadfaddca", + "sha256:0d9fcfc09d67218fce114fe9fd97bba4f9d56add0f775c588d8c626ed47f1aef", + "sha256:0f31d02b831d0fa9bf099b1b714b5a8252eabd8db34b7d33c48e7e808a2dabf9", + "sha256:115e76fbe9288119526b66963f614042222d1587f1ba5ddb90088215a3d2a25a", + "sha256:13491f1bfcf020fd02751c4a55294aa8957e21b7ecd2542b0521a7aa50c58bb2", + "sha256:2ad4eb2608661d63fb57c674dafb9955f5141d748d4579c7722c1a3c6b86a0c2", + "sha256:2c4d4d92182002b2878adb3329de1ccb7f3f7571d3586f92602e790bfeab45d0", + "sha256:2d6bb318ddce8b978c81cf78caf8b3836db84f6235d721952685e87871f506e4", + "sha256:34059c3ea6e342ba388cd9774a61761bb4200ca18bd475de65c9cc70ef4e0204", + "sha256:3679a6693456f5f7ccca9ab2a91408e99ee257e145024fe380da7c78a07e98b6", + "sha256:39318348db488a2f24e7c84e08bdc82f2624853c0fea8b475ea0b70b27176492", + "sha256:3cffbba1888f795de2103e6fb1482c8ea8d457e638fa813e090fe747f9e549bb", + "sha256:452679284c15a7d5a88bff675e1dd660349360f0665aea50be2d98b7650925f8", + "sha256:45277bb54c35b11bcdd6cf0f56eb950eb280b67146db0cb57853fb6334c6d11d", + "sha256:45aaceb082ad89365f2f783a40db42359591ad55914fb298841196edf88afdc5", + "sha256:485f8a3087392e2287e2869adc0385b439f69b9cfbd262fdf39b00417690c988", + "sha256:4db9eea298e982aee7ba12b3432c66eb2e91bb2f5d026bbd57c35698ea0f557f", + "sha256:4faf17ea6e8fc3065a862d4b24be84048fd58ed7abe59aa2f9141446a7a72335", + "sha256:4fbc8f62b8d50f9a2eef99927a9dcb8d0a42e5a801ab14c2e4aeab622c88f54b", + "sha256:530a474a79fa6c2127bb7e3ba00857b1f26a563615863f17b7434331aa3fe404", + "sha256:5742ef31e1e2c9a4824ef6b05af0f4949047a6f73af1d4b238ce12935174aede", + "sha256:57b44f789794d74c1feddae054dd045b9f601bdffd7288e069b4ca7ed607ec61", + "sha256:6ac1cf1f2ed01656b33618352f7e42bf75d027425b83cc96cfe13ce4b6cba5de", + "sha256:75206369504fc442c10a86ecf57b91592dca744e4592af22a47e9a774d53dd10", + "sha256:77f4d001fb7a03a68b53be20571acd17452d1dda7907d9c325dff0cc704b1ef9", + "sha256:808f56d4cd0511723b787c341f3cc995fd72893e608102268298c188f4a4f2e7", + "sha256:93502f45948ae8d7f874ba4c113b50cb6fb4ee664caa82e1ddc398500ee0ffb3", + "sha256:9c016b3e859b41cf4ce1b8107f364ad5a83c086f75ea4d8d3990b24691f626a1", + "sha256:a1cab30c11880f38a27911b569ea38b0bd67fcf32f8a8a8519b613c70562dae2", + "sha256:a90f9c7b6635967eacafebe439d518b7dc720aaaf19cb9553f5aad03c13296f4", + "sha256:a95ed0e6f481462a3ff2be4c2e4ffffc5d00fc3884d4ccd1fe5b702d4938ec09", + "sha256:a993002fe28c840dc29805fde7341c775b7878b311b85f21560fdebf220c247b", + "sha256:abb2362783521bd9a22fe69b2141abab4db97237665a36a034b161ddee5b3e72", + "sha256:ada4852db0e33dbdd1425322db081d22b9725cb9f5eba42885467b4e2c4f2ac0", + "sha256:b37f4b0d983316242b4b9241ecbbe55220aa92af93ff04626441fe0ea90a54f9", + "sha256:b77f2b45535bcf3741592fa03183558bd42198b872c1584b896fa0ba5f2ac68d", + "sha256:b94f58e05e69e1a43da551c8f532e9fad057df1641f0f8ae8f103d4ede5a80fe", + "sha256:ba3f7b433c1721a43674c0889d5fad746bf608416c8f849343859e6d4d3a7113", + "sha256:c18e125537a96e76c8c34201e5a9aad8625e3d872dd26a63155573462e54e185", + "sha256:c95bd21d87b08c88fe5296381a5f39cd979a775bf1a1d7379a6ff87c703e510b", + "sha256:d0d9431101f600d5a557d55989658cbfd02b7c0dcd1e4675dac8ad7e0da8ea5b", + "sha256:d9d17a6ceb301c5dbd3820e62c1b10a4ad3a6eea3e07e7afaf736b5f490c2e32", + "sha256:db21997270e943aee9cb7694112d24a4702fbe1977fbe53b3cb4db3d02be73d9", + "sha256:dd9cab3b862bec2b110886aedb11765e9deda363c4c7ab5ea205f3d8f143c411", + "sha256:dee39967168d6326ea2df56ad215a4d5049aa52f44cd5aad45bfb63d5b4fb9e5", + "sha256:e3e011fa2ae9e953fe1ab8394329a21bdb54357c7fe509bcfb02b88bc15bffbb", + "sha256:ebc901131057c115a8868e14c1df6e56b9190df774b72664c03ebd858296bb81", + "sha256:f18c13d5ed6fde5efd3b1c039f6a34296d1a0409bb00fbf45bec6f9bcf63ddf5", + "sha256:f687539ead9fbc17f499e33ee20c1dc41598f70ad95edb4990c576447cec9d23", + "sha256:f6fcfef825edb44cf3c6ba2c091ad76a83da62ac9c79553e80e0c2a1f75eda2e", + "sha256:fcfd2255458a5779dbab813550695331d541b24f0ef831ace83f04f9516ddf26" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.4" + "version": "==3.0.5" }, "dask": { "hashes": [ @@ -781,10 +781,11 @@ }, "executing": { "hashes": [ - "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657", - "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08" + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" ], - "version": "==2.0.0" + "markers": "python_version >= '3.5'", + "version": "==2.0.1" }, "fastjsonschema": { "hashes": [ @@ -795,11 +796,11 @@ }, "filelock": { "hashes": [ - "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4", - "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd" + "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", + "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c" ], "markers": "python_version >= '3.8'", - "version": "==3.12.4" + "version": "==3.13.1" }, "fiona": { "hashes": [ @@ -834,6 +835,13 @@ "index": "pypi", "version": "==6.0.0" }, + "flake8-pyproject": { + "hashes": [ + "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a" + ], + "index": "pypi", + "version": "==1.2.3" + }, "flox": { "hashes": [ "sha256:44b0ce5aea13485126cb69bf4ab1aad0cfe131ddadc577f1f244d48d856fd08d", @@ -844,51 +852,51 @@ }, "fonttools": { "hashes": [ - "sha256:10003ebd81fec0192c889e63a9c8c63f88c7d72ae0460b7ba0cd2a1db246e5ad", - "sha256:10b3922875ffcba636674f406f9ab9a559564fdbaa253d66222019d569db869c", - "sha256:13a9a185259ed144def3682f74fdcf6596f2294e56fe62dfd2be736674500dba", - "sha256:17dbc2eeafb38d5d0e865dcce16e313c58265a6d2d20081c435f84dc5a9d8212", - "sha256:18a2477c62a728f4d6e88c45ee9ee0229405e7267d7d79ce1f5ce0f3e9f8ab86", - "sha256:18eefac1b247049a3a44bcd6e8c8fd8b97f3cad6f728173b5d81dced12d6c477", - "sha256:1952c89a45caceedf2ab2506d9a95756e12b235c7182a7a0fff4f5e52227204f", - "sha256:1cf9e974f63b1080b1d2686180fc1fbfd3bfcfa3e1128695b5de337eb9075cef", - "sha256:1e09da7e8519e336239fbd375156488a4c4945f11c4c5792ee086dd84f784d02", - "sha256:2062542a7565091cea4cc14dd99feff473268b5b8afdee564f7067dd9fff5860", - "sha256:25d3da8a01442cbc1106490eddb6d31d7dffb38c1edbfabbcc8db371b3386d72", - "sha256:34f713dad41aa21c637b4e04fe507c36b986a40f7179dcc86402237e2d39dcd3", - "sha256:360201d46165fc0753229afe785900bc9596ee6974833124f4e5e9f98d0f592b", - "sha256:3b7ad05b2beeebafb86aa01982e9768d61c2232f16470f9d0d8e385798e37184", - "sha256:4c54466f642d2116686268c3e5f35ebb10e49b0d48d41a847f0e171c785f7ac7", - "sha256:4d9740e3783c748521e77d3c397dc0662062c88fd93600a3c2087d3d627cd5e5", - "sha256:4f88cae635bfe4bbbdc29d479a297bb525a94889184bb69fa9560c2d4834ddb9", - "sha256:51669b60ee2a4ad6c7fc17539a43ffffc8ef69fd5dbed186a38a79c0ac1f5db7", - "sha256:5db46659cfe4e321158de74c6f71617e65dc92e54980086823a207f1c1c0e24b", - "sha256:5f37e31291bf99a63328668bb83b0669f2688f329c4c0d80643acee6e63cd933", - "sha256:6bb5ea9076e0e39defa2c325fc086593ae582088e91c0746bee7a5a197be3da0", - "sha256:748015d6f28f704e7d95cd3c808b483c5fb87fd3eefe172a9da54746ad56bfb6", - "sha256:7bbbf8174501285049e64d174e29f9578495e1b3b16c07c31910d55ad57683d8", - "sha256:884ef38a5a2fd47b0c1291647b15f4e88b9de5338ffa24ee52c77d52b4dfd09c", - "sha256:8da417431bfc9885a505e86ba706f03f598c85f5a9c54f67d63e84b9948ce590", - "sha256:95e974d70238fc2be5f444fa91f6347191d0e914d5d8ae002c9aa189572cc215", - "sha256:9648518ef687ba818db3fcc5d9aae27a369253ac09a81ed25c3867e8657a0680", - "sha256:9a2f0aa6ca7c9bc1058a9d0b35483d4216e0c1bbe3962bc62ce112749954c7b8", - "sha256:9c36da88422e0270fbc7fd959dc9749d31a958506c1d000e16703c2fce43e3d0", - "sha256:9c60ecfa62839f7184f741d0509b5c039d391c3aff71dc5bc57b87cc305cff3b", - "sha256:9f727c3e3d08fd25352ed76cc3cb61486f8ed3f46109edf39e5a60fc9fecf6ca", - "sha256:a7a06f8d95b7496e53af80d974d63516ffb263a468e614978f3899a6df52d4b3", - "sha256:ad0b3f6342cfa14be996971ea2b28b125ad681c6277c4cd0fbdb50340220dfb6", - "sha256:b2adca1b46d69dce4a37eecc096fe01a65d81a2f5c13b25ad54d5430ae430b13", - "sha256:b84a1c00f832feb9d0585ca8432fba104c819e42ff685fcce83537e2e7e91204", - "sha256:bb6d2f8ef81ea076877d76acfb6f9534a9c5f31dc94ba70ad001267ac3a8e56f", - "sha256:bf11e2cca121df35e295bd34b309046c29476ee739753bc6bc9d5050de319273", - "sha256:d21099b411e2006d3c3e1f9aaf339e12037dbf7bf9337faf0e93ec915991f43b", - "sha256:d4071bd1c183b8d0b368cc9ed3c07a0f6eb1bdfc4941c4c024c49a35429ac7cd", - "sha256:e117a92b07407a061cde48158c03587ab97e74e7d73cb65e6aadb17af191162a", - "sha256:f7a58eb5e736d7cf198eee94844b81c9573102ae5989ebcaa1d1a37acd04b33d", - "sha256:fe9b1ec799b6086460a7480e0f55c447b1aca0a4eecc53e444f639e967348896" + "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e", + "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5", + "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e", + "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2", + "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b", + "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4", + "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97", + "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111", + "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252", + "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf", + "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189", + "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b", + "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e", + "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267", + "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20", + "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165", + "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2", + "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc", + "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400", + "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928", + "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a", + "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5", + "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d", + "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2", + "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb", + "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0", + "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2", + "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335", + "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae", + "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287", + "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d", + "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b", + "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39", + "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040", + "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d", + "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c", + "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86", + "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c", + "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3", + "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d", + "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219", + "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5" ], "markers": "python_version >= '3.8'", - "version": "==4.43.1" + "version": "==4.44.0" }, "fqdn": { "hashes": [ @@ -943,16 +951,15 @@ "sha256:d9f26aa88f164b77a47cb7d7eafc1641e48abe4152501657cb173c44dc84a8fd" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.2.3" }, "identify": { "hashes": [ - "sha256:afe67f26ae29bab007ec21b03d4114f41316ab9dd15aa8736a167481e108da54", - "sha256:f302a4256a15c849b91cfcdcec052a8ce914634b2f77ae87dad29cd749f2d88d" + "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75", + "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d" ], "markers": "python_version >= '3.8'", - "version": "==2.5.30" + "version": "==2.5.31" }, "idna": { "hashes": [ @@ -972,86 +979,70 @@ }, "importlib-resources": { "hashes": [ - "sha256:9d48dcccc213325e810fd723e7fbb45ccb39f6cf5c31f00cf2b965f5f10f3cb9", - "sha256:aa50258bbfa56d4e33fbd8aa3ef48ded10d1735f11532b8df95388cc6bdb7e83" + "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", + "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" ], "markers": "python_version < '3.10'", - "version": "==6.1.0" + "version": "==6.1.1" }, "inflate64": { "hashes": [ - "sha256:08c3b03514d4b849901762a32a45eeba7fd5d784fec698eca6975f41cca33672", - "sha256:094ef56a87c7b7398d93af7bfe7f24f830f24b6e55b77426f6516cef43e05460", - "sha256:09dd0f8d6dee0da467c264dbd9bca8b33f9c915860fc3385f2a633640a65bd10", - "sha256:0b0c8aa2fcdb1052d3bc6c5b5b1191b9c708d30e47af98ba0a8117ae1f6c9efc", - "sha256:130dfdca4bd38e588ea4f878bf62635e36f83ddf7f2842d1055d1c16a11890cf", - "sha256:1749da3a02b53035cde1cf95f885e78e0c2c49b201e97d368b3ba97e0f3d42c3", - "sha256:17aaac096f40bd80dd72481831607a0846271d401ba3cd863386b8c244c7ebc1", - "sha256:1d861fed6b2098d1862b64db9df650b9bd41fc41caa9fcaeee399079342aa4a8", - "sha256:26e8319fd032c520203e2c001f1693c1c03774d85915900427e884011718f41d", - "sha256:29946840e6970d68e7739207ca21140c59ffebe7e02d28c7e86348166ce32418", - "sha256:35e24ffd8d6225fbfe26c524b45ace1bb8956811bd79e9f3d523a721d51b0d4e", - "sha256:3a17e1dd1a5a872edfc02bc4a048868ada4865a3f4ee3ad5d224b192f2e53df7", - "sha256:3bacbe9d4b7c185011b59268223a010ed777a28ed8cf40efc74fab1b7262e904", - "sha256:3c270d373ca3717dbeb9b171eea53cbf2c9d7471b9b5de1e57f165e60cf58037", - "sha256:3c913b679f023f5907a54bfa9a6e438407ed4e40eee23ed19b4118128bdd091c", - "sha256:3cf41f82dd4e90e8684c7be4583d7232bd800a561f3ed0241c84e39148861887", - "sha256:41504988023042452d2d84e4110c9ef4ff8ebd33cb90ba83e44b92c9a6753c43", - "sha256:42a6ef375b3e7059bd52993a0938f2bf97725cb5dc380f0c4dbaa9fc3780e025", - "sha256:473e0081c268ffa4b18683586b55170eb96d8b4fc684dd3ed9599c17c512d2e4", - "sha256:48fd2527a462374dc19be06301d6aa30a03190532f2f8bddfbc39b7158561750", - "sha256:4d807cfa9ddad940401ef04502eb367a77f569850f59c2e71670347d558a3830", - "sha256:4e7b0a598adaa11366ffbbb7b3d3110db29edd4b732d9336570891363b22b002", - "sha256:525bc309d8533ef9917e006284996ee7a9a71ac6dd19fb57c0f741ad0c805d4f", - "sha256:553cd992f02af574d2116c74ca48d7cf10894c6b9ba8159f488f3bfac3c201ae", - "sha256:5c5b2eb7e89d550d287774dea7d429ee24ce44ca34499a6cef113a14f108e700", - "sha256:5efd55c21b794601fd44b99b8e2f17498744f573116ce27a745bc5e08f0457e1", - "sha256:6059eaba5044739ad6424588e845bd856f89a1a18f1addc31b97c49f02f68728", - "sha256:664929528047b6b472852a4c0d12b4b9cf6e663059ba64ebd10f08aa56365755", - "sha256:67e37d96ea2ee8257b12cde83a09e4f0276950268a7a2f777aee7de60db5ec72", - "sha256:67efdfd21d7b99f30a43560b22264c1e580ff08ae9831e78c99445575962dbc7", - "sha256:6ff89f94823b2466bae45759fc324bd25bd20c490607a7d8407237cf64ccafa9", - "sha256:74ceb9d172ce06572632bc8070d54b963455421e216013575383f991e722bb7d", - "sha256:7b7966193f1bf23e050af72b4c4720dffa5f33471de7afea37ba0d0f0195adef", - "sha256:7ba954600441eafe8f6f54eadffeac4d1ab2416d5d1a6b0ab403e50284ba457b", - "sha256:7c142fbbbfbe0877fe821ff8bc4cc10f96d344b7400721579b3d17deeae28f59", - "sha256:7f8346e644de449a4a90dcb22971dea456398b6cc788102013675b11256ae47e", - "sha256:80a125dd5cb7b7985c05a78b0bfd7751249d0d84fc330901dbd9faa693e1f53f", - "sha256:82393e46b8ba2f8613d030f38c7c492b0896ff8803f7ff870677f25d3e5e7113", - "sha256:84287d1d09fd879353d3ccadd43f3d8adea75e830476ddfd46d8849d36d25afe", - "sha256:853f3442eceda8035072686533694ab833c4293d10c9d0685147200f0e964356", - "sha256:906a4b57df32f903e847766ca685e44ed3e7ee3a960fa94264d5e68b836d446d", - "sha256:90f95b92d0f672d11151cb964964d1723e2e3ce3a19d32d24aece1acdec1e287", - "sha256:91233b5300bbb7562804c3d07617e9ce2983e8434218991db98ef175491e417f", - "sha256:9297115bf144c585e9d6a746e851c64c81d8f1ce8b62da4885babe66c36f7d29", - "sha256:9f6737a575c6e7e818963d95a998be4c91484374961734cee97265f3c4c3b979", - "sha256:a075b174bace5174828906c7c87019a2af3cc5707025f01ee0395fb4b88fd98e", - "sha256:a1b481343f12641b1ae7a19135a70c44ecf020dccb670e02522c2b02db920851", - "sha256:a2f4aaa02f9a5ada944960428b6528a0a9d773925efc73485882f34bf42654be", - "sha256:a6bec3d2f30f6f2656e1c5a4147181e401c8d7026cd598d86ad5647c616fc618", - "sha256:aa7476129e7f81e67a9253470c3085a9fd75ec77e6fae3de61f7795138ce725e", - "sha256:ab8f9e14ba6495f440101751ba8aa371e4a52941b5e343c6f3e8c61021e2df5e", - "sha256:ac60868745f7bfbcd615329fbdc35997fa36043ce358a1c64d229ef448ebecf0", - "sha256:ad4cae5097bdff7e0bb1ab676d86ad08716597baa3b616e5b710a724f5d5cbc4", - "sha256:ad84ac611eae17a961124c5fbe754b6982291a3945ab2b9c334a08e2e56f9ccc", - "sha256:b52dd8fefd2ba179e5dfa18d6eca7e2fc822584616271c039d5ef1f9ca90c71c", - "sha256:b7aa123c740f2f9798f72873e50d7c6d43664d12cad7a1405296079987bdb04a", - "sha256:c1faf43890dbfff31195f5d59e37e49824f5ff4be77d67f7144a6b953bbde51c", - "sha256:c28cb635ccb9aae399fbc8e82c85b89ea0a7bb2219e7d582bbc007a29fb6e149", - "sha256:c71821f93c931ae379cf9c9bbdd7099738fa00802ccf2a5271e2b68bc67a6ab8", - "sha256:ced0af509a31dcba0cd98ecdd06cb7c9ce66ebde78e0d99ba3515d4e991e34d0", - "sha256:d4e2a337c6c03b0e96ccd79940cbb04fe2063974d56fff6d78f8d57839546c57", - "sha256:d71af8b23ac23bc9e9f776451c125be6320ad4589a7d5bcb5ab5e1fc61b4e58f", - "sha256:d881b605b7448be451f02c59128dc5fac262dbd0dcff4638e702dc8c7bbb8ef0", - "sha256:e1987bbc482aa3e2e7fb72c70b22483cfaed3dbebc5ba6f9ac6f75240794709b", - "sha256:e32a78c81afba5699569c3493066ecb38fb45ccdf4c35b3c2232c9c2585b5257", - "sha256:f2a4dac4ebc4ad58a4ac911e39cf97cd74906c0c82c16333887aa9f287e98d5b", - "sha256:f39b57974db0e85897fff40518da420f4c4012b73515ca6f415a472228fea288", - "sha256:fd04764d0bb830414788cae897d082bf6ad92324e571a5511bd7e1de4a0cdc67", - "sha256:fde3f85864c84badb26f42d95639360e627fd09c529a76c46a06dbd7a5735c51" - ], - "markers": "python_version > '3.6'", - "version": "==0.3.1" + "sha256:022ca1cc928e7365a05f7371ff06af143c6c667144965e2cf9a9236a2ae1c291", + "sha256:0c644bf7208e20825ca3bbb5fb1f7f495cfcb49eb01a5f67338796d44a42f2bf", + "sha256:0fe481f31695d35a433c3044ac8fd5d9f5069aaad03a0c04b570eb258ce655aa", + "sha256:137ca6b315f0157a786c3a755a09395ca69aed8bcf42ad3437cb349f5ebc86d2", + "sha256:1616a87ff04f583e9558cc247ec0b72a30d540ee0c17cc77823be175c0ec92f0", + "sha256:1facd35319b6a391ee4c3d709c7c650bcada8cd7141d86cd8c2257287f45e6e6", + "sha256:228d504239d27958e71fc77e3119a6ac4528127df38468a0c95a5bd3927204b8", + "sha256:2be4e01c1b04761874cb44b35b6103ca5846bc36c18fc3ff5e8cbcd8bfc15e9f", + "sha256:2cccded63865640d03253897be7232b2bbac295fe43914c61f86a57aa23bb61d", + "sha256:3278827b803cf006a1df251f3e13374c7d26db779e5a33329cc11789b804bc2d", + "sha256:34de6902c39d9225459583d5034182d371fc694bc3cfd6c0fc89aa62e9809faf", + "sha256:35a45f6979ad5874d4d4898c2fc770b136e61b96b850118fdaec5a5af1b9123a", + "sha256:36342338e957c790fc630d4afcdcc3926beb2ecaea0b302336079e8fa37e57a0", + "sha256:3a70ea2e456c15f7aa7c74b8ab8f20b4f8940ec657604c9f0a9de3342f280fff", + "sha256:3e243ea9bd36a035059f2365bd6d156ff59717fbafb0255cb0c75bf151bf6904", + "sha256:46792ecf3565d64fd2c519b0a780c03a57e195613c9954ef94e739a057b3fd06", + "sha256:4dc392dec1cd11cacda3d2637214ca45e38202e8a4f31d4a4e566d6e90625fc4", + "sha256:543f400201f5c101141af3c79c82059e1aa6ef4f1584a7f1fa035fb2e465097f", + "sha256:57fe7c14aebf1c5a74fc3b70d355be1280a011521a76aa3895486e62454f4242", + "sha256:5ebad4a6cd2a2c1d81be0b09d4006479f3b258803c49a9224ef8ca0b649072fa", + "sha256:5f816d1c8a0593375c289e285c96deaee9c2d8742cb0edbd26ee05588a9ae657", + "sha256:5ff8bd2a562343fcbc4eea26fdc368904a3b5f6bb8262344274d3d74a1de15bb", + "sha256:6823b2c0cff3a8159140f3b17ec64fb8ec0e663b45a6593618ecdde8aeecb5b2", + "sha256:6c5775c91f94f5eced9160fb0af12a09f3e030194f91a6a46e706a79350bd056", + "sha256:6ceca14f7ec19fb44b047f56c50efb7521b389d222bba2b0a10286a0caeb03fa", + "sha256:75448c7b414dadaeeb11dab9f75e022aa1e0ee19b00f570e9f58e933603d71ac", + "sha256:8140942d1614bdeb5a9ddd7559348c5c77f884a42424aef7ccf149ccfb93aa08", + "sha256:8b402a50eda7ee75f342fc346d33a41bca58edc222a4b17f9be0db1daed459fa", + "sha256:8f033b2879696b855200cde5ca4e293132c7499df790acb2c0dacb336d5e83b1", + "sha256:92f0dc6af0e8e97324981178dc442956cbff1247a56d1e201af8d865244653f8", + "sha256:9373ccf0661cc72ac84a0ad622634144da5ce7d57c9572ed0723d67a149feed2", + "sha256:9964a4eaf26a9d36f82a1d9b12c28e35800dd3d99eb340453ed12ac90c2976a8", + "sha256:9a270be6b10cde01258c0097a663a307c62d12c78eb8f62f8e29f205335942c9", + "sha256:9b65cc701ef33ab20dbfd1d64088ffd89a8c265b356d2c21ba0ec565661645ef", + "sha256:9fe3f9051338bb7d07b5e7d88420d666b5109f33ae39aa55ecd1a053c0f22b1b", + "sha256:a475e8822f1a74c873e60b8f270773757ade024097ca39e43402d47c049c67d4", + "sha256:a90c0bdf4a7ecddd8a64cc977181810036e35807f56b0bcacee9abb0fcfd18dc", + "sha256:a982dc93920f9450da4d4f25c5e5c1288ef053b1d618cedc91adb67e035e35f5", + "sha256:ae2572e06bcfe15e3bbf77d4e4a6d6c55e2a70d6abceaaf60c5c3653ddb96dfd", + "sha256:b559937a42f0c175b4d2dfc7eb53b97bdc87efa9add15ed5549c6abc1e89d02f", + "sha256:bf2981b95c1f26242bb084d9a07f3feb0cfe3d6d0a8d90f42389803bc1252c4a", + "sha256:c10ca61212a753bbce6d341e7cfa779c161b839281f1f9fdc15cf1f324ce7c5b", + "sha256:ca0310b2c55bc40394c5371db2a22f705fd594226cc09432e1eb04d3aed83930", + "sha256:d4367480733ac8daf368f6fc704b7c9db85521ee745eb5bd443f4b97d2051acc", + "sha256:d491f104fb3701926ebd82b8c9250dfba0ddcab584504e26f1e4adb26730378d", + "sha256:d76d205b844d78ce04768060084ef20e64dcc63a3e9166674f857acaf4d140ed", + "sha256:d90730165f471d61a1a694a5e354f3ffa938227e8dcecb62d5d728e8069cee94", + "sha256:dd6d3e7d47df43210a995fd1f5989602b64de3f2a17cf4cbff553518b3577fd4", + "sha256:e4650c6f65011ec57cf5cd96b92d5b7c6f59e502930c86eb8227c93cf02dc270", + "sha256:e95044ae55a161144445527a2efad550851fecc699066423d24b2634a6a83710", + "sha256:ebafbd813213dc470719cd0a2bcb53aab89d9059f4e75386048b4c4dcdb2fd99", + "sha256:f5924499dc8800928c0ee4580fa8eb4ffa880b2cce4431537d0390e503a9c9ee", + "sha256:f79542478e49e471e8b23556700e6f688a40dc93e9a746f77a546c13251b59b1" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.0" }, "iniconfig": { "hashes": [ @@ -1162,12 +1153,15 @@ "version": "==2.4" }, "jsonschema": { + "extras": [ + "format-nongpl" + ], "hashes": [ - "sha256:cd5f1f9ed9444e554b38ba003af06c0a8c2868131e56bfbef0550fb450c0330e", - "sha256:ec84cc37cfa703ef7cd4928db24f9cb31428a5d0fa77747b8b51a847458e0bbf" + "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392", + "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc" ], "markers": "python_version >= '3.8'", - "version": "==4.19.1" + "version": "==4.19.2" }, "jsonschema-specifications": { "hashes": [ @@ -1204,27 +1198,27 @@ }, "jupyter-core": { "hashes": [ - "sha256:66e252f675ac04dcf2feb6ed4afb3cd7f68cf92f483607522dc251f32d471571", - "sha256:e4b98344bb94ee2e3e6c4519a97d001656009f9cb2b7f2baf15b3c205770011d" + "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3", + "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805" ], "markers": "python_version >= '3.8'", - "version": "==5.4.0" + "version": "==5.5.0" }, "jupyter-events": { "hashes": [ - "sha256:81f07375c7673ff298bfb9302b4a981864ec64edaed75ca0fe6f850b9b045525", - "sha256:fda08f0defce5e16930542ce60634ba48e010830d50073c3dfd235759cee77bf" + "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399", + "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf" ], "markers": "python_version >= '3.8'", - "version": "==0.8.0" + "version": "==0.9.0" }, "jupyter-server": { "hashes": [ - "sha256:21ad1a3d455d5a79ce4bef5201925cd17510c17898cf9d54e3ccfb6b12734948", - "sha256:9ba71be4b9c16e479e4c50c929f8ac4b1015baf90237a08681397a98c76c7e5e" + "sha256:47b8f5e63440125cb1bb8957bf12b18453ee5ed9efe42d2f7b2ca66a7019a278", + "sha256:dde56c9bc3cb52d7b72cc0f696d15d7163603526f1a758eb4a27405b73eab2a5" ], "markers": "python_version >= '3.8'", - "version": "==2.9.1" + "version": "==2.10.0" }, "jupyter-server-fileid": { "hashes": [ @@ -1713,19 +1707,19 @@ }, "nbclient": { "hashes": [ - "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548", - "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55" + "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e", + "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15" ], "markers": "python_version >= '3.8'", - "version": "==0.8.0" + "version": "==0.9.0" }, "nbconvert": { "hashes": [ - "sha256:39fe4b8bdd1b0104fdd86fc8a43a9077ba64c720bda4c6132690d917a0a154ee", - "sha256:e56cc7588acc4f93e2bb5a34ec69028e4941797b2bfaf6462f18a41d1cc258c9" + "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000", + "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe" ], "markers": "python_version >= '3.8'", - "version": "==7.9.2" + "version": "==7.11.0" }, "nbformat": { "hashes": [ @@ -1902,6 +1896,7 @@ "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.23.5" }, "numpy-groupies": { @@ -2122,11 +2117,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091", - "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101" + "sha256:35f7a8c22139e2bb7ca5a698e92d38145bc8dc74c1c0bf56f25cca886a764e17", + "sha256:8de3ae2755f890826f4b6479e5571d4f74ac17a81345fe69a6778fdb92579184" ], - "markers": "python_version >= '3.6'", - "version": "==0.17.1" + "markers": "python_version >= '3.8'", + "version": "==0.18.0" }, "prompt-toolkit": { "hashes": [ @@ -2257,118 +2252,93 @@ }, "pyarrow": { "hashes": [ - "sha256:1cbcfcbb0e74b4d94f0b7dde447b835a01bc1d16510edb8bb7d6224b9bf5bafc", - "sha256:25aa11c443b934078bfd60ed63e4e2d42461682b5ac10f67275ea21e60e6042c", - "sha256:2d53ba72917fdb71e3584ffc23ee4fcc487218f8ff29dd6df3a34c5c48fe8c06", - "sha256:2d942c690ff24a08b07cb3df818f542a90e4d359381fbff71b8f2aea5bf58841", - "sha256:2f51dc7ca940fdf17893227edb46b6784d37522ce08d21afc56466898cb213b2", - "sha256:362a7c881b32dc6b0eccf83411a97acba2774c10edcec715ccaab5ebf3bb0835", - "sha256:3e99be85973592051e46412accea31828da324531a060bd4585046a74ba45854", - "sha256:40bb42afa1053c35c749befbe72f6429b7b5f45710e85059cdd534553ebcf4f2", - "sha256:410624da0708c37e6a27eba321a72f29d277091c8f8d23f72c92bada4092eb5e", - "sha256:41a1451dd895c0b2964b83d91019e46f15b5564c7ecd5dcb812dadd3f05acc97", - "sha256:5461c57dbdb211a632a48facb9b39bbeb8a7905ec95d768078525283caef5f6d", - "sha256:69309be84dcc36422574d19c7d3a30a7ea43804f12552356d1ab2a82a713c418", - "sha256:7c28b5f248e08dea3b3e0c828b91945f431f4202f1a9fe84d1012a761324e1ba", - "sha256:8f40be0d7381112a398b93c45a7e69f60261e7b0269cc324e9f739ce272f4f70", - "sha256:a37bc81f6c9435da3c9c1e767324ac3064ffbe110c4e460660c43e144be4ed85", - "sha256:aaee8f79d2a120bf3e032d6d64ad20b3af6f56241b0ffc38d201aebfee879d00", - "sha256:ad42bb24fc44c48f74f0d8c72a9af16ba9a01a2ccda5739a517aa860fa7e3d56", - "sha256:ad7c53def8dbbc810282ad308cc46a523ec81e653e60a91c609c2233ae407689", - "sha256:becc2344be80e5dce4e1b80b7c650d2fc2061b9eb339045035a1baa34d5b8f1c", - "sha256:caad867121f182d0d3e1a0d36f197df604655d0b466f1bc9bafa903aa95083e4", - "sha256:ccbf29a0dadfcdd97632b4f7cca20a966bb552853ba254e874c66934931b9841", - "sha256:da93340fbf6f4e2a62815064383605b7ffa3e9eeb320ec839995b1660d69f89b", - "sha256:e217d001e6389b20a6759392a5ec49d670757af80101ee6b5f2c8ff0172e02ca", - "sha256:f010ce497ca1b0f17a8243df3048055c0d18dcadbcc70895d5baf8921f753de5", - "sha256:f12932e5a6feb5c58192209af1d2607d488cb1d404fbc038ac12ada60327fa34" + "sha256:0140c7e2b740e08c5a459439d87acd26b747fc408bde0a8806096ee0baaa0c15", + "sha256:01e44de9749cddc486169cb632f3c99962318e9dacac7778315a110f4bf8a450", + "sha256:05fe7994745b634c5fb16ce5717e39a1ac1fac3e2b0795232841660aa76647cd", + "sha256:06ca79080ef89d6529bb8e5074d4b4f6086143b2520494fcb7cf8a99079cde93", + "sha256:097828b55321897db0e1dbfc606e3ff8101ae5725673498cbfa7754ee0da80e4", + "sha256:0f6f053cb66dc24091f5511e5920e45c83107f954a21032feadc7b9e3a8e7851", + "sha256:11e045dfa09855b6d3e7705a37c42e2dc2c71d608fab34d3c23df2e02df9aec3", + "sha256:1a8ae88c0038d1bc362a682320112ee6774f006134cd5afc291591ee4bc06505", + "sha256:1daab52050a1c48506c029e6fa0944a7b2436334d7e44221c16f6f1b2cc9c510", + "sha256:2a145dab9ed7849fc1101bf03bcdc69913547f10513fdf70fc3ab6c0a50c7eee", + "sha256:30d8494870d9916bb53b2a4384948491444741cb9a38253c590e21f836b01222", + "sha256:323cbe60210173ffd7db78bfd50b80bdd792c4c9daca8843ef3cd70b186649db", + "sha256:32542164d905002c42dff896efdac79b3bdd7291b1b74aa292fac8450d0e4dcd", + "sha256:33c1f6110c386464fd2e5e4ea3624466055bbe681ff185fd6c9daa98f30a3f9a", + "sha256:3c76807540989fe8fcd02285dd15e4f2a3da0b09d27781abec3adc265ddbeba1", + "sha256:3f6d5faf4f1b0d5a7f97be987cf9e9f8cd39902611e818fe134588ee99bf0283", + "sha256:450e4605e3c20e558485f9161a79280a61c55efe585d51513c014de9ae8d393f", + "sha256:470ae0194fbfdfbf4a6b65b4f9e0f6e1fa0ea5b90c1ee6b65b38aecee53508c8", + "sha256:4756a2b373a28f6166c42711240643fb8bd6322467e9aacabd26b488fa41ec23", + "sha256:58c889851ca33f992ea916b48b8540735055201b177cb0dcf0596a495a667b00", + "sha256:6263cffd0c3721c1e348062997babdf0151301f7353010c9c9a8ed47448f82ab", + "sha256:78d4a77a46a7de9388b653af1c4ce539350726cd9af62e0831e4f2bd0c95a2f4", + "sha256:7a8089d7e77d1455d529dbd7cff08898bbb2666ee48bc4085203af1d826a33cc", + "sha256:906b0dc25f2be12e95975722f1e60e162437023f490dbd80d0deb7375baf3171", + "sha256:922e8b49b88da8633d6cac0e1b5a690311b6758d6f5d7c2be71acb0f1e14cd61", + "sha256:96d64e5ba7dceb519a955e5eeb5c9adcfd63f73a56aea4722e2cc81364fc567a", + "sha256:981670b4ce0110d8dcb3246410a4aabf5714db5d8ea63b15686bce1c914b1f83", + "sha256:a8eeef015ae69d104c4c3117a6011e7e3ecd1abec79dc87fd2fac6e442f666ee", + "sha256:b8b3f4fe8d4ec15e1ef9b599b94683c5216adaed78d5cb4c606180546d1e2ee1", + "sha256:be28e1a07f20391bb0b15ea03dcac3aade29fc773c5eb4bee2838e9b2cdde0cb", + "sha256:c7331b4ed3401b7ee56f22c980608cf273f0380f77d0f73dd3c185f78f5a6220", + "sha256:cf87e2cec65dd5cf1aa4aba918d523ef56ef95597b545bbaad01e6433851aa10", + "sha256:d0351fecf0e26e152542bc164c22ea2a8e8c682726fce160ce4d459ea802d69c", + "sha256:d264ad13605b61959f2ae7c1d25b1a5b8505b112715c961418c8396433f213ad", + "sha256:e592e482edd9f1ab32f18cd6a716c45b2c0f2403dc2af782f4e9674952e6dd27", + "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226" ], "index": "pypi", - "version": "==11.0.0" + "markers": "python_version >= '3.8'", + "version": "==14.0.1" }, "pybcj": { "hashes": [ - "sha256:023082fd677f67ebd36fe96322a4a45ac33a2b340d49010d88e1867c76744c50", - "sha256:05fad9a905772774aacc96cb174571ac1f5afa80b9f54c6ec414d369865d305c", - "sha256:09872b32edad4e3653d5b357b244d267ca58fe52d4e1dd3cdff816d3bb9d9f7c", - "sha256:0eaa90639992b6096afb1485380fae7f084483db6b92867847a3bfdf22cc4efc", - "sha256:10182725b0e6aa944d13a10a4a9cb5208bafe0016b4326253340948153de4bc0", - "sha256:10961ea10ae930b9348132707b9dd3cf3e71a41ef1df7656fbc4f14a71f10747", - "sha256:15edd1786617127ecfda4274bbb04f09ae299c474ada86e369bcf050d5cb88dd", - "sha256:1a5365edcaa82dc47e7757ba2efb48f96b9b352e3811a2aaa90084802479ddbe", - "sha256:1c0e1657c233f9f4070ab578951e03d569f1b645042ce661341091f50e41b541", - "sha256:1e6434a46f852cd3e6929633b43537887bd381bc614dbf5c4a128fdde4966b3a", - "sha256:20fc0d8f67e2d9747e0c31082d5f64b112258ae602a85aa5c7e6bf5a7cad287b", - "sha256:21098001200273c3c9fd90e7bf909fb905a8e1c102c80b604cb7c6a3103ef7e0", - "sha256:225a0addf4b3d580bf4eae583b5168dac0125a703c53ded8b3f120882e1e0312", - "sha256:262f53e27bca6096e3424c63e5e59948b10985eee4b03a5d70c3f3f6161a79e7", - "sha256:2d6b34ec233fcf5a83ccfbf422fef22256947eaa7077aaa012e5961d15aa302c", - "sha256:2e1859d36c073231737956fbeb5bbcfa8dba880e1b66bfbd001466718d6d89dc", - "sha256:358dba3dc39a07cded6897b9f99bb5b951a0ad95d567eda535b44861caa02f5b", - "sha256:3847387b43af47d9677952b8a22d9c2d8a544c2175b6d5304c200669c05d39e1", - "sha256:393d95f83e47976d137bcec7b66986f51282dcb2091933f88983dd7eb89e59c4", - "sha256:39dd836134e261ec769cd5aa9ae7a3a330a7dac81efb66eb5504643abd8235df", - "sha256:421ed75e54ebecd79c80178c1df5bdbe1e0e3e10e7efef5f011b5f0be6a9a12f", - "sha256:421f211fb15aeb836b4ba61174cb409fc82222ab3b2486deb4953ae863e6507b", - "sha256:43e8bc75773ca06ee7a64602b799613171e4edf4d9d8fd38fa5c49f1cdbb4407", - "sha256:46b82fe50eb8171ee2205e935f3fd5900e31beb5e54e10c88f23a5420902467d", - "sha256:4bc8720f3a224c27bd413a930b9bec5f225fda050641258967b1ebb252a053fb", - "sha256:4d10dd75fad48555e9530c5565c7ccf13754adad2fe331feefb263055cdca7b3", - "sha256:534b8b253dbdb746c06bab28383db31d7e2b42aa9b33ed4e7836319622dcd75b", - "sha256:570a3cf4e016dcb0fc561991833e5170a2a0bc6ee88fe5667591f356bd7b7895", - "sha256:5de90f8b6c7fc1d28dbe74c29b1d5053a7a8703cbc2c6f4f112907ffd7529f8e", - "sha256:603daa737579cf69efb368fab716cdce18d0b2615af77bb623f5f42aa546b3d8", - "sha256:6485c6b091504c0e6431a9495309271626eaa9ecb23276903486824f94f4c551", - "sha256:6ca6ddae1302477879099d4c4efc65790f4610d71ceff7fbe8f8b60f6ac6dcff", - "sha256:6df9eccc99a0d7bc091b58cff2f507b89f076d657253975fa2ca9eb42dbb4733", - "sha256:6f589af70286ec6565e3415145a03abc3c14a23ed7ed198ac741de81af332f26", - "sha256:731800acfc6112132aa2b7d08f9d6fe49a0c0071b30985809d084e238af98dac", - "sha256:74d34340323996b70dbd73e9530cca71c05ff7c97e30fe4d32aeea2f877836ca", - "sha256:7801ee9a9fcd47b92d4d90ff9a28cfdc23195cad72bd8032938ab3c794942b43", - "sha256:795dff9229dc024e54bd0f618f5a3adb269ee0cccd7ac9a0bef29df388beed23", - "sha256:7b3773a77ae3b18778c9bf22c7ba6478a0e5416f84b7d2ac6d764001f6d0d985", - "sha256:872697d8bff2572e4225ed8cbce17be338faac28ec1ab3c00419aaef2f56dd3c", - "sha256:8b682ed08caabfb7c042d4be083e28ddc692afb1deff5567111f8855071b75c3", - "sha256:8e846a8272bf02202794fe22beaf389ed27c2d8ebf59aafb43af4935feac0389", - "sha256:8efed581f2ee74f1e0ec04a10e97881b93abc258d13b15ef966aee71732ac152", - "sha256:970dc23ca1c64611d35a3abe76a059cf551da53d62faefd84c5bf3e0af1602d1", - "sha256:9b56eeff51efa556ecc186260ac486a4ddd79ad37bc88d669e96c45190f3c0da", - "sha256:9fc313b1a5547c5416982853f2de1454980704f3ab3dbcad18dacdc565a2eafc", - "sha256:a74e70bf3fd50a413fdce4264e037b8e8f34cb8d9207ac364167b6eb076c14ec", - "sha256:a77796b4c5370cedd4fad2264b6d7a78cb40229c7fa3cbcab24df3adea768962", - "sha256:a81f14f213a75597f9be44feb97740a51adda558465fb159114472dc2ab39ef8", - "sha256:acfc4a02ddf22f6df7184441b39f38c31e95aa8af41de4d2f825821ab1fb85c6", - "sha256:b3861996b06b8238f799b4f1bd9542d1a8ae8e4765adbdde25ed011c3bda11df", - "sha256:b901f12380e988da07f21bb6b75da7f91fd9feffb43fcf70fad698e40a2ef3a7", - "sha256:b99f4291e59dcbe548be5a1e8c6a1a19a860184526c2d14fc374ec687b98ad7d", - "sha256:bb378b0f133e19d437eca4327bac7c3f38e30950c5c604092c72b18cba839bc2", - "sha256:bbb49772fc3896850a704215160df8316db89e5e8876b2d8af6c6c15b4e0f6ea", - "sha256:bc1684b9f7ec92d2ae94a137ec311bd2227f684429521061af7ceed4952c7f72", - "sha256:bdabbe7fd66886943393ecf98318d7801dd40183af80314acd4464bccdd44d53", - "sha256:bf87f2a7f827656bc6e1d9888d47931aa0ae35cdc4ff33b1cec70d8d462590b3", - "sha256:c1e02170f8d358a8ddc716606760c73d55eea6bdb0cca2d97b86447e9524708b", - "sha256:c72ff262613c9a6f20e80bcf1e8bbc000b78b95a7fa301164ab3e3bd23bd936c", - "sha256:c854a206d8c3a5a959b803405760f3627bb4878450e2f36b5d35af09c89152fc", - "sha256:d5b327df02761c42399c878cd6c37f885bf0639befbd4d1ab763cd44ba1e0552", - "sha256:d5c4ca6faff0af4b5f3e7d88d13ec76f8cac36c9bcc814b8c84d9f3f951b2cf9", - "sha256:d61f287f820787d3acf60d113c5ce6e506870d9d3103bc37a74373e72ce9d7a6", - "sha256:dc23f2ac2c1ded250f1aa66fbd1a3d823f76de549978b61eed4fb34affc11338", - "sha256:dc79ed4773cd35328377a8fedbbdcafb3a9d242ee63b96863c0692c81faefab8", - "sha256:df75707f466ab6fa086f164bff2df75fd16543c8d43ca43a268f938c1144e792", - "sha256:e6a74cb618da93ac1322d6a548a4508e76eb4c388ed1c80560bc25d8764cf272", - "sha256:e89a814f1727be7d543ac6910f0d94131f43a337e811ab684606d42dbc22b701", - "sha256:efe75e3b8768c4f9d454d3c1b2b2a67e757f2b00d638146d3a4cddb38460fc3a", - "sha256:f2f950ca403ffaa808a017e40e3371115bcb0b4b1061772b03e7d842555132ac", - "sha256:f4428b6808d781f4b605a27f53fc10a3ca343d1cd901c691b9ba2e4ed85a5fc7", - "sha256:f46ba61c942ee64198444c9562c5cf089eaf97f17b413e15fa1c0614df304734", - "sha256:f472da992a6ba58381c0314b994c01d20e522ff8836417ef1c0975bdae142406", - "sha256:f58e489e43c9a1688c7d5ceb7455b44952d87f183b7b9c915b301478a2b3bfbe", - "sha256:f8576a1dcf445ef064bf8c3b2cdc1d6353e41cb4b366329946883e285dcbcec0", - "sha256:fa787b414c4dc6b6cd75338fac18a7dbb53a09443dd863020a2d2bda76940ca6", - "sha256:fda423836d7d69cba6a6f99e7a34c2e5fe3621e5e945cd25ea9ba60a96223254" + "sha256:1079ca63ff8da5c936b76863690e0bd2489e8d4e0a3a340e032095dae805dd91", + "sha256:198e0b4768b4025eb3309273d7e81dc53834b9a50092be6e0d9b3983cfd35c35", + "sha256:21b5f2460629167340403d359289a173e0729ce8e84e3ce99462009d5d5e01a4", + "sha256:22a94885723f8362d4cb468e68910eef92d3e2b1293de82b8eacb4198ef6655f", + "sha256:2940fb85730b9869254559c491cd83cf777e56c76a8a60df60e4be4f2a4248d7", + "sha256:2ed5b3dd9c209fe7b90990dee4ef21870dca39db1cd326553c314ee1b321c1cc", + "sha256:3602be737c6e9553c45ae89e6b0e556f64f34dabf27d5260317d1824d31b79d3", + "sha256:3b8d7810fb587adbffba025330cf212d9bbed8f29559656d05cb6609673f306a", + "sha256:3ffae79ef8a1ea81ea2748ad7b7ad9b882aa88ddf65ce90f9e944df639eccc61", + "sha256:493eab2b1f6f546730a6de0c5ceb75ce16f3767154e8ae30e2b70d41b928b7d2", + "sha256:5c3171bb95c9b45cbcad25589e1ae4f4ca4ea99dc1724c4e0671eb6b9055514e", + "sha256:63dd2ca52a48841f561bfec0fa3f208d375b0a8dcd3d7b236459e683ae29221d", + "sha256:746550dc7b5af4d04bb5fa4d065f18d39c925bcb5dee30db75747cd9a58bb6e8", + "sha256:75d6d613bae6f27678d5e44e89d61018779726aa6aa950c516d33a04b8af8c59", + "sha256:7bff28d97e47047d69a4ac6bf59adda738cf1d00adde8819117fdb65d966bdbc", + "sha256:8007371f6f2b462f5aa05d5c2135d0a1bcf5b7bdd9bd15d86c730f588d10b7d3", + "sha256:8204a714029784b1a08a3d790430d80b423b68615c5b1e67aabca5bd5419b77d", + "sha256:87108181c7a6ac4d3fc1e4551cab5db5eea7f9fdca611175243234cd94bcc59b", + "sha256:8ce9b62b6aaa5b08773be8a919ecc4e865396c969f982b685eeca6e80c82abb7", + "sha256:9c2b3e60b65c7ac73e44335934e1e122da8d56db87840984601b3c5dc0ae4c19", + "sha256:9ea46e2d45469d13b7f25b08efcdb140220bab1ac5a850db0954591715b8caaa", + "sha256:a2562ebe5a0abec4da0229f8abb5e90ee97b178f19762eb925c1159be36828b3", + "sha256:a29be917fbc99eca204b08407e0971e0205bfdad4b74ec915930675f352b669d", + "sha256:a54ebdc8423ba99d75372708a882fcfc3b14d9d52cf195295ad53e5a47dab37f", + "sha256:af19bc61ded933001cd68f004ae2042bf1a78eb498a3c685ebd655fa1be90dbe", + "sha256:b8f9368036c9e658d8e3b3534086d298a5349c864542b34657cbe57c260daa49", + "sha256:bdb4d8ff5cba3e0bd1adee7d20dbb2b4d80cb31ac04d6ea1cd06cfc02d2ecd0d", + "sha256:bdf5bcac4f1da36ad43567ea6f6ef404347658dbbe417c87cdb1699f327d6337", + "sha256:c7f5bef7f47723c53420e377bc64d2553843bee8bcac5f0ad076ab1524780018", + "sha256:ce1c8af7a4761d2b1b531864d84113948daa0c4245775c63bd9874cb955f4662", + "sha256:db57f26b8c0162cfddb52b869efb1741b8c5e67fc536994f743074985f714c55", + "sha256:e96ae14062bdcddc3197300e6ee4efa6fbc6749be917db934eac66d0daaecb68", + "sha256:e9a785eb26884429d9b9f6326e68c3638828c83bf6d42d2463c97ad5385caff2", + "sha256:ef55b96b7f2ed823e0b924de902065ec42ade856366c287dbb073fabd6b90ec1", + "sha256:f3f4a447800850aba7724a2274ea0a4800724520c1caf38f7d0dabf2f89a5e15", + "sha256:f40f3243139d675f43793a4e35c410c370f7b91ccae74e70c8b2f4877869f90e", + "sha256:f9a2585e0da9cf343ea27421995b881736a1eb604a7c1d4ca74126af94c3d4a8", + "sha256:fa26415b4a118ea790de9d38f244312f2510a9bb5c65e560184d241a6f391a2d", + "sha256:fabb2be57e4ca28ea36c13146cdf97d73abd27c51741923fc6ba1e8cd33e255c", + "sha256:fdb7cd8271471a5979d84915c1ee57eea7e0a69c893225fc418db66883b0e2a7", + "sha256:fde2376b180ae2620c102fbc3ef06638d306feae83964aaa5051ecbdda54845a" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.1" + "markers": "python_version >= '3.8'", + "version": "==1.0.2" }, "pycodestyle": { "hashes": [ @@ -2622,14 +2592,6 @@ "index": "pypi", "version": "==3.5.0" }, - "pyproject-flake8": { - "hashes": [ - "sha256:bdc7ca9b967b9724983903489b8943b72c668178fb69f03e8774ec74f6a13782", - "sha256:d43421caca0ef8a672874405fe63c722b0333e3c22c41648c6df60f21bab2b6b" - ], - "index": "pypi", - "version": "==6.0.0.post1" - }, "pytest": { "hashes": [ "sha256:58ecc27ebf0ea643ebfdf7fb1249335da761a00c9f955bcd922349bcb68ee57d", @@ -2643,7 +2605,7 @@ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, "python-dotenv": { @@ -2937,11 +2899,11 @@ }, "qtconsole": { "hashes": [ - "sha256:a3b69b868e041c2c698bdc75b0602f42e130ffb256d6efa48f9aa756c97672aa", - "sha256:b7ffb53d74f23cee29f4cdb55dd6fabc8ec312d94f3c46ba38e1dde458693dfb" + "sha256:6b6bcf8f834c6df1579a3e6623c8531b85d3e723997cee3a1156296df14716c8", + "sha256:ea8b4a07d7dc915a1b1238fbfe2c9aea570640402557b64615e09a4bc60df47c" ], - "markers": "python_version >= '3.7'", - "version": "==5.4.4" + "markers": "python_version >= '3.8'", + "version": "==5.5.0" }, "qtpy": { "hashes": [ @@ -3051,108 +3013,108 @@ }, "rpds-py": { "hashes": [ - "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed", - "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8", - "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417", - "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801", - "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31", - "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116", - "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5", - "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393", - "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532", - "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc", - "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2", - "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df", - "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3", - "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf", - "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647", - "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3", - "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721", - "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247", - "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c", - "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42", - "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014", - "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65", - "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e", - "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02", - "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb", - "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c", - "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043", - "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403", - "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57", - "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50", - "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6", - "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071", - "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487", - "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138", - "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2", - "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063", - "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6", - "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35", - "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a", - "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238", - "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba", - "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175", - "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6", - "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8", - "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396", - "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d", - "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9", - "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977", - "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3", - "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55", - "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977", - "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80", - "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4", - "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c", - "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4", - "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac", - "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1", - "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0", - "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5", - "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469", - "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d", - "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f", - "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c", - "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2", - "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf", - "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5", - "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7", - "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e", - "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7", - "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336", - "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4", - "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed", - "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9", - "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094", - "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f", - "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b", - "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13", - "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722", - "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53", - "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4", - "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38", - "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e", - "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31", - "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586", - "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad", - "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7", - "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482", - "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d", - "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066", - "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b", - "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b", - "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d", - "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9", - "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069", - "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971", - "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18", - "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1", - "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d", - "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281" + "sha256:0525847f83f506aa1e28eb2057b696fe38217e12931c8b1b02198cfe6975e142", + "sha256:05942656cb2cb4989cd50ced52df16be94d344eae5097e8583966a1d27da73a5", + "sha256:0831d3ecdea22e4559cc1793f22e77067c9d8c451d55ae6a75bf1d116a8e7f42", + "sha256:0853da3d5e9bc6a07b2486054a410b7b03f34046c123c6561b535bb48cc509e1", + "sha256:08e6e7ff286254016b945e1ab632ee843e43d45e40683b66dd12b73791366dd1", + "sha256:0a38612d07a36138507d69646c470aedbfe2b75b43a4643f7bd8e51e52779624", + "sha256:0bedd91ae1dd142a4dc15970ed2c729ff6c73f33a40fa84ed0cdbf55de87c777", + "sha256:0c5441b7626c29dbd54a3f6f3713ec8e956b009f419ffdaaa3c80eaf98ddb523", + "sha256:0e9e976e0dbed4f51c56db10831c9623d0fd67aac02853fe5476262e5a22acb7", + "sha256:0fadfdda275c838cba5102c7f90a20f2abd7727bf8f4a2b654a5b617529c5c18", + "sha256:1096ca0bf2d3426cbe79d4ccc91dc5aaa73629b08ea2d8467375fad8447ce11a", + "sha256:171d9a159f1b2f42a42a64a985e4ba46fc7268c78299272ceba970743a67ee50", + "sha256:188912b22b6c8225f4c4ffa020a2baa6ad8fabb3c141a12dbe6edbb34e7f1425", + "sha256:1b4cf9ab9a0ae0cb122685209806d3f1dcb63b9fccdf1424fb42a129dc8c2faa", + "sha256:1e04581c6117ad9479b6cfae313e212fe0dfa226ac727755f0d539cd54792963", + "sha256:1fa73ed22c40a1bec98d7c93b5659cd35abcfa5a0a95ce876b91adbda170537c", + "sha256:2124f9e645a94ab7c853bc0a3644e0ca8ffbe5bb2d72db49aef8f9ec1c285733", + "sha256:240687b5be0f91fbde4936a329c9b7589d9259742766f74de575e1b2046575e4", + "sha256:25740fb56e8bd37692ed380e15ec734be44d7c71974d8993f452b4527814601e", + "sha256:27ccc93c7457ef890b0dd31564d2a05e1aca330623c942b7e818e9e7c2669ee4", + "sha256:281c8b219d4f4b3581b918b816764098d04964915b2f272d1476654143801aa2", + "sha256:2d34a5450a402b00d20aeb7632489ffa2556ca7b26f4a63c35f6fccae1977427", + "sha256:301bd744a1adaa2f6a5e06c98f1ac2b6f8dc31a5c23b838f862d65e32fca0d4b", + "sha256:30e5ce9f501fb1f970e4a59098028cf20676dee64fc496d55c33e04bbbee097d", + "sha256:33ab498f9ac30598b6406e2be1b45fd231195b83d948ebd4bd77f337cb6a2bff", + "sha256:35585a8cb5917161f42c2104567bb83a1d96194095fc54a543113ed5df9fa436", + "sha256:389c0e38358fdc4e38e9995e7291269a3aead7acfcf8942010ee7bc5baee091c", + "sha256:3acadbab8b59f63b87b518e09c4c64b142e7286b9ca7a208107d6f9f4c393c5c", + "sha256:3b7a64d43e2a1fa2dd46b678e00cabd9a49ebb123b339ce799204c44a593ae1c", + "sha256:3c8c0226c71bd0ce9892eaf6afa77ae8f43a3d9313124a03df0b389c01f832de", + "sha256:429349a510da82c85431f0f3e66212d83efe9fd2850f50f339341b6532c62fe4", + "sha256:466030a42724780794dea71eb32db83cc51214d66ab3fb3156edd88b9c8f0d78", + "sha256:47aeceb4363851d17f63069318ba5721ae695d9da55d599b4d6fb31508595278", + "sha256:48aa98987d54a46e13e6954880056c204700c65616af4395d1f0639eba11764b", + "sha256:4b2416ed743ec5debcf61e1242e012652a4348de14ecc7df3512da072b074440", + "sha256:4d0a675a7acbbc16179188d8c6d0afb8628604fc1241faf41007255957335a0b", + "sha256:4eb74d44776b0fb0782560ea84d986dffec8ddd94947f383eba2284b0f32e35e", + "sha256:4f8a1d990dc198a6c68ec3d9a637ba1ce489b38cbfb65440a27901afbc5df575", + "sha256:513ccbf7420c30e283c25c82d5a8f439d625a838d3ba69e79a110c260c46813f", + "sha256:5210a0018c7e09c75fa788648617ebba861ae242944111d3079034e14498223f", + "sha256:54cdfcda59251b9c2f87a05d038c2ae02121219a04d4a1e6fc345794295bdc07", + "sha256:56dd500411d03c5e9927a1eb55621e906837a83b02350a9dc401247d0353717c", + "sha256:57ec6baec231bb19bb5fd5fc7bae21231860a1605174b11585660236627e390e", + "sha256:5f1519b080d8ce0a814f17ad9fb49fb3a1d4d7ce5891f5c85fc38631ca3a8dc4", + "sha256:6174d6ad6b58a6bcf67afbbf1723420a53d06c4b89f4c50763d6fa0a6ac9afd2", + "sha256:68172622a5a57deb079a2c78511c40f91193548e8ab342c31e8cb0764d362459", + "sha256:6915fc9fa6b3ec3569566832e1bb03bd801c12cea030200e68663b9a87974e76", + "sha256:6b75b912a0baa033350367a8a07a8b2d44fd5b90c890bfbd063a8a5f945f644b", + "sha256:6f5dcb658d597410bb7c967c1d24eaf9377b0d621358cbe9d2ff804e5dd12e81", + "sha256:6f8d7fe73d1816eeb5378409adc658f9525ecbfaf9e1ede1e2d67a338b0c7348", + "sha256:7036316cc26b93e401cedd781a579be606dad174829e6ad9e9c5a0da6e036f80", + "sha256:7188ddc1a8887194f984fa4110d5a3d5b9b5cd35f6bafdff1b649049cbc0ce29", + "sha256:761531076df51309075133a6bc1db02d98ec7f66e22b064b1d513bc909f29743", + "sha256:7979d90ee2190d000129598c2b0c82f13053dba432b94e45e68253b09bb1f0f6", + "sha256:8015835494b21aa7abd3b43fdea0614ee35ef6b03db7ecba9beb58eadf01c24f", + "sha256:81c4d1a3a564775c44732b94135d06e33417e829ff25226c164664f4a1046213", + "sha256:81cf9d306c04df1b45971c13167dc3bad625808aa01281d55f3cf852dde0e206", + "sha256:88857060b690a57d2ea8569bca58758143c8faa4639fb17d745ce60ff84c867e", + "sha256:8c567c664fc2f44130a20edac73e0a867f8e012bf7370276f15c6adc3586c37c", + "sha256:91bd2b7cf0f4d252eec8b7046fa6a43cee17e8acdfc00eaa8b3dbf2f9a59d061", + "sha256:9620650c364c01ed5b497dcae7c3d4b948daeae6e1883ae185fef1c927b6b534", + "sha256:9b007c2444705a2dc4a525964fd4dd28c3320b19b3410da6517cab28716f27d3", + "sha256:9bf9acce44e967a5103fcd820fc7580c7b0ab8583eec4e2051aec560f7b31a63", + "sha256:a239303acb0315091d54c7ff36712dba24554993b9a93941cf301391d8a997ee", + "sha256:a2baa6be130e8a00b6cbb9f18a33611ec150b4537f8563bddadb54c1b74b8193", + "sha256:a54917b7e9cd3a67e429a630e237a90b096e0ba18897bfb99ee8bd1068a5fea0", + "sha256:a689e1ded7137552bea36305a7a16ad2b40be511740b80748d3140614993db98", + "sha256:a952ae3eb460c6712388ac2ec706d24b0e651b9396d90c9a9e0a69eb27737fdc", + "sha256:aa32205358a76bf578854bf31698a86dc8b2cb591fd1d79a833283f4a403f04b", + "sha256:b2287c09482949e0ca0c0eb68b2aca6cf57f8af8c6dfd29dcd3bc45f17b57978", + "sha256:b6b0e17d39d21698185097652c611f9cf30f7c56ccec189789920e3e7f1cee56", + "sha256:b710bf7e7ae61957d5c4026b486be593ed3ec3dca3e5be15e0f6d8cf5d0a4990", + "sha256:b8e11715178f3608874508f08e990d3771e0b8c66c73eb4e183038d600a9b274", + "sha256:b92aafcfab3d41580d54aca35a8057341f1cfc7c9af9e8bdfc652f83a20ced31", + "sha256:bec29b801b4adbf388314c0d050e851d53762ab424af22657021ce4b6eb41543", + "sha256:c694bee70ece3b232df4678448fdda245fd3b1bb4ba481fb6cd20e13bb784c46", + "sha256:c6b52b7028b547866c2413f614ee306c2d4eafdd444b1ff656bf3295bf1484aa", + "sha256:cb41ad20064e18a900dd427d7cf41cfaec83bcd1184001f3d91a1f76b3fcea4e", + "sha256:cd316dbcc74c76266ba94eb021b0cc090b97cca122f50bd7a845f587ff4bf03f", + "sha256:ced40cdbb6dd47a032725a038896cceae9ce267d340f59508b23537f05455431", + "sha256:d1c562a9bb72244fa767d1c1ab55ca1d92dd5f7c4d77878fee5483a22ffac808", + "sha256:d389ff1e95b6e46ebedccf7fd1fadd10559add595ac6a7c2ea730268325f832c", + "sha256:d56b1cd606ba4cedd64bb43479d56580e147c6ef3f5d1c5e64203a1adab784a2", + "sha256:d72a4315514e5a0b9837a086cb433b004eea630afb0cc129de76d77654a9606f", + "sha256:d9e7f29c00577aff6b318681e730a519b235af292732a149337f6aaa4d1c5e31", + "sha256:dbc25baa6abb205766fb8606f8263b02c3503a55957fcb4576a6bb0a59d37d10", + "sha256:e57919c32ee295a2fca458bb73e4b20b05c115627f96f95a10f9f5acbd61172d", + "sha256:e5bbe011a2cea9060fef1bb3d668a2fd8432b8888e6d92e74c9c794d3c101595", + "sha256:e6aea5c0eb5b0faf52c7b5c4a47c8bb64437173be97227c819ffa31801fa4e34", + "sha256:e888be685fa42d8b8a3d3911d5604d14db87538aa7d0b29b1a7ea80d354c732d", + "sha256:eebaf8c76c39604d52852366249ab807fe6f7a3ffb0dd5484b9944917244cdbe", + "sha256:efbe0b5e0fd078ed7b005faa0170da4f72666360f66f0bb2d7f73526ecfd99f9", + "sha256:efddca2d02254a52078c35cadad34762adbae3ff01c6b0c7787b59d038b63e0d", + "sha256:f05450fa1cd7c525c0b9d1a7916e595d3041ac0afbed2ff6926e5afb6a781b7f", + "sha256:f12d69d568f5647ec503b64932874dade5a20255736c89936bf690951a5e79f5", + "sha256:f45321224144c25a62052035ce96cbcf264667bcb0d81823b1bbc22c4addd194", + "sha256:f62581d7e884dd01ee1707b7c21148f61f2febb7de092ae2f108743fcbef5985", + "sha256:f8832a4f83d4782a8f5a7b831c47e8ffe164e43c2c148c8160ed9a6d630bc02a", + "sha256:fa35ad36440aaf1ac8332b4a4a433d4acd28f1613f0d480995f5cfd3580e90b7" ], "markers": "python_version >= '3.8'", - "version": "==0.10.6" + "version": "==0.12.0" }, "rtree": { "hashes": [ @@ -3417,7 +3379,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "sniffio": { @@ -3539,11 +3501,11 @@ }, "traitlets": { "hashes": [ - "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47", - "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35" + "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", + "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" ], "markers": "python_version >= '3.8'", - "version": "==5.12.0" + "version": "==5.13.0" }, "typeguard": { "hashes": [ @@ -3608,10 +3570,10 @@ }, "wcwidth": { "hashes": [ - "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704", - "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4" + "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223", + "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8" ], - "version": "==0.2.8" + "version": "==0.2.9" }, "webcolors": { "hashes": [ @@ -3750,11 +3712,11 @@ }, "xyzservices": { "hashes": [ - "sha256:70b9910f6c8e46f6ca92dea21e9b8cf89edf0ead35a870198fb59a7d63579525", - "sha256:eee203e91955782fd8bfc2f05846830c289139dc0ab4eaf733bfa8f0be71861f" + "sha256:091229269043bc8258042edbedad4fcb44684b0473ede027b5672ad40dc9fa02", + "sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" ], "markers": "python_version >= '3.8'", - "version": "==2023.10.0" + "version": "==2023.10.1" }, "y-py": { "hashes": [ @@ -3855,10 +3817,10 @@ "develop": { "asttokens": { "hashes": [ - "sha256:2e0171b991b2c959acc6c49318049236844a5da1d65ba2672c4880c1c894834e", - "sha256:cf8fc9e61a86461aa9fb161a14a0841a03c405fa829ac6b202670b3495d2ce69" + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" ], - "version": "==2.4.0" + "version": "==2.4.1" }, "backcall": { "hashes": [ @@ -3877,10 +3839,11 @@ }, "executing": { "hashes": [ - "sha256:06df6183df67389625f4e763921c6cf978944721abf3e714000200aab95b0657", - "sha256:0ff053696fdeef426cda5bd18eacd94f82c91f49823a2e9090124212ceea9b08" + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" ], - "version": "==2.0.0" + "markers": "python_version >= '3.5'", + "version": "==2.0.1" }, "ipython": { "hashes": [ @@ -3964,7 +3927,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "stack-data": { @@ -3976,11 +3939,11 @@ }, "traitlets": { "hashes": [ - "sha256:81539f07f7aebcde2e4b5ab76727f53eabf18ad155c6ed7979a681411602fa47", - "sha256:833273bf645d8ce31dcb613c56999e2e055b1ffe6d09168a164bcd91c36d5d35" + "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", + "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" ], "markers": "python_version >= '3.8'", - "version": "==5.12.0" + "version": "==5.13.0" }, "typing-extensions": { "hashes": [ @@ -3992,10 +3955,10 @@ }, "wcwidth": { "hashes": [ - "sha256:77f719e01648ed600dfa5402c347481c0992263b81a027344f3e1ba25493a704", - "sha256:8705c569999ffbb4f6a87c6d1b80f324bd6db952f5eb0b95bc07517f4c1813d4" + "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223", + "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8" ], - "version": "==0.2.8" + "version": "==0.2.9" } } } diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py index b0197de74..71dbbc9b4 100755 --- a/data/wbd/generate_pre_clip_fim_huc8.py +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -131,7 +131,7 @@ def pre_clip_hucs_from_wbd(wbd_file, outputs_dir, huc_list, number_of_jobs, over if number_of_jobs > total_cpus_available: print( f'Provided: -j {number_of_jobs}, which is greater than than amount of available cpus -2: ' - f'{total_cpus_available -2} will be used instead.' + f'{total_cpus_available - 2} will be used instead.' ) number_of_jobs = total_cpus_available - 2 diff --git a/data/write_parquet_from_calib_pts.py b/data/write_parquet_from_calib_pts.py index 5d1f903b3..5ffb7a50b 100644 --- a/data/write_parquet_from_calib_pts.py +++ b/data/write_parquet_from_calib_pts.py @@ -231,7 +231,7 @@ def create_parquet_files( if number_of_jobs > total_cpus_available: logging.info( f'Provided: -j {number_of_jobs}, which is greater than than amount of available cpus -1: ' - f'{total_cpus_available -1} will be used instead.' + f'{total_cpus_available - 1} will be used instead.' ) number_of_jobs = total_cpus_available - 1 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7d9369013..a6cbbc5a7 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,52 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.7.0 - 2023-11-13 - [PR#1030](https://github.com/NOAA-OWP/inundation-mapping/pull/1030) + +This PR introduces the `.github/workflows/lint_and_format.yaml` file which serves as the first step in developing a Continuous Integration pipeline for this repository. +The `flake8-pyproject` dependency is now used, as it works out of the box with the `pre-commit` GitHub Action in the GitHub Hosted Runner environment. +In switching to this package, a couple of `E721` errors appeared. Modifications were made to the appropriate files to resolve the `flake8` `E721` errors. +Also, updates to the `unit_tests` were necessary since Branch IDs have changed with the latest code. + +A small fix was also included where `src_adjust_ras2fim_rating.py` which sometimes fails with an encoding error when the ras2fim csv sometimes is created or adjsuted in windows. + +### Changes +- `.pre-commit-config.yaml`: use `flake8-pyproject` package instead of `pyproject-flake8`. +- `Pipfile` and `Pipfile.lock`: updated to use `flake8-pyproject` package instead of `pyproject-flake8`, upgrade `pyarrow` version. +- `data` + - `/wbd/generate_pre_clip_fim_huc8.py`: Add space between (-) operator line 134. + - `write_parquet_from_calib_pts.py`: Add space between (-) operator line 234. +- `src` + - `check_huc_inputs.py`: Change `== string` to `is str`, remove `import string` + - `src_adjust_ras2fim_rating.py`: Fixed encoding error. +- `tools` + - `eval_plots.py`: Add space after comma in lines 207 & 208 + - `generate_categorical_fim_mapping.py`: Use `is` instead of `==`, line 315 + - `hash_compare.py`: Add space after comma, line 153. + - `inundate_mosaic_wrapper.py`: Use `is` instead of `==`, line 73. + - `inundation_wrapper_nwm_flows.py`: Use `is not` instead of `!=`, line 76. + - `mosaic_inundation.py`: Use `is` instead of `==`, line 181. +- `unit_tests` + - `README.md`: Updated documentation, run `pytest` in `/foss_fim` directory. + - `clip_vectors_to_wbd_test.py`: File moved to data/wbd directory, update import statement, skipped this test. + - `filter_catchments_and_add_attributes_params.json`: Update Branch ID + - `inundate_gms_params.json`: Moved to `unit_tests/` folder. + - `inundate_gms_test.py`: Moved to `unit_tests/` folder. + - `inundation_params.json`: Moved to `unit_tests/` folder. + - `inundation_test.py`: Moved to `unit_tests/` folder. + - `outputs_cleanup_params.json`: Update Branch ID + - `outputs_cleanup_test.py`: Update import statement + - `split_flows_params.json`: Update Branch ID + - `usgs_gage_crosswalk_params.json`: Update Branch ID & update argument to gage_crosswalk.run_crosswalk + - `usgs_gage_crosswalk_test.py`: Update params to gage_crosswalk.run_crosswalk + +### Additions +- `.github/workflows/` + - `lint_and_format.yaml`: Add GitHub Actions Workflow file for Continuous Integration environment (lint and format test). + +

+ +======= ## v4.4.6.0 - 2023-11-17 - [PR#1031](https://github.com/NOAA-OWP/inundation-mapping/pull/1031) Upgrade our acquire 3Dep DEMs script to pull down South Alaska HUCS with its own CRS. @@ -23,6 +69,7 @@ This issue closes [1028](https://github.com/NOAA-OWP/inundation-mapping/issues/1 - Changed date/times to utc. - Upgraded error handing for the gdal "processing" call. +

## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) diff --git a/src/check_huc_inputs.py b/src/check_huc_inputs.py index ef58280d0..6c6c2fad9 100755 --- a/src/check_huc_inputs.py +++ b/src/check_huc_inputs.py @@ -4,7 +4,6 @@ import argparse import os import pathlib -import string from glob import glob from logging import exception @@ -59,8 +58,8 @@ def __clean_huc_value(huc): def __check_for_membership(hucs, accepted_hucs_set): for huc in hucs: - if (type(huc) == string) and (not huc.isnumeric()): - msg = f"Huc value of {huc} does not appear to be a number." + if (type(huc) is str) and (not huc.isnumeric()): + msg = f"Huc value of {huc} does not appear to be a number. " msg += "It could be an incorrect value but also could be that the huc list " msg += "(if you used one), is not unix encoded." raise KeyError(msg) diff --git a/src/src_adjust_ras2fim_rating.py b/src/src_adjust_ras2fim_rating.py index 7136e617a..22a47b33e 100644 --- a/src/src_adjust_ras2fim_rating.py +++ b/src/src_adjust_ras2fim_rating.py @@ -52,7 +52,9 @@ def create_ras2fim_rating_database(ras_rc_filepath, ras_elev_df, nwm_recurr_file print('Reading RAS2FIM rating curves from csv...') log_text = 'Processing database for RAS2FIM flow/WSE at NWM flow recur intervals...\n' col_filter = ["fid_xs", "flow", "wse"] - ras_rc_df = pd.read_csv(ras_rc_filepath, dtype={'fid_xs': object}, usecols=col_filter) # , nrows=30000) + ras_rc_df = pd.read_csv( + ras_rc_filepath, dtype={'fid_xs': object}, usecols=col_filter, encoding="unicode_escape" + ) # , nrows=30000) ras_rc_df.rename(columns={'fid_xs': 'location_id'}, inplace=True) # ras_rc_df['location_id'] = ras_rc_df['feature_id'].astype(object) print('Duration (read ras_rc_csv): {}'.format(dt.datetime.now() - start_time)) diff --git a/tools/eval_plots.py b/tools/eval_plots.py index dab85e934..75773deec 100644 --- a/tools/eval_plots.py +++ b/tools/eval_plots.py @@ -204,8 +204,8 @@ def scatterplot(dataframe, x_field, y_field, title_text, stats_text=False, annot axes.tick_params(labelsize='xx-large') # Define y axis label and x axis label. - axes.set_ylabel(f'{y_field.replace("_"," ")}', fontsize='xx-large', weight='bold') - axes.set_xlabel(f'{x_field.replace("_"," ")}', fontsize='xx-large', weight='bold') + axes.set_ylabel(f'{y_field.replace("_", " ")}', fontsize='xx-large', weight='bold') + axes.set_xlabel(f'{x_field.replace("_", " ")}', fontsize='xx-large', weight='bold') # Plot diagonal line diag_range = [0, 1] diff --git a/tools/generate_categorical_fim_mapping.py b/tools/generate_categorical_fim_mapping.py index 1fb068d77..df44a4a52 100755 --- a/tools/generate_categorical_fim_mapping.py +++ b/tools/generate_categorical_fim_mapping.py @@ -312,7 +312,7 @@ def reformat_inundation_maps( handle = os.path.split(extent_grid)[1].replace('.tif', '') diss_extent_filename = os.path.join(gpkg_dir, f"{handle}_{huc}_dissolved.gpkg") extent_poly_diss["geometry"] = [ - MultiPolygon([feature]) if type(feature) == Polygon else feature + MultiPolygon([feature]) if type(feature) is Polygon else feature for feature in extent_poly_diss["geometry"] ] diff --git a/tools/hash_compare.py b/tools/hash_compare.py index 49946025a..8de401be2 100755 --- a/tools/hash_compare.py +++ b/tools/hash_compare.py @@ -150,7 +150,7 @@ def compare_gpkg(file1, file2, list_of_failed_files=[], verbose=False): except AssertionError as e: print(f"\n {str(e)} \n") print(" The following files failed assert_geodataframe_equal: ") - print(f" -{file1.rsplit('/',1)[-1]} ") + print(f" {file1.rsplit('/', 1)[-1]} ") list_of_failed_files.append(f1_gdf) diff --git a/tools/inundate_mosaic_wrapper.py b/tools/inundate_mosaic_wrapper.py index 1620a7820..c75c4ea2e 100644 --- a/tools/inundate_mosaic_wrapper.py +++ b/tools/inundate_mosaic_wrapper.py @@ -70,8 +70,9 @@ def produce_mosaicked_inundation( raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), hydrofabric_dir) # If the "hucs" argument is really one huc, convert it to a list - if type(hucs) == str: + if type(hucs) is str: hucs = [hucs] + # Check that huc folder exists in the hydrofabric_dir. for huc in hucs: if not os.path.exists(os.path.join(hydrofabric_dir, huc)): diff --git a/tools/inundation_wrapper_nwm_flows.py b/tools/inundation_wrapper_nwm_flows.py index 68f4ff27b..2b2d73b60 100755 --- a/tools/inundation_wrapper_nwm_flows.py +++ b/tools/inundation_wrapper_nwm_flows.py @@ -73,7 +73,7 @@ def run_recurr_test(fim_run_dir, branch_name, huc_id, magnitude, mask_type='huc' # Check if magnitude is list of magnitudes or single value. magnitude_list = magnitude - if type(magnitude_list) != list: + if type(magnitude_list) is not list: magnitude_list = [magnitude_list] for magnitude in magnitude_list: diff --git a/tools/mosaic_inundation.py b/tools/mosaic_inundation.py index 6229b9907..7baa7f5dc 100755 --- a/tools/mosaic_inundation.py +++ b/tools/mosaic_inundation.py @@ -178,7 +178,7 @@ def mosaic_final_inundation_extent_to_poly(inundation_raster, inundation_polygon extent_poly = gpd.GeoDataFrame.from_features(list(results), crs=src.crs) extent_poly_diss = extent_poly.dissolve(by="extent") extent_poly_diss["geometry"] = [ - MultiPolygon([feature]) if type(feature) == Polygon else feature + MultiPolygon([feature]) if type(feature) is Polygon else feature for feature in extent_poly_diss["geometry"] ] diff --git a/unit_tests/README.md b/unit_tests/README.md index f957a4e77..6612b9761 100644 --- a/unit_tests/README.md +++ b/unit_tests/README.md @@ -56,7 +56,7 @@ docker run --rm -it --name mytest \ -v /abcd_share/foss_fim/outputs_temp/:/fim_temp \ fim_4:dev_20220208_8eba0ee ``` -* Call the `fim_pipeline.sh` script with the necessary arguments. +* Call the `fim_pipeline.sh` script with the necessary arguments (`-n` must be `unit_test_data`). ```bash fim_pipeline.sh -n unit_test_data -u "02020005 05030104" \ -bd /foss_fim/config/deny_branch_unittests.lst \ @@ -79,18 +79,21 @@ python3 foss_fim/tools/synthesize_test_cases.py \ ## Running unit tests ### If you'd like to test the whole unit test suite: +When inside of the container, ensure you are within the root directory of the repository before running the `pytest` command. ``` +cd /foss_fim pytest /foss_fim/unit_tests ``` -__NOTE:__ This is subject to error, as the downloaded/generated data could potentially have a different path than what is specified in the `/unit_tests/*_params.json` files. The data files are not included in this repository, are potentially not uniform accross machines, and are subject to change. +__NOTE:__ This is subject to error, as the downloaded/generated data could potentially have a different path than what is specified in the `/unit_tests/*_params.json` files. The data files are not included in this repository, so are subject to change. ### If you want to test just one unit test (from the root terminal window): ```bash -pytest /foss_fim/unit_tests/gms/derive_level_paths_test.py +cd /foss_fim +pytest unit_tests/gms/derive_level_paths_test.py or -pytest /foss_fim/unit_tests/clip_vectors_to_wbd_test.py +pytest unit_tests/inundate_gms_test.py ``` ### If you'd like to run a particular test, you can, for example: @@ -133,9 +136,7 @@ ie: ## [Pytest](https://docs.pytest.org/en/7.2.x/) particulars -The `pyproject.toml` file has been added, which contains the build system requirements of Python projects. This file used to specify which warnings are disabled to pass our unit tests. - -A `__init__.py` file has been added to the subdirectory of `/tools` in order for the `pytest` command run in the `/unit_tests` to pick up the tests in those directories as well. +The `unit_tests/pyproject.toml` file is used to specify which warnings are disabled for our particular unit tests. Luckily, `pytest` works well with The Python Standard Library `unittest`. This made the migration of previous unit tests using `unittest` over to `pytest` quite simple. The caveat is that our current unit tests employ elements of both libraries. A full transition to `pytest` will ideally take place at a future date. diff --git a/unit_tests/clip_vectors_to_wbd_test.py b/unit_tests/clip_vectors_to_wbd_test.py index 2930883db..9c817a448 100644 --- a/unit_tests/clip_vectors_to_wbd_test.py +++ b/unit_tests/clip_vectors_to_wbd_test.py @@ -4,10 +4,11 @@ import os import unittest -import clip_vectors_to_wbd as src import pytest from unit_tests_utils import FIM_unit_test_helpers as ut_helpers +import data.wbd.clip_vectors_to_wbd as src + class test_clip_vectors_to_wbd(unittest.TestCase): @@ -24,7 +25,11 @@ def setUpClass(self): # Test Cases: # TODO New Test Case to check that files were being created on the file system - + @pytest.mark.skip( + reason="pre clipped vector files are now generated using generate_pre_clip_fim_huc8.py and " + "sent to the /inputs directory. Testing the clip_vectors_to_wbd.py is no longer necessary, " + "as this script is not run during fim_pipeline.sh execution." + ) def test_subset_vector_layers_success(self): """ This NEEDS be upgraded to check the output, as well as the fact that all of the output files exist. diff --git a/unit_tests/filter_catchments_and_add_attributes_params.json b/unit_tests/filter_catchments_and_add_attributes_params.json index 84a4b5b19..a68a46fd7 100644 --- a/unit_tests/filter_catchments_and_add_attributes_params.json +++ b/unit_tests/filter_catchments_and_add_attributes_params.json @@ -1,10 +1,10 @@ { "valid_data": { "outputDestDir": "/outputs/unit_test_data", - "input_catchments_filename": "/data/outputs/unit_test_data/02020005/branches/3246000006/gw_catchments_reaches_3246000006.gpkg", - "input_flows_filename": "/data/outputs/unit_test_data/02020005/branches/3246000006/demDerived_reaches_split_3246000006.gpkg", - "output_catchments_filename": "/data/outputs/unit_test_data/02020005/branches/3246000006/gw_catchments_reaches_filtered_addedAttributes_3246000006.gpkg", - "output_flows_filename": "/data/outputs/unit_test_data/02020005/branches/3246000006/demDerived_reaches_split_filtered_3246000006.gpkg", + "input_catchments_filename": "/data/outputs/unit_test_data/02020005/branches/2274000033/gw_catchments_reaches_2274000033.gpkg", + "input_flows_filename": "/data/outputs/unit_test_data/02020005/branches/2274000033/demDerived_reaches_split_2274000033.gpkg", + "output_catchments_filename": "/data/outputs/unit_test_data/02020005/branches/2274000033/gw_catchments_reaches_filtered_addedAttributes_2274000033.gpkg", + "output_flows_filename": "/data/outputs/unit_test_data/02020005/branches/2274000033/demDerived_reaches_split_filtered_2274000033.gpkg", "wbd_filename": "/data/outputs/unit_test_data/02020005/wbd8_clp.gpkg", "huc_code": "02020005" } diff --git a/unit_tests/tools/inundate_gms_params.json b/unit_tests/inundate_gms_params.json similarity index 100% rename from unit_tests/tools/inundate_gms_params.json rename to unit_tests/inundate_gms_params.json diff --git a/unit_tests/tools/inundate_gms_test.py b/unit_tests/inundate_gms_test.py similarity index 97% rename from unit_tests/tools/inundate_gms_test.py rename to unit_tests/inundate_gms_test.py index b15557a7b..c8cfdab5e 100644 --- a/unit_tests/tools/inundate_gms_test.py +++ b/unit_tests/inundate_gms_test.py @@ -8,8 +8,7 @@ import inundate_gms as src import pandas as pd import pytest - -from unit_tests.unit_tests_utils import FIM_unit_test_helpers as ut_helpers +from unit_tests_utils import FIM_unit_test_helpers as ut_helpers class test_inundate_gms(unittest.TestCase): diff --git a/unit_tests/tools/inundation_params.json b/unit_tests/inundation_params.json similarity index 100% rename from unit_tests/tools/inundation_params.json rename to unit_tests/inundation_params.json diff --git a/unit_tests/tools/inundation_test.py b/unit_tests/inundation_test.py similarity index 100% rename from unit_tests/tools/inundation_test.py rename to unit_tests/inundation_test.py diff --git a/unit_tests/outputs_cleanup_params.json b/unit_tests/outputs_cleanup_params.json index 516292c3f..a3d70bca5 100644 --- a/unit_tests/outputs_cleanup_params.json +++ b/unit_tests/outputs_cleanup_params.json @@ -1,8 +1,8 @@ { "valid_specific_branch_data": { - "src_dir": "/data/outputs/unit_test_data/02020005/branches/3246000009", + "src_dir": "/data/outputs/unit_test_data/02020005/branches/2274000018", "deny_list": "/foss_fim/config/deny_branches.lst", - "branch_id": "3246000009", + "branch_id": "2274000018", "verbose": true }, "valid_directory_data": { diff --git a/unit_tests/outputs_cleanup_test.py b/unit_tests/outputs_cleanup_test.py index e3c9e5149..d339ff183 100644 --- a/unit_tests/outputs_cleanup_test.py +++ b/unit_tests/outputs_cleanup_test.py @@ -11,7 +11,7 @@ import pytest from unit_tests_utils import FIM_unit_test_helpers as ut_helpers -import src.outputs_cleanup as src +import outputs_cleanup as src from utils.shared_functions import FIM_Helpers as fh diff --git a/unit_tests/split_flows_params.json b/unit_tests/split_flows_params.json index e7f7676c9..a4a17c248 100644 --- a/unit_tests/split_flows_params.json +++ b/unit_tests/split_flows_params.json @@ -4,10 +4,10 @@ "max_length": 1500, "slope_min": 0.001, "lakes_buffer_input": 20, - "flows_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/demDerived_reaches_3246000005.shp", - "dem_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/dem_thalwegCond_3246000005.tif", - "split_flows_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/demDerived_reaches_split_3246000005.gpkg", - "split_points_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/demDerived_reaches_split_points_3246000005.gpkg", + "flows_filename": "/data/outputs/unit_test_data/02020005/branches/2274000031/demDerived_reaches_2274000031.shp", + "dem_filename": "/data/outputs/unit_test_data/02020005/branches/2274000031/dem_thalwegCond_2274000031.tif", + "split_flows_filename": "/data/outputs/unit_test_data/02020005/branches/2274000031/demDerived_reaches_split_2274000031.gpkg", + "split_points_filename": "/data/outputs/unit_test_data/02020005/branches/2274000031/demDerived_reaches_split_points_2274000031.gpkg", "wbd8_clp_filename": "/data/outputs/unit_test_data/02020005/wbd8_clp.gpkg", "lakes_filename": "/data/outputs/unit_test_data/02020005/nwm_lakes_proj_subset.gpkg", "nwm_streams_filename": "/data/outputs/unit_test_data/02020005/nwm_subset_streams_levelPaths.gpkg" diff --git a/unit_tests/tools/__init__.py b/unit_tests/tools/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/unit_tests/usgs_gage_crosswalk_params.json b/unit_tests/usgs_gage_crosswalk_params.json index 33ec7cd41..e65627bed 100644 --- a/unit_tests/usgs_gage_crosswalk_params.json +++ b/unit_tests/usgs_gage_crosswalk_params.json @@ -1,11 +1,12 @@ { "valid_data": { "usgs_gages_filename": "/data/outputs/unit_test_data/02020005/usgs_subset_gages.gpkg", - "input_flows_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/demDerived_reaches_split_filtered_3246000005.gpkg", - "input_catchment_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/gw_catchments_reaches_filtered_addedAttributes_3246000005.gpkg", - "dem_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/dem_meters_3246000005.tif", - "dem_adj_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/dem_thalwegCond_3246000005.tif", - "output_table_filename": "/data/outputs/unit_test_data/02020005/branches/3246000005/usgs_elev_table.csv", - "branch_id": "3246000005" + "input_flows_filename": "/data/outputs/unit_test_data/02020005/branches/2274000028/demDerived_reaches_split_filtered_2274000028.gpkg", + "input_catchment_filename": "/data/outputs/unit_test_data/02020005/branches/2274000028/gw_catchments_reaches_filtered_addedAttributes_2274000028.gpkg", + "dem_filename": "/data/outputs/unit_test_data/02020005/branches/2274000028/dem_meters_2274000028.tif", + "dem_adj_filename": "/data/outputs/unit_test_data/02020005/branches/2274000028/dem_thalwegCond_2274000028.tif", + "output_table_filename": "/data/outputs/unit_test_data/02020005/branches/2274000028/usgs_elev_table.csv", + "output_directory": "/data/outputs/unit_test_data/02020005/branches/2274000028", + "branch_id": "2274000028" } } diff --git a/unit_tests/usgs_gage_crosswalk_test.py b/unit_tests/usgs_gage_crosswalk_test.py index 0fe7d41c9..43d9fa2de 100644 --- a/unit_tests/usgs_gage_crosswalk_test.py +++ b/unit_tests/usgs_gage_crosswalk_test.py @@ -52,7 +52,7 @@ def test_GageCrosswalk_success(self): params["input_flows_filename"], params["dem_filename"], params["dem_adj_filename"], - params["output_table_filename"], + params["output_directory"], ) # Make sure that the usgs_elev_table.csv was written From 3a453705f723de39922f2472520af75fe8f43490 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 1 Dec 2023 13:24:58 -0700 Subject: [PATCH 14/51] v4.4.7.1 Adjust ras2fim calibration input changes (#1036) --- config/params_template.env | 15 --------------- docs/CHANGELOG.md | 22 ++++++++++++++++++++-- src/bash_variables.env | 24 ++++++++++++++++++++++++ src/run_unit_wb.sh | 2 +- src/usgs_gage_crosswalk.py | 12 +++++++++--- src/usgs_gage_unit_setup.py | 4 +--- 6 files changed, 55 insertions(+), 24 deletions(-) diff --git a/config/params_template.env b/config/params_template.env index 6c2cb1687..ab761336c 100644 --- a/config/params_template.env +++ b/config/params_template.env @@ -33,48 +33,33 @@ export levee_id_attribute=SYSTEM_ID #### apply bathymetry adjustment to rating curve #### export bathymetry_adjust=True -export bathymetry_file="$inputsDir/bathymetry/bathymetry_adjustment_data.gpkg" #### estimating bankfull stage in SRCs #### # Toggle to run identify_bankfull routine (True=on; False=off) export src_bankfull_toggle="True" -# input file location with nwm feature_id and recurrence flow values -export bankfull_flows_file="$inputsDir/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv" #### applying channel/overbank subdivision routine to SRCs #### # Toggle to run composite roughness src routine (True=on; False=off) export src_subdiv_toggle="True" # text to append to output log and hydrotable file names (use for testing/debugging) export vrough_suffix="" -# input file location with nwm feature_id and channel roughness and overbank roughness attributes -export vmann_input_file="$inputsDir/rating_curve/variable_roughness/mannings_global_06_12.csv" #### SRC calibration variables -# input file location with nwm feature_id and recurrence flow values -export nwm_recur_file="$inputsDir/rating_curve/nwm_recur_flows/nwm21_17C_recurrence_flows_cfs.csv" - #### apply SRC adjustments using USGS rating curve database #### # Toggle to run src adjustment routine with USGS rating data (True=on; False=off) export src_adjust_usgs="True" -# input file location with usgs rating curve database -export usgs_rating_curve_csv="$inputsDir/usgs_gages/usgs_rating_curves.csv" #### apply SRC adjustments using ras2fim rating curve database #### # Toggle to run src adjustment routine with ras2fim data (True=on; False=off) export src_adjust_ras2fim="True" -# input file location with nwm feature_id and recurrence flow values -export ras_rating_curve_csv="$inputsDir/rating_curve/ras2fim_exports/reformat_ras_rating_curve_table.csv" #### apply SRC adjustments using observed FIM/flow point database (parquet files)#### # Toggle to run src adjustment routine with flood edge point db (True=on; False=off) export src_adjust_spatial="True" -export fim_obs_pnt_data="$inputsDir/rating_curve/water_edge_database/usgs_nws_benchmark_points_cleaned.gpkg" #### apply manual calibration #### # Toggle to run manual calibration routine (True=on; False=off) export manual_calb_toggle="True" -# Input file location with HUC, nwm feature_id and manual calibration coefficients -export man_calb_file="$inputsDir/rating_curve/manual_calibration_coefficients.csv" #### computational parameters #### export ncores_gw=1 # mpi number of cores for gagewatershed diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a6cbbc5a7..09d892805 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,26 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.7.1 - 2023-12-01 - [PR#1036](https://github.com/NOAA-OWP/inundation-mapping/pull/1036) + +Quick update to match incoming ras2fim calibration output files being feed into FIM was the initial change. + +There is no FIM issue card for this, but this is related to a ras2fim [PR #205](https://github.com/NOAA-OWP/ras2fim/pull/205) which also made changes to ensure compatibility. New copies of both the `reformat_ras_rating_curve_table_rel_101.csv` and `reformat_ras_rating_curve_points_rel_101.gpkg` were generated from ras2fim but retained the version of `rel_101`. + +Originally, was planning to update just the two locations for newer versions of the two `reformat_ras_rating_surve...` files. Both had been update to recognize the ras2release version rel_101. + +In the process of doing that, we took the opportunity to move all inputs files from params_template.env and put them into bash_variables.env as per precedence set recently. + +### Changes + +- `config`/`params_template.env`: moved input variables into `src/bash_variables.env` +- `src` + - `bash_variablles.env`: Added all input variables from `params_template.env` to here and added one new one from `run_unit_wb.sh` for ras_rating_curve_points_gpkg. + - `run_unit_wb.sh`: Updated an input param to the usgs_gage_unit_setup.py file to point the -ras param to the updated rel_101 value now in the `src/bash_variables.env`. + - `usgs_gage_unit_setup.py`: Changed to drop a column no longer going to be coming from ras2fim calibration files. + +

+ ## v4.4.7.0 - 2023-11-13 - [PR#1030](https://github.com/NOAA-OWP/inundation-mapping/pull/1030) This PR introduces the `.github/workflows/lint_and_format.yaml` file which serves as the first step in developing a Continuous Integration pipeline for this repository. @@ -46,7 +66,6 @@ A small fix was also included where `src_adjust_ras2fim_rating.py` which sometim

-======= ## v4.4.6.0 - 2023-11-17 - [PR#1031](https://github.com/NOAA-OWP/inundation-mapping/pull/1031) Upgrade our acquire 3Dep DEMs script to pull down South Alaska HUCS with its own CRS. @@ -69,7 +88,6 @@ This issue closes [1028](https://github.com/NOAA-OWP/inundation-mapping/issues/1 - Changed date/times to utc. - Upgraded error handing for the gdal "processing" call. -

## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) diff --git a/src/bash_variables.env b/src/bash_variables.env index 01a1cf4f3..fe348a63c 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -16,6 +16,30 @@ export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_W export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 +export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg + +# input file location with nwm feature_id and recurrence flow values +export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv + +# input file location with nwm feature_id and channel roughness and overbank roughness attributes +export vmann_input_file=${inputsDir}/rating_curve/variable_roughness/mannings_global_025_05.csv + +# input file location with nwm feature_id and recurrence flow values +export nwm_recur_file=${inputsDir}/rating_curve/nwm_recur_flows/nwm21_17C_recurrence_flows_cfs.csv + +# input file location with usgs rating curve database +export usgs_rating_curve_csv=${inputsDir}/usgs_gages/usgs_rating_curves.csv + +# input file locations for ras2fim locations and rating curve data +export ras_rating_curve_csv=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_table_rel_101.csv +export ras_rating_curve_points_gpkg=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_points_rel_101.gpkg + +export fim_obs_pnt_data=${inputsDir}/rating_curve/water_edge_database/usgs_nws_benchmark_points_cleaned.gpkg + +# Input file location with HUC, nwm feature_id and manual calibration coefficients +export man_calb_file=${inputsDir}/rating_curve/manual_calibration_coefficients.csv + + # Styling export startDiv="\n-----------------------------------------------------------------\n" export stopDiv="\n-----------------------------------------------------------------\n" diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 4dc8a4898..701246900 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -276,7 +276,7 @@ if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then python3 $srcDir/usgs_gage_unit_setup.py \ -gages $inputsDir/usgs_gages/usgs_gages.gpkg \ -nwm $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg \ - -ras $inputsDir/rating_curve/ras2fim_exports/reformat_ras_rating_curve_points.gpkg \ + -ras $ras_rating_curve_points_gpkg \ -o $tempHucDataDir/usgs_subset_gages.gpkg \ -huc $hucNumber \ -ahps $inputsDir/ahps_sites/nws_lid.gpkg \ diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index 6adba78d4..b87dfc430 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -117,8 +117,8 @@ def write(self, output_directory): elev_table = elev_table[elev_table['location_id'].notna()] elev_table.source = elev_table.source.apply(str.lower) - # filter for just ras2fim entries - ras_elev_table = elev_table[elev_table['source'] == 'ras2fim'] + # filter for just ras2fim entries (note that source column includes suffix with version number) + ras_elev_table = elev_table[elev_table['source'].str.contains('ras2fim')] ras_elev_table = ras_elev_table[ [ "location_id", @@ -134,9 +134,15 @@ def write(self, output_directory): ] if not ras_elev_table.empty: ras_elev_table.to_csv(join(output_directory, 'ras_elev_table.csv'), index=False) + else: + print( + 'INFO: there were no ras2fim points located in this huc' + ' (note that most hucs do not have ras2fim data)' + ) # filter for just usgs entries - usgs_elev_table = elev_table[elev_table['source'] != 'ras2fim'] + # look for source attributes that do not contain "ras2fim" + usgs_elev_table = elev_table[~elev_table['source'].str.contains('ras2fim')] if not usgs_elev_table.empty: usgs_elev_table.to_csv(join(output_directory, 'usgs_elev_table.csv'), index=False) diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index 8ef766aaa..61e82c797 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -33,9 +33,7 @@ def load_gages(self): # !!! Geopandas is not honoring the dtype arg with this read_file below (huc8 being read as int64). # Need the raw data to store the 'huc8' attribute as an object to avoid issues with integers truncating the leading zero from some hucs ras_locs = gpd.read_file(self.ras_locs_filename, dtype={'huc8': 'object'}) - ras_locs = ras_locs[ - ['feature_id', 'huc8', 'stream_stn', 'fid_xs', 'source', 'wrds_timestamp', 'geometry'] - ] + ras_locs = ras_locs[['feature_id', 'huc8', 'stream_stn', 'fid_xs', 'source', 'geometry']] ras_locs['location_id'] = ras_locs['fid_xs'] # Convert ras locs crs to match usgs gage crs From 5e794f55f2f2ac909795f66bfba06dfec8d28e0f Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 8 Dec 2023 13:40:41 -0700 Subject: [PATCH 15/51] v4.4.7.2 Fix inundation nation pathing errors (#1026) * Fixes for inundate_nation to create boolean rasters * fixed bug with default huc lists * took out debug line, added more prints * fix some output print errors * debugging * rolled most changes back to Ryan's orig fix * minor adj to temp dir * update notes in_nation * Update inundate_nation.py * Update CHANGELOG.md * Update params_template.env * Added vrt raster and final mosaic step; fixed logging * More fixes for logging info and adding log printing to screen * fix linting error * Added multi-threading to gdal.translate * linting fix * Revert "linting fix" This reverts commit 15aad0427198d5bece4f33b6b7629f45f1c86417. * fixing linting errors * more linting fixes --------- Co-authored-by: RyanSpies-NOAA Co-authored-by: Carson Pruitt <90792257+CarsonPruitt-NOAA@users.noreply.github.com> --- docs/CHANGELOG.md | 15 ++++ tools/inundate_mosaic_wrapper.py | 2 - tools/inundate_nation.py | 124 +++++++++++++++++++++++-------- 3 files changed, 107 insertions(+), 34 deletions(-) mode change 100644 => 100755 tools/inundate_nation.py diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 09d892805..a1314d95f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.7.2 - 2023-12-08 - [PR#1026](https://github.com/NOAA-OWP/inundation-mapping/pull/1026) + +A couple of directly related issues were fixed in this PR. +The initial problem came from Issue #[1025](https://github.com/NOAA-OWP/inundation-mapping/issues/1025) which was about a pathing issue for the outputs directory. In testing that fix, it exposed a few other pathing and file cleanup issues which are now fixed. We also added more console output to help view variables and pathing. + +### Changes + +- `config`/`params_template.env`: Updated for a newer mannings global file. Changed and tested by Ryan Spies. +- `tools` + - `inundate_mosiac_wrapper.py`: Took out a misleading and non-required print statement. + - `inundate_nation.py`: As mentioned above. + +

+ ## v4.4.7.1 - 2023-12-01 - [PR#1036](https://github.com/NOAA-OWP/inundation-mapping/pull/1036) Quick update to match incoming ras2fim calibration output files being feed into FIM was the initial change. @@ -90,6 +104,7 @@ This issue closes [1028](https://github.com/NOAA-OWP/inundation-mapping/issues/1

+ ## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) During a recent BED attempt which added the new pre-clip system, it was erroring out on a number of hucs. It was issuing an error in the add_crosswalk.py script. While a minor bug does exist there, after a wide number of tests, the true culprit is the memory profile system embedded throughout FIM. This system has been around for at least a few years but not in use. It is not 100% clear why it became a problem with the addition of pre-clip, but that changes how records are loaded which likely affected memory at random times. diff --git a/tools/inundate_mosaic_wrapper.py b/tools/inundate_mosaic_wrapper.py index c75c4ea2e..5b274122a 100644 --- a/tools/inundate_mosaic_wrapper.py +++ b/tools/inundate_mosaic_wrapper.py @@ -93,8 +93,6 @@ def produce_mosaicked_inundation( "Please lower the num_workers.".format(num_workers, total_cpus_available) ) - fh.vprint("Running inundate for " + huc + "...", verbose) - # Call Inundate_gms map_file = Inundate_gms( hydrofabric_dir=hydrofabric_dir, diff --git a/tools/inundate_nation.py b/tools/inundate_nation.py old mode 100644 new mode 100755 index fe8680418..050436670 --- a/tools/inundate_nation.py +++ b/tools/inundate_nation.py @@ -6,17 +6,14 @@ import os import re import shutil -import sys from datetime import datetime from multiprocessing import Pool import rasterio from inundate_mosaic_wrapper import produce_mosaicked_inundation -from osgeo import gdal, ogr -from rasterio.merge import merge +from osgeo import gdal from utils.shared_functions import FIM_Helpers as fh -from utils.shared_variables import PREP_PROJECTION, elev_raster_ndv # INUN_REVIEW_DIR = r'/data/inundation_review/inundation_nwm_recurr/' @@ -26,6 +23,9 @@ # DEFAULT_OUTPUT_DIR = '/data/inundation_review/inundate_nation/mosaic_output/' +# TODO: Nov 2023, Logging system appears to be not working correctly. + + def inundate_nation(fim_run_dir, output_dir, magnitude_key, flow_file, huc_list, inc_mosaic, job_number): assert os.path.exists(flow_file), f"ERROR: could not find the flow file: {flow_file}" @@ -37,12 +37,14 @@ def inundate_nation(fim_run_dir, output_dir, magnitude_key, flow_file, huc_list, + " max jobs will be used instead." ) + print() + print("Inundation Nation script starting...") + fim_version = os.path.basename(os.path.normpath(fim_run_dir)) - logging.info(f"Using fim version: {fim_version}") output_base_file_name = magnitude_key + "_" + fim_version - # print(output_base_file_name) __setup_logger(output_dir, output_base_file_name) + logging.info(f"Using fim version: {fim_version}") start_dt = datetime.now() @@ -52,48 +54,42 @@ def inundate_nation(fim_run_dir, output_dir, magnitude_key, flow_file, huc_list, logging.info(f"flow_file: {flow_file}") logging.info(f"inc_mosaic: {str(inc_mosaic)}") - print("Preparing to generate inundation outputs for magnitude: " + magnitude_key) - print("Input flow file: " + flow_file) - magnitude_output_dir = os.path.join(output_dir, output_base_file_name) if not os.path.exists(magnitude_output_dir): - print("Creating new output directory for raw mosaic files: " + magnitude_output_dir) + logging.info( + "Removing previous output dir and creating new output dir for inunation wrapper files: " + + magnitude_output_dir + ) os.mkdir(magnitude_output_dir) else: # we need to empty it. we will kill it and remake it (using rmtree to force it) shutil.rmtree(magnitude_output_dir, ignore_errors=True) os.mkdir(magnitude_output_dir) - if huc_list is None: + if huc_list == 'all' or len(huc_list) == 0: huc_list = [] for huc in os.listdir(fim_run_dir): - # if ( - # huc != 'logs' - # and huc != 'branch_errors' - # and huc != 'unit_errors' - # and os.path.isdir(os.path.join(fim_run_dir, huc)) - # ): if re.match(r'\d{8}', huc): huc_list.append(huc) else: for huc in huc_list: - assert os.path.isdir( - fim_run_dir + os.sep + huc - ), f'ERROR: could not find the input fim_dir location: {fim_run_dir + os.sep + huc}' + huc_path = os.path.join(fim_run_dir, huc) + assert os.path.isdir(huc_path), f'ERROR: could not find the input fim_dir location: {huc_path}' - print("Inundation raw mosaic outputs here: " + magnitude_output_dir) + huc_list.sort() + logging.info(f"Inundation mosaic wrapper outputs will saved here: {magnitude_output_dir}") run_inundation([fim_run_dir, huc_list, magnitude_key, magnitude_output_dir, flow_file, job_number]) # Perform mosaic operation if inc_mosaic: fh.print_current_date_time() logging.info(datetime.now().strftime("%Y_%m_%d-%H_%M_%S")) - print("Performing bool mosaic process...") logging.info("Performing bool mosaic process...") - output_bool_dir = os.path.join(output_dir, "bool_temp") + logging.info(f"output_bool_dir is {output_bool_dir}") + if not os.path.exists(output_bool_dir): os.mkdir(output_bool_dir) else: @@ -105,7 +101,7 @@ def inundate_nation(fim_run_dir, output_dir, magnitude_key, flow_file, huc_list, for rasfile in os.listdir(magnitude_output_dir): if rasfile.endswith(".tif") and "extent" in rasfile: # p = magnitude_output_dir + rasfile - procs_list.append([magnitude_output_dir, rasfile, output_bool_dir]) + procs_list.append([magnitude_output_dir, rasfile, output_bool_dir, fim_version]) # Multiprocess --> create boolean inundation rasters for all hucs if len(procs_list) > 0: @@ -116,10 +112,17 @@ def inundate_nation(fim_run_dir, output_dir, magnitude_key, flow_file, huc_list, print(msg) logging.info(msg) - # now cleanup the raw mosiac directories + # Perform VRT creation and mosaic all of the huc rasters using boolean rasters + vrt_raster_mosaic(output_bool_dir, output_dir, output_base_file_name, job_number) + + # now cleanup the temp bool directory shutil.rmtree(output_bool_dir, ignore_errors=True) + else: + print("Skipping mosiaking") + # now cleanup the raw mosiac directories + # comment this out if you want to see the individual huc rasters shutil.rmtree(magnitude_output_dir, ignore_errors=True) fh.print_current_date_time() @@ -149,7 +152,16 @@ def run_inundation(args): inundation_raster = os.path.join(magnitude_output_dir, magnitude + "_inund_extent.tif") - print("Running the NWM recurrence intervals for HUC inundation (extent) for magnitude: " + str(magnitude)) + logging.info( + "Running inundation wrapper for the NWM recurrence intervals for each huc using magnitude: " + + str(magnitude) + ) + print( + "This will take a long time depending on the number of HUCs. Progress bar may not appear." + " Once it gets to boolean/mosiacing (if applicable), screen output will exist. To see if the script has frozen," + " you should be able to watch the file system for some changes." + ) + print() produce_mosaicked_inundation( fim_run_dir, @@ -167,6 +179,7 @@ def create_bool_rasters(args): in_raster_dir = args[0] rasfile = args[1] output_bool_dir = args[2] + fim_version = args[3] print("Calculating boolean inundate raster: " + rasfile) p = in_raster_dir + os.sep + rasfile @@ -189,23 +202,70 @@ def create_bool_rasters(args): dtype="int8", compress="lzw", ) - with rasterio.open(output_bool_dir + os.sep + "bool_" + rasfile, "w", **profile) as dst: + with rasterio.open( + output_bool_dir + os.sep + rasfile[:-4] + '_' + fim_version + '.tif', "w", **profile + ) as dst: dst.write(array.astype(rasterio.int8)) -def __setup_logger(output_folder_path, log_file_name_key): +def vrt_raster_mosaic(output_bool_dir, output_dir, fim_version_tag, threads): + rasters_to_mosaic = [] + for rasfile in os.listdir(output_bool_dir): + if rasfile.endswith('.tif') and "extent" in rasfile: + p = output_bool_dir + os.sep + rasfile + rasters_to_mosaic.append(p) + + output_mosiac_vrt = os.path.join(output_bool_dir, fim_version_tag + "_merged.vrt") + logging.info("Creating virtual raster: " + output_mosiac_vrt) + vrt = gdal.BuildVRT(output_mosiac_vrt, rasters_to_mosaic) + + output_mosiac_raster = os.path.join(output_dir, fim_version_tag + "_mosaic.tif") + logging.info("Building raster mosaic: " + output_mosiac_raster) + logging.info("Using " + str(threads) + " threads for parallizing") + print("Note: This step can take a number of hours if processing 100s of hucs") + gdal.Translate( + output_mosiac_raster, + vrt, + xRes=10, + yRes=-10, + creationOptions=['COMPRESS=LZW', 'TILED=YES', 'PREDICTOR=2', 'NUM_THREADS=' + str(threads)], + ) + vrt = None + + +def __setup_logger(output_folder_path, log_file_name_key, log_level=logging.INFO): start_time = datetime.now() file_dt_string = start_time.strftime("%Y_%m_%d-%H_%M_%S") log_file_name = f"{log_file_name_key}-{file_dt_string}.log" log_file_path = os.path.join(output_folder_path, log_file_name) + print('Log file created here:' + str(log_file_path)) + + # Clear previous logging configuration + logging.getLogger().handlers = [] + + # Create a StreamHandler and set the level + console_handler = logging.StreamHandler() + console_handler.setLevel(log_level) + + # Create a FileHandler and set the level + file_handler = logging.FileHandler(log_file_path) + file_handler.setLevel(log_level) - logging.basicConfig(filename=log_file_path, level=logging.DEBUG, format="%(message)s") + # Create a formatter and set the formatter for the handlers + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s") + console_handler.setFormatter(formatter) + file_handler.setFormatter(formatter) - # yes.. this can do console logs as well, but it can be a bit unstable and ugly + # Add the handlers to the logger + logger = logging.getLogger() + logger.setLevel(log_level) + logger.addHandler(console_handler) + logger.addHandler(file_handler) - logging.info(f'Started : {start_time.strftime("%m/%d/%Y %H:%M:%S")}') - logging.info("----------------") + # Log the start time + logger.info(f'Started: {start_time.strftime("%m/%d/%Y %H:%M:%S")}') + logger.info("----------------") if __name__ == "__main__": From 9ed73c6a91ac5668a15e3fadcfefa43027e3eeea Mon Sep 17 00:00:00 2001 From: Rob Gonzalez-Pita Date: Fri, 8 Dec 2023 13:45:53 -0700 Subject: [PATCH 16/51] v4.4.8.0 Copy files to scratch directory for processing, and remove upon completion (#1045) --- Pipfile.lock | 340 +++++++++++++++++++++-------------------- config/deny_unit.lst | 4 + docs/CHANGELOG.md | 13 ++ src/bash_variables.env | 48 +++--- src/run_unit_wb.sh | 15 +- 5 files changed, 223 insertions(+), 197 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index 61853dec6..a0e867a67 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "196cd7e33d0458f7b032017fcd2e1940761158c53a4130adb8915f036ed61b49" + "sha256": "05bec99d8be9c133d86cc5a13bbb8dd751b89eaa4368df49170d3527a84bb127" }, "pipfile-spec": 6, "requires": { @@ -42,11 +42,11 @@ }, "anyio": { "hashes": [ - "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f", - "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a" + "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f", + "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da" ], "markers": "python_version >= '3.8'", - "version": "==4.0.0" + "version": "==4.1.0" }, "appdirs": { "hashes": [ @@ -133,7 +133,7 @@ "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==4.12.2" }, "black": { @@ -773,11 +773,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", - "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.3" + "version": "==1.2.0" }, "executing": { "hashes": [ @@ -789,10 +789,10 @@ }, "fastjsonschema": { "hashes": [ - "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea", - "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8" + "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e", + "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225" ], - "version": "==2.18.1" + "version": "==2.19.0" }, "filelock": { "hashes": [ @@ -963,19 +963,19 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "importlib-metadata": { "hashes": [ - "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" + "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7", + "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67" ], "markers": "python_version < '3.9'", - "version": "==6.8.0" + "version": "==7.0.0" }, "importlib-resources": { "hashes": [ @@ -1157,19 +1157,19 @@ "format-nongpl" ], "hashes": [ - "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392", - "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc" + "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa", + "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3" ], "markers": "python_version >= '3.8'", - "version": "==4.19.2" + "version": "==4.20.0" }, "jsonschema-specifications": { "hashes": [ - "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", - "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb" + "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8", + "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93" ], "markers": "python_version >= '3.8'", - "version": "==2023.7.1" + "version": "==2023.11.2" }, "jupyter": { "hashes": [ @@ -1214,11 +1214,12 @@ }, "jupyter-server": { "hashes": [ - "sha256:47b8f5e63440125cb1bb8957bf12b18453ee5ed9efe42d2f7b2ca66a7019a278", - "sha256:dde56c9bc3cb52d7b72cc0f696d15d7163603526f1a758eb4a27405b73eab2a5" + "sha256:0c548151b54bcb516ca466ec628f7f021545be137d01b5467877e87f6fff4374", + "sha256:0c99f9367b0f24141e527544522430176613f9249849be80504c6d2b955004bb" ], + "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.10.0" + "version": "==2.11.2" }, "jupyter-server-fileid": { "hashes": [ @@ -1262,11 +1263,11 @@ }, "jupyterlab-pygments": { "hashes": [ - "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f", - "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d" + "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", + "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780" ], - "markers": "python_version >= '3.7'", - "version": "==0.2.2" + "markers": "python_version >= '3.8'", + "version": "==0.3.0" }, "jupyterlab-server": { "hashes": [ @@ -1710,16 +1711,16 @@ "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e", "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15" ], - "markers": "python_version >= '3.8'", + "markers": "python_full_version >= '3.8.0'", "version": "==0.9.0" }, "nbconvert": { "hashes": [ - "sha256:abedc01cf543177ffde0bfc2a69726d5a478f6af10a332fc1bf29fcb4f0cf000", - "sha256:d1d417b7f34a4e38887f8da5bdfd12372adf3b80f995d57556cb0972c68909fe" + "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310", + "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0" ], "markers": "python_version >= '3.8'", - "version": "==7.11.0" + "version": "==7.12.0" }, "nbformat": { "hashes": [ @@ -2093,11 +2094,11 @@ }, "platformdirs": { "hashes": [ - "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3", - "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==3.11.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ @@ -2117,11 +2118,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:35f7a8c22139e2bb7ca5a698e92d38145bc8dc74c1c0bf56f25cca886a764e17", - "sha256:8de3ae2755f890826f4b6479e5571d4f74ac17a81345fe69a6778fdb92579184" + "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1", + "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92" ], "markers": "python_version >= '3.8'", - "version": "==0.18.0" + "version": "==0.19.0" }, "prompt-toolkit": { "hashes": [ @@ -2226,6 +2227,7 @@ "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" ], + "markers": "os_name != 'nt'", "version": "==0.7.0" }, "pure-eval": { @@ -2453,11 +2455,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pyparsing": { "hashes": [ @@ -2946,11 +2948,11 @@ }, "referencing": { "hashes": [ - "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", - "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0" + "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec", + "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d" ], "markers": "python_version >= '3.8'", - "version": "==0.30.2" + "version": "==0.31.1" }, "requests": { "hashes": [ @@ -3013,108 +3015,108 @@ }, "rpds-py": { "hashes": [ - "sha256:0525847f83f506aa1e28eb2057b696fe38217e12931c8b1b02198cfe6975e142", - "sha256:05942656cb2cb4989cd50ced52df16be94d344eae5097e8583966a1d27da73a5", - "sha256:0831d3ecdea22e4559cc1793f22e77067c9d8c451d55ae6a75bf1d116a8e7f42", - "sha256:0853da3d5e9bc6a07b2486054a410b7b03f34046c123c6561b535bb48cc509e1", - "sha256:08e6e7ff286254016b945e1ab632ee843e43d45e40683b66dd12b73791366dd1", - "sha256:0a38612d07a36138507d69646c470aedbfe2b75b43a4643f7bd8e51e52779624", - "sha256:0bedd91ae1dd142a4dc15970ed2c729ff6c73f33a40fa84ed0cdbf55de87c777", - "sha256:0c5441b7626c29dbd54a3f6f3713ec8e956b009f419ffdaaa3c80eaf98ddb523", - "sha256:0e9e976e0dbed4f51c56db10831c9623d0fd67aac02853fe5476262e5a22acb7", - "sha256:0fadfdda275c838cba5102c7f90a20f2abd7727bf8f4a2b654a5b617529c5c18", - "sha256:1096ca0bf2d3426cbe79d4ccc91dc5aaa73629b08ea2d8467375fad8447ce11a", - "sha256:171d9a159f1b2f42a42a64a985e4ba46fc7268c78299272ceba970743a67ee50", - "sha256:188912b22b6c8225f4c4ffa020a2baa6ad8fabb3c141a12dbe6edbb34e7f1425", - "sha256:1b4cf9ab9a0ae0cb122685209806d3f1dcb63b9fccdf1424fb42a129dc8c2faa", - "sha256:1e04581c6117ad9479b6cfae313e212fe0dfa226ac727755f0d539cd54792963", - "sha256:1fa73ed22c40a1bec98d7c93b5659cd35abcfa5a0a95ce876b91adbda170537c", - "sha256:2124f9e645a94ab7c853bc0a3644e0ca8ffbe5bb2d72db49aef8f9ec1c285733", - "sha256:240687b5be0f91fbde4936a329c9b7589d9259742766f74de575e1b2046575e4", - "sha256:25740fb56e8bd37692ed380e15ec734be44d7c71974d8993f452b4527814601e", - "sha256:27ccc93c7457ef890b0dd31564d2a05e1aca330623c942b7e818e9e7c2669ee4", - "sha256:281c8b219d4f4b3581b918b816764098d04964915b2f272d1476654143801aa2", - "sha256:2d34a5450a402b00d20aeb7632489ffa2556ca7b26f4a63c35f6fccae1977427", - "sha256:301bd744a1adaa2f6a5e06c98f1ac2b6f8dc31a5c23b838f862d65e32fca0d4b", - "sha256:30e5ce9f501fb1f970e4a59098028cf20676dee64fc496d55c33e04bbbee097d", - "sha256:33ab498f9ac30598b6406e2be1b45fd231195b83d948ebd4bd77f337cb6a2bff", - "sha256:35585a8cb5917161f42c2104567bb83a1d96194095fc54a543113ed5df9fa436", - "sha256:389c0e38358fdc4e38e9995e7291269a3aead7acfcf8942010ee7bc5baee091c", - "sha256:3acadbab8b59f63b87b518e09c4c64b142e7286b9ca7a208107d6f9f4c393c5c", - "sha256:3b7a64d43e2a1fa2dd46b678e00cabd9a49ebb123b339ce799204c44a593ae1c", - "sha256:3c8c0226c71bd0ce9892eaf6afa77ae8f43a3d9313124a03df0b389c01f832de", - "sha256:429349a510da82c85431f0f3e66212d83efe9fd2850f50f339341b6532c62fe4", - "sha256:466030a42724780794dea71eb32db83cc51214d66ab3fb3156edd88b9c8f0d78", - "sha256:47aeceb4363851d17f63069318ba5721ae695d9da55d599b4d6fb31508595278", - "sha256:48aa98987d54a46e13e6954880056c204700c65616af4395d1f0639eba11764b", - "sha256:4b2416ed743ec5debcf61e1242e012652a4348de14ecc7df3512da072b074440", - "sha256:4d0a675a7acbbc16179188d8c6d0afb8628604fc1241faf41007255957335a0b", - "sha256:4eb74d44776b0fb0782560ea84d986dffec8ddd94947f383eba2284b0f32e35e", - "sha256:4f8a1d990dc198a6c68ec3d9a637ba1ce489b38cbfb65440a27901afbc5df575", - "sha256:513ccbf7420c30e283c25c82d5a8f439d625a838d3ba69e79a110c260c46813f", - "sha256:5210a0018c7e09c75fa788648617ebba861ae242944111d3079034e14498223f", - "sha256:54cdfcda59251b9c2f87a05d038c2ae02121219a04d4a1e6fc345794295bdc07", - "sha256:56dd500411d03c5e9927a1eb55621e906837a83b02350a9dc401247d0353717c", - "sha256:57ec6baec231bb19bb5fd5fc7bae21231860a1605174b11585660236627e390e", - "sha256:5f1519b080d8ce0a814f17ad9fb49fb3a1d4d7ce5891f5c85fc38631ca3a8dc4", - "sha256:6174d6ad6b58a6bcf67afbbf1723420a53d06c4b89f4c50763d6fa0a6ac9afd2", - "sha256:68172622a5a57deb079a2c78511c40f91193548e8ab342c31e8cb0764d362459", - "sha256:6915fc9fa6b3ec3569566832e1bb03bd801c12cea030200e68663b9a87974e76", - "sha256:6b75b912a0baa033350367a8a07a8b2d44fd5b90c890bfbd063a8a5f945f644b", - "sha256:6f5dcb658d597410bb7c967c1d24eaf9377b0d621358cbe9d2ff804e5dd12e81", - "sha256:6f8d7fe73d1816eeb5378409adc658f9525ecbfaf9e1ede1e2d67a338b0c7348", - "sha256:7036316cc26b93e401cedd781a579be606dad174829e6ad9e9c5a0da6e036f80", - "sha256:7188ddc1a8887194f984fa4110d5a3d5b9b5cd35f6bafdff1b649049cbc0ce29", - "sha256:761531076df51309075133a6bc1db02d98ec7f66e22b064b1d513bc909f29743", - "sha256:7979d90ee2190d000129598c2b0c82f13053dba432b94e45e68253b09bb1f0f6", - "sha256:8015835494b21aa7abd3b43fdea0614ee35ef6b03db7ecba9beb58eadf01c24f", - "sha256:81c4d1a3a564775c44732b94135d06e33417e829ff25226c164664f4a1046213", - "sha256:81cf9d306c04df1b45971c13167dc3bad625808aa01281d55f3cf852dde0e206", - "sha256:88857060b690a57d2ea8569bca58758143c8faa4639fb17d745ce60ff84c867e", - "sha256:8c567c664fc2f44130a20edac73e0a867f8e012bf7370276f15c6adc3586c37c", - "sha256:91bd2b7cf0f4d252eec8b7046fa6a43cee17e8acdfc00eaa8b3dbf2f9a59d061", - "sha256:9620650c364c01ed5b497dcae7c3d4b948daeae6e1883ae185fef1c927b6b534", - "sha256:9b007c2444705a2dc4a525964fd4dd28c3320b19b3410da6517cab28716f27d3", - "sha256:9bf9acce44e967a5103fcd820fc7580c7b0ab8583eec4e2051aec560f7b31a63", - "sha256:a239303acb0315091d54c7ff36712dba24554993b9a93941cf301391d8a997ee", - "sha256:a2baa6be130e8a00b6cbb9f18a33611ec150b4537f8563bddadb54c1b74b8193", - "sha256:a54917b7e9cd3a67e429a630e237a90b096e0ba18897bfb99ee8bd1068a5fea0", - "sha256:a689e1ded7137552bea36305a7a16ad2b40be511740b80748d3140614993db98", - "sha256:a952ae3eb460c6712388ac2ec706d24b0e651b9396d90c9a9e0a69eb27737fdc", - "sha256:aa32205358a76bf578854bf31698a86dc8b2cb591fd1d79a833283f4a403f04b", - "sha256:b2287c09482949e0ca0c0eb68b2aca6cf57f8af8c6dfd29dcd3bc45f17b57978", - "sha256:b6b0e17d39d21698185097652c611f9cf30f7c56ccec189789920e3e7f1cee56", - "sha256:b710bf7e7ae61957d5c4026b486be593ed3ec3dca3e5be15e0f6d8cf5d0a4990", - "sha256:b8e11715178f3608874508f08e990d3771e0b8c66c73eb4e183038d600a9b274", - "sha256:b92aafcfab3d41580d54aca35a8057341f1cfc7c9af9e8bdfc652f83a20ced31", - "sha256:bec29b801b4adbf388314c0d050e851d53762ab424af22657021ce4b6eb41543", - "sha256:c694bee70ece3b232df4678448fdda245fd3b1bb4ba481fb6cd20e13bb784c46", - "sha256:c6b52b7028b547866c2413f614ee306c2d4eafdd444b1ff656bf3295bf1484aa", - "sha256:cb41ad20064e18a900dd427d7cf41cfaec83bcd1184001f3d91a1f76b3fcea4e", - "sha256:cd316dbcc74c76266ba94eb021b0cc090b97cca122f50bd7a845f587ff4bf03f", - "sha256:ced40cdbb6dd47a032725a038896cceae9ce267d340f59508b23537f05455431", - "sha256:d1c562a9bb72244fa767d1c1ab55ca1d92dd5f7c4d77878fee5483a22ffac808", - "sha256:d389ff1e95b6e46ebedccf7fd1fadd10559add595ac6a7c2ea730268325f832c", - "sha256:d56b1cd606ba4cedd64bb43479d56580e147c6ef3f5d1c5e64203a1adab784a2", - "sha256:d72a4315514e5a0b9837a086cb433b004eea630afb0cc129de76d77654a9606f", - "sha256:d9e7f29c00577aff6b318681e730a519b235af292732a149337f6aaa4d1c5e31", - "sha256:dbc25baa6abb205766fb8606f8263b02c3503a55957fcb4576a6bb0a59d37d10", - "sha256:e57919c32ee295a2fca458bb73e4b20b05c115627f96f95a10f9f5acbd61172d", - "sha256:e5bbe011a2cea9060fef1bb3d668a2fd8432b8888e6d92e74c9c794d3c101595", - "sha256:e6aea5c0eb5b0faf52c7b5c4a47c8bb64437173be97227c819ffa31801fa4e34", - "sha256:e888be685fa42d8b8a3d3911d5604d14db87538aa7d0b29b1a7ea80d354c732d", - "sha256:eebaf8c76c39604d52852366249ab807fe6f7a3ffb0dd5484b9944917244cdbe", - "sha256:efbe0b5e0fd078ed7b005faa0170da4f72666360f66f0bb2d7f73526ecfd99f9", - "sha256:efddca2d02254a52078c35cadad34762adbae3ff01c6b0c7787b59d038b63e0d", - "sha256:f05450fa1cd7c525c0b9d1a7916e595d3041ac0afbed2ff6926e5afb6a781b7f", - "sha256:f12d69d568f5647ec503b64932874dade5a20255736c89936bf690951a5e79f5", - "sha256:f45321224144c25a62052035ce96cbcf264667bcb0d81823b1bbc22c4addd194", - "sha256:f62581d7e884dd01ee1707b7c21148f61f2febb7de092ae2f108743fcbef5985", - "sha256:f8832a4f83d4782a8f5a7b831c47e8ffe164e43c2c148c8160ed9a6d630bc02a", - "sha256:fa35ad36440aaf1ac8332b4a4a433d4acd28f1613f0d480995f5cfd3580e90b7" + "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276", + "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f", + "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60", + "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0", + "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d", + "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3", + "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2", + "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9", + "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb", + "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b", + "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a", + "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d", + "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1", + "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7", + "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9", + "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4", + "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53", + "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea", + "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66", + "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190", + "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3", + "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12", + "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824", + "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27", + "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e", + "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8", + "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8", + "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914", + "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211", + "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab", + "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468", + "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3", + "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff", + "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c", + "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d", + "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e", + "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a", + "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e", + "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a", + "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0", + "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1", + "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3", + "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42", + "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452", + "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198", + "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa", + "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b", + "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4", + "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1", + "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad", + "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c", + "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381", + "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0", + "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2", + "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3", + "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31", + "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74", + "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6", + "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff", + "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b", + "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca", + "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd", + "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a", + "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568", + "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1", + "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c", + "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad", + "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7", + "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d", + "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658", + "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1", + "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64", + "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815", + "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1", + "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac", + "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07", + "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e", + "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee", + "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45", + "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc", + "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41", + "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2", + "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083", + "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e", + "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266", + "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141", + "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b", + "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933", + "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21", + "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0", + "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7", + "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc", + "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba", + "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a", + "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57", + "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2", + "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007", + "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f", + "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f" ], "markers": "python_version >= '3.8'", - "version": "==0.12.0" + "version": "==0.13.2" }, "rtree": { "hashes": [ @@ -3437,11 +3439,11 @@ }, "terminado": { "hashes": [ - "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333", - "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae" + "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded", + "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e" ], - "markers": "python_version >= '3.7'", - "version": "==0.17.1" + "markers": "python_version >= '3.8'", + "version": "==0.18.0" }, "texttable": { "hashes": [ @@ -3476,20 +3478,20 @@ }, "tornado": { "hashes": [ - "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f", - "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5", - "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d", - "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3", - "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2", - "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a", - "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16", - "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a", - "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17", - "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0", - "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe" + "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0", + "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63", + "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263", + "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052", + "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f", + "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee", + "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78", + "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579", + "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212", + "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e", + "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2" ], "markers": "python_version >= '3.8'", - "version": "==6.3.3" + "version": "==6.4" }, "tqdm": { "hashes": [ @@ -3501,11 +3503,11 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33", + "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" + "version": "==5.14.0" }, "typeguard": { "hashes": [ @@ -3591,11 +3593,11 @@ }, "websocket-client": { "hashes": [ - "sha256:084072e0a7f5f347ef2ac3d8698a5e0b4ffbfcab607628cadabc650fc9a83a24", - "sha256:b3324019b3c28572086c4a319f91d1dcd44e6e11cd340232978c684a7650d0df" + "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6", + "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588" ], "markers": "python_version >= '3.8'", - "version": "==1.6.4" + "version": "==1.7.0" }, "whitebox": { "hashes": [ diff --git a/config/deny_unit.lst b/config/deny_unit.lst index 9cf751d6a..f46240f89 100644 --- a/config/deny_unit.lst +++ b/config/deny_unit.lst @@ -35,3 +35,7 @@ nwm_headwaters.gpkg # wbd8_clp.gpkg wbd_buffered.gpkg wbd_buffered_streams.gpkg +HUC6_dem_domain.gpkg +usgs_gages.gpkg +reformat_ras_rating_curve_points_rel_101.gpkg +nws_lid.gpkg diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a1314d95f..8c4b441f5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,19 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.8.0 - 2023-12-08 - [PR#1045](https://github.com/NOAA-OWP/inundation-mapping/pull/1045) + +In order to avoid file system collisions on AWS, and keep the reads/writes from the same file on disk to a minimum, three files (`HUC6_dem_domain.gpkg`, `nws_lid.gpkg`, `reformat_ras_rating_curve_points_rel_101.gpkg`, & `usgs_gages.gpkg`) are now copied from disk into a scratch directory (temporary working directory), and removed after processing steps are completed. + +### Changes + +- `config`/`deny_unit.lst`: Add files to remove list - repetitive copies needed for processing step (`run_unit_wb.sh`) +- `src` + - `bash_variables.env`: Add a new variable for the ras rating curve filename. It will be easier to track the filename in the `.env`, and pull into `run_unit_wb.sh`, rather than hardcode it. + - `run_unit_wb.sh`: Copy files and update references from `$inputsDir` to `$tempHucDataDir`. + +

+ ## v4.4.7.2 - 2023-12-08 - [PR#1026](https://github.com/NOAA-OWP/inundation-mapping/pull/1026) A couple of directly related issues were fixed in this PR. diff --git a/src/bash_variables.env b/src/bash_variables.env index fe348a63c..67b20ea57 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -1,43 +1,43 @@ ## Define inputs # NOTE: $inputsDir is defined in Dockerfile -export DEFAULT_FIM_PROJECTION_CRS=EPSG:5070 -export input_DEM=${inputsDir}/3dep_dems/10m_5070/fim_seamless_3dep_dem_10m_5070.vrt -export input_DEM_domain=${inputsDir}/3dep_dems/10m_5070/HUC6_dem_domain.gpkg -export input_GL_boundaries=${inputsDir}/landsea/gl_water_polygons.gpkg -export input_NLD=${inputsDir}/nld_vectors/System_Routes_NLDFS_5070_230314.gpkg -export input_levees_preprocessed=${inputsDir}/nld_vectors/3d_nld_preprocessed_230314.gpkg -export input_nld_levee_protected_areas=${inputsDir}/nld_vectors/Leveed_Areas_NLDFS_5070_230314.gpkg -export input_nwm_catchments=${inputsDir}/nwm_hydrofabric/nwm_catchments.gpkg -export input_nwm_flows=${inputsDir}/nwm_hydrofabric/nwm_flows.gpkg -export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwaters.gpkg -export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg -export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg -export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ -export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 - -export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg +export DEFAULT_FIM_PROJECTION_CRS=EPSG:5070 +export input_DEM=${inputsDir}/3dep_dems/10m_5070/fim_seamless_3dep_dem_10m_5070.vrt +export input_DEM_domain=${inputsDir}/3dep_dems/10m_5070/HUC6_dem_domain.gpkg +export input_GL_boundaries=${inputsDir}/landsea/gl_water_polygons.gpkg +export input_NLD=${inputsDir}/nld_vectors/System_Routes_NLDFS_5070_230314.gpkg +export input_levees_preprocessed=${inputsDir}/nld_vectors/3d_nld_preprocessed_230314.gpkg +export input_nld_levee_protected_areas=${inputsDir}/nld_vectors/Leveed_Areas_NLDFS_5070_230314.gpkg +export input_nwm_catchments=${inputsDir}/nwm_hydrofabric/nwm_catchments.gpkg +export input_nwm_flows=${inputsDir}/nwm_hydrofabric/nwm_flows.gpkg +export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwaters.gpkg +export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg +export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg +export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ +export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 +export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg # input file location with nwm feature_id and recurrence flow values -export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv +export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv # input file location with nwm feature_id and channel roughness and overbank roughness attributes -export vmann_input_file=${inputsDir}/rating_curve/variable_roughness/mannings_global_025_05.csv +export vmann_input_file=${inputsDir}/rating_curve/variable_roughness/mannings_global_025_05.csv # input file location with nwm feature_id and recurrence flow values -export nwm_recur_file=${inputsDir}/rating_curve/nwm_recur_flows/nwm21_17C_recurrence_flows_cfs.csv +export nwm_recur_file=${inputsDir}/rating_curve/nwm_recur_flows/nwm21_17C_recurrence_flows_cfs.csv # input file location with usgs rating curve database -export usgs_rating_curve_csv=${inputsDir}/usgs_gages/usgs_rating_curves.csv +export usgs_rating_curve_csv=${inputsDir}/usgs_gages/usgs_rating_curves.csv # input file locations for ras2fim locations and rating curve data -export ras_rating_curve_csv=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_table_rel_101.csv -export ras_rating_curve_points_gpkg=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_points_rel_101.gpkg +export ras_rating_curve_csv=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_table_rel_101.csv +export ras_rating_curve_points_gpkg=${inputsDir}/rating_curve/ras2fim_exports/reformat_ras_rating_curve_points_rel_101.gpkg +export ras_rating_curve_gpkg_filename=reformat_ras_rating_curve_points_rel_101.gpkg -export fim_obs_pnt_data=${inputsDir}/rating_curve/water_edge_database/usgs_nws_benchmark_points_cleaned.gpkg +export fim_obs_pnt_data=${inputsDir}/rating_curve/water_edge_database/usgs_nws_benchmark_points_cleaned.gpkg # Input file location with HUC, nwm feature_id and manual calibration coefficients -export man_calb_file=${inputsDir}/rating_curve/manual_calibration_coefficients.csv +export man_calb_file=${inputsDir}/rating_curve/manual_calibration_coefficients.csv # Styling diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 701246900..6c17078fa 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -26,6 +26,13 @@ huc_start_time=`date +%s` echo -e $startDiv"Copying staged wbd and .gpkg files from $pre_clip_huc_dir/$hucNumber" cp -a $pre_clip_huc_dir/$hucNumber/. $tempHucDataDir +# Copy necessary files from $inputsDir into $tempHucDataDir to avoid File System Collisions +# For buffer_stream_branches.py +cp $input_DEM_domain $tempHucDataDir +# For usgs_gage_unit_setup.py +cp $inputsDir/usgs_gages/usgs_gages.gpkg $tempHucDataDir +cp $ras_rating_curve_points_gpkg $tempHucDataDir +cp $inputsDir/ahps_sites/nws_lid.gpkg $tempHucDataDir ## DERIVE LEVELPATH ## echo -e $startDiv"Generating Level Paths for $hucNumber" @@ -77,7 +84,7 @@ Tcount echo -e $startDiv"Generating Stream Branch Polygons for $hucNumber" date -u Tstart -$srcDir/buffer_stream_branches.py -a $input_DEM_domain \ +$srcDir/buffer_stream_branches.py -a $tempHucDataDir/HUC6_dem_domain.gpkg \ -s $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg \ -i $branch_id_attribute \ -d $branch_buffer_distance_meters \ @@ -274,12 +281,12 @@ if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then date -u Tstart python3 $srcDir/usgs_gage_unit_setup.py \ - -gages $inputsDir/usgs_gages/usgs_gages.gpkg \ + -gages $tempHucDataDir/usgs_gages.gpkg \ -nwm $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg \ - -ras $ras_rating_curve_points_gpkg \ + -ras $tempHucDataDir/$ras_rating_curve_gpkg_filename \ -o $tempHucDataDir/usgs_subset_gages.gpkg \ -huc $hucNumber \ - -ahps $inputsDir/ahps_sites/nws_lid.gpkg \ + -ahps $tempHucDataDir/nws_lid.gpkg \ -bzero_id $branch_zero_id Tcount fi From 79f8a82e20b888fb6291eac80921c185750703ea Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 8 Dec 2023 13:51:01 -0700 Subject: [PATCH 17/51] v4.4.8.1 Upgrade JDK to v.17 (#1047) --- Dockerfile | 4 ++-- docs/CHANGELOG.md | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 101fcb2e0..512e726dd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,7 +15,7 @@ RUN git clone https://github.com/dtarb/taudem.git RUN git clone https://github.com/fernandoa123/cybergis-toolkit.git taudem_accelerated_flowDirections RUN apt-get update --fix-missing && apt-get install -y cmake mpich \ - libgtest-dev libboost-test-dev libnetcdf-dev && rm -rf /var/lib/apt/lists/* + libgtest-dev libboost-test-dev libnetcdf-dev openjdk-17-jdk && rm -rf /var/lib/apt/lists/* ## Compile Main taudem repo ## RUN mkdir -p taudem/bin @@ -71,7 +71,7 @@ RUN mkdir -p $depDir COPY --from=builder $depDir $depDir RUN apt update --fix-missing -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y p7zip-full python3-pip time mpich=3.3.2-2build1 parallel=20161222-1.1 libgeos-dev=3.8.0-1build1 expect=5.45.4-2build1 tmux rsync tzdata +RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y p7zip-full python3-pip time mpich=3.3.2-2build1 parallel=20161222-1.1 libgeos-dev=3.8.0-1build1 expect=5.45.4-2build1 tmux rsync tzdata openjdk-17-jdk RUN apt auto-remove diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 8c4b441f5..b62378506 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,16 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.8.1 - 2023-12-08 - [PR#1047](https://github.com/NOAA-OWP/inundation-mapping/pull/1047) + +Upgrades JDK to v.17.0.9 in Docker image to address security vulnerabilities. + +### Changes + +- `Dockerfile`: Upgrades JDK to v.17. + +

+ ## v4.4.8.0 - 2023-12-08 - [PR#1045](https://github.com/NOAA-OWP/inundation-mapping/pull/1045) In order to avoid file system collisions on AWS, and keep the reads/writes from the same file on disk to a minimum, three files (`HUC6_dem_domain.gpkg`, `nws_lid.gpkg`, `reformat_ras_rating_curve_points_rel_101.gpkg`, & `usgs_gages.gpkg`) are now copied from disk into a scratch directory (temporary working directory), and removed after processing steps are completed. From 5cca27c5f8c63482e5aeb9c157e7435fb635d781 Mon Sep 17 00:00:00 2001 From: Carson Pruitt <90792257+CarsonPruitt-NOAA@users.noreply.github.com> Date: Wed, 13 Dec 2023 08:08:37 -0600 Subject: [PATCH 18/51] v4.4.8.2 Hotfix for a switched global manning file (#1052) --- docs/CHANGELOG.md | 10 ++++++++++ src/bash_variables.env | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b62378506..45689b40b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,16 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.8.2 - 2023-12-12 - [PR#1052](https://github.com/NOAA-OWP/inundation-mapping/pull/1052) + +The alpha test for v4.4.8.1 came back with a large degradation in skill and we noticed that the global manning's roughness file was changed in v4.4.7.1 - likely in error. + +### Changes + +- `src`/`bash_variables.env`: changed the global roughness file to `${inputsDir}/rating_curve/variable_roughness/mannings_global_06_12.csv` + +

+ ## v4.4.8.1 - 2023-12-08 - [PR#1047](https://github.com/NOAA-OWP/inundation-mapping/pull/1047) Upgrades JDK to v.17.0.9 in Docker image to address security vulnerabilities. diff --git a/src/bash_variables.env b/src/bash_variables.env index 67b20ea57..a853a78eb 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -21,7 +21,7 @@ export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adju export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv # input file location with nwm feature_id and channel roughness and overbank roughness attributes -export vmann_input_file=${inputsDir}/rating_curve/variable_roughness/mannings_global_025_05.csv +export vmann_input_file=${inputsDir}/rating_curve/variable_roughness/mannings_global_06_12.csv # input file location with nwm feature_id and recurrence flow values export nwm_recur_file=${inputsDir}/rating_curve/nwm_recur_flows/nwm21_17C_recurrence_flows_cfs.csv From 4b2762d1578068938584c8e05b75cce050369f71 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 5 Jan 2024 10:31:16 -0700 Subject: [PATCH 19/51] v4.4.8.3 Fix erroneous branch inundation in levee-protected areas (#1059) --- docs/CHANGELOG.md | 14 ++++ src/delineate_hydros_and_produce_HAND.sh | 1 + src/mask_dem.py | 89 +++++++++++++++++------- 3 files changed, 80 insertions(+), 24 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 45689b40b..7fb3bd956 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.8.3 - 2024-01-05 - [PR#1059](https://github.com/NOAA-OWP/inundation-mapping/pull/1059) + +Fixes erroneous branch inundation in levee-protected areas. + +Levees disrupt the natural hydrology and can create large catchments that contain low-lying areas in levee-protected areas that are subject to being inundated in the REM (HAND) grid. However, these low-lying areas are hydrologically disconnected from the stream associated with the catchment and can be erroneously inundated. Branch inundation in levee-protected areas is now confined to the catchment for the levelpath. + +### Changes + +- `src/` + - `delineate_hydros_and_produce_HAND.sh`: Adds input argument for catchments. + - `mask_dem.py`: Adds DEM masking for areas of levee-protected areas that are not in the levelpath catchment. + +

+ ## v4.4.8.2 - 2023-12-12 - [PR#1052](https://github.com/NOAA-OWP/inundation-mapping/pull/1052) The alpha test for v4.4.8.1 came back with a large degradation in skill and we noticed that the global manning's roughness file was changed in v4.4.7.1 - likely in error. diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 2b04da494..c8c469858 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -23,6 +23,7 @@ if [ "$mask_leveed_area_toggle" = "True" ] && [ -f $tempHucDataDir/LeveeProtecte python3 $srcDir/mask_dem.py \ -dem $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -nld $tempHucDataDir/LeveeProtectedAreas_subset.gpkg \ + -catchments $z_arg \ -out $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -b $branch_id_attribute \ -i $current_branch_id \ diff --git a/src/mask_dem.py b/src/mask_dem.py index a303eb0c2..bf8897ec7 100755 --- a/src/mask_dem.py +++ b/src/mask_dem.py @@ -5,6 +5,7 @@ import fiona import geopandas as gpd +import numpy as np import pandas as pd import rasterio as rio from rasterio.mask import mask @@ -14,6 +15,7 @@ def mask_dem( dem_filename: str, nld_filename: str, levee_id_attribute: str, + catchments_filename: str, out_dem_filename: str, branch_id_attribute: str, branch_id: int, @@ -22,7 +24,8 @@ def mask_dem( ): """ Masks levee-protected areas from DEM in branch 0 or if the level path is associated with a levee - (determined in src/associate_levelpaths_with_levees.py). + (determined in src/associate_levelpaths_with_levees.py). Also masks parts of levee-protected areas + through which level paths flow that are not in the level path catchment. Parameters ---------- @@ -41,35 +44,39 @@ def mask_dem( branch_zero_id: int Branch 0 ID number levee_levelpaths: str - Path to levee-levelpath association file. + Path to levee-levelpath association file (generated by src/associate_levelpaths_with_levees.py) """ - # Rasterize if branch zero - if branch_id == branch_zero_id: - with rio.open(dem_filename) as dem, fiona.open(nld_filename) as leveed: - dem_profile = dem.profile.copy() + assert os.path.exists(dem_filename), f"DEM file {dem_filename} does not exist" + assert os.path.exists(nld_filename), f"NLD file {nld_filename} does not exist" + assert os.path.exists(catchments_filename), f"Catchments file {catchments_filename} does not exist" - geoms = [feature["geometry"] for feature in leveed] + dem_masked = None - # Mask out levee-protected areas from DEM - out_dem_masked, _ = mask(dem, geoms, invert=True) + with rio.open(dem_filename) as dem: + dem_profile = dem.profile.copy() + nodata = dem.nodata - with rio.open(out_dem_filename, "w", **dem_profile, BIGTIFF='YES') as dest: - dest.write(out_dem_masked[0, :, :], indexes=1) + if branch_id == branch_zero_id: + # Mask if branch zero + with fiona.open(nld_filename) as leveed: + geoms = [feature["geometry"] for feature in leveed] - elif os.path.exists(levee_levelpaths): - levee_levelpaths = pd.read_csv(levee_levelpaths) + if len(geoms) > 0: + dem_masked, _ = mask(dem, geoms, invert=True) - # Select levees associated with branch - levee_levelpaths = levee_levelpaths[levee_levelpaths[branch_id_attribute] == branch_id] + elif os.path.exists(levee_levelpaths): + # Mask levee-protected areas protected against level path + levee_levelpaths = pd.read_csv(levee_levelpaths) - # Get levee IDs - levelpath_levees = list(levee_levelpaths[levee_id_attribute]) + # Select levees associated with branch + levee_levelpaths = levee_levelpaths[levee_levelpaths[branch_id_attribute] == branch_id] - if len(levelpath_levees) > 0: - with rio.open(dem_filename) as dem: + # Get levee IDs + levelpath_levees = list(levee_levelpaths[levee_id_attribute]) + + if len(levelpath_levees) > 0: leveed = gpd.read_file(nld_filename) - dem_profile = dem.profile.copy() # Get geometries of levee protected areas associated with levelpath geoms = [ @@ -78,11 +85,40 @@ def mask_dem( if feature[levee_id_attribute] in levelpath_levees ] - # Mask out levee-protected areas from DEM - out_dem_masked, _ = mask(dem, geoms, invert=True) + if len(geoms) > 0: + dem_masked, _ = mask(dem, geoms, invert=True) + + # Mask levee-protected areas not protected against level path + catchments = gpd.read_file(catchments_filename) + leveed = gpd.read_file(nld_filename) + + leveed_area_catchments = gpd.overlay(catchments, leveed, how="union") + + # Select levee catchments not associated with level path + levee_catchments_to_mask = leveed_area_catchments.loc[ + ~leveed_area_catchments[levee_id_attribute].isna() & leveed_area_catchments['ID'].isna(), : + ] + + geoms = [feature["geometry"] for i, feature in levee_catchments_to_mask.iterrows()] + + levee_catchments_masked = None + if len(geoms) > 0: + levee_catchments_masked, _ = mask(dem, geoms, invert=True) + out_masked = None + if dem_masked is None: + if levee_catchments_masked is not None: + out_masked = levee_catchments_masked + + else: + if levee_catchments_masked is None: + out_masked = dem_masked + else: + out_masked = np.where(levee_catchments_masked == nodata, nodata, dem_masked) + + if out_masked is not None: with rio.open(out_dem_filename, "w", **dem_profile, BIGTIFF='YES') as dest: - dest.write(out_dem_masked[0, :, :], indexes=1) + dest.write(out_masked[0, :, :], indexes=1) if __name__ == '__main__': @@ -91,8 +127,13 @@ def mask_dem( parser.add_argument( '-nld', '--nld-filename', help='NLD levee-protected areas filename', required=True, type=str ) + parser.add_argument( + '-catchments', '--catchments-filename', help='NWM catchments filename', required=True, type=str + ) parser.add_argument('-l', '--levee-id-attribute', help='Levee ID attribute name', required=True, type=str) - parser.add_argument('-out', '--out-dem-filename', help='out DEM filename', required=True, type=str) + parser.add_argument( + '-out', '--out-dem-filename', help='DEM filename to be written', required=True, type=str + ) parser.add_argument( '-b', '--branch-id-attribute', help='Branch ID attribute name', required=True, type=str ) From 5478554f1ab4988d2c1330c5ebc6c6fc9d6d5b46 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 12 Jan 2024 10:44:35 -0700 Subject: [PATCH 20/51] v4.4.8.4 Tool to evaluate crosswalk accuracy (#1061) --- Dockerfile | 1 + docs/CHANGELOG.md | 22 ++ fim_pipeline.sh | 1 + fim_post_processing.sh | 2 +- fim_pre_processing.sh | 5 + src/add_crosswalk.py | 6 +- src/delineate_hydros_and_produce_HAND.sh | 17 +- tools/evaluate_crosswalk.py | 291 +++++++++++++++++++++++ 8 files changed, 342 insertions(+), 3 deletions(-) create mode 100644 tools/evaluate_crosswalk.py diff --git a/Dockerfile b/Dockerfile index 512e726dd..dd579c65e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -54,6 +54,7 @@ ARG depDir=/dependencies ENV inputsDir=$dataDir/inputs ENV outputsDir=/outputs ENV srcDir=$projectDir/src +ENV toolsDir=$projectDir/tools ENV workDir=/fim_temp ENV taudemDir=$depDir/taudem/bin ENV taudemDir2=$depDir/taudem_accelerated_flowDirections/taudem/build/bin diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7fb3bd956..e514eb23c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,28 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.8.4 - 2024-01-12 - [PR#1061](https://github.com/NOAA-OWP/inundation-mapping/pull/1061) + +Adds a post-processing tool to compare crosswalked (conflated) `feature_id`s between NWM stream network to DEM-derived reaches. The tool is run if the `-x` flag is added to `fim_pipeline.sh`. Results are computed for branch 0 and saved in a summary file in the HUC output folder. + +### Additions + +- `tools/evaluate_crosswalk.py`: evaluates crosswalk accuracy using two methods: + - intersections: the number of intersections between streamlines + - network (or tree): compares the feature_ids of the immediate upstream segments + +### Changes + +- `Dockerfile`: added `toolsDir` environment variable +- `fim_pipeline.sh`: added `-x` flag to run crosswalk evaluation tool +- `fim_post_processing.sh`: changed hardcoded `/foss_fim/tools` to `toolsDir` environment variable +- `fim_pre_processing.sh`: added `evaluateCrosswalk` environment variable +- `src/` + - `add_crosswalk.py`: fix bug + - `delineate_hydros_and_produce_HAND.sh`: added a call to `verify_crosswalk.py` if evaluateCrosswalk is True. + +

+ ## v4.4.8.3 - 2024-01-05 - [PR#1059](https://github.com/NOAA-OWP/inundation-mapping/pull/1059) Fixes erroneous branch inundation in levee-protected areas. diff --git a/fim_pipeline.sh b/fim_pipeline.sh index 8523d21ef..4e1e76159 100755 --- a/fim_pipeline.sh +++ b/fim_pipeline.sh @@ -48,6 +48,7 @@ usage() will be skipped. -isaws : If this param is included, AWS objects will be used where possible - Note: This feature is not yet implemented. + -x : If this param is included, the crosswalk will be evaluated. Running 'fim_pipeline.sh' is a quicker process than running all three scripts independently; however, diff --git a/fim_post_processing.sh b/fim_post_processing.sh index f8266c94d..4ebb7b5fa 100755 --- a/fim_post_processing.sh +++ b/fim_post_processing.sh @@ -210,7 +210,7 @@ echo echo -e $startDiv"Combining crosswalk tables" # aggregate outputs Tstart -python3 /foss_fim/tools/combine_crosswalk_tables.py \ +python3 $toolsDir/combine_crosswalk_tables.py \ -d $outputDestDir \ -o $outputDestDir/crosswalk_table.csv Tcount diff --git a/fim_pre_processing.sh b/fim_pre_processing.sh index 61eb3ef1a..cff84fa23 100755 --- a/fim_pre_processing.sh +++ b/fim_pre_processing.sh @@ -101,6 +101,9 @@ in -isaws) isAWS=1 ;; + -x) + evaluateCrosswalk=1 + ;; *) ;; esac shift @@ -129,6 +132,7 @@ if [ "$jobBranchLimit" = "" ]; then jobBranchLimit=1; fi if [ -z "$overwrite" ]; then overwrite=0; fi if [ -z "$skipcal" ]; then skipcal=0; fi if [ -z "$isAWS" ]; then isAWS=0; fi +if [ -z "$evaluateCrosswalk" ]; then evaluateCrosswalk=0; fi # validate and set defaults for the deny lists if [ "$deny_unit_list" = "" ] @@ -234,6 +238,7 @@ echo "export deny_branch_zero_list=$deny_branch_zero_list" >> $args_file echo "export has_deny_branch_zero_override=$has_deny_branch_zero_override" >> $args_file echo "export isAWS=$isAWS" >> $args_file echo "export skipcal=$skipcal" >> $args_file +echo "export evaluateCrosswalk=$evaluateCrosswalk" >> $args_file echo "--- Pre-processing is complete" diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index fd7c8c450..b10453f61 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -258,7 +258,11 @@ def add_crosswalk( else: update_id = output_flows.loc[output_flows.HydroID == short_id]['HydroID'].item() - str_order = output_flows.loc[output_flows.HydroID == short_id]['order_'].item() + output_order = output_flows.loc[output_flows.HydroID == short_id]['order_'] + if len(output_order) == 1: + str_order = output_order.item() + else: + str_order = output_order.max() sml_segs = pd.concat( [ sml_segs, diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index c8c469858..b97d1912d 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -17,7 +17,7 @@ T_total_start ## MASK LEVEE-PROTECTED AREAS FROM DEM ## if [ "$mask_leveed_area_toggle" = "True" ] && [ -f $tempHucDataDir/LeveeProtectedAreas_subset.gpkg ]; then - echo -e $startDiv"Mask levee-protected areas from DEM (*Overwrite dem_meters.tif output) $hucNumber $branch_zero_id" + echo -e $startDiv"Mask levee-protected areas from DEM (*Overwrite dem_meters.tif output) $hucNumber $current_branch_id" date -u Tstart python3 $srcDir/mask_dem.py \ @@ -303,3 +303,18 @@ python3 $srcDir/add_crosswalk.py \ -e $min_catchment_area \ -g $min_stream_length Tcount + +## EVALUATE CROSSWALK ## +if [ "$current_branch_id" = "$branch_zero_id" ] && [ "$evaluateCrosswalk" = "1" ] ; then + echo -e $startDiv"Evaluate crosswalk $hucNumber $current_branch_id" + date -u + Tstart + python3 $toolsDir/evaluate_crosswalk.py \ + -a $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_addedAttributes_crosswalked_$current_branch_id.gpkg \ + -b $b_arg \ + -c $tempHucDataDir/crosswalk_evaluation_$current_branch_id.csv \ + -d $tempHucDataDir/nwm_headwater_points_subset.gpkg \ + -u $hucNumber \ + -z $current_branch_id + Tcount +fi diff --git a/tools/evaluate_crosswalk.py b/tools/evaluate_crosswalk.py new file mode 100644 index 000000000..0051c3600 --- /dev/null +++ b/tools/evaluate_crosswalk.py @@ -0,0 +1,291 @@ +#!/usr/bin/env python3 + +import argparse + +import geopandas as gpd +import numpy as np +import pandas as pd + + +def evaluate_crosswalk( + input_flows_fileName: str, + input_nwmflows_fileName: str, + input_nwm_headwaters_fileName: str, + output_table_fileName: str, + huc: str, + branch: str, +): + """ + Tool to check the accuracy of crosswalked attributes using two methods: counting the number of intersections between two stream representations and network, which checks the upstream and downstream connectivity of each stream segment. + + Parameters + ---------- + input_flows_fileName : str + Path to DEM derived streams + input_nwmflows_fileName : str + Path to subset NWM burnlines + input_nwm_headwaters_fileName : str + Path to subset NWM headwaters + output_table_fileName : str + Path to output table filename + huc : str + HUC ID + branch : str + Branch ID + + Returns + ------- + results : pandas.DataFrame + + Usage + ----- + python evaluate_crosswalk.py -a -b -d -c -u -z + """ + + intersections_results = _evaluate_crosswalk_intersections(input_flows_fileName, input_nwmflows_fileName) + + intersections_correct = intersections_results['crosswalk'].sum() + intersections_total = len(intersections_results) + intersections_summary = intersections_correct / intersections_total + + network_results = _evaluate_crosswalk_network( + input_flows_fileName, input_nwmflows_fileName, input_nwm_headwaters_fileName + ) + + network_results = network_results[network_results['status'] >= 0] + network_correct = len(network_results[network_results['status'] == 0]) + network_total = len(network_results) + network_summary = network_correct / network_total + + results = pd.DataFrame( + data={ + 'huc': [huc, huc], + 'branch': [branch, branch], + 'method': ['intersections', 'network'], + 'correct': [intersections_correct, network_correct], + 'total': [intersections_total, network_total], + 'proportion': [intersections_summary, network_summary], + } + ) + + results.to_csv(output_table_fileName, index=False) + + return results + + +def _evaluate_crosswalk_intersections(input_flows_fileName: str, input_nwmflows_fileName: str): + """ + Computes the number of intersections between the NWM and DEM-derived flowlines + + Parameters + ---------- + input_flows_fileName : str + Path to DEM derived streams + input_nwmflows_fileName : str + Path to subset NWM burnlines + + Returns + ------- + pandas.DataFrame + """ + + # Crosswalk check + # fh.vprint('Checking for crosswalks between NWM and DEM-derived flowlines', verbose) + + flows = gpd.read_file(input_flows_fileName) + nwm_streams = gpd.read_file(input_nwmflows_fileName) + + # Compute the number of intersections between the NWM and DEM-derived flowlines + streams = nwm_streams + xwalks = [] + intersects = flows.sjoin(streams) + + for idx in intersects.index: + flows_idx = intersects.loc[intersects.index == idx, 'HydroID'].unique() + + if isinstance(intersects.loc[idx, 'ID'], np.int64): + streams_idxs = [intersects.loc[idx, 'ID']] + else: + streams_idxs = intersects.loc[idx, 'ID'].unique() + + for flows_id in flows_idx: + for streams_idx in streams_idxs: + intersect = gpd.overlay( + flows[flows['HydroID'] == flows_id], + nwm_streams[nwm_streams['ID'] == streams_idx], + keep_geom_type=False, + ) + + if len(intersect) == 0: + intersect_points = 0 + feature_id = flows.loc[flows['HydroID'] == flows_id, 'feature_id'] + elif intersect.geometry[0].geom_type == 'Point': + intersect_points = 1 + feature_id = flows.loc[flows['HydroID'] == flows_id, 'feature_id'] + else: + intersect_points = len(intersect.geometry[0].geoms) + feature_id = int(flows.loc[flows['HydroID'] == flows_id, 'feature_id'].iloc[0]) + + xwalks.append([flows_id, feature_id, streams_idx, intersect_points]) + + # Get the maximum number of intersections for each flowline + xwalks = pd.DataFrame(xwalks, columns=['HydroID', 'feature_id', 'ID', 'intersect_points']) + xwalks['feature_id'] = xwalks['feature_id'].astype(int) + + xwalks['match'] = xwalks['feature_id'] == xwalks['ID'] + + xwalks_groupby = xwalks[['HydroID', 'intersect_points']].groupby('HydroID').max() + + xwalks = xwalks.merge(xwalks_groupby, on='HydroID', how='left') + xwalks['max'] = xwalks['intersect_points_x'] == xwalks['intersect_points_y'] + + xwalks['crosswalk'] = xwalks['match'] == xwalks['max'] + + return xwalks + + +def _evaluate_crosswalk_network( + input_flows_fileName: str, input_nwmflows_fileName: str, input_nwm_headwaters_fileName: str +): + """ + Compares the upstream and downstream connectivity of each stream segment + + Parameters + ---------- + input_flows_fileName : str + Path to DEM derived streams + input_nwmflows_fileName : str + Path to subset NWM burnlines + input_nwm_headwaters_fileName : str + Path to subset NWM headwaters + output_table_fileName : str + Path to output table filename + + Returns + ------- + pandas.DataFrame + """ + + # Check for crosswalks between NWM and DEM-derived flowlines + # fh.vprint('Checking for crosswalks between NWM and DEM-derived flowlines', verbose) + + flows = gpd.read_file(input_flows_fileName) + flows['HydroID'] = flows['HydroID'].astype(int) + nwm_streams = gpd.read_file(input_nwmflows_fileName) + nwm_streams = nwm_streams.rename(columns={'ID': 'feature_id'}) + nwm_headwaters = gpd.read_file(input_nwm_headwaters_fileName) + + streams_outlets = nwm_streams.loc[~nwm_streams.to.isin(nwm_streams.feature_id), 'feature_id'] + flows_outlets = flows.loc[~flows['NextDownID'].isin(flows['HydroID']), 'HydroID'] + + nwm_streams_headwaters_list = ~nwm_streams['feature_id'].isin(nwm_streams['to']) + # flows_headwaters_list = ~flows['LINKNO'].isin(flows['DSLINKNO']) + flows_headwaters_list = ~flows['HydroID'].isin(flows['NextDownID']) + + nwm_streams_headwaters = nwm_streams[nwm_streams_headwaters_list] + flows_headwaters = flows[flows_headwaters_list] + + # Map headwater points to DEM-derived reaches + flows_headwaters = flows_headwaters.sjoin_nearest(nwm_headwaters) + flows_headwaters = flows_headwaters[['HydroID', 'ID']] + nwm_streams_headwaters = nwm_streams_headwaters.sjoin_nearest(nwm_headwaters) + nwm_streams_headwaters = nwm_streams_headwaters[['feature_id', 'ID']] + + def _hydroid_to_feature_id(df, hydroid, hydroid_attr, feature_id_attr): + return df.loc[df[hydroid_attr] == hydroid, feature_id_attr] + + def _get_upstream_data(data, data_headwaters, data_dict, hydroid, hydroid_attr, nextdownid_attr): + # Find upstream segments + data_dict[hydroid] = list(data.loc[data[nextdownid_attr] == hydroid, hydroid_attr].values) + + for hydroid in data_dict[hydroid]: + if hydroid in data_headwaters[hydroid_attr].values: + data_dict[hydroid] = data_headwaters.loc[ + data_headwaters[hydroid_attr] == hydroid, 'ID' + ].values[0] + else: + data_dict = _get_upstream_data( + data, data_headwaters, data_dict, hydroid, hydroid_attr, nextdownid_attr + ) + + return data_dict + + flows_dict = dict() + streams_dict = dict() + + # Compare hash tables + for hydroid in flows_outlets: + flows_dict = _get_upstream_data(flows, flows_headwaters, flows_dict, hydroid, 'HydroID', 'NextDownID') + + for feature_id in streams_outlets: + streams_dict = _get_upstream_data( + nwm_streams, nwm_streams_headwaters, streams_dict, feature_id, 'feature_id', 'to' + ) + + results = [] + for flow in flows_dict: + fid = _hydroid_to_feature_id(flows, flow, 'HydroID', 'feature_id').iloc[0] + upstream_hid = flows_dict[flow] + + upstream_fids = [] + nwm_fids = streams_dict[fid] + out_list = [flow, fid, upstream_fids, nwm_fids] + + if not isinstance(upstream_hid, np.int64): + if len(upstream_hid) > 0: + for i in upstream_hid: + # Find upstream feature_id(s) + temp_fid = int(_hydroid_to_feature_id(flows, i, 'HydroID', 'feature_id').iloc[0]) + + if isinstance(temp_fid, list): + upstream_fids.append(temp_fid[0]) + else: + upstream_fids.append(temp_fid) + + out_list = [flow, fid, upstream_fids, nwm_fids] + if isinstance(nwm_fids, np.int64): + nwm_fids = [nwm_fids] + + if fid in upstream_fids: + # Skip duplicate feature_ids + out_list.append(-1) + elif set(upstream_fids) == set(nwm_fids): + # 0: Crosswalk is correct + out_list.append(0) + else: + # 1: Crosswalk is incorrect + out_list.append(1) + else: + # 2: Crosswalk is empty + out_list.append(2) + else: + # 3: if upstream is a headwater point + out_list.append(3) + + results.append(out_list) + + results = pd.DataFrame( + data=results, columns=['HydroID', 'feature_id', 'upstream_fids', 'upstream_nwm_fids', 'status'] + ) + + return results + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Tool to check crosswalk accuracy') + parser.add_argument('-a', '--input-flows-fileName', help='DEM derived streams', type=str, required=True) + parser.add_argument( + '-b', '--input-nwmflows-fileName', help='Subset NWM burnlines', type=str, required=True + ) + parser.add_argument( + '-d', '--input-nwm-headwaters-fileName', help='Subset NWM headwaters', type=str, required=True + ) + parser.add_argument( + '-c', '--output-table-fileName', help='Output table filename', type=str, required=True + ) + parser.add_argument('-u', '--huc', help='HUC ID', type=str, required=True) + parser.add_argument('-z', '--branch', help='Branch ID', type=str, required=True) + + args = vars(parser.parse_args()) + + evaluate_crosswalk(**args) From e7a6b7956322892bbc6a6953b233bde610c6bf5f Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 12 Jan 2024 10:55:12 -0700 Subject: [PATCH 21/51] v4.4.9.0 Upgrade base Docker image to GDAL v3.8.0 (#1058) --- Dockerfile | 17 +- Pipfile | 3 +- Pipfile.lock | 1111 ++++++++++------------ docs/CHANGELOG.md | 18 + src/accumulate_headwaters.py | 102 ++ src/delineate_hydros_and_produce_HAND.sh | 15 +- 6 files changed, 660 insertions(+), 606 deletions(-) create mode 100644 src/accumulate_headwaters.py diff --git a/Dockerfile b/Dockerfile index dd579c65e..70f7d336f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Temporary image to build the libraries and only save the needed artifacts -FROM ghcr.io/osgeo/gdal:ubuntu-full-3.4.3 AS builder +FROM ghcr.io/osgeo/gdal:ubuntu-full-3.8.0 AS builder WORKDIR /opt/builder ARG dataDir=/data ARG projectDir=/foss_fim @@ -15,7 +15,7 @@ RUN git clone https://github.com/dtarb/taudem.git RUN git clone https://github.com/fernandoa123/cybergis-toolkit.git taudem_accelerated_flowDirections RUN apt-get update --fix-missing && apt-get install -y cmake mpich \ - libgtest-dev libboost-test-dev libnetcdf-dev openjdk-17-jdk && rm -rf /var/lib/apt/lists/* + libgtest-dev libboost-test-dev libnetcdf-dev && rm -rf /var/lib/apt/lists/* ## Compile Main taudem repo ## RUN mkdir -p taudem/bin @@ -36,18 +36,13 @@ RUN mkdir -p $taudemDir RUN mkdir -p $taudemDir2 ## Move needed binaries to the next stage of the image -RUN cd taudem/bin && mv -t $taudemDir flowdircond aread8 threshold streamnet gagewatershed catchhydrogeo dinfdistdown +RUN cd taudem/bin && mv -t $taudemDir flowdircond streamnet gagewatershed catchhydrogeo dinfdistdown RUN cd taudem_accelerated_flowDirections/taudem/build/bin && mv -t $taudemDir2 d8flowdir dinfflowdir - - ############################################################################################### - - - # Base Image that has GDAL, PROJ, etc -FROM ghcr.io/osgeo/gdal:ubuntu-full-3.4.3 +FROM ghcr.io/osgeo/gdal:ubuntu-full-3.8.0 ARG dataDir=/data ENV projectDir=/foss_fim ARG depDir=/dependencies @@ -72,7 +67,7 @@ RUN mkdir -p $depDir COPY --from=builder $depDir $depDir RUN apt update --fix-missing -RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y p7zip-full python3-pip time mpich=3.3.2-2build1 parallel=20161222-1.1 libgeos-dev=3.8.0-1build1 expect=5.45.4-2build1 tmux rsync tzdata openjdk-17-jdk +RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y p7zip-full python3-pip time mpich parallel libgeos-dev expect tmux rsync tzdata RUN apt auto-remove @@ -107,7 +102,7 @@ RUN pip3 install pipenv==2022.4.8 && PIP_NO_CACHE_DIR=off pipenv install --syste # We download and unzip it to the same file folder that pip deployed the whitebox library. # Whitebox also attempts to always download a folder called testdata regardless of use. # We added an empty folder to fake out whitebox_tools.py so it doesn't try to download the folder -RUN wbox_path=/usr/local/lib/python3.8/dist-packages/whitebox/ && \ +RUN wbox_path=/usr/local/lib/python3.10/dist-packages/whitebox/ && \ wget -P $wbox_path https://www.whiteboxgeo.com/WBT_Linux/WhiteboxTools_linux_musl.zip && \ unzip -o $wbox_path/WhiteboxTools_linux_musl.zip -d $wbox_path && \ cp $wbox_path/WBT/whitebox_tools $wbox_path && \ diff --git a/Pipfile b/Pipfile index beace0056..043b69288 100644 --- a/Pipfile +++ b/Pipfile @@ -43,6 +43,7 @@ flake8-pyproject = "==1.2.3" pre-commit = "==3.3.3" isort = "==5.12.0" urllib3 = "==1.26.18" +pyflwdir = "*" [requires] -python_version = "3.8" +python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index a0e867a67..b38946cc9 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "05bec99d8be9c133d86cc5a13bbb8dd751b89eaa4368df49170d3527a84bb127" + "sha256": "b0e64fe05b2fb6310dcb5e41cb0d131e77067c5bb3c54db67c9f46a14e705d42" }, "pipfile-spec": 6, "requires": { - "python_version": "3.8" + "python_version": "3.10" }, "sources": [ { @@ -29,7 +29,7 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==22.1.0" }, "aiosqlite": { @@ -42,11 +42,11 @@ }, "anyio": { "hashes": [ - "sha256:56a415fbc462291813a94528a779597226619c8e78af7de0507333f700011e5f", - "sha256:5a0bec7085176715be77df87fc66d6c9d70626bd752fcc85f57cdbee5b3760da" + "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", + "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" ], "markers": "python_version >= '3.8'", - "version": "==4.1.0" + "version": "==4.2.0" }, "appdirs": { "hashes": [ @@ -115,25 +115,18 @@ }, "babel": { "hashes": [ - "sha256:33e0952d7dd6374af8dbf6768cc4ddf3ccfefc244f9986d4074704f2fbd18900", - "sha256:7077a4984b02b6727ac10f1f7294484f737443d7e2e66c5e4380e41a3ae0b4ed" + "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", + "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" ], "markers": "python_version >= '3.7'", - "version": "==2.13.1" - }, - "backcall": { - "hashes": [ - "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", - "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" - ], - "version": "==0.2.0" + "version": "==2.14.0" }, "beautifulsoup4": { "hashes": [ "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" ], - "markers": "python_full_version >= '3.6.0'", + "markers": "python_version >= '3.6'", "version": "==4.12.2" }, "black": { @@ -196,7 +189,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4'", + "markers": "python_version >= '3.8' and python_version < '4.0'", "version": "==2.0.0" }, "boto3": { @@ -529,7 +522,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", "version": "==0.7.2" }, "cloudpickle": { @@ -566,61 +559,53 @@ }, "contourpy": { "hashes": [ - "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6", - "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33", - "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8", - "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d", - "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d", - "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c", - "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf", - "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e", - "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e", - "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163", - "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532", - "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2", - "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8", - "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1", - "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b", - "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9", - "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916", - "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23", - "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb", - "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a", - "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e", - "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442", - "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684", - "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34", - "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d", - "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d", - "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9", - "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45", - "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718", - "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab", - "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3", - "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae", - "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb", - "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5", - "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba", - "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0", - "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217", - "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887", - "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887", - "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62", - "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431", - "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b", - "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce", - "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b", - "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f", - "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85", - "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e", - "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7", - "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251", - "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970", - "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0", - "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7" - ], - "markers": "python_version >= '3.8'", - "version": "==1.1.1" + "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", + "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956", + "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5", + "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", + "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", + "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", + "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", + "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", + "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", + "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4", + "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", + "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", + "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e", + "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", + "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", + "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", + "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", + "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", + "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", + "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", + "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", + "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", + "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc", + "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", + "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", + "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808", + "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", + "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", + "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843", + "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", + "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", + "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9", + "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", + "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", + "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", + "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", + "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8", + "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776", + "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", + "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108", + "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e", + "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8", + "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", + "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a" + ], + "markers": "python_version >= '3.9'", + "version": "==1.2.0" }, "cycler": { "hashes": [ @@ -632,67 +617,60 @@ }, "cython": { "hashes": [ - "sha256:035cb6930a8534f865a3f4616543f78bd27e4de9c3e117b2826e395085ffc4c0", - "sha256:039877e57dc10abf0d30d2de2c7476f0881d8ecef1f29bdeed1a6a06a8d89141", - "sha256:048fe89c2c753c24e1a7a05496907173dab17e238c8dc3c7cad90b3679b0d846", - "sha256:05c4efd36879ff8020af00407e4c14246b894558ea41dc6486f60dd71601fc67", - "sha256:063220a6dc0909b576ef068c7e2acf5c608d64423a6d231aacb72d06352cd95b", - "sha256:0759868b4a4d103578375e031e89abd578c26774d957ee4f591764ef8003b363", - "sha256:077d9a61e6042174dabf68b8e92c0a80f5aff529439ed314aa6e6a233af80b95", - "sha256:0a9206b0720f0cad3e70c018722f6d10e81b32e65477e14ffedd3fbfadfaddca", - "sha256:0d9fcfc09d67218fce114fe9fd97bba4f9d56add0f775c588d8c626ed47f1aef", - "sha256:0f31d02b831d0fa9bf099b1b714b5a8252eabd8db34b7d33c48e7e808a2dabf9", - "sha256:115e76fbe9288119526b66963f614042222d1587f1ba5ddb90088215a3d2a25a", - "sha256:13491f1bfcf020fd02751c4a55294aa8957e21b7ecd2542b0521a7aa50c58bb2", - "sha256:2ad4eb2608661d63fb57c674dafb9955f5141d748d4579c7722c1a3c6b86a0c2", - "sha256:2c4d4d92182002b2878adb3329de1ccb7f3f7571d3586f92602e790bfeab45d0", - "sha256:2d6bb318ddce8b978c81cf78caf8b3836db84f6235d721952685e87871f506e4", - "sha256:34059c3ea6e342ba388cd9774a61761bb4200ca18bd475de65c9cc70ef4e0204", - "sha256:3679a6693456f5f7ccca9ab2a91408e99ee257e145024fe380da7c78a07e98b6", - "sha256:39318348db488a2f24e7c84e08bdc82f2624853c0fea8b475ea0b70b27176492", - "sha256:3cffbba1888f795de2103e6fb1482c8ea8d457e638fa813e090fe747f9e549bb", - "sha256:452679284c15a7d5a88bff675e1dd660349360f0665aea50be2d98b7650925f8", - "sha256:45277bb54c35b11bcdd6cf0f56eb950eb280b67146db0cb57853fb6334c6d11d", - "sha256:45aaceb082ad89365f2f783a40db42359591ad55914fb298841196edf88afdc5", - "sha256:485f8a3087392e2287e2869adc0385b439f69b9cfbd262fdf39b00417690c988", - "sha256:4db9eea298e982aee7ba12b3432c66eb2e91bb2f5d026bbd57c35698ea0f557f", - "sha256:4faf17ea6e8fc3065a862d4b24be84048fd58ed7abe59aa2f9141446a7a72335", - "sha256:4fbc8f62b8d50f9a2eef99927a9dcb8d0a42e5a801ab14c2e4aeab622c88f54b", - "sha256:530a474a79fa6c2127bb7e3ba00857b1f26a563615863f17b7434331aa3fe404", - "sha256:5742ef31e1e2c9a4824ef6b05af0f4949047a6f73af1d4b238ce12935174aede", - "sha256:57b44f789794d74c1feddae054dd045b9f601bdffd7288e069b4ca7ed607ec61", - "sha256:6ac1cf1f2ed01656b33618352f7e42bf75d027425b83cc96cfe13ce4b6cba5de", - "sha256:75206369504fc442c10a86ecf57b91592dca744e4592af22a47e9a774d53dd10", - "sha256:77f4d001fb7a03a68b53be20571acd17452d1dda7907d9c325dff0cc704b1ef9", - "sha256:808f56d4cd0511723b787c341f3cc995fd72893e608102268298c188f4a4f2e7", - "sha256:93502f45948ae8d7f874ba4c113b50cb6fb4ee664caa82e1ddc398500ee0ffb3", - "sha256:9c016b3e859b41cf4ce1b8107f364ad5a83c086f75ea4d8d3990b24691f626a1", - "sha256:a1cab30c11880f38a27911b569ea38b0bd67fcf32f8a8a8519b613c70562dae2", - "sha256:a90f9c7b6635967eacafebe439d518b7dc720aaaf19cb9553f5aad03c13296f4", - "sha256:a95ed0e6f481462a3ff2be4c2e4ffffc5d00fc3884d4ccd1fe5b702d4938ec09", - "sha256:a993002fe28c840dc29805fde7341c775b7878b311b85f21560fdebf220c247b", - "sha256:abb2362783521bd9a22fe69b2141abab4db97237665a36a034b161ddee5b3e72", - "sha256:ada4852db0e33dbdd1425322db081d22b9725cb9f5eba42885467b4e2c4f2ac0", - "sha256:b37f4b0d983316242b4b9241ecbbe55220aa92af93ff04626441fe0ea90a54f9", - "sha256:b77f2b45535bcf3741592fa03183558bd42198b872c1584b896fa0ba5f2ac68d", - "sha256:b94f58e05e69e1a43da551c8f532e9fad057df1641f0f8ae8f103d4ede5a80fe", - "sha256:ba3f7b433c1721a43674c0889d5fad746bf608416c8f849343859e6d4d3a7113", - "sha256:c18e125537a96e76c8c34201e5a9aad8625e3d872dd26a63155573462e54e185", - "sha256:c95bd21d87b08c88fe5296381a5f39cd979a775bf1a1d7379a6ff87c703e510b", - "sha256:d0d9431101f600d5a557d55989658cbfd02b7c0dcd1e4675dac8ad7e0da8ea5b", - "sha256:d9d17a6ceb301c5dbd3820e62c1b10a4ad3a6eea3e07e7afaf736b5f490c2e32", - "sha256:db21997270e943aee9cb7694112d24a4702fbe1977fbe53b3cb4db3d02be73d9", - "sha256:dd9cab3b862bec2b110886aedb11765e9deda363c4c7ab5ea205f3d8f143c411", - "sha256:dee39967168d6326ea2df56ad215a4d5049aa52f44cd5aad45bfb63d5b4fb9e5", - "sha256:e3e011fa2ae9e953fe1ab8394329a21bdb54357c7fe509bcfb02b88bc15bffbb", - "sha256:ebc901131057c115a8868e14c1df6e56b9190df774b72664c03ebd858296bb81", - "sha256:f18c13d5ed6fde5efd3b1c039f6a34296d1a0409bb00fbf45bec6f9bcf63ddf5", - "sha256:f687539ead9fbc17f499e33ee20c1dc41598f70ad95edb4990c576447cec9d23", - "sha256:f6fcfef825edb44cf3c6ba2c091ad76a83da62ac9c79553e80e0c2a1f75eda2e", - "sha256:fcfd2255458a5779dbab813550695331d541b24f0ef831ace83f04f9516ddf26" + "sha256:01b94304aab87496e81d1f546e71abf57b430b39be4269df1cd7da9928d70b5b", + "sha256:0c636c9ab92c7838231a1ba769e519d953af8294612f3f772a54d3a5250ff23f", + "sha256:0d8a98c7d86ac4d05b251c39faf49423780381aab55fbf2e147f6e006a34a58a", + "sha256:13211b67b29f6ed8e87c137496c73d93aff0330d97940b4fbed72eae37a4a2a0", + "sha256:133057ac45b6fa7fe5d7baada9d3545d09339432f75c0545f556e8c6fecc2932", + "sha256:167b3f3894dcc697cefefac1d198304fae8eb4d5860a7b8bc2459d572e838470", + "sha256:225f8bba6428b8d711ca2d6c738d2e3a4667f6a2ae40f8a7a5256f69f6a3600e", + "sha256:22d2a684122dfb531853d57c8c85c1d5d44be709e12466dca99fa6aee7d8054f", + "sha256:23ceac5315fe899c229e874328742154e331fa41337bb03f6f5264636c351c9e", + "sha256:2c67105f2c6ccf5b3adbcfaecf3c5c9fa8940f9f97955c9ad7d2542151d97d93", + "sha256:30eb2d2938b9195e2c82951713429aff3ad1be9f104437d1536a04eb0cb3dc0e", + "sha256:34d51709e10ad6213b4bf094af7be7ff82bab43216b3c92a07d05b451deeca79", + "sha256:3a83e04fde663b84905f3a20213a4333d13a07b79434300704b70dc552761f8b", + "sha256:3f02c7240abab48d59f0d5fef7064f18f01a2a204616165fa6367a8abf5a8832", + "sha256:45319d2471f4dbf19893ca53785a421107266e18b8cccd2054fce1e3f72a85f1", + "sha256:4e8bf00ec1dd1d92e9ae74d2e6891f087a939e1dfb40c9c7fa5d8d6a26c94f5a", + "sha256:51e8164b1270625ff101e95c3c1c234421520c07a0a3a20ded9e9431d98afce7", + "sha256:539ad5a21141e6420035cf616bcba48d999bf878839e52692f97fc7e2f16265c", + "sha256:55f93d3822bc196b37a8bdfa4ec6a35232a399e97f2baa714bd5ed8ea9b0ce68", + "sha256:5e3a038332973b12e72236e8884dc99601a840334c2c46cfbbb5851cb94166eb", + "sha256:612d83fd1eb5aaa5401a755c1f1aafacd9dab404cd350b90d5f404c98b33e4b3", + "sha256:6a1859af761977530df2cd5c36e31d54e8d6708ad2c4656e7125c482364dc216", + "sha256:79868ec74e4907a8a6e63effe13547c6157f196a162920b1de066da5849ffb8e", + "sha256:79f20c61114c7948cf1214585066406cef4b54a9b935160980e0b6e70ada3a69", + "sha256:7c8d579d13cb81abe704c8b0908d122b81d6e2623265a19c4a6a7377f440debb", + "sha256:812b193c26553f1f375d4f1c50f805c227b24ed2d595bc9cdaf78c992ecc64a4", + "sha256:816f5285d596062c7ef22790de7d75354b58d4417a9fc64cba914aeeb900db0b", + "sha256:82f27a0134fc6bb46032ca5f728d8af984f3be94a3cb01cb70ff1224e551b9cf", + "sha256:848a28ea49166454c3bff927e5a47629eecf1aa755d6fb3290569cba0fc93766", + "sha256:861cf254bf5836d47c2aee86aa75dd93d3de00ccd1b077c3c7a2bb22cba358e7", + "sha256:8ad7c2303a338b2c0b6c6c68f101a6768725934538756096cf3388a5c07a7525", + "sha256:8ea936cf5931297ba07bce121388c4c6266c1b63a9f4d648ae16c92ff090204b", + "sha256:931aade65f77cf59f2a702ac1f549a4836ce221107c740502cbad18d6d8e9511", + "sha256:936ec37b261b226d7404eff23a9aad284098338150d42a53d6a9af12b18d3892", + "sha256:9fcd9a18ee3ac7f460e0841954feb495102ffbdbec0e6c78562f3495cda000dd", + "sha256:b1853bc34ced5ff6473e881fcf6de29da83262552c8f268a0df53b49c2b89e2c", + "sha256:b227643d8a40b68554dc7d37fcd03fc97b4fb0bd2614aeb5f2e07ab244642d36", + "sha256:b65abca78aa5ebc8675c8480b9a53006f6efea9910ad099cf32c9fb5617ef251", + "sha256:b9d0dae6dccd349b8ccf197c10ef2d05c711ca36a649c7eddbab1de2c90b63a1", + "sha256:cd6ae43ef2e596c9a88dbf2a8895be2e32cc2f5bc3c8ba2e7753b69068fc0b2d", + "sha256:e13abb14843397b76d0472c7d33cd260d5f262ab05cc27ed423317e645e29643", + "sha256:e1bdf8a107fdf9e174991aa87a0be7504f60de1ec6bfb1ccfb30e33acac818a0", + "sha256:e34b4b08d795ccca920fa26b099558f4f1e4e3f794e4ba8d3433c5bc2454d50a", + "sha256:e3c0e19bb41de6be9d8afc85795159ca16296be81a586cd9588be0400d44a855", + "sha256:ef5bb0268bfe5992da3ef9292463a5a895ed8700b134ed2c00008d5471b3ba6e", + "sha256:f2602a5c97a3d618b3b847514204ef3349fb414c59e1126c0c2c708d2c5680f8", + "sha256:f3845c4506e0d207c5e268fb02813928f3a1e135de954a379f165ef0d581da47", + "sha256:f674be92673e87dd8ee7cfe553d5960ec4effc5ab15063b9a5e265a51585a31a", + "sha256:f6d8ff62ad55dc0393686438eac4b457a916e4d1118a0b550746bb52b4c756cc", + "sha256:fb299acf3a578573c190c858d49e0cf9d75f4bc49c3f24c5a63804997ef09213", + "sha256:fed25959e4025870fdde5f895fcb126196d22affd4f4fad85a2823e0dddc85b0" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.5" + "version": "==3.0.7" }, "dask": { "hashes": [ @@ -704,17 +682,11 @@ }, "datashader": { "hashes": [ - "sha256:9539529379287d69c10e9ab4e0b2900e1a16004d6ff06de0d84aa62c4833b1bb", - "sha256:9af96d76bc7011c60b4e76177e283efe20e060278ecd81ce7005a4d80a4dc69e" + "sha256:a2cb0f839067bf29cf6cc9c07a1dad35f0e4aed3768387056fcbac8748087bfa", + "sha256:ed4c111957578dcb3fcff972d954f77586dafd71a7345fd5cd069d9fb050d0d1" ], - "markers": "python_version >= '3.8'", - "version": "==0.15.2" - }, - "datashape": { - "hashes": [ - "sha256:2356ea690c3cf003c1468a243a9063144235de45b080b3652de4f3d44e57d783" - ], - "version": "==0.5.2" + "markers": "python_version >= '3.9'", + "version": "==0.16.0" }, "debugpy": { "hashes": [ @@ -758,10 +730,10 @@ }, "distlib": { "hashes": [ - "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057", - "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8" + "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", + "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" ], - "version": "==0.3.7" + "version": "==0.3.8" }, "entrypoints": { "hashes": [ @@ -852,51 +824,51 @@ }, "fonttools": { "hashes": [ - "sha256:05d7c4d2c95b9490e669f3cb83918799bf1c838619ac6d3bad9ea017cfc63f2e", - "sha256:0f412954275e594f7a51c16f3b3edd850acb0d842fefc33856b63a17e18499a5", - "sha256:22ea8aa7b3712450b42b044702bd3a64fd118006bad09a6f94bd1b227088492e", - "sha256:2db63941fee3122e31a21dd0f5b2138ce9906b661a85b63622421d3654a74ae2", - "sha256:2e91e19b583961979e2e5a701269d3cfc07418963bee717f8160b0a24332826b", - "sha256:31b38528f25bc662401e6ffae14b3eb7f1e820892fd80369a37155e3b636a2f4", - "sha256:3d29509f6e05e8d725db59c2d8c076223d793e4e35773040be6632a0349f2f97", - "sha256:46c79af80a835410874683b5779b6c1ec1d5a285e11c45b5193e79dd691eb111", - "sha256:4e90dd81b6e0d97ebfe52c0d12a17a9ef7f305d6bfbb93081265057d6092f252", - "sha256:50d25893885e80a5955186791eed5579f1e75921751539cc1dc3ffd1160b48cf", - "sha256:518a945dbfe337744bfff31423c1430303b8813c5275dffb0f2577f0734a1189", - "sha256:54efed22b2799a85475e6840e907c402ba49892c614565dc770aa97a53621b2b", - "sha256:58af428746fa73a2edcbf26aff33ac4ef3c11c8d75bb200eaea2f7e888d2de4e", - "sha256:59b6ad83cce067d10f4790c037a5904424f45bebb5e7be2eb2db90402f288267", - "sha256:63a3112f753baef8c6ac2f5f574bb9ac8001b86c8c0c0380039db47a7f512d20", - "sha256:66bc6efd829382f7a7e6cf33c2fb32b13edc8a239eb15f32acbf197dce7a0165", - "sha256:6999e80a125b0cd8e068d0210b63323f17338038c2ecd2e11b9209ec430fe7f2", - "sha256:6d16d9634ff1e5cea2cf4a8cbda9026f766e4b5f30b48f8180f0e99133d3abfc", - "sha256:84f308b7a8d28208d54315d11d35f9888d6d607673dd4d42d60b463682ee0400", - "sha256:9ee8692e23028564c13d924004495f284df8ac016a19f17a87251210e1f1f928", - "sha256:a3da036b016c975c2d8c69005bdc4d5d16266f948a7fab950244e0f58301996a", - "sha256:a7aec7f5d14dfcd71fb3ebc299b3f000c21fdc4043079101777ed2042ba5b7c5", - "sha256:a8a1fa9a718de0bc026979c93e1e9b55c5efde60d76f91561fd713387573817d", - "sha256:a8b99713d3a0d0e876b6aecfaada5e7dc9fe979fcd90ef9fa0ba1d9b9aed03f2", - "sha256:b63da598d9cbc52e2381f922da0e94d60c0429f92207bd3fb04d112fc82ea7cb", - "sha256:b6e6aa2d066f8dafd06d8d0799b4944b5d5a1f015dd52ac01bdf2895ebe169a0", - "sha256:b99fe8ef4093f672d00841569d2d05691e50334d79f4d9c15c1265d76d5580d2", - "sha256:b9beb0fa6ff3ea808ad4a6962d68ac0f140ddab080957b20d9e268e4d67fb335", - "sha256:b9eab7f9837fdaa2a10a524fbcc2ec24bf60637c044b6e4a59c3f835b90f0fae", - "sha256:bca49da868e8bde569ef36f0cc1b6de21d56bf9c3be185c503b629c19a185287", - "sha256:c05064f95aacdfc06f21e55096c964b2228d942b8675fa26995a2551f6329d2d", - "sha256:c2de1fb18198acd400c45ffe2aef5420c8d55fde903e91cba705596099550f3b", - "sha256:c794de4086f06ae609b71ac944ec7deb09f34ecf73316fddc041087dd24bba39", - "sha256:d4fa4f4bc8fd86579b8cdbe5e948f35d82c0eda0091c399d009b2a5a6b61c040", - "sha256:dab3d00d27b1a79ae4d4a240e8ceea8af0ff049fd45f05adb4f860d93744110d", - "sha256:dbac86d83d96099890e731cc2af97976ff2c98f4ba432fccde657c5653a32f1c", - "sha256:df40daa6c03b98652ffe8110ae014fe695437f6e1cb5a07e16ea37f40e73ac86", - "sha256:e1cd1c6bb097e774d68402499ff66185190baaa2629ae2f18515a2c50b93db0c", - "sha256:e8ff7d19a6804bfd561cfcec9b4200dd1788e28f7de4be70189801530c47c1b3", - "sha256:eb01c49c8aa035d5346f46630209923d4927ed15c2493db38d31da9f811eb70d", - "sha256:f53526668beccdb3409c6055a4ffe50987a7f05af6436fa55d61f5e7bd450219", - "sha256:f611c97678604e302b725f71626edea113a5745a7fb557c958b39edb6add87d5" + "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be", + "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154", + "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8", + "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d", + "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda", + "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9", + "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767", + "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391", + "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc", + "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b", + "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca", + "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c", + "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984", + "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4", + "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7", + "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6", + "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d", + "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500", + "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5", + "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980", + "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540", + "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71", + "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd", + "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982", + "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671", + "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf", + "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c", + "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7", + "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7", + "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa", + "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11", + "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826", + "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9", + "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82", + "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff", + "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992", + "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812", + "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8", + "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78", + "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d", + "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf", + "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538" ], "markers": "python_version >= '3.8'", - "version": "==4.44.0" + "version": "==4.47.0" }, "fqdn": { "hashes": [ @@ -907,19 +879,19 @@ }, "fsspec": { "hashes": [ - "sha256:330c66757591df346ad3091a53bd907e15348c2ba17d63fd54f5c39c4457d2a5", - "sha256:346a8f024efeb749d2a5fca7ba8854474b1ff9af7c3faaf636a4548781136529" + "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb", + "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960" ], "markers": "python_version >= '3.8'", - "version": "==2023.10.0" + "version": "==2023.12.2" }, "geocube": { "hashes": [ - "sha256:35d446f61e8ce97d0bcc3c692d003b355df19d7f59c8cd8bd61d2f9e3c7f72c8", - "sha256:b50ee83e4dcf465ccc54e62abe0e6458a26e8faf1e7b15b27604f936781c8a04" + "sha256:43c88cd5dd18f9df9561e642b4840e4bd061ccc8a3e8c419378f6707384213d0", + "sha256:5404060d6dcc8d3f251b453588667c6d5e5e60d07793011851f8bc129f779db0" ], - "markers": "python_version >= '3.8'", - "version": "==0.3.3" + "markers": "python_version >= '3.9'", + "version": "==0.4.2" }, "geographiclib": { "hashes": [ @@ -939,11 +911,11 @@ }, "geopy": { "hashes": [ - "sha256:a59392bf17adb486b25dbdd71fbed27733bdf24a2dac588047a619de56695e36", - "sha256:d2639a46d0ce4c091e9688b750ba94348a14b898a1e55c68f4b4a07e7d1afa20" + "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", + "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" ], "markers": "python_version >= '3.7'", - "version": "==2.4.0" + "version": "==2.4.1" }, "gval": { "hashes": [ @@ -955,11 +927,11 @@ }, "identify": { "hashes": [ - "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75", - "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d" + "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d", + "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34" ], "markers": "python_version >= '3.8'", - "version": "==2.5.31" + "version": "==2.5.33" }, "idna": { "hashes": [ @@ -974,17 +946,9 @@ "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7", "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67" ], - "markers": "python_version < '3.9'", + "markers": "python_version >= '3.8'", "version": "==7.0.0" }, - "importlib-resources": { - "hashes": [ - "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a", - "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6" - ], - "markers": "python_version < '3.10'", - "version": "==6.1.1" - }, "inflate64": { "hashes": [ "sha256:022ca1cc928e7365a05f7371ff06af143c6c667144965e2cf9a9236a2ae1c291", @@ -1054,11 +1018,11 @@ }, "ipykernel": { "hashes": [ - "sha256:3ba3dc97424b87b31bb46586b5167b3161b32d7820b9201a9e698c71e271602c", - "sha256:553856658eb8430bbe9653ea041a41bff63e9606fc4628873fc92a6cf3abd404" + "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6", + "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686" ], "markers": "python_version >= '3.8'", - "version": "==6.26.0" + "version": "==6.27.1" }, "ipympl": { "hashes": [ @@ -1070,11 +1034,11 @@ }, "ipython": { "hashes": [ - "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", - "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5", + "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0" ], - "markers": "python_version >= '3.8'", - "version": "==8.12.3" + "markers": "python_version >= '3.10'", + "version": "==8.19.0" }, "ipython-genutils": { "hashes": [ @@ -1116,11 +1080,12 @@ }, "jinja2": { "hashes": [ - "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", - "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61" + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.1.2" + "version": "==3.1.3" }, "jmespath": { "hashes": [ @@ -1198,11 +1163,11 @@ }, "jupyter-core": { "hashes": [ - "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3", - "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805" + "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40", + "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739" ], "markers": "python_version >= '3.8'", - "version": "==5.5.0" + "version": "==5.5.1" }, "jupyter-events": { "hashes": [ @@ -1214,28 +1179,27 @@ }, "jupyter-server": { "hashes": [ - "sha256:0c548151b54bcb516ca466ec628f7f021545be137d01b5467877e87f6fff4374", - "sha256:0c99f9367b0f24141e527544522430176613f9249849be80504c6d2b955004bb" + "sha256:dc77b7dcc5fc0547acba2b2844f01798008667201eea27c6319ff9257d700a6d", + "sha256:fd030dd7be1ca572e4598203f718df6630c12bd28a599d7f1791c4d7938e1010" ], - "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.11.2" + "version": "==2.12.1" }, "jupyter-server-fileid": { "hashes": [ - "sha256:171538b7c7d08d11dbc57d4e6da196e0c258e4c2cd29249ef1e032bb423677f8", - "sha256:5b489c6fe6783c41174a728c7b81099608518387e53c3d53451a67f46a0cb7b0" + "sha256:7486bca3acf9bbaab7ce5127f9f64d2df58f5d2de377609fb833291a7217a6a2", + "sha256:76dd05a45b78c7ec0cba0be98ece289984c6bcfc1ca2da216d42930e506a4d68" ], "markers": "python_version >= '3.7'", - "version": "==0.9.0" + "version": "==0.9.1" }, "jupyter-server-terminals": { "hashes": [ - "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d", - "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36" + "sha256:2fc0692c883bfd891f4fba0c4b4a684a37234b0ba472f2e97ed0a3888f46e1e4", + "sha256:ebcd68c9afbf98a480a533e6f3266354336e645536953b7abcc7bdeebc0154a3" ], "markers": "python_version >= '3.8'", - "version": "==0.4.4" + "version": "==0.5.0" }, "jupyter-server-ydoc": { "hashes": [ @@ -1271,11 +1235,11 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:77c2f1f282d610f95e496e20d5bf1d2a7706826dfb7b18f3378ae2870d272fb7", - "sha256:c9f67a98b295c5dee87f41551b0558374e45d449f3edca153dd722140630dcb2" + "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf", + "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63" ], "markers": "python_version >= '3.8'", - "version": "==2.25.0" + "version": "==2.25.2" }, "jupyterlab-widgets": { "hashes": [ @@ -1711,16 +1675,16 @@ "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e", "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15" ], - "markers": "python_full_version >= '3.8.0'", + "markers": "python_version >= '3.8'", "version": "==0.9.0" }, "nbconvert": { "hashes": [ - "sha256:5b6c848194d270cc55fb691169202620d7b52a12fec259508d142ecbe4219310", - "sha256:b1564bd89f69a74cd6398b0362da94db07aafb991b7857216a766204a71612c0" + "sha256:2dc8267dbdfeedce2dcd34c9e3f1b51af18f43cb105549d1c5a18189ec23ba85", + "sha256:3c50eb2d326478cc90b8759cf2ab9dde3d892c6537cd6a5bc0991db8ef734bcc" ], "markers": "python_version >= '3.8'", - "version": "==7.12.0" + "version": "==7.13.1" }, "nbformat": { "hashes": [ @@ -1831,39 +1795,38 @@ }, "numexpr": { "hashes": [ - "sha256:15469dc722b5ceb92324ec8635411355ebc702303db901ae8cc87f47c5e3a124", - "sha256:18b1804923cfa3be7bbb45187d01c0540c8f6df4928c22a0f786e15568e9ebc5", - "sha256:1967c16f61c27df1cdc43ba3c0ba30346157048dd420b4259832276144d0f64e", - "sha256:211804ec25a9f6d188eadf4198dd1a92b2f61d7d20993c6c7706139bc4199c5b", - "sha256:27782177a0081bd0aab229be5d37674e7f0ab4264ef576697323dd047432a4cd", - "sha256:31cf610c952eec57081171f0b4427f9bed2395ec70ec432bbf45d260c5c0cdeb", - "sha256:38b8b90967026bbc36c7aa6e8ca3b8906e1990914fd21f446e2a043f4ee3bc06", - "sha256:47b45da5aa25600081a649f5e8b2aa640e35db3703f4631f34bb1f2f86d1b5b4", - "sha256:6336f8dba3f456e41a4ffc3c97eb63d89c73589ff6e1707141224b930263260d", - "sha256:681812e2e71ff1ba9145fac42d03f51ddf6ba911259aa83041323f68e7458002", - "sha256:6d7003497d82ef19458dce380b36a99343b96a3bd5773465c2d898bf8f5a38f9", - "sha256:6e884687da8af5955dc9beb6a12d469675c90b8fb38b6c93668c989cfc2cd982", - "sha256:80acbfefb68bd92e708e09f0a02b29e04d388b9ae72f9fcd57988aca172a7833", - "sha256:84979bf14143351c2db8d9dd7fef8aca027c66ad9df9cb5e75c93bf5f7b5a338", - "sha256:8564186aad5a2c88d597ebc79b8171b52fd33e9b085013e1ff2208f7e4b387e3", - "sha256:8e3e6f1588d6c03877cb3b3dcc3096482da9d330013b886b29cb9586af5af3eb", - "sha256:95b9da613761e4fc79748535b2a1f58cada22500e22713ae7d9571fa88d1c2e2", - "sha256:95c09e814b0d6549de98b5ded7cdf7d954d934bb6b505432ff82e83a6d330bda", - "sha256:9ef7e8aaa84fce3aba2e65f243d14a9f8cc92aafd5d90d67283815febfe43eeb", - "sha256:aa0f661f5f4872fd7350cc9895f5d2594794b2a7e7f1961649a351724c64acc9", - "sha256:b5f96c89aa0b1f13685ec32fa3d71028db0b5981bfd99a0bbc271035949136b3", - "sha256:c48221b6a85494a7be5a022899764e58259af585dff031cecab337277278cc93", - "sha256:c8f37f7a6af3bdd61f2efd1cafcc083a9525ab0aaf5dc641e7ec8fc0ae2d3aa1", - "sha256:d126938c2c3784673c9c58d94e00b1570aa65517d9c33662234d442fc9fb5795", - "sha256:d36528a33aa9c23743b3ea686e57526a4f71e7128a1be66210e1511b09c4e4e9", - "sha256:d6a88d71c166e86b98d34701285d23e3e89d548d9f5ae3f4b60919ac7151949f", - "sha256:dee04d72307c09599f786b9231acffb10df7d7a74b2ce3681d74a574880d13ce", - "sha256:e640bc0eaf1b59f3dde52bc02bbfda98e62f9950202b0584deba28baf9f36bbb", - "sha256:e93d64cd20940b726477c3cb64926e683d31b778a1e18f9079a5088fd0d8e7c8", - "sha256:ef6e8896457a60a539cb6ba27da78315a9bb31edb246829b25b5b0304bfcee91" - ], - "markers": "python_version >= '3.7'", - "version": "==2.8.6" + "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127", + "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2", + "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa", + "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3", + "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d", + "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39", + "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921", + "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61", + "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6", + "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a", + "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3", + "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68", + "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729", + "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084", + "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce", + "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef", + "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce", + "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406", + "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525", + "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6", + "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5", + "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520", + "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4", + "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd", + "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373", + "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0", + "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd", + "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34", + "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c" + ], + "markers": "python_version >= '3.9'", + "version": "==2.8.8" }, "numpy": { "hashes": [ @@ -1897,14 +1860,15 @@ "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.23.5" }, "numpy-groupies": { "hashes": [ - "sha256:fd50026552280ca717722f17d4231390667505bb572de564de1362b40487d34a" + "sha256:24a574ecdd58c0d669749b67ec31dab971d27e04037b402bbc4f6bedaa2623bc", + "sha256:f920c4ded899f5975d94fc63d634e7c89622056bbab8cc98a44d4320a0ae8a12" ], - "version": "==0.9.22" + "markers": "python_version >= '3.9'", + "version": "==0.10.2" }, "odc-geo": { "hashes": [ @@ -1979,11 +1943,11 @@ }, "param": { "hashes": [ - "sha256:0153a06fb0049fab73132d7faf4c468d44ad77ee00d531702b0bf222c069f9b6", - "sha256:19823383b0dac5a794152b85336cb4c6b0d0ef61a2b1eb7cd272aae141be0117" + "sha256:4bfc94c0e4127626fa833e30c71c91ea73e7675b80c26dbdd4a6e5a8f6dc46db", + "sha256:7943a04607822efd46e96e1827dc5fa929a2fc3b1fe9fc7b7dca7d17a8031a5b" ], "markers": "python_version >= '3.8'", - "version": "==2.0.0" + "version": "==2.0.1" }, "parso": { "hashes": [ @@ -2003,26 +1967,19 @@ }, "pathspec": { "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" - }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" + "version": "==4.9.0" }, "pillow": { "hashes": [ @@ -2084,14 +2041,6 @@ "markers": "python_version >= '3.8'", "version": "==10.1.0" }, - "pkgutil-resolve-name": { - "hashes": [ - "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174", - "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e" - ], - "markers": "python_version < '3.9'", - "version": "==1.3.10" - }, "platformdirs": { "hashes": [ "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", @@ -2126,33 +2075,33 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", - "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_version >= '3.7'", - "version": "==3.0.39" + "version": "==3.0.43" }, "psutil": { "hashes": [ - "sha256:10e8c17b4f898d64b121149afb136c53ea8b68c7531155147867b7b1ac9e7e28", - "sha256:18cd22c5db486f33998f37e2bb054cc62fd06646995285e02a51b1e08da97017", - "sha256:3ebf2158c16cc69db777e3c7decb3c0f43a7af94a60d72e87b2823aebac3d602", - "sha256:51dc3d54607c73148f63732c727856f5febec1c7c336f8f41fcbd6315cce76ac", - "sha256:6e5fb8dc711a514da83098bc5234264e551ad980cec5f85dabf4d38ed6f15e9a", - "sha256:70cb3beb98bc3fd5ac9ac617a327af7e7f826373ee64c80efd4eb2856e5051e9", - "sha256:748c9dd2583ed86347ed65d0035f45fa8c851e8d90354c122ab72319b5f366f4", - "sha256:91ecd2d9c00db9817a4b4192107cf6954addb5d9d67a969a4f436dbc9200f88c", - "sha256:92e0cc43c524834af53e9d3369245e6cc3b130e78e26100d1f63cdb0abeb3d3c", - "sha256:a6f01f03bf1843280f4ad16f4bde26b817847b4c1a0db59bf6419807bc5ce05c", - "sha256:c69596f9fc2f8acd574a12d5f8b7b1ba3765a641ea5d60fb4736bf3c08a8214a", - "sha256:ca2780f5e038379e520281e4c032dddd086906ddff9ef0d1b9dcf00710e5071c", - "sha256:daecbcbd29b289aac14ece28eca6a3e60aa361754cf6da3dfb20d4d32b6c7f57", - "sha256:e4b92ddcd7dd4cdd3f900180ea1e104932c7bce234fb88976e2a3b296441225a", - "sha256:fb8a697f11b0f5994550555fcfe3e69799e5b060c8ecf9e2f75c69302cc35c0d", - "sha256:ff18b8d1a784b810df0b0fff3bcb50ab941c3b8e2c8de5726f9c71c601c611aa" + "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340", + "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6", + "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284", + "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c", + "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7", + "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c", + "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e", + "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6", + "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056", + "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9", + "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68", + "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df", + "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e", + "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414", + "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508", + "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe" ], "markers": "sys_platform != 'cygwin'", - "version": "==5.9.6" + "version": "==5.9.7" }, "psycopg2-binary": { "hashes": [ @@ -2292,7 +2241,6 @@ "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==14.0.1" }, "pybcj": { @@ -2359,41 +2307,42 @@ }, "pycryptodomex": { "hashes": [ - "sha256:09c9401dc06fb3d94cb1ec23b4ea067a25d1f4c6b7b118ff5631d0b5daaab3cc", - "sha256:0b2f1982c5bc311f0aab8c293524b861b485d76f7c9ab2c3ac9a25b6f7655975", - "sha256:136b284e9246b4ccf4f752d435c80f2c44fc2321c198505de1d43a95a3453b3c", - "sha256:1789d89f61f70a4cd5483d4dfa8df7032efab1118f8b9894faae03c967707865", - "sha256:2126bc54beccbede6eade00e647106b4f4c21e5201d2b0a73e9e816a01c50905", - "sha256:258c4233a3fe5a6341780306a36c6fb072ef38ce676a6d41eec3e591347919e8", - "sha256:263de9a96d2fcbc9f5bd3a279f14ea0d5f072adb68ebd324987576ec25da084d", - "sha256:50cb18d4dd87571006fd2447ccec85e6cec0136632a550aa29226ba075c80644", - "sha256:5b883e1439ab63af976656446fb4839d566bb096f15fc3c06b5a99cde4927188", - "sha256:5d73e9fa3fe830e7b6b42afc49d8329b07a049a47d12e0ef9225f2fd220f19b2", - "sha256:61056a1fd3254f6f863de94c233b30dd33bc02f8c935b2000269705f1eeeffa4", - "sha256:67c8eb79ab33d0fbcb56842992298ddb56eb6505a72369c20f60bc1d2b6fb002", - "sha256:6e45bb4635b3c4e0a00ca9df75ef6295838c85c2ac44ad882410cb631ed1eeaa", - "sha256:7cb51096a6a8d400724104db8a7e4f2206041a1f23e58924aa3d8d96bcb48338", - "sha256:800a2b05cfb83654df80266692f7092eeefe2a314fa7901dcefab255934faeec", - "sha256:8df69e41f7e7015a90b94d1096ec3d8e0182e73449487306709ec27379fff761", - "sha256:917033016ecc23c8933205585a0ab73e20020fdf671b7cd1be788a5c4039840b", - "sha256:a12144d785518f6491ad334c75ccdc6ad52ea49230b4237f319dbb7cef26f464", - "sha256:a3866d68e2fc345162b1b9b83ef80686acfe5cec0d134337f3b03950a0a8bf56", - "sha256:a588a1cb7781da9d5e1c84affd98c32aff9c89771eac8eaa659d2760666f7139", - "sha256:a77b79852175064c822b047fee7cf5a1f434f06ad075cc9986aa1c19a0c53eb0", - "sha256:af83a554b3f077564229865c45af0791be008ac6469ef0098152139e6bd4b5b6", - "sha256:b801216c48c0886742abf286a9a6b117e248ca144d8ceec1f931ce2dd0c9cb40", - "sha256:bfb040b5dda1dff1e197d2ef71927bd6b8bfcb9793bc4dfe0bb6df1e691eaacb", - "sha256:c01678aee8ac0c1a461cbc38ad496f953f9efcb1fa19f5637cbeba7544792a53", - "sha256:c74eb1f73f788facece7979ce91594dc177e1a9b5d5e3e64697dd58299e5cb4d", - "sha256:c9a68a2f7bd091ccea54ad3be3e9d65eded813e6d79fdf4cc3604e26cdd6384f", - "sha256:d4dd3b381ff5a5907a3eb98f5f6d32c64d319a840278ceea1dcfcc65063856f3", - "sha256:e8e5ecbd4da4157889fce8ba49da74764dd86c891410bfd6b24969fa46edda51", - "sha256:eb2fc0ec241bf5e5ef56c8fbec4a2634d631e4c4f616a59b567947a0f35ad83c", - "sha256:edbe083c299835de7e02c8aa0885cb904a75087d35e7bab75ebe5ed336e8c3e2", - "sha256:ff64fd720def623bf64d8776f8d0deada1cc1bf1ec3c1f9d6f5bb5bd098d034f" + "sha256:011e859026ecbd15b8e720e8992361186e582cf726c50bde6ff8c0c05e820ddf", + "sha256:0b42e2743893f386dfb58fe24a4c8be5305c3d1c825d5f23d9e63fd0700d1110", + "sha256:0b7154aff2272962355f8941fd514104a88cb29db2d8f43a29af900d6398eb1c", + "sha256:0bc4b7bfaac56e6dfd62044847443a3d110c7abea7fcb0d68c1aea64ed3a6697", + "sha256:10c2eed4efdfa084b602ab922e699a0a2ba82053baebfc8afcaf27489def7955", + "sha256:1c04cfff163c05d033bf28e3c4429d8222796738c7b6c1638b9d7090b904611e", + "sha256:23707238b024b36c35dd3428f5af6c1f0c5ef54c21e387a2063633717699b8b2", + "sha256:371bbe0be17b4dd8cc0c2f378d75ea33f00d5a39884c09a672016ac40145a5fa", + "sha256:39eb1f82ac3ba3e39d866f38e480e8fa53fcdd22260340f05f54a8188d47d510", + "sha256:3f3c58971784fba0e014bc3f8aed1197b86719631e1b597d36d7354be5598312", + "sha256:5ca98de2e5ac100e57a7116309723360e8f799f722509e376dc396cdf65eec9c", + "sha256:62f51a63d73153482729904381dd2de86800b0733a8814ee8f072fa73e5c92fb", + "sha256:76414d39df6b45bcc4f38cf1ba2031e0f4b8e99d1ba3c2eee31ffe1b9f039733", + "sha256:8dffe067d5fff14dba4d18ff7d459cc2a47576d82dafbff13a8f1199c3353e41", + "sha256:96000b837bcd8e3bf86b419924a056c978e45027281e4318650c81c25a3ef6cc", + "sha256:9919a1edd2a83c4dfb69f1d8a4c0c5efde7147ef15b07775633372b80c90b5d8", + "sha256:aab7941c2ff53eb63cb26252770e4f14386d79ce07baeffbf98a1323c1646545", + "sha256:ac562e239d98cfef763866c0aee4586affb0d58c592202f06c87241af99db241", + "sha256:ae75eea2e908383fd4c659fdcfe9621a72869e3e3ee73904227e93b7f7b80b54", + "sha256:b5c336dc698650283ad06f8c0237a984087d0af9f403ff21d633507335628156", + "sha256:beb5f0664f49b6093da179ee8e27c1d670779f50b9ece0886ce491bb8bd63728", + "sha256:c1ae2fb8d5d6771670436dcc889b293e363c97647a6d31c21eebc12b7b760010", + "sha256:c9332b04bf3f838327087b028f690f4ddb9341eb014a0221e79b9c19a77f7555", + "sha256:c9cb88ed323be1aa642b3c17cd5caa1a03c3a8fbad092d48ecefe88e328ffae3", + "sha256:d45d0d35a238d838b872598fa865bbfb31aaef9aeeda77c68b04ef79f9a469dc", + "sha256:d7a77391fd351ff1bdf8475558ddc6e92950218cb905419ee14aa02f370f1054", + "sha256:de5a43901e47e7a6938490fc5de3074f6e35c8b481a75b227c0d24d6099bd41d", + "sha256:e94a7e986b117b72e9472f8eafdd81748dafff30815401f9760f759f1debe9ef", + "sha256:ed3bdda44cc05dd13eee697ab9bea6928531bb7b218e68e66d0d3eb2ebab043e", + "sha256:f24f49fc6bd706d87048654d6be6c7c967d6836d4879e3a7c439275fab9948ad", + "sha256:f8a97b1acd36e9ce9d4067d94a8be99c458f0eb8070828639302a95cfcf0770b", + "sha256:f8b3d9e7c17c1ffc1fa5b11c0bbab8a5df3de8596bb32ad30281b21e5ede4bf5" ], + "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.19.0" + "version": "==3.19.1" }, "pyct": { "hashes": [ @@ -2453,6 +2402,14 @@ "markers": "python_version >= '3.6'", "version": "==3.0.1" }, + "pyflwdir": { + "hashes": [ + "sha256:07f5499e976e3b45ea5750869dc6c3b85a77aa674ac73c45f7da0a2e9f7e66db", + "sha256:be059dcade8bde51102e7e832903e76bec391b8bb460ca571895f511f4c18e4d" + ], + "index": "pypi", + "version": "==0.5.8" + }, "pygments": { "hashes": [ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", @@ -2901,11 +2858,11 @@ }, "qtconsole": { "hashes": [ - "sha256:6b6bcf8f834c6df1579a3e6623c8531b85d3e723997cee3a1156296df14716c8", - "sha256:ea8b4a07d7dc915a1b1238fbfe2c9aea570640402557b64615e09a4bc60df47c" + "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b", + "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc" ], "markers": "python_version >= '3.8'", - "version": "==5.5.0" + "version": "==5.5.1" }, "qtpy": { "hashes": [ @@ -2948,11 +2905,11 @@ }, "referencing": { "hashes": [ - "sha256:81a1471c68c9d5e3831c30ad1dd9815c45b558e596653db751a2bfdd17b3b9ec", - "sha256:c19c4d006f1757e3dd75c4f784d38f8698d87b649c54f9ace14e5e8c9667c01d" + "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161", + "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99" ], "markers": "python_version >= '3.8'", - "version": "==0.31.1" + "version": "==0.32.0" }, "requests": { "hashes": [ @@ -3007,116 +2964,116 @@ }, "rioxarray": { "hashes": [ - "sha256:0cad24ad2c3c5ee181a0cfad2b8c2152a609b7eb118a3430034aec171e9cf14f", - "sha256:56eef711d9817d3c729c1a267c940e7dff66bfc874a0b24ed3604ea2f958dfb2" + "sha256:d2a8429a5b6405913c7b6f515ef2992b05139c96eb39a2dc1c9f475ce0848c9c", + "sha256:d7c0b2efc21075f77fe04302b916a995320004695f3c31e4f06d9ab40acd4498" ], - "markers": "python_version >= '3.8'", - "version": "==0.13.4" + "markers": "python_version >= '3.9'", + "version": "==0.15.0" }, "rpds-py": { "hashes": [ - "sha256:06d218e4464d31301e943b65b2c6919318ea6f69703a351961e1baaf60347276", - "sha256:12ecf89bd54734c3c2c79898ae2021dca42750c7bcfb67f8fb3315453738ac8f", - "sha256:15253fff410873ebf3cfba1cc686a37711efcd9b8cb30ea21bb14a973e393f60", - "sha256:188435794405c7f0573311747c85a96b63c954a5f2111b1df8018979eca0f2f0", - "sha256:1ceebd0ae4f3e9b2b6b553b51971921853ae4eebf3f54086be0565d59291e53d", - "sha256:244e173bb6d8f3b2f0c4d7370a1aa341f35da3e57ffd1798e5b2917b91731fd3", - "sha256:25b28b3d33ec0a78e944aaaed7e5e2a94ac811bcd68b557ca48a0c30f87497d2", - "sha256:25ea41635d22b2eb6326f58e608550e55d01df51b8a580ea7e75396bafbb28e9", - "sha256:29d311e44dd16d2434d5506d57ef4d7036544fc3c25c14b6992ef41f541b10fb", - "sha256:2a1472956c5bcc49fb0252b965239bffe801acc9394f8b7c1014ae9258e4572b", - "sha256:2a7bef6977043673750a88da064fd513f89505111014b4e00fbdd13329cd4e9a", - "sha256:2ac26f50736324beb0282c819668328d53fc38543fa61eeea2c32ea8ea6eab8d", - "sha256:2e72f750048b32d39e87fc85c225c50b2a6715034848dbb196bf3348aa761fa1", - "sha256:31e220a040b89a01505128c2f8a59ee74732f666439a03e65ccbf3824cdddae7", - "sha256:35f53c76a712e323c779ca39b9a81b13f219a8e3bc15f106ed1e1462d56fcfe9", - "sha256:38d4f822ee2f338febcc85aaa2547eb5ba31ba6ff68d10b8ec988929d23bb6b4", - "sha256:38f9bf2ad754b4a45b8210a6c732fe876b8a14e14d5992a8c4b7c1ef78740f53", - "sha256:3a44c8440183b43167fd1a0819e8356692bf5db1ad14ce140dbd40a1485f2dea", - "sha256:3ab96754d23372009638a402a1ed12a27711598dd49d8316a22597141962fe66", - "sha256:3c55d7f2d817183d43220738270efd3ce4e7a7b7cbdaefa6d551ed3d6ed89190", - "sha256:46e1ed994a0920f350a4547a38471217eb86f57377e9314fbaaa329b71b7dfe3", - "sha256:4a5375c5fff13f209527cd886dc75394f040c7d1ecad0a2cb0627f13ebe78a12", - "sha256:4c2d26aa03d877c9730bf005621c92da263523a1e99247590abbbe252ccb7824", - "sha256:4c4e314d36d4f31236a545696a480aa04ea170a0b021e9a59ab1ed94d4c3ef27", - "sha256:4d0c10d803549427f427085ed7aebc39832f6e818a011dcd8785e9c6a1ba9b3e", - "sha256:4dcc5ee1d0275cb78d443fdebd0241e58772a354a6d518b1d7af1580bbd2c4e8", - "sha256:51967a67ea0d7b9b5cd86036878e2d82c0b6183616961c26d825b8c994d4f2c8", - "sha256:530190eb0cd778363bbb7596612ded0bb9fef662daa98e9d92a0419ab27ae914", - "sha256:5379e49d7e80dca9811b36894493d1c1ecb4c57de05c36f5d0dd09982af20211", - "sha256:5493569f861fb7b05af6d048d00d773c6162415ae521b7010197c98810a14cab", - "sha256:5a4c1058cdae6237d97af272b326e5f78ee7ee3bbffa6b24b09db4d828810468", - "sha256:5d75d6d220d55cdced2f32cc22f599475dbe881229aeddba6c79c2e9df35a2b3", - "sha256:5d97e9ae94fb96df1ee3cb09ca376c34e8a122f36927230f4c8a97f469994bff", - "sha256:5feae2f9aa7270e2c071f488fab256d768e88e01b958f123a690f1cc3061a09c", - "sha256:603d5868f7419081d616dab7ac3cfa285296735e7350f7b1e4f548f6f953ee7d", - "sha256:61d42d2b08430854485135504f672c14d4fc644dd243a9c17e7c4e0faf5ed07e", - "sha256:61dbc1e01dc0c5875da2f7ae36d6e918dc1b8d2ce04e871793976594aad8a57a", - "sha256:65cfed9c807c27dee76407e8bb29e6f4e391e436774bcc769a037ff25ad8646e", - "sha256:67a429520e97621a763cf9b3ba27574779c4e96e49a27ff8a1aa99ee70beb28a", - "sha256:6aadae3042f8e6db3376d9e91f194c606c9a45273c170621d46128f35aef7cd0", - "sha256:6ba8858933f0c1a979781272a5f65646fca8c18c93c99c6ddb5513ad96fa54b1", - "sha256:6bc568b05e02cd612be53900c88aaa55012e744930ba2eeb56279db4c6676eb3", - "sha256:729408136ef8d45a28ee9a7411917c9e3459cf266c7e23c2f7d4bb8ef9e0da42", - "sha256:751758d9dd04d548ec679224cc00e3591f5ebf1ff159ed0d4aba6a0746352452", - "sha256:76d59d4d451ba77f08cb4cd9268dec07be5bc65f73666302dbb5061989b17198", - "sha256:79bf58c08f0756adba691d480b5a20e4ad23f33e1ae121584cf3a21717c36dfa", - "sha256:7de12b69d95072394998c622cfd7e8cea8f560db5fca6a62a148f902a1029f8b", - "sha256:7f55cd9cf1564b7b03f238e4c017ca4794c05b01a783e9291065cb2858d86ce4", - "sha256:80e5acb81cb49fd9f2d5c08f8b74ffff14ee73b10ca88297ab4619e946bcb1e1", - "sha256:87a90f5545fd61f6964e65eebde4dc3fa8660bb7d87adb01d4cf17e0a2b484ad", - "sha256:881df98f0a8404d32b6de0fd33e91c1b90ed1516a80d4d6dc69d414b8850474c", - "sha256:8a776a29b77fe0cc28fedfd87277b0d0f7aa930174b7e504d764e0b43a05f381", - "sha256:8c2a61c0e4811012b0ba9f6cdcb4437865df5d29eab5d6018ba13cee1c3064a0", - "sha256:8fa6bd071ec6d90f6e7baa66ae25820d57a8ab1b0a3c6d3edf1834d4b26fafa2", - "sha256:96f2975fb14f39c5fe75203f33dd3010fe37d1c4e33177feef1107b5ced750e3", - "sha256:96fb0899bb2ab353f42e5374c8f0789f54e0a94ef2f02b9ac7149c56622eaf31", - "sha256:97163a1ab265a1073a6372eca9f4eeb9f8c6327457a0b22ddfc4a17dcd613e74", - "sha256:9c95a1a290f9acf7a8f2ebbdd183e99215d491beea52d61aa2a7a7d2c618ddc6", - "sha256:9d94d78418203904730585efa71002286ac4c8ac0689d0eb61e3c465f9e608ff", - "sha256:a6ba2cb7d676e9415b9e9ac7e2aae401dc1b1e666943d1f7bc66223d3d73467b", - "sha256:aa0379c1935c44053c98826bc99ac95f3a5355675a297ac9ce0dfad0ce2d50ca", - "sha256:ac96d67b37f28e4b6ecf507c3405f52a40658c0a806dffde624a8fcb0314d5fd", - "sha256:ade2ccb937060c299ab0dfb2dea3d2ddf7e098ed63ee3d651ebfc2c8d1e8632a", - "sha256:aefbdc934115d2f9278f153952003ac52cd2650e7313750390b334518c589568", - "sha256:b07501b720cf060c5856f7b5626e75b8e353b5f98b9b354a21eb4bfa47e421b1", - "sha256:b5267feb19070bef34b8dea27e2b504ebd9d31748e3ecacb3a4101da6fcb255c", - "sha256:b5f6328e8e2ae8238fc767703ab7b95785521c42bb2b8790984e3477d7fa71ad", - "sha256:b8996ffb60c69f677245f5abdbcc623e9442bcc91ed81b6cd6187129ad1fa3e7", - "sha256:b981a370f8f41c4024c170b42fbe9e691ae2dbc19d1d99151a69e2c84a0d194d", - "sha256:b9d121be0217787a7d59a5c6195b0842d3f701007333426e5154bf72346aa658", - "sha256:bcef4f2d3dc603150421de85c916da19471f24d838c3c62a4f04c1eb511642c1", - "sha256:bed0252c85e21cf73d2d033643c945b460d6a02fc4a7d644e3b2d6f5f2956c64", - "sha256:bfdfbe6a36bc3059fff845d64c42f2644cf875c65f5005db54f90cdfdf1df815", - "sha256:c0095b8aa3e432e32d372e9a7737e65b58d5ed23b9620fea7cb81f17672f1fa1", - "sha256:c1f41d32a2ddc5a94df4b829b395916a4b7f103350fa76ba6de625fcb9e773ac", - "sha256:c45008ca79bad237cbc03c72bc5205e8c6f66403773929b1b50f7d84ef9e4d07", - "sha256:c82bbf7e03748417c3a88c1b0b291288ce3e4887a795a3addaa7a1cfd9e7153e", - "sha256:c918621ee0a3d1fe61c313f2489464f2ae3d13633e60f520a8002a5e910982ee", - "sha256:d204957169f0b3511fb95395a9da7d4490fb361763a9f8b32b345a7fe119cb45", - "sha256:d329896c40d9e1e5c7715c98529e4a188a1f2df51212fd65102b32465612b5dc", - "sha256:d3a61e928feddc458a55110f42f626a2a20bea942ccedb6fb4cee70b4830ed41", - "sha256:d48db29bd47814671afdd76c7652aefacc25cf96aad6daefa82d738ee87461e2", - "sha256:d5593855b5b2b73dd8413c3fdfa5d95b99d657658f947ba2c4318591e745d083", - "sha256:d79c159adea0f1f4617f54aa156568ac69968f9ef4d1e5fefffc0a180830308e", - "sha256:db09b98c7540df69d4b47218da3fbd7cb466db0fb932e971c321f1c76f155266", - "sha256:ddf23960cb42b69bce13045d5bc66f18c7d53774c66c13f24cf1b9c144ba3141", - "sha256:e06cfea0ece444571d24c18ed465bc93afb8c8d8d74422eb7026662f3d3f779b", - "sha256:e7c564c58cf8f248fe859a4f0fe501b050663f3d7fbc342172f259124fb59933", - "sha256:e86593bf8637659e6a6ed58854b6c87ec4e9e45ee8a4adfd936831cef55c2d21", - "sha256:eaffbd8814bb1b5dc3ea156a4c5928081ba50419f9175f4fc95269e040eff8f0", - "sha256:ee353bb51f648924926ed05e0122b6a0b1ae709396a80eb583449d5d477fcdf7", - "sha256:ee6faebb265e28920a6f23a7d4c362414b3f4bb30607141d718b991669e49ddc", - "sha256:efe093acc43e869348f6f2224df7f452eab63a2c60a6c6cd6b50fd35c4e075ba", - "sha256:f03a1b3a4c03e3e0161642ac5367f08479ab29972ea0ffcd4fa18f729cd2be0a", - "sha256:f0d320e70b6b2300ff6029e234e79fe44e9dbbfc7b98597ba28e054bd6606a57", - "sha256:f252dfb4852a527987a9156cbcae3022a30f86c9d26f4f17b8c967d7580d65d2", - "sha256:f5f4424cb87a20b016bfdc157ff48757b89d2cc426256961643d443c6c277007", - "sha256:f8eae66a1304de7368932b42d801c67969fd090ddb1a7a24f27b435ed4bed68f", - "sha256:fdb82eb60d31b0c033a8e8ee9f3fc7dfbaa042211131c29da29aea8531b4f18f" + "sha256:02744236ac1895d7be837878e707a5c35fb8edc5137602f253b63623d7ad5c8c", + "sha256:03f9c5875515820633bd7709a25c3e60c1ea9ad1c5d4030ce8a8c203309c36fd", + "sha256:044f6f46d62444800402851afa3c3ae50141f12013060c1a3a0677e013310d6d", + "sha256:07a2e1d78d382f7181789713cdf0c16edbad4fe14fe1d115526cb6f0eef0daa3", + "sha256:082e0e55d73690ffb4da4352d1b5bbe1b5c6034eb9dc8c91aa2a3ee15f70d3e2", + "sha256:13152dfe7d7c27c40df8b99ac6aab12b978b546716e99f67e8a67a1d441acbc3", + "sha256:13716e53627ad97babf72ac9e01cf9a7d4af2f75dd5ed7b323a7a9520e948282", + "sha256:13ff62d3561a23c17341b4afc78e8fcfd799ab67c0b1ca32091d71383a98ba4b", + "sha256:1607cda6129f815493a3c184492acb5ae4aa6ed61d3a1b3663aa9824ed26f7ac", + "sha256:164fcee32f15d04d61568c9cb0d919e37ff3195919cd604039ff3053ada0461b", + "sha256:1c24e30d720c0009b6fb2e1905b025da56103c70a8b31b99138e4ed1c2a6c5b0", + "sha256:1e6fcd0a0f62f2997107f758bb372397b8d5fd5f39cc6dcb86f7cb98a2172d6c", + "sha256:1fd0f0b1ccd7d537b858a56355a250108df692102e08aa2036e1a094fd78b2dc", + "sha256:2181e86d4e1cdf49a7320cb72a36c45efcb7670d0a88f09fd2d3a7967c0540fd", + "sha256:2974e6dff38afafd5ccf8f41cb8fc94600b3f4fd9b0a98f6ece6e2219e3158d5", + "sha256:2dccc623725d0b298f557d869a68496a2fd2a9e9c41107f234fa5f7a37d278ac", + "sha256:2df3d07a16a3bef0917b28cd564778fbb31f3ffa5b5e33584470e2d1b0f248f0", + "sha256:2e7e5633577b3bd56bf3af2ef6ae3778bbafb83743989d57f0e7edbf6c0980e4", + "sha256:2ee066a64f0d2ba45391cac15b3a70dcb549e968a117bd0500634754cfe0e5fc", + "sha256:2f1f295a5c28cfa74a7d48c95acc1c8a7acd49d7d9072040d4b694fe11cd7166", + "sha256:2faa97212b0dc465afeedf49045cdd077f97be1188285e646a9f689cb5dfff9e", + "sha256:30479a9f1fce47df56b07460b520f49fa2115ec2926d3b1303c85c81f8401ed1", + "sha256:337a8653fb11d2fbe7157c961cc78cb3c161d98cf44410ace9a3dc2db4fad882", + "sha256:3423007fc0661827e06f8a185a3792c73dda41f30f3421562f210cf0c9e49569", + "sha256:373b76eeb79e8c14f6d82cb1d4d5293f9e4059baec6c1b16dca7ad13b6131b39", + "sha256:3b79c63d29101cbaa53a517683557bb550462394fb91044cc5998dd2acff7340", + "sha256:3bbc89ce2a219662ea142f0abcf8d43f04a41d5b1880be17a794c39f0d609cb0", + "sha256:3c11bc5814554b018f6c5d6ae0969e43766f81e995000b53a5d8c8057055e886", + "sha256:3cd61e759c4075510052d1eca5cddbd297fe1164efec14ef1fce3f09b974dfe4", + "sha256:3d40fb3ca22e3d40f494d577441b263026a3bd8c97ae6ce89b2d3c4b39ac9581", + "sha256:3db0c998c92b909d7c90b66c965590d4f3cd86157176a6cf14aa1f867b77b889", + "sha256:422b0901878a31ef167435c5ad46560362891816a76cc0d150683f3868a6f0d1", + "sha256:46b4f3d47d1033db569173be62365fbf7808c2bd3fb742314d251f130d90d44c", + "sha256:485fbdd23becb822804ed05622907ee5c8e8a5f43f6f43894a45f463b2217045", + "sha256:53304cc14b1d94487d70086e1cb0cb4c29ec6da994d58ae84a4d7e78c6a6d04d", + "sha256:5595c80dd03d7e6c6afb73f3594bf3379a7d79fa57164b591d012d4b71d6ac4c", + "sha256:56b51ba29a18e5f5810224bcf00747ad931c0716e3c09a76b4a1edd3d4aba71f", + "sha256:580182fa5b269c2981e9ce9764367cb4edc81982ce289208d4607c203f44ffde", + "sha256:5e99d6510c8557510c220b865d966b105464740dcbebf9b79ecd4fbab30a13d9", + "sha256:5eb05b654a41e0f81ab27a7c3e88b6590425eb3e934e1d533ecec5dc88a6ffff", + "sha256:62b292fff4739c6be89e6a0240c02bda5a9066a339d90ab191cf66e9fdbdc193", + "sha256:6a5122b17a4faf5d7a6d91fa67b479736c0cacc7afe791ddebb7163a8550b799", + "sha256:6a8ff8e809da81363bffca2b965cb6e4bf6056b495fc3f078467d1f8266fe27f", + "sha256:6c43e1b89099279cc03eb1c725c5de12af6edcd2f78e2f8a022569efa639ada3", + "sha256:709dc11af2f74ba89c68b1592368c6edcbccdb0a06ba77eb28c8fe08bb6997da", + "sha256:7e072f5da38d6428ba1fc1115d3cc0dae895df671cb04c70c019985e8c7606be", + "sha256:813a65f95bfcb7c8f2a70dd6add9b51e9accc3bdb3e03d0ff7a9e6a2d3e174bf", + "sha256:86c01299942b0f4b5b5f28c8701689181ad2eab852e65417172dbdd6c5b3ccc8", + "sha256:893e38d0f4319dfa70c0f36381a37cc418985c87b11d9784365b1fff4fa6973b", + "sha256:8a5f574b92b3ee7d254e56d56e37ec0e1416acb1ae357c4956d76a1788dc58fb", + "sha256:8b9650f92251fdef843e74fc252cdfd6e3c700157ad686eeb0c6d7fdb2d11652", + "sha256:8ec464f20fe803ae00419bd1610934e3bda963aeba1e6181dfc9033dc7e8940c", + "sha256:8f333bfe782a2d05a67cfaa0cc9cd68b36b39ee6acfe099f980541ed973a7093", + "sha256:8ffdeb7dbd0160d4e391e1f857477e4762d00aa2199c294eb95dfb9451aa1d9f", + "sha256:911e600e798374c0d86235e7ef19109cf865d1336942d398ff313375a25a93ba", + "sha256:9235be95662559141934fced8197de6fee8c58870f36756b0584424b6d708393", + "sha256:938518a11780b39998179d07f31a4a468888123f9b00463842cd40f98191f4d3", + "sha256:93c18a1696a8e0388ed84b024fe1a188a26ba999b61d1d9a371318cb89885a8c", + "sha256:97532802f14d383f37d603a56e226909f825a83ff298dc1b6697de00d2243999", + "sha256:98ee201a52a7f65608e5494518932e1473fd43535f12cade0a1b4ab32737fe28", + "sha256:9d2ae79f31da5143e020a8d4fc74e1f0cbcb8011bdf97453c140aa616db51406", + "sha256:9d38494a8d21c246c535b41ecdb2d562c4b933cf3d68de03e8bc43a0d41be652", + "sha256:9d41ebb471a6f064c0d1c873c4f7dded733d16ca5db7d551fb04ff3805d87802", + "sha256:9e09d017e3f4d9bd7d17a30d3f59e4d6d9ba2d2ced280eec2425e84112cf623f", + "sha256:a6945c2d61c42bb7e818677f43638675b8c1c43e858b67a96df3eb2426a86c9d", + "sha256:a72e00826a2b032dda3eb25aa3e3579c6d6773d22d8446089a57a123481cc46c", + "sha256:aa1e626c524d2c7972c0f3a8a575d654a3a9c008370dc2a97e46abd0eaa749b9", + "sha256:ab095edf1d840a6a6a4307e1a5b907a299a94e7b90e75436ee770b8c35d22a25", + "sha256:ac2ac84a4950d627d84b61f082eba61314373cfab4b3c264b62efab02ababe83", + "sha256:ac7187bee72384b9cfedf09a29a3b2b6e8815cc64c095cdc8b5e6aec81e9fd5f", + "sha256:ae9d83a81b09ce3a817e2cbb23aabc07f86a3abc664c613cd283ce7a03541e95", + "sha256:afeabb382c1256a7477b739820bce7fe782bb807d82927102cee73e79b41b38b", + "sha256:b2a4cd924d0e2f4b1a68034abe4cadc73d69ad5f4cf02db6481c0d4d749f548f", + "sha256:b414ef79f1f06fb90b5165db8aef77512c1a5e3ed1b4807da8476b7e2c853283", + "sha256:b4ecbba7efd82bd2a4bb88aab7f984eb5470991c1347bdd1f35fb34ea28dba6e", + "sha256:b61d5096e75fd71018b25da50b82dd70ec39b5e15bb2134daf7eb7bbbc103644", + "sha256:b629db53fe17e6ce478a969d30bd1d0e8b53238c46e3a9c9db39e8b65a9ef973", + "sha256:b70b45a40ad0798b69748b34d508259ef2bdc84fb2aad4048bc7c9cafb68ddb3", + "sha256:b88c3ab98556bc351b36d6208a6089de8c8db14a7f6e1f57f82a334bd2c18f0b", + "sha256:baf744e5f9d5ee6531deea443be78b36ed1cd36c65a0b95ea4e8d69fa0102268", + "sha256:bbc7421cbd28b4316d1d017db338039a7943f945c6f2bb15e1439b14b5682d28", + "sha256:c31272c674f725dfe0f343d73b0abe8c878c646967ec1c6106122faae1efc15b", + "sha256:c51a899792ee2c696072791e56b2020caff58b275abecbc9ae0cb71af0645c95", + "sha256:c61e42b4ceb9759727045765e87d51c1bb9f89987aca1fcc8a040232138cad1c", + "sha256:c7cd0841a586b7105513a7c8c3d5c276f3adc762a072d81ef7fae80632afad1e", + "sha256:c827a931c6b57f50f1bb5de400dcfb00bad8117e3753e80b96adb72d9d811514", + "sha256:d2aa3ca9552f83b0b4fa6ca8c6ce08da6580f37e3e0ab7afac73a1cfdc230c0e", + "sha256:d46ee458452727a147d7897bb33886981ae1235775e05decae5d5d07f537695a", + "sha256:d64a657de7aae8db2da60dc0c9e4638a0c3893b4d60101fd564a3362b2bfeb34", + "sha256:d800a8e2ac62db1b9ea5d6d1724f1a93c53907ca061de4d05ed94e8dfa79050c", + "sha256:d9d7ebcd11ea76ba0feaae98485cd8e31467c3d7985210fab46983278214736b", + "sha256:dd7d3608589072f63078b4063a6c536af832e76b0b3885f1bfe9e892abe6c207", + "sha256:ec19e823b4ccd87bd69e990879acbce9e961fc7aebe150156b8f4418d4b27b7f", + "sha256:ee40206d1d6e95eaa2b7b919195e3689a5cf6ded730632de7f187f35a1b6052c", + "sha256:f138f550b83554f5b344d6be35d3ed59348510edc3cb96f75309db6e9bfe8210", + "sha256:f3e6e2e502c4043c52a99316d89dc49f416acda5b0c6886e0dd8ea7bb35859e8", + "sha256:fb10bb720348fe1647a94eb605accb9ef6a9b1875d8845f9e763d9d71a706387", + "sha256:fc066395e6332da1e7525d605b4c96055669f8336600bef8ac569d5226a7c76f", + "sha256:fc33267d58dfbb2361baed52668c5d8c15d24bc0372cecbb79fed77339b55e0d" ], "markers": "python_version >= '3.8'", - "version": "==0.13.2" + "version": "==0.15.2" }, "rtree": { "hashes": [ @@ -3222,11 +3179,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", + "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.2" }, "shapely": { "hashes": [ @@ -3526,11 +3483,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], - "markers": "python_version < '3.10'", - "version": "==4.8.0" + "markers": "python_version >= '3.8'", + "version": "==4.9.0" }, "typing-inspect": { "hashes": [ @@ -3564,18 +3521,18 @@ }, "virtualenv": { "hashes": [ - "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af", - "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381" + "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", + "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" ], "markers": "python_version >= '3.7'", - "version": "==20.24.6" + "version": "==20.25.0" }, "wcwidth": { "hashes": [ - "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223", - "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8" + "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02", + "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c" ], - "version": "==0.2.9" + "version": "==0.2.12" }, "webcolors": { "hashes": [ @@ -3617,84 +3574,79 @@ }, "wrapt": { "hashes": [ - "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0", - "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420", - "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a", - "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c", - "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079", - "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923", - "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f", - "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1", - "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8", - "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86", - "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0", - "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364", - "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e", - "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c", - "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e", - "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c", - "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727", - "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff", - "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e", - "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29", - "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7", - "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72", - "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475", - "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a", - "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317", - "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2", - "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd", - "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640", - "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98", - "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248", - "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e", - "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d", - "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec", - "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1", - "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e", - "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9", - "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92", - "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb", - "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094", - "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46", - "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29", - "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd", - "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705", - "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8", - "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975", - "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb", - "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e", - "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b", - "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418", - "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019", - "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1", - "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba", - "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6", - "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2", - "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3", - "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7", - "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752", - "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416", - "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f", - "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1", - "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc", - "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145", - "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee", - "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a", - "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7", - "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b", - "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653", - "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0", - "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90", - "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29", - "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6", - "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034", - "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09", - "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559", - "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639" + "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", + "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", + "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", + "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", + "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", + "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", + "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", + "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", + "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", + "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", + "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", + "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", + "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", + "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", + "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", + "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", + "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", + "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", + "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", + "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", + "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", + "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", + "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", + "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", + "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", + "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", + "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", + "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", + "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", + "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", + "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", + "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", + "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", + "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", + "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", + "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", + "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", + "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", + "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", + "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", + "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", + "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", + "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", + "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", + "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", + "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", + "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", + "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", + "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", + "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", + "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", + "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", + "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", + "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", + "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", + "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", + "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", + "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", + "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", + "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", + "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", + "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", + "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", + "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", + "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.15.0" + "markers": "python_version >= '3.6'", + "version": "==1.16.0" }, "xarray": { "hashes": [ @@ -3849,11 +3801,11 @@ }, "ipython": { "hashes": [ - "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", - "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5", + "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0" ], - "markers": "python_version >= '3.8'", - "version": "==8.12.3" + "markers": "python_version >= '3.10'", + "version": "==8.19.0" }, "jedi": { "hashes": [ @@ -3881,11 +3833,11 @@ }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" + "version": "==4.9.0" }, "pickleshare": { "hashes": [ @@ -3896,17 +3848,18 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac", - "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_version >= '3.7'", - "version": "==3.0.39" + "version": "==3.0.43" }, "ptyprocess": { "hashes": [ "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" ], + "markers": "os_name != 'nt'", "version": "==0.7.0" }, "pure-eval": { @@ -3918,11 +3871,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "six": { "hashes": [ @@ -3941,26 +3894,18 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33", + "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" - }, - "typing-extensions": { - "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" - ], - "markers": "python_version < '3.10'", - "version": "==4.8.0" + "version": "==5.14.0" }, "wcwidth": { "hashes": [ - "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223", - "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8" + "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02", + "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c" ], - "version": "==0.2.9" + "version": "==0.2.12" } } } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e514eb23c..be5e9c1be 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,22 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.9.0 - 2024-01-12 - [PR#1058](https://github.com/NOAA-OWP/inundation-mapping/pull/1058) + +Upgrades base Docker image to GDAL v3.8.0. In order to upgrade past GDAL v.3.4.3 (see #1029), TauDEM's `aread8` was replaced with a module from the `pyflwdir` Python package. + +### Additions + +- `src/accumulate_headwaters.py`: Uses `pyflwdir` to accumulate headwaters and threshold and create stream pixels. + +### Changes + +- `Dockerfile`: Upgrade GDAL from v.3.4.3 to v.3.8.0; remove JDK 17 and TauDEM `aread8` and `threshold`. +- `Pipfile` and `Pipfile.lock`: Add `pyflwdir`, `pycryptodomex` and upgrade Python version. +- `src/delineate_hydros_and_produce_HAND.sh`: Add `src/accumulate_headwaters.py` and remove TauDEM `aread8` and `threshold` + +

+ ## v4.4.8.4 - 2024-01-12 - [PR#1061](https://github.com/NOAA-OWP/inundation-mapping/pull/1061) Adds a post-processing tool to compare crosswalked (conflated) `feature_id`s between NWM stream network to DEM-derived reaches. The tool is run if the `-x` flag is added to `fim_pipeline.sh`. Results are computed for branch 0 and saved in a summary file in the HUC output folder. @@ -37,6 +53,7 @@ Levees disrupt the natural hydrology and can create large catchments that contai

+ ## v4.4.8.2 - 2023-12-12 - [PR#1052](https://github.com/NOAA-OWP/inundation-mapping/pull/1052) The alpha test for v4.4.8.1 came back with a large degradation in skill and we noticed that the global manning's roughness file was changed in v4.4.7.1 - likely in error. @@ -47,6 +64,7 @@ The alpha test for v4.4.8.1 came back with a large degradation in skill and we n

+ ## v4.4.8.1 - 2023-12-08 - [PR#1047](https://github.com/NOAA-OWP/inundation-mapping/pull/1047) Upgrades JDK to v.17.0.9 in Docker image to address security vulnerabilities. diff --git a/src/accumulate_headwaters.py b/src/accumulate_headwaters.py new file mode 100644 index 000000000..4dcb6fb4d --- /dev/null +++ b/src/accumulate_headwaters.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import argparse +import os + +import numpy as np +import pyflwdir +import rasterio as rio + + +def accumulate_flow( + flow_direction_filename, + headwaters_filename, + flow_accumulation_filename, + stream_pixel_filename, + flow_accumulation_threshold, +): + """ + Accumulate headwaters along the flow direction and threshold accumulations to produce stream pixels. + + Parameters + ---------- + flow_direction_filename : str + Flow direction filename + headwaters_filename : str + Headwaters filename + flow_accumulation_filename : str + Flow accumulation filename + stream_pixel_filename : str + Stream pixel filename + flow_accumulation_threshold : str + """ + + assert os.path.isfile(flow_direction_filename), 'Flow direction raster does not exist.' + + # Read the flow direction raster + with rio.open(flow_direction_filename) as src: + data = src.read(1) + nodata = src.nodata + profile = src.profile + # transform = src.transform + # crs = src.crs + # latlon = crs.to_epsg() == 4326 + + # Convert the TauDEM flow direction raster to a pyflwdir flow direction array + temp = data.copy() + + temp[data == 1] = 1 + temp[data == 2] = 128 + temp[data == 3] = 64 + temp[data == 4] = 32 + temp[data == 5] = 16 + temp[data == 6] = 8 + temp[data == 7] = 4 + temp[data == 8] = 2 + temp[data == nodata] = 247 + + temp = temp.astype(np.uint8) + + flw = pyflwdir.from_array(temp, ftype='d8') + + # Read the flow direction raster + with rio.open(headwaters_filename) as src: + headwaters = src.read(1) + nodata = src.nodata + + flowaccum = flw.accuflux(headwaters, nodata=nodata, direction='up') + + stream = np.where(flowaccum > 0, flow_accumulation_threshold, 0) + + # Write the flow accumulation raster + profile.update(dtype=flowaccum.dtype) + with rio.open(flow_accumulation_filename, 'w', **profile) as dst, rio.open( + stream_pixel_filename, 'w', **profile + ) as dst2: + dst.write(flowaccum, 1) + dst2.write(stream, 1) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument( + '-fd', '--flow-direction-filename', help='Flow direction filename', required=True, type=str + ) + parser.add_argument('-wg', '--headwaters-filename', help='Headwaters filename', required=True, type=str) + parser.add_argument( + '-fa', '--flow-accumulation-filename', help='Flow accumulation filename', required=True, type=str + ) + parser.add_argument( + '-stream', '--stream-pixel-filename', help='Stream pixel filename', required=True, type=str + ) + parser.add_argument( + '-thresh', + '--flow-accumulation-threshold', + help='Flow accumulation threshold', + required=True, + type=float, + ) + + args = parser.parse_args() + + accumulate_flow(**vars(args)) diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index b97d1912d..b69aa339a 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -37,18 +37,11 @@ fi echo -e $startDiv"D8 Flow Accumulations $hucNumber $current_branch_id" date -u Tstart -$taudemDir/aread8 -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ - -ad8 $tempCurrentBranchDataDir/flowaccum_d8_burned_filled_$current_branch_id.tif \ +python3 $srcDir/accumulate_headwaters.py \ + -fd $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ + -fa $tempCurrentBranchDataDir/flowaccum_d8_burned_filled_$current_branch_id.tif \ -wg $tempCurrentBranchDataDir/headwaters_$current_branch_id.tif \ - -nc -Tcount - -# THRESHOLD ACCUMULATIONS ## -echo -e $startDiv"Threshold Accumulations $hucNumber $current_branch_id" -date -u -Tstart -$taudemDir/threshold -ssa $tempCurrentBranchDataDir/flowaccum_d8_burned_filled_$current_branch_id.tif \ - -src $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ + -stream $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -thresh 1 Tcount From 85c77e98c04f45041efa775456a369de4d2e6b65 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:20:43 +0000 Subject: [PATCH 22/51] v4.4.9.1 Update pipfile and lock for dependabot fixes (#1073) --- Pipfile | 3 +- Pipfile.lock | 1127 +++++++++++++++++++++++---------------------- docs/CHANGELOG.md | 11 + 3 files changed, 587 insertions(+), 554 deletions(-) diff --git a/Pipfile b/Pipfile index 043b69288..97bac2944 100644 --- a/Pipfile +++ b/Pipfile @@ -27,7 +27,7 @@ pyproj = "==3.5.0" psycopg2-binary = "==2.9.6" boto3 = "==1.26.109" jupyter = "==1.0.0" -jupyterlab = "==3.6.3" +jupyterlab = "==3.6.7" ipympl = "==0.9.3" pytest = "==7.3.0" whitebox = "==2.3.1" @@ -44,6 +44,7 @@ pre-commit = "==3.3.3" isort = "==5.12.0" urllib3 = "==1.26.18" pyflwdir = "*" +pillow = "==10.2.0" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index b38946cc9..61248b1d8 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "b0e64fe05b2fb6310dcb5e41cb0d131e77067c5bb3c54db67c9f46a14e705d42" + "sha256": "5f29b79268530835205eb8a550b43c847acfcb16ede4de1a6dc1d22c176f5ac1" }, "pipfile-spec": 6, "requires": { @@ -21,7 +21,7 @@ "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.4.0" }, "aiofiles": { @@ -29,7 +29,7 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version >= '3.7' and python_version < '4.0'", + "markers": "python_version < '4' and python_full_version >= '3.7.0'", "version": "==22.1.0" }, "aiosqlite": { @@ -37,7 +37,7 @@ "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d", "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.19.0" }, "anyio": { @@ -60,7 +60,7 @@ "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==23.1.0" }, "argon2-cffi-bindings": { @@ -107,27 +107,27 @@ }, "attrs": { "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" + "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", + "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], - "markers": "python_version >= '3.7'", - "version": "==23.1.0" + "markers": "python_full_version >= '3.7.0'", + "version": "==23.2.0" }, "babel": { "hashes": [ "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.14.0" }, "beautifulsoup4": { "hashes": [ - "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", - "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" + "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", + "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], "markers": "python_version >= '3.6'", - "version": "==4.12.2" + "version": "==4.12.3" }, "black": { "hashes": [ @@ -189,7 +189,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4.0'", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.0.0" }, "boto3": { @@ -205,7 +205,7 @@ "sha256:6f35d59e230095aed7cd747604fe248fa384bebb7d09549077892f936a8ca3df", "sha256:988b948be685006b43c4bbd8f5c0cb93e77c66deb70561994e0c5b31b5a67210" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.29.165" }, "brotli": { @@ -302,7 +302,7 @@ "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2", "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==5.3.2" }, "certifi": { @@ -499,7 +499,7 @@ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.3.2" }, "click": { @@ -507,7 +507,7 @@ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==8.1.7" }, "click-plugins": { @@ -522,7 +522,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { @@ -543,11 +543,11 @@ }, "comm": { "hashes": [ - "sha256:2da8d9ebb8dd7bfc247adaff99f24dce705638a8042b85cb995066793e391001", - "sha256:a517ea2ca28931c7007a7a99c562a0fa5883cfb48963140cf642c41c948498be" + "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a", + "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021" ], "markers": "python_version >= '3.8'", - "version": "==0.2.0" + "version": "==0.2.1" }, "contextily": { "hashes": [ @@ -617,60 +617,67 @@ }, "cython": { "hashes": [ - "sha256:01b94304aab87496e81d1f546e71abf57b430b39be4269df1cd7da9928d70b5b", - "sha256:0c636c9ab92c7838231a1ba769e519d953af8294612f3f772a54d3a5250ff23f", - "sha256:0d8a98c7d86ac4d05b251c39faf49423780381aab55fbf2e147f6e006a34a58a", - "sha256:13211b67b29f6ed8e87c137496c73d93aff0330d97940b4fbed72eae37a4a2a0", - "sha256:133057ac45b6fa7fe5d7baada9d3545d09339432f75c0545f556e8c6fecc2932", - "sha256:167b3f3894dcc697cefefac1d198304fae8eb4d5860a7b8bc2459d572e838470", - "sha256:225f8bba6428b8d711ca2d6c738d2e3a4667f6a2ae40f8a7a5256f69f6a3600e", - "sha256:22d2a684122dfb531853d57c8c85c1d5d44be709e12466dca99fa6aee7d8054f", - "sha256:23ceac5315fe899c229e874328742154e331fa41337bb03f6f5264636c351c9e", - "sha256:2c67105f2c6ccf5b3adbcfaecf3c5c9fa8940f9f97955c9ad7d2542151d97d93", - "sha256:30eb2d2938b9195e2c82951713429aff3ad1be9f104437d1536a04eb0cb3dc0e", - "sha256:34d51709e10ad6213b4bf094af7be7ff82bab43216b3c92a07d05b451deeca79", - "sha256:3a83e04fde663b84905f3a20213a4333d13a07b79434300704b70dc552761f8b", - "sha256:3f02c7240abab48d59f0d5fef7064f18f01a2a204616165fa6367a8abf5a8832", - "sha256:45319d2471f4dbf19893ca53785a421107266e18b8cccd2054fce1e3f72a85f1", - "sha256:4e8bf00ec1dd1d92e9ae74d2e6891f087a939e1dfb40c9c7fa5d8d6a26c94f5a", - "sha256:51e8164b1270625ff101e95c3c1c234421520c07a0a3a20ded9e9431d98afce7", - "sha256:539ad5a21141e6420035cf616bcba48d999bf878839e52692f97fc7e2f16265c", - "sha256:55f93d3822bc196b37a8bdfa4ec6a35232a399e97f2baa714bd5ed8ea9b0ce68", - "sha256:5e3a038332973b12e72236e8884dc99601a840334c2c46cfbbb5851cb94166eb", - "sha256:612d83fd1eb5aaa5401a755c1f1aafacd9dab404cd350b90d5f404c98b33e4b3", - "sha256:6a1859af761977530df2cd5c36e31d54e8d6708ad2c4656e7125c482364dc216", - "sha256:79868ec74e4907a8a6e63effe13547c6157f196a162920b1de066da5849ffb8e", - "sha256:79f20c61114c7948cf1214585066406cef4b54a9b935160980e0b6e70ada3a69", - "sha256:7c8d579d13cb81abe704c8b0908d122b81d6e2623265a19c4a6a7377f440debb", - "sha256:812b193c26553f1f375d4f1c50f805c227b24ed2d595bc9cdaf78c992ecc64a4", - "sha256:816f5285d596062c7ef22790de7d75354b58d4417a9fc64cba914aeeb900db0b", - "sha256:82f27a0134fc6bb46032ca5f728d8af984f3be94a3cb01cb70ff1224e551b9cf", - "sha256:848a28ea49166454c3bff927e5a47629eecf1aa755d6fb3290569cba0fc93766", - "sha256:861cf254bf5836d47c2aee86aa75dd93d3de00ccd1b077c3c7a2bb22cba358e7", - "sha256:8ad7c2303a338b2c0b6c6c68f101a6768725934538756096cf3388a5c07a7525", - "sha256:8ea936cf5931297ba07bce121388c4c6266c1b63a9f4d648ae16c92ff090204b", - "sha256:931aade65f77cf59f2a702ac1f549a4836ce221107c740502cbad18d6d8e9511", - "sha256:936ec37b261b226d7404eff23a9aad284098338150d42a53d6a9af12b18d3892", - "sha256:9fcd9a18ee3ac7f460e0841954feb495102ffbdbec0e6c78562f3495cda000dd", - "sha256:b1853bc34ced5ff6473e881fcf6de29da83262552c8f268a0df53b49c2b89e2c", - "sha256:b227643d8a40b68554dc7d37fcd03fc97b4fb0bd2614aeb5f2e07ab244642d36", - "sha256:b65abca78aa5ebc8675c8480b9a53006f6efea9910ad099cf32c9fb5617ef251", - "sha256:b9d0dae6dccd349b8ccf197c10ef2d05c711ca36a649c7eddbab1de2c90b63a1", - "sha256:cd6ae43ef2e596c9a88dbf2a8895be2e32cc2f5bc3c8ba2e7753b69068fc0b2d", - "sha256:e13abb14843397b76d0472c7d33cd260d5f262ab05cc27ed423317e645e29643", - "sha256:e1bdf8a107fdf9e174991aa87a0be7504f60de1ec6bfb1ccfb30e33acac818a0", - "sha256:e34b4b08d795ccca920fa26b099558f4f1e4e3f794e4ba8d3433c5bc2454d50a", - "sha256:e3c0e19bb41de6be9d8afc85795159ca16296be81a586cd9588be0400d44a855", - "sha256:ef5bb0268bfe5992da3ef9292463a5a895ed8700b134ed2c00008d5471b3ba6e", - "sha256:f2602a5c97a3d618b3b847514204ef3349fb414c59e1126c0c2c708d2c5680f8", - "sha256:f3845c4506e0d207c5e268fb02813928f3a1e135de954a379f165ef0d581da47", - "sha256:f674be92673e87dd8ee7cfe553d5960ec4effc5ab15063b9a5e265a51585a31a", - "sha256:f6d8ff62ad55dc0393686438eac4b457a916e4d1118a0b550746bb52b4c756cc", - "sha256:fb299acf3a578573c190c858d49e0cf9d75f4bc49c3f24c5a63804997ef09213", - "sha256:fed25959e4025870fdde5f895fcb126196d22affd4f4fad85a2823e0dddc85b0" + "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02", + "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6", + "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7", + "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a", + "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064", + "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd", + "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c", + "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6", + "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d", + "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717", + "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026", + "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0", + "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795", + "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9", + "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83", + "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6", + "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd", + "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae", + "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520", + "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0", + "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1", + "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3", + "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee", + "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e", + "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc", + "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c", + "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de", + "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580", + "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e", + "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388", + "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539", + "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6", + "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c", + "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7", + "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f", + "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12", + "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434", + "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0", + "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc", + "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782", + "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636", + "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff", + "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba", + "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f", + "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39", + "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93", + "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3", + "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b", + "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871", + "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae", + "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0", + "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7", + "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39", + "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419", + "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f", + "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944", + "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae", + "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.7" + "version": "==3.0.8" }, "dask": { "hashes": [ @@ -761,10 +768,10 @@ }, "fastjsonschema": { "hashes": [ - "sha256:b9fd1a2dd6971dbc7fee280a95bd199ae0dd9ce22beb91cc75e9c1c528a5170e", - "sha256:e25df6647e1bc4a26070b700897b07b542ec898dd4f1f6ea013e7f6a88417225" + "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0", + "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d" ], - "version": "==2.19.0" + "version": "==2.19.1" }, "filelock": { "hashes": [ @@ -824,51 +831,51 @@ }, "fonttools": { "hashes": [ - "sha256:084511482dd265bce6dca24c509894062f0117e4e6869384d853f46c0e6d43be", - "sha256:1193fb090061efa2f9e2d8d743ae9850c77b66746a3b32792324cdce65784154", - "sha256:174995f7b057e799355b393e97f4f93ef1f2197cbfa945e988d49b2a09ecbce8", - "sha256:253bb46bab970e8aae254cebf2ae3db98a4ef6bd034707aa68a239027d2b198d", - "sha256:2a78dba8c2a1e9d53a0fb5382979f024200dc86adc46a56cbb668a2249862fda", - "sha256:2d2404107626f97a221dc1a65b05396d2bb2ce38e435f64f26ed2369f68675d9", - "sha256:40bdbe90b33897d9cc4a39f8e415b0fcdeae4c40a99374b8a4982f127ff5c767", - "sha256:495369c660e0c27233e3c572269cbe520f7f4978be675f990f4005937337d391", - "sha256:4a9a51745c0439516d947480d4d884fa18bd1458e05b829e482b9269afa655bc", - "sha256:511482df31cfea9f697930f61520f6541185fa5eeba2fa760fe72e8eee5af88b", - "sha256:52c82df66201f3a90db438d9d7b337c7c98139de598d0728fb99dab9fd0495ca", - "sha256:562681188c62c024fe2c611b32e08b8de2afa00c0c4e72bed47c47c318e16d5c", - "sha256:59a6c8b71a245800e923cb684a2dc0eac19c56493e2f896218fcf2571ed28984", - "sha256:5dde0eab40faaa5476133123f6a622a1cc3ac9b7af45d65690870620323308b4", - "sha256:61df4dee5d38ab65b26da8efd62d859a1eef7a34dcbc331299a28e24d04c59a7", - "sha256:62d8ddb058b8e87018e5dc26f3258e2c30daad4c87262dfeb0e2617dd84750e6", - "sha256:66c92ec7f95fd9732550ebedefcd190a8d81beaa97e89d523a0d17198a8bda4d", - "sha256:843509ae9b93db5aaf1a6302085e30bddc1111d31e11d724584818f5b698f500", - "sha256:854421e328d47d70aa5abceacbe8eef231961b162c71cbe7ff3f47e235e2e5c5", - "sha256:97620c4af36e4c849e52661492e31dc36916df12571cb900d16960ab8e92a980", - "sha256:9acfa1cdc479e0dde528b61423855913d949a7f7fe09e276228298fef4589540", - "sha256:a77a60315c33393b2bd29d538d1ef026060a63d3a49a9233b779261bad9c3f71", - "sha256:b4fabb8cc9422efae1a925160083fdcbab8fdc96a8483441eb7457235df625bd", - "sha256:bf1810635c00f7c45d93085611c995fc130009cec5abdc35b327156aa191f982", - "sha256:c01f409be619a9a0f5590389e37ccb58b47264939f0e8d58bfa1f3ba07d22671", - "sha256:c59227d7ba5b232281c26ae04fac2c73a79ad0e236bca5c44aae904a18f14faf", - "sha256:c75e19971209fbbce891ebfd1b10c37320a5a28e8d438861c21d35305aedb81c", - "sha256:ce0e2c88c8c985b7b9a7efcd06511fb0a1fe3ddd9a6cd2895ef1dbf9059719d7", - "sha256:d6477ba902dd2d7adda7f0fd3bfaeb92885d45993c9e1928c9f28fc3961415f7", - "sha256:d986b66ff722ef675b7ee22fbe5947a41f60a61a4da15579d5e276d897fbc7fa", - "sha256:dd23848f877c3754f53a4903fb7a593ed100924f9b4bff7d5a4e2e8a7001ae11", - "sha256:e3f4d61f3a8195eac784f1d0c16c0a3105382c1b9a74d99ac4ba421da39a8826", - "sha256:e6b968543fde4119231c12c2a953dcf83349590ca631ba8216a8edf9cd4d36a9", - "sha256:e77bdf52185bdaf63d39f3e1ac3212e6cfa3ab07d509b94557a8902ce9c13c82", - "sha256:e79f1a3970d25f692bbb8c8c2637e621a66c0d60c109ab48d4a160f50856deff", - "sha256:e7a0a8848726956e9d9fb18c977a279013daadf0cbb6725d2015a6dd57527992", - "sha256:e869da810ae35afb3019baa0d0306cdbab4760a54909c89ad8904fa629991812", - "sha256:e8acf6dd0434b211b3bd30d572d9e019831aae17a54016629fa8224783b22df8", - "sha256:e8fa20748de55d0021f83754b371432dca0439e02847962fc4c42a0e444c2d78", - "sha256:ea592e6a09b71cb7a7661dd93ac0b877a6228e2d677ebacbad0a4d118494c86d", - "sha256:ec13a10715eef0e031858c1c23bfaee6cba02b97558e4a7bfa089dba4a8c2ebf", - "sha256:f4da089f6dfdb822293bde576916492cd708c37c2501c3651adde39804630538" + "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", + "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37", + "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", + "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae", + "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b", + "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc", + "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", + "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", + "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", + "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", + "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", + "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6", + "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", + "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", + "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7", + "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6", + "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", + "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899", + "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50", + "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", + "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", + "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", + "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", + "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", + "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", + "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8", + "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506", + "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", + "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", + "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b", + "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", + "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c", + "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa", + "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", + "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", + "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", + "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", + "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946", + "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", + "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952", + "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", + "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8" ], "markers": "python_version >= '3.8'", - "version": "==4.47.0" + "version": "==4.47.2" }, "fqdn": { "hashes": [ @@ -887,18 +894,18 @@ }, "geocube": { "hashes": [ - "sha256:43c88cd5dd18f9df9561e642b4840e4bd061ccc8a3e8c419378f6707384213d0", - "sha256:5404060d6dcc8d3f251b453588667c6d5e5e60d07793011851f8bc129f779db0" + "sha256:0049913c9ca0e0ff8bd4473ab6a87d185e5c2457ee053a7184abcfe9e9447b57", + "sha256:4fbcdcbb187cbf02d9f03bec0c30628f5d5161cd3e9c51aaf0877c5f69539ed7" ], - "markers": "python_version >= '3.9'", - "version": "==0.4.2" + "markers": "python_version >= '3.10'", + "version": "==0.5.0" }, "geographiclib": { "hashes": [ "sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734", "sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.0" }, "geopandas": { @@ -914,7 +921,7 @@ "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.4.1" }, "gval": { @@ -943,11 +950,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:7fc841f8b8332803464e5dc1c63a2e59121f46ca186c0e2e182e80bf8c1319f7", - "sha256:d97503976bb81f40a193d41ee6570868479c69d5068651eb039c40d850c59d67" + "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", + "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" ], "markers": "python_version >= '3.8'", - "version": "==7.0.0" + "version": "==7.0.1" }, "inflate64": { "hashes": [ @@ -1005,7 +1012,7 @@ "sha256:f5924499dc8800928c0ee4580fa8eb4ffa880b2cce4431537d0390e503a9c9ee", "sha256:f79542478e49e471e8b23556700e6f688a40dc93e9a746f77a546c13251b59b1" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.0.0" }, "iniconfig": { @@ -1013,16 +1020,16 @@ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.0.0" }, "ipykernel": { "hashes": [ - "sha256:7d5d594b6690654b4d299edba5e872dc17bb7396a8d0609c97cb7b8a1c605de6", - "sha256:dab88b47f112f9f7df62236511023c9bdeef67abc73af7c652e4ce4441601686" + "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f", + "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f" ], "markers": "python_version >= '3.8'", - "version": "==6.27.1" + "version": "==6.29.0" }, "ipympl": { "hashes": [ @@ -1034,11 +1041,11 @@ }, "ipython": { "hashes": [ - "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5", - "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0" + "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5", + "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73" ], "markers": "python_version >= '3.10'", - "version": "==8.19.0" + "version": "==8.21.0" }, "ipython-genutils": { "hashes": [ @@ -1052,7 +1059,7 @@ "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f", "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==8.1.1" }, "isoduration": { @@ -1083,8 +1090,7 @@ "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], - "index": "pypi", - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.1.3" }, "jmespath": { @@ -1092,7 +1098,7 @@ "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.0.1" }, "joblib": { @@ -1100,7 +1106,7 @@ "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.3.2" }, "json5": { @@ -1122,19 +1128,19 @@ "format-nongpl" ], "hashes": [ - "sha256:4f614fd46d8d61258610998997743ec5492a648b33cf478c1ddc23ed4598a5fa", - "sha256:ed6231f0429ecf966f5bc8dfef245998220549cbbcf140f913b7464c52c3b6b3" + "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f", + "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5" ], "markers": "python_version >= '3.8'", - "version": "==4.20.0" + "version": "==4.21.1" }, "jsonschema-specifications": { "hashes": [ - "sha256:9472fc4fea474cd74bea4a2b190daeccb5a9e4db2ea80efcf7a1b582fc9a81b8", - "sha256:e74ba7c0a65e8cb49dc26837d6cfe576557084a8b423ed16a420984228104f93" + "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", + "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c" ], "markers": "python_version >= '3.8'", - "version": "==2023.11.2" + "version": "==2023.12.1" }, "jupyter": { "hashes": [ @@ -1150,7 +1156,7 @@ "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7", "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==7.4.9" }, "jupyter-console": { @@ -1158,16 +1164,16 @@ "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==6.6.3" }, "jupyter-core": { "hashes": [ - "sha256:1553311a97ccd12936037f36b9ab4d6ae8ceea6ad2d5c90d94a909e752178e40", - "sha256:220dfb00c45f0d780ce132bb7976b58263f81a3ada6e90a9b6823785a424f739" + "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7", + "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218" ], "markers": "python_version >= '3.8'", - "version": "==5.5.1" + "version": "==5.7.1" }, "jupyter-events": { "hashes": [ @@ -1179,34 +1185,34 @@ }, "jupyter-server": { "hashes": [ - "sha256:dc77b7dcc5fc0547acba2b2844f01798008667201eea27c6319ff9257d700a6d", - "sha256:fd030dd7be1ca572e4598203f718df6630c12bd28a599d7f1791c4d7938e1010" + "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689", + "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923" ], "markers": "python_version >= '3.8'", - "version": "==2.12.1" + "version": "==2.12.5" }, "jupyter-server-fileid": { "hashes": [ "sha256:7486bca3acf9bbaab7ce5127f9f64d2df58f5d2de377609fb833291a7217a6a2", "sha256:76dd05a45b78c7ec0cba0be98ece289984c6bcfc1ca2da216d42930e506a4d68" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.9.1" }, "jupyter-server-terminals": { "hashes": [ - "sha256:2fc0692c883bfd891f4fba0c4b4a684a37234b0ba472f2e97ed0a3888f46e1e4", - "sha256:ebcd68c9afbf98a480a533e6f3266354336e645536953b7abcc7bdeebc0154a3" + "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80", + "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.2" }, "jupyter-server-ydoc": { "hashes": [ "sha256:969a3a1a77ed4e99487d60a74048dc9fa7d3b0dcd32e60885d835bbf7ba7be11", "sha256:a6fe125091792d16c962cc3720c950c2b87fcc8c3ecf0c54c84e9a20b814526c" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.8.0" }, "jupyter-ydoc": { @@ -1214,16 +1220,16 @@ "sha256:5759170f112c70320a84217dd98d287699076ae65a7f88d458d57940a9f2b882", "sha256:5a02ca7449f0d875f73e8cb8efdf695dddef15a8e71378b1f4eda6b7c90f5382" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.2.5" }, "jupyterlab": { "hashes": [ - "sha256:373e9cfb8a72edd294be14f16662563a220cecf0fb26de7aab1af9a29b689b82", - "sha256:6aba0caa771697d02fbf409f9767b2fdb4ee32ce935940e3b9a0d5d48d994d0f" + "sha256:2fadeaec161b0d1aec19f17721d8b803aef1d267f89c8b636b703be14f435c8f", + "sha256:d92d57d402f53922bca5090654843aa08e511290dff29fdb0809eafbbeb6df98" ], "index": "pypi", - "version": "==3.6.3" + "version": "==3.6.7" }, "jupyterlab-pygments": { "hashes": [ @@ -1246,7 +1252,7 @@ "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d", "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.9" }, "kiwisolver": { @@ -1356,7 +1362,7 @@ "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.4.5" }, "llvmlite": { @@ -1390,7 +1396,7 @@ "sha256:fa9b26939ae553bf30a9f5c4c754db0fb2d2677327f2511e674aa2f5df941789", "sha256:fb62fc7016b592435d3e3a8f680e3ea8897c3c9e62e6e6cc58011e7a4801439e" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.39.1" }, "locket": { @@ -1403,69 +1409,69 @@ }, "markupsafe": { "hashes": [ - "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e", - "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e", - "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431", - "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686", - "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c", - "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559", - "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc", - "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb", - "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939", - "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c", - "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0", - "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4", - "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9", - "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575", - "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba", - "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d", - "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd", - "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3", - "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00", - "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155", - "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac", - "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52", - "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f", - "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8", - "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b", - "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007", - "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24", - "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea", - "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198", - "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0", - "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee", - "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be", - "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2", - "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1", - "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707", - "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6", - "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c", - "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58", - "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823", - "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779", - "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636", - "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c", - "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad", - "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee", - "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc", - "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2", - "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48", - "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7", - "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e", - "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b", - "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa", - "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5", - "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e", - "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb", - "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9", - "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57", - "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc", - "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc", - "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2", - "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.3" + "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", + "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", + "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", + "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", + "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", + "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", + "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", + "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", + "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", + "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", + "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", + "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", + "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", + "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", + "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", + "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", + "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", + "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", + "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", + "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", + "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", + "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", + "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", + "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", + "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", + "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", + "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", + "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", + "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", + "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", + "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", + "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", + "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", + "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", + "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", + "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", + "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", + "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", + "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", + "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", + "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", + "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", + "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", + "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", + "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", + "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", + "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", + "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", + "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", + "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", + "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", + "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", + "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", + "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", + "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", + "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", + "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", + "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", + "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", + "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==2.1.4" }, "matplotlib": { "hashes": [ @@ -1542,7 +1548,7 @@ "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.2" }, "morecantile": { @@ -1617,11 +1623,11 @@ }, "multimethod": { "hashes": [ - "sha256:afd84da9c3d0445c84f827e4d63ad42d17c6d29b122427c6dee9032ac2d2a0d4", - "sha256:daa45af3fe257f73abb69673fd54ddeaf31df0eb7363ad6e1251b7c9b192d8c5" + "sha256:e57253f5b6d530b10696843e693c11f0dadbe299a327bd71cdf3edd0019a3853", + "sha256:ef40713d84da4015285122a16f57bf5066cc7876b5eaf183262f3c34668c6ad3" ], - "markers": "python_version >= '3.8'", - "version": "==1.10" + "markers": "python_version >= '3.9'", + "version": "==1.11" }, "multipledispatch": { "hashes": [ @@ -1667,7 +1673,7 @@ "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3", "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.0.0" }, "nbclient": { @@ -1680,11 +1686,11 @@ }, "nbconvert": { "hashes": [ - "sha256:2dc8267dbdfeedce2dcd34c9e3f1b51af18f43cb105549d1c5a18189ec23ba85", - "sha256:3c50eb2d326478cc90b8759cf2ab9dde3d892c6537cd6a5bc0991db8ef734bcc" + "sha256:a7f8808fd4e082431673ac538400218dd45efd076fbeb07cc6e5aa5a3a4e949e", + "sha256:db28590cef90f7faf2ebbc71acd402cbecf13d29176df728c0a9025a49345ea1" ], "markers": "python_version >= '3.8'", - "version": "==7.13.1" + "version": "==7.14.2" }, "nbformat": { "hashes": [ @@ -1696,11 +1702,11 @@ }, "nest-asyncio": { "hashes": [ - "sha256:25aa2ca0d2a5b5531956b9e273b45cf664cae2b145101d73b86b199978d48fdb", - "sha256:accda7a339a70599cb08f9dd09a67e0c2ef8d8d6f4c07f96ab203f2ae254e48d" + "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", + "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" ], "markers": "python_version >= '3.5'", - "version": "==1.5.8" + "version": "==1.6.0" }, "netcdf4": { "hashes": [ @@ -1748,7 +1754,7 @@ "sha256:b4625a4b7a597839dd3156b140d5ba2c7123761f98245a3290f67a8b8ee048d9", "sha256:c1e2eb2e3b6079a0552a04974883a48d04c3c05792170d64a4b23d707d453181" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==6.5.6" }, "notebook-shim": { @@ -1756,7 +1762,7 @@ "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7", "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.2.3" }, "numba": { @@ -1795,38 +1801,38 @@ }, "numexpr": { "hashes": [ - "sha256:0d7bfc8b77d8a7b04cd64ae42b62b3bf824a8c751ca235692bfd5231c6e90127", - "sha256:12146521b1730073859a20454e75004e38cd0cb61333e763c58ef5171e101eb2", - "sha256:121b049b6909787111daf92919c052c4fd87b5691172e8f19f702b96f20aaafa", - "sha256:17104051f0bd83fd350212e268d8b48017d5eff522b09b573fdbcc560c5e7ab3", - "sha256:22ccd67c0fbeae091f2c577f5b9c8046de6631d46b1cbe22aad46a08d2b42c2d", - "sha256:290f91c7ba7772abaf7107f3cc0601d93d6a3f21c13ee3da93f1b8a9ca3e8d39", - "sha256:296dc1f79d386166dec3bdb45f51caba29ffd8dc91db15447108c04d3001d921", - "sha256:2ae264c35fa67cd510191ab8144f131fddd0f1d13413af710913ea6fc0c6aa61", - "sha256:307b49fd15ef2ca292f381e67759e5b477410341f2f499a377234f1b42f529a6", - "sha256:399cb914b41c4027ba88a18f6b8ccfc3af5c32bc3b1758403a7c44c72530618a", - "sha256:3f168b4b42d4cb120fe1993676dcf74b77a3e8e45b58855566da037cfd938ca3", - "sha256:47c05007cd1c553515492c1a78b5477eaaba9cadc5d7b795d49f7aae53ccdf68", - "sha256:4d83a542d9deefb050e389aacaddea0f09d68ec617dd37e45b9a7cfbcba6d729", - "sha256:4f01d71db6fdb97a68def5407e2dbd748eaea9d98929db08816de40aa4ae3084", - "sha256:5a92f230dd9d6c42803f855970e93677b44290b6dad15cb6796fd85edee171ce", - "sha256:6459dc6ed6abcdeab3cd3667c79f29e4a0f0a02c29ad71ee5cff065e880ee9ef", - "sha256:76f0f010f9c6318bae213b21c5c0e381c2fc9c9ecb8b35f99f5030e7ac96c9ce", - "sha256:7badc50efbb2f1c8b78cd68089031e0fd29cbafa6a9e6d730533f22d88168406", - "sha256:85c9f79e346c26aa0d425ecfc9e5de7184567d5e48d0bdb02d468bb927e92525", - "sha256:925927cd1f610593e7783d8f2e12e3d800d5928601e077e4910e2b50bde624b6", - "sha256:a82d710145b0fbaec919dde9c90ed9df1e6785625cc36d1c71f3a53112b66fc5", - "sha256:aab17d65751c039d13ed9d49c9a7517b130ef488c1885c4666af9b5c6ad59520", - "sha256:b4649c1dcf9b0c2ae0a7b767dbbbde4e05ee68480c1ba7f06fc7963f1f73acf4", - "sha256:bf8c517bbbb82c07c23c17f9d52b4c9f86601f57d48e87c0cbda24af5907f4dd", - "sha256:ccef9b09432d59229c2a737882e55de7906006452003323e107576f264cec373", - "sha256:cd07793b074cc38e478637cbe738dff7d8eb92b5cf8ffaacff0c4f0bca5270a0", - "sha256:dbac846f713b4c82333e6af0814ebea0b4e74dfb2649e76c58953fd4862322dd", - "sha256:e76ce4d25372f46170cf7eb1ff14ed5d9c69a0b162a405063cbe481bafe3af34", - "sha256:f031ac4e70f9ad867543bfbde8452e9d1a14f0525346b4b8bd4e5c0f1380a11c" + "sha256:00dab81d49239ea5423861ad627097b44d10d802df5f883d1b00f742139c3349", + "sha256:0e2574cafb18373774f351cac45ed23b5b360d9ecd1dbf3c12dac6d6eefefc87", + "sha256:0f619e91034b346ea85a4e1856ff06011dcb7dce10a60eda75e74db90120f880", + "sha256:1a78b937861d13de67d440d54c85a835faed7572be5a6fd10d4f3bd4e66e157f", + "sha256:1fae6828042b70c2f52a132bfcb9139da704274ed11b982fbf537f91c075d2ef", + "sha256:2749bce1c48706d58894992634a43b8458c4ba9411191471c4565fa41e9979ec", + "sha256:374dc6ca54b2af813cb15c2b34e85092dfeac1f73d51ec358dd81876bd9adcec", + "sha256:37a7dd36fd79a2b69c3fd2bc2b51ac8270bebc69cc96e6d78f1148e147fcbfa8", + "sha256:3b03a6cf37a72f5b52f2b962d7ac7f565bea8eaba83c3c4e5fcf8fbb6a938153", + "sha256:50f57bc333f285e8c46b1ce61c6e94ec9bb74e4ea0d674d1c6c6f4a286f64fe4", + "sha256:520e55d75bd99c76e376b6326e35ecf44c5ce2635a5caed72799a3885fc49173", + "sha256:549afc1622296cca3478a132c6e0fb5e55a19e08d32bc0d5a415434824a9c157", + "sha256:5615497c3f34b637fda9b571f7774b6a82f2367cc1364b7a4573068dd1aabcaa", + "sha256:6eae6c0c2d5682c02e8ac9c4287c2232c2443c9148b239df22500eaa3c5d73b7", + "sha256:7c618a5895e34db0a364dcdb9960084c080f93f9d377c45b1ca9c394c24b4e77", + "sha256:7c77392aea53f0700d60eb270ad63174b4ff10b04f8de92861101ca2129fee51", + "sha256:8efd879839572bde5a38a1aa3ac23fd4dd9b956fb969bc5e43d1c403419e1e8c", + "sha256:943ba141f3884ffafa3fa1a3ebf3cdda9e9688a67a3c91986e6eae13dc073d43", + "sha256:972e29b5cecc21466c5b177e38568372ab66aab1f053ae04690a49cea09e747d", + "sha256:9761195526a228e05eba400b8c484c94bbabfea853b9ea35ab8fa1bf415331b1", + "sha256:977537f2a1cc843f888fb5f0507626f956ada674e4b3847168214a3f3c7446fa", + "sha256:aa6298fb46bd7ec69911b5b80927a00663d066e719b29f48eb952d559bdd8371", + "sha256:b04f12a6130094a251e3a8fff40130589c1c83be6d4eb223873bea14d8c8b630", + "sha256:bffcbc55dea5a5f5255e2586da08f00929998820e6592ee717273a08ad021eb3", + "sha256:c52b4ac54514f5d4d8ead66768810cd5f77aa198e6064213d9b5c7b2e1c97c35", + "sha256:d655b6eacc4e81006b662cba014e4615a9ddd96881b8b4db4ad0d7f6d38069af", + "sha256:e1c31f621a625c7be602f92b027d90f2d3d60dcbc19b106e77fb04a4362152af", + "sha256:ee48acd6339748a65c0e32403b802ebfadd9cb0e3b602ba5889896238eafdd61", + "sha256:f21d12f6c432ce349089eb95342babf6629aebb3fddf187a4492d3aadaadaaf0" ], "markers": "python_version >= '3.9'", - "version": "==2.8.8" + "version": "==2.9.0" }, "numpy": { "hashes": [ @@ -1880,18 +1886,18 @@ }, "overrides": { "hashes": [ - "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d", - "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757" + "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", + "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49" ], "markers": "python_version >= '3.6'", - "version": "==7.4.0" + "version": "==7.7.0" }, "packaging": { "hashes": [ "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==23.2" }, "pandas": { @@ -1930,24 +1936,24 @@ "sha256:1cc70f5f182f5b4bd2e248f49372fcd88eba8423b8604ea9e1ebd64222730a41", "sha256:1cf13c06068d64edb1630b0e50d6588243b7c202d7ce00d968fe3d6bef7684f8" ], - "markers": "python_version < '3.12' and python_version >= '3.7'", + "markers": "python_version < '3.12' and python_full_version >= '3.7.0'", "version": "==0.15.1" }, "pandocfilters": { "hashes": [ - "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38", - "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f" + "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", + "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.5.0" + "version": "==1.5.1" }, "param": { "hashes": [ - "sha256:4bfc94c0e4127626fa833e30c71c91ea73e7675b80c26dbdd4a6e5a8f6dc46db", - "sha256:7943a04607822efd46e96e1827dc5fa929a2fc3b1fe9fc7b7dca7d17a8031a5b" + "sha256:785845a727a588eb94c7666d80551c7e2bb97d4309d3507beab66f95e57f7527", + "sha256:b269fd7397886ec609e544f81035fa52e1950da0e76d20080bfeca3d7a0317ca" ], "markers": "python_version >= '3.8'", - "version": "==2.0.1" + "version": "==2.0.2" }, "parso": { "hashes": [ @@ -1962,7 +1968,7 @@ "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6", "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.4.1" }, "pathspec": { @@ -1983,79 +1989,93 @@ }, "pillow": { "hashes": [ - "sha256:00f438bb841382b15d7deb9a05cc946ee0f2c352653c7aa659e75e592f6fa17d", - "sha256:0248f86b3ea061e67817c47ecbe82c23f9dd5d5226200eb9090b3873d3ca32de", - "sha256:04f6f6149f266a100374ca3cc368b67fb27c4af9f1cc8cb6306d849dcdf12616", - "sha256:062a1610e3bc258bff2328ec43f34244fcec972ee0717200cb1425214fe5b839", - "sha256:0a026c188be3b443916179f5d04548092e253beb0c3e2ee0a4e2cdad72f66099", - "sha256:0f7c276c05a9767e877a0b4c5050c8bee6a6d960d7f0c11ebda6b99746068c2a", - "sha256:1a8413794b4ad9719346cd9306118450b7b00d9a15846451549314a58ac42219", - "sha256:1ab05f3db77e98f93964697c8efc49c7954b08dd61cff526b7f2531a22410106", - "sha256:1c3ac5423c8c1da5928aa12c6e258921956757d976405e9467c5f39d1d577a4b", - "sha256:1c41d960babf951e01a49c9746f92c5a7e0d939d1652d7ba30f6b3090f27e412", - "sha256:1fafabe50a6977ac70dfe829b2d5735fd54e190ab55259ec8aea4aaea412fa0b", - "sha256:1fb29c07478e6c06a46b867e43b0bcdb241b44cc52be9bc25ce5944eed4648e7", - "sha256:24fadc71218ad2b8ffe437b54876c9382b4a29e030a05a9879f615091f42ffc2", - "sha256:2cdc65a46e74514ce742c2013cd4a2d12e8553e3a2563c64879f7c7e4d28bce7", - "sha256:2ef6721c97894a7aa77723740a09547197533146fba8355e86d6d9a4a1056b14", - "sha256:3b834f4b16173e5b92ab6566f0473bfb09f939ba14b23b8da1f54fa63e4b623f", - "sha256:3d929a19f5469b3f4df33a3df2983db070ebb2088a1e145e18facbc28cae5b27", - "sha256:41f67248d92a5e0a2076d3517d8d4b1e41a97e2df10eb8f93106c89107f38b57", - "sha256:47e5bf85b80abc03be7455c95b6d6e4896a62f6541c1f2ce77a7d2bb832af262", - "sha256:4d0152565c6aa6ebbfb1e5d8624140a440f2b99bf7afaafbdbf6430426497f28", - "sha256:50d08cd0a2ecd2a8657bd3d82c71efd5a58edb04d9308185d66c3a5a5bed9610", - "sha256:61f1a9d247317fa08a308daaa8ee7b3f760ab1809ca2da14ecc88ae4257d6172", - "sha256:6932a7652464746fcb484f7fc3618e6503d2066d853f68a4bd97193a3996e273", - "sha256:7a7e3daa202beb61821c06d2517428e8e7c1aab08943e92ec9e5755c2fc9ba5e", - "sha256:7dbaa3c7de82ef37e7708521be41db5565004258ca76945ad74a8e998c30af8d", - "sha256:7df5608bc38bd37ef585ae9c38c9cd46d7c81498f086915b0f97255ea60c2818", - "sha256:806abdd8249ba3953c33742506fe414880bad78ac25cc9a9b1c6ae97bedd573f", - "sha256:883f216eac8712b83a63f41b76ddfb7b2afab1b74abbb413c5df6680f071a6b9", - "sha256:912e3812a1dbbc834da2b32299b124b5ddcb664ed354916fd1ed6f193f0e2d01", - "sha256:937bdc5a7f5343d1c97dc98149a0be7eb9704e937fe3dc7140e229ae4fc572a7", - "sha256:9882a7451c680c12f232a422730f986a1fcd808da0fd428f08b671237237d651", - "sha256:9a92109192b360634a4489c0c756364c0c3a2992906752165ecb50544c251312", - "sha256:9d7bc666bd8c5a4225e7ac71f2f9d12466ec555e89092728ea0f5c0c2422ea80", - "sha256:a5f63b5a68daedc54c7c3464508d8c12075e56dcfbd42f8c1bf40169061ae666", - "sha256:a646e48de237d860c36e0db37ecaecaa3619e6f3e9d5319e527ccbc8151df061", - "sha256:a89b8312d51715b510a4fe9fc13686283f376cfd5abca8cd1c65e4c76e21081b", - "sha256:a92386125e9ee90381c3369f57a2a50fa9e6aa8b1cf1d9c4b200d41a7dd8e992", - "sha256:ae88931f93214777c7a3aa0a8f92a683f83ecde27f65a45f95f22d289a69e593", - "sha256:afc8eef765d948543a4775f00b7b8c079b3321d6b675dde0d02afa2ee23000b4", - "sha256:b0eb01ca85b2361b09480784a7931fc648ed8b7836f01fb9241141b968feb1db", - "sha256:b1c25762197144e211efb5f4e8ad656f36c8d214d390585d1d21281f46d556ba", - "sha256:b4005fee46ed9be0b8fb42be0c20e79411533d1fd58edabebc0dd24626882cfd", - "sha256:b920e4d028f6442bea9a75b7491c063f0b9a3972520731ed26c83e254302eb1e", - "sha256:baada14941c83079bf84c037e2d8b7506ce201e92e3d2fa0d1303507a8538212", - "sha256:bb40c011447712d2e19cc261c82655f75f32cb724788df315ed992a4d65696bb", - "sha256:c0949b55eb607898e28eaccb525ab104b2d86542a85c74baf3a6dc24002edec2", - "sha256:c9aeea7b63edb7884b031a35305629a7593272b54f429a9869a4f63a1bf04c34", - "sha256:cfe96560c6ce2f4c07d6647af2d0f3c54cc33289894ebd88cfbb3bcd5391e256", - "sha256:d27b5997bdd2eb9fb199982bb7eb6164db0426904020dc38c10203187ae2ff2f", - "sha256:d921bc90b1defa55c9917ca6b6b71430e4286fc9e44c55ead78ca1a9f9eba5f2", - "sha256:e6bf8de6c36ed96c86ea3b6e1d5273c53f46ef518a062464cd7ef5dd2cf92e38", - "sha256:eaed6977fa73408b7b8a24e8b14e59e1668cfc0f4c40193ea7ced8e210adf996", - "sha256:fa1d323703cfdac2036af05191b969b910d8f115cf53093125e4058f62012c9a", - "sha256:fe1e26e1ffc38be097f0ba1d0d07fcade2bcfd1d023cda5b29935ae8052bd793" + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], - "markers": "python_version >= '3.8'", - "version": "==10.1.0" + "index": "pypi", + "version": "==10.2.0" }, "platformdirs": { "hashes": [ - "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", - "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], "markers": "python_version >= '3.8'", - "version": "==4.1.0" + "version": "==4.2.0" }, "pluggy": { "hashes": [ - "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12", - "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7" + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" ], "markers": "python_version >= '3.8'", - "version": "==1.3.0" + "version": "==1.4.0" }, "pre-commit": { "hashes": [ @@ -2078,30 +2098,30 @@ "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.43" }, "psutil": { "hashes": [ - "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340", - "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6", - "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284", - "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c", - "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7", - "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c", - "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e", - "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6", - "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056", - "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9", - "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68", - "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df", - "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e", - "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414", - "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508", - "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe" + "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d", + "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73", + "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8", + "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2", + "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e", + "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36", + "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7", + "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c", + "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee", + "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421", + "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf", + "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81", + "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0", + "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631", + "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4", + "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8" ], "markers": "sys_platform != 'cygwin'", - "version": "==5.9.7" + "version": "==5.9.8" }, "psycopg2-binary": { "hashes": [ @@ -2307,49 +2327,48 @@ }, "pycryptodomex": { "hashes": [ - "sha256:011e859026ecbd15b8e720e8992361186e582cf726c50bde6ff8c0c05e820ddf", - "sha256:0b42e2743893f386dfb58fe24a4c8be5305c3d1c825d5f23d9e63fd0700d1110", - "sha256:0b7154aff2272962355f8941fd514104a88cb29db2d8f43a29af900d6398eb1c", - "sha256:0bc4b7bfaac56e6dfd62044847443a3d110c7abea7fcb0d68c1aea64ed3a6697", - "sha256:10c2eed4efdfa084b602ab922e699a0a2ba82053baebfc8afcaf27489def7955", - "sha256:1c04cfff163c05d033bf28e3c4429d8222796738c7b6c1638b9d7090b904611e", - "sha256:23707238b024b36c35dd3428f5af6c1f0c5ef54c21e387a2063633717699b8b2", - "sha256:371bbe0be17b4dd8cc0c2f378d75ea33f00d5a39884c09a672016ac40145a5fa", - "sha256:39eb1f82ac3ba3e39d866f38e480e8fa53fcdd22260340f05f54a8188d47d510", - "sha256:3f3c58971784fba0e014bc3f8aed1197b86719631e1b597d36d7354be5598312", - "sha256:5ca98de2e5ac100e57a7116309723360e8f799f722509e376dc396cdf65eec9c", - "sha256:62f51a63d73153482729904381dd2de86800b0733a8814ee8f072fa73e5c92fb", - "sha256:76414d39df6b45bcc4f38cf1ba2031e0f4b8e99d1ba3c2eee31ffe1b9f039733", - "sha256:8dffe067d5fff14dba4d18ff7d459cc2a47576d82dafbff13a8f1199c3353e41", - "sha256:96000b837bcd8e3bf86b419924a056c978e45027281e4318650c81c25a3ef6cc", - "sha256:9919a1edd2a83c4dfb69f1d8a4c0c5efde7147ef15b07775633372b80c90b5d8", - "sha256:aab7941c2ff53eb63cb26252770e4f14386d79ce07baeffbf98a1323c1646545", - "sha256:ac562e239d98cfef763866c0aee4586affb0d58c592202f06c87241af99db241", - "sha256:ae75eea2e908383fd4c659fdcfe9621a72869e3e3ee73904227e93b7f7b80b54", - "sha256:b5c336dc698650283ad06f8c0237a984087d0af9f403ff21d633507335628156", - "sha256:beb5f0664f49b6093da179ee8e27c1d670779f50b9ece0886ce491bb8bd63728", - "sha256:c1ae2fb8d5d6771670436dcc889b293e363c97647a6d31c21eebc12b7b760010", - "sha256:c9332b04bf3f838327087b028f690f4ddb9341eb014a0221e79b9c19a77f7555", - "sha256:c9cb88ed323be1aa642b3c17cd5caa1a03c3a8fbad092d48ecefe88e328ffae3", - "sha256:d45d0d35a238d838b872598fa865bbfb31aaef9aeeda77c68b04ef79f9a469dc", - "sha256:d7a77391fd351ff1bdf8475558ddc6e92950218cb905419ee14aa02f370f1054", - "sha256:de5a43901e47e7a6938490fc5de3074f6e35c8b481a75b227c0d24d6099bd41d", - "sha256:e94a7e986b117b72e9472f8eafdd81748dafff30815401f9760f759f1debe9ef", - "sha256:ed3bdda44cc05dd13eee697ab9bea6928531bb7b218e68e66d0d3eb2ebab043e", - "sha256:f24f49fc6bd706d87048654d6be6c7c967d6836d4879e3a7c439275fab9948ad", - "sha256:f8a97b1acd36e9ce9d4067d94a8be99c458f0eb8070828639302a95cfcf0770b", - "sha256:f8b3d9e7c17c1ffc1fa5b11c0bbab8a5df3de8596bb32ad30281b21e5ede4bf5" + "sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1", + "sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305", + "sha256:19764605feea0df966445d46533729b645033f134baeb3ea26ad518c9fdf212c", + "sha256:1be97461c439a6af4fe1cf8bf6ca5936d3db252737d2f379cc6b2e394e12a458", + "sha256:25cd61e846aaab76d5791d006497134602a9e451e954833018161befc3b5b9ed", + "sha256:2a47bcc478741b71273b917232f521fd5704ab4b25d301669879e7273d3586cc", + "sha256:59af01efb011b0e8b686ba7758d59cf4a8263f9ad35911bfe3f416cee4f5c08c", + "sha256:5dcac11031a71348faaed1f403a0debd56bf5404232284cf8c761ff918886ebc", + "sha256:62a5ec91388984909bb5398ea49ee61b68ecb579123694bffa172c3b0a107079", + "sha256:645bd4ca6f543685d643dadf6a856cc382b654cc923460e3a10a49c1b3832aeb", + "sha256:653b29b0819605fe0898829c8ad6400a6ccde096146730c2da54eede9b7b8baa", + "sha256:69138068268127cd605e03438312d8f271135a33140e2742b417d027a0539427", + "sha256:6e186342cfcc3aafaad565cbd496060e5a614b441cacc3995ef0091115c1f6c5", + "sha256:76bd15bb65c14900d98835fcd10f59e5e0435077431d3a394b60b15864fddd64", + "sha256:7805830e0c56d88f4d491fa5ac640dfc894c5ec570d1ece6ed1546e9df2e98d6", + "sha256:7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e", + "sha256:7a7a8f33a1f1fb762ede6cc9cbab8f2a9ba13b196bfaf7bc6f0b39d2ba315a43", + "sha256:82ee7696ed8eb9a82c7037f32ba9b7c59e51dda6f105b39f043b6ef293989cb3", + "sha256:88afd7a3af7ddddd42c2deda43d53d3dfc016c11327d0915f90ca34ebda91499", + "sha256:8af1a451ff9e123d0d8bd5d5e60f8e3315c3a64f3cdd6bc853e26090e195cdc8", + "sha256:8ee606964553c1a0bc74057dd8782a37d1c2bc0f01b83193b6f8bb14523b877b", + "sha256:91852d4480a4537d169c29a9d104dda44094c78f1f5b67bca76c29a91042b623", + "sha256:9c682436c359b5ada67e882fec34689726a09c461efd75b6ea77b2403d5665b7", + "sha256:bc3ee1b4d97081260d92ae813a83de4d2653206967c4a0a017580f8b9548ddbc", + "sha256:bca649483d5ed251d06daf25957f802e44e6bb6df2e8f218ae71968ff8f8edc4", + "sha256:c39778fd0548d78917b61f03c1fa8bfda6cfcf98c767decf360945fe6f97461e", + "sha256:cbe71b6712429650e3883dc81286edb94c328ffcd24849accac0a4dbcc76958a", + "sha256:d00fe8596e1cc46b44bf3907354e9377aa030ec4cd04afbbf6e899fc1e2a7781", + "sha256:d3584623e68a5064a04748fb6d76117a21a7cb5eaba20608a41c7d0c61721794", + "sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea", + "sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b", + "sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913" ], - "index": "pypi", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.19.1" + "version": "==3.20.0" }, "pyct": { "hashes": [ "sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c", "sha256:dd9f4ac5cbd8e37c352c04036062d3c5f67efec76d404761ef16b0cbf26aa6a0" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.5.0" }, "pydantic": { @@ -2391,7 +2410,7 @@ "sha256:f3d4ee957a727ccb5a36f1b0a6dbd9fad5dedd2a41eada99a8df55c12896e18d", "sha256:f79db3652ed743309f116ba863dae0c974a41b688242482638b892246b7db21d" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.10.10" }, "pyflakes": { @@ -2415,7 +2434,7 @@ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.17.2" }, "pyparsing": { @@ -2585,10 +2604,10 @@ }, "pytz": { "hashes": [ - "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b", - "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7" + "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40", + "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a" ], - "version": "==2023.3.post1" + "version": "==2023.4" }, "pyyaml": { "hashes": [ @@ -2621,6 +2640,7 @@ "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", + "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", @@ -2869,7 +2889,7 @@ "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.4.1" }, "rasterio": { @@ -2905,18 +2925,18 @@ }, "referencing": { "hashes": [ - "sha256:689e64fe121843dcfd57b71933318ef1f91188ffb45367332700a86ac8fd6161", - "sha256:bdcd3efb936f82ff86f993093f6da7435c7de69a3b3a5a06678a6050184bee99" + "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", + "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7" ], "markers": "python_version >= '3.8'", - "version": "==0.32.0" + "version": "==0.33.0" }, "requests": { "hashes": [ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.31.0" }, "rfc3339-validator": { @@ -2964,116 +2984,116 @@ }, "rioxarray": { "hashes": [ - "sha256:d2a8429a5b6405913c7b6f515ef2992b05139c96eb39a2dc1c9f475ce0848c9c", - "sha256:d7c0b2efc21075f77fe04302b916a995320004695f3c31e4f06d9ab40acd4498" + "sha256:75c41e5836a9adba2a42a2cdbc62a50b81e01bd4fcc9f55a96f187322182d671", + "sha256:c6d30d8b1b12924dffc45c4d55764840039fa0c8b551589d6cc1364e158e6055" ], - "markers": "python_version >= '3.9'", - "version": "==0.15.0" + "markers": "python_version >= '3.10'", + "version": "==0.15.1" }, "rpds-py": { "hashes": [ - "sha256:02744236ac1895d7be837878e707a5c35fb8edc5137602f253b63623d7ad5c8c", - "sha256:03f9c5875515820633bd7709a25c3e60c1ea9ad1c5d4030ce8a8c203309c36fd", - "sha256:044f6f46d62444800402851afa3c3ae50141f12013060c1a3a0677e013310d6d", - "sha256:07a2e1d78d382f7181789713cdf0c16edbad4fe14fe1d115526cb6f0eef0daa3", - "sha256:082e0e55d73690ffb4da4352d1b5bbe1b5c6034eb9dc8c91aa2a3ee15f70d3e2", - "sha256:13152dfe7d7c27c40df8b99ac6aab12b978b546716e99f67e8a67a1d441acbc3", - "sha256:13716e53627ad97babf72ac9e01cf9a7d4af2f75dd5ed7b323a7a9520e948282", - "sha256:13ff62d3561a23c17341b4afc78e8fcfd799ab67c0b1ca32091d71383a98ba4b", - "sha256:1607cda6129f815493a3c184492acb5ae4aa6ed61d3a1b3663aa9824ed26f7ac", - "sha256:164fcee32f15d04d61568c9cb0d919e37ff3195919cd604039ff3053ada0461b", - "sha256:1c24e30d720c0009b6fb2e1905b025da56103c70a8b31b99138e4ed1c2a6c5b0", - "sha256:1e6fcd0a0f62f2997107f758bb372397b8d5fd5f39cc6dcb86f7cb98a2172d6c", - "sha256:1fd0f0b1ccd7d537b858a56355a250108df692102e08aa2036e1a094fd78b2dc", - "sha256:2181e86d4e1cdf49a7320cb72a36c45efcb7670d0a88f09fd2d3a7967c0540fd", - "sha256:2974e6dff38afafd5ccf8f41cb8fc94600b3f4fd9b0a98f6ece6e2219e3158d5", - "sha256:2dccc623725d0b298f557d869a68496a2fd2a9e9c41107f234fa5f7a37d278ac", - "sha256:2df3d07a16a3bef0917b28cd564778fbb31f3ffa5b5e33584470e2d1b0f248f0", - "sha256:2e7e5633577b3bd56bf3af2ef6ae3778bbafb83743989d57f0e7edbf6c0980e4", - "sha256:2ee066a64f0d2ba45391cac15b3a70dcb549e968a117bd0500634754cfe0e5fc", - "sha256:2f1f295a5c28cfa74a7d48c95acc1c8a7acd49d7d9072040d4b694fe11cd7166", - "sha256:2faa97212b0dc465afeedf49045cdd077f97be1188285e646a9f689cb5dfff9e", - "sha256:30479a9f1fce47df56b07460b520f49fa2115ec2926d3b1303c85c81f8401ed1", - "sha256:337a8653fb11d2fbe7157c961cc78cb3c161d98cf44410ace9a3dc2db4fad882", - "sha256:3423007fc0661827e06f8a185a3792c73dda41f30f3421562f210cf0c9e49569", - "sha256:373b76eeb79e8c14f6d82cb1d4d5293f9e4059baec6c1b16dca7ad13b6131b39", - "sha256:3b79c63d29101cbaa53a517683557bb550462394fb91044cc5998dd2acff7340", - "sha256:3bbc89ce2a219662ea142f0abcf8d43f04a41d5b1880be17a794c39f0d609cb0", - "sha256:3c11bc5814554b018f6c5d6ae0969e43766f81e995000b53a5d8c8057055e886", - "sha256:3cd61e759c4075510052d1eca5cddbd297fe1164efec14ef1fce3f09b974dfe4", - "sha256:3d40fb3ca22e3d40f494d577441b263026a3bd8c97ae6ce89b2d3c4b39ac9581", - "sha256:3db0c998c92b909d7c90b66c965590d4f3cd86157176a6cf14aa1f867b77b889", - "sha256:422b0901878a31ef167435c5ad46560362891816a76cc0d150683f3868a6f0d1", - "sha256:46b4f3d47d1033db569173be62365fbf7808c2bd3fb742314d251f130d90d44c", - "sha256:485fbdd23becb822804ed05622907ee5c8e8a5f43f6f43894a45f463b2217045", - "sha256:53304cc14b1d94487d70086e1cb0cb4c29ec6da994d58ae84a4d7e78c6a6d04d", - "sha256:5595c80dd03d7e6c6afb73f3594bf3379a7d79fa57164b591d012d4b71d6ac4c", - "sha256:56b51ba29a18e5f5810224bcf00747ad931c0716e3c09a76b4a1edd3d4aba71f", - "sha256:580182fa5b269c2981e9ce9764367cb4edc81982ce289208d4607c203f44ffde", - "sha256:5e99d6510c8557510c220b865d966b105464740dcbebf9b79ecd4fbab30a13d9", - "sha256:5eb05b654a41e0f81ab27a7c3e88b6590425eb3e934e1d533ecec5dc88a6ffff", - "sha256:62b292fff4739c6be89e6a0240c02bda5a9066a339d90ab191cf66e9fdbdc193", - "sha256:6a5122b17a4faf5d7a6d91fa67b479736c0cacc7afe791ddebb7163a8550b799", - "sha256:6a8ff8e809da81363bffca2b965cb6e4bf6056b495fc3f078467d1f8266fe27f", - "sha256:6c43e1b89099279cc03eb1c725c5de12af6edcd2f78e2f8a022569efa639ada3", - "sha256:709dc11af2f74ba89c68b1592368c6edcbccdb0a06ba77eb28c8fe08bb6997da", - "sha256:7e072f5da38d6428ba1fc1115d3cc0dae895df671cb04c70c019985e8c7606be", - "sha256:813a65f95bfcb7c8f2a70dd6add9b51e9accc3bdb3e03d0ff7a9e6a2d3e174bf", - "sha256:86c01299942b0f4b5b5f28c8701689181ad2eab852e65417172dbdd6c5b3ccc8", - "sha256:893e38d0f4319dfa70c0f36381a37cc418985c87b11d9784365b1fff4fa6973b", - "sha256:8a5f574b92b3ee7d254e56d56e37ec0e1416acb1ae357c4956d76a1788dc58fb", - "sha256:8b9650f92251fdef843e74fc252cdfd6e3c700157ad686eeb0c6d7fdb2d11652", - "sha256:8ec464f20fe803ae00419bd1610934e3bda963aeba1e6181dfc9033dc7e8940c", - "sha256:8f333bfe782a2d05a67cfaa0cc9cd68b36b39ee6acfe099f980541ed973a7093", - "sha256:8ffdeb7dbd0160d4e391e1f857477e4762d00aa2199c294eb95dfb9451aa1d9f", - "sha256:911e600e798374c0d86235e7ef19109cf865d1336942d398ff313375a25a93ba", - "sha256:9235be95662559141934fced8197de6fee8c58870f36756b0584424b6d708393", - "sha256:938518a11780b39998179d07f31a4a468888123f9b00463842cd40f98191f4d3", - "sha256:93c18a1696a8e0388ed84b024fe1a188a26ba999b61d1d9a371318cb89885a8c", - "sha256:97532802f14d383f37d603a56e226909f825a83ff298dc1b6697de00d2243999", - "sha256:98ee201a52a7f65608e5494518932e1473fd43535f12cade0a1b4ab32737fe28", - "sha256:9d2ae79f31da5143e020a8d4fc74e1f0cbcb8011bdf97453c140aa616db51406", - "sha256:9d38494a8d21c246c535b41ecdb2d562c4b933cf3d68de03e8bc43a0d41be652", - "sha256:9d41ebb471a6f064c0d1c873c4f7dded733d16ca5db7d551fb04ff3805d87802", - "sha256:9e09d017e3f4d9bd7d17a30d3f59e4d6d9ba2d2ced280eec2425e84112cf623f", - "sha256:a6945c2d61c42bb7e818677f43638675b8c1c43e858b67a96df3eb2426a86c9d", - "sha256:a72e00826a2b032dda3eb25aa3e3579c6d6773d22d8446089a57a123481cc46c", - "sha256:aa1e626c524d2c7972c0f3a8a575d654a3a9c008370dc2a97e46abd0eaa749b9", - "sha256:ab095edf1d840a6a6a4307e1a5b907a299a94e7b90e75436ee770b8c35d22a25", - "sha256:ac2ac84a4950d627d84b61f082eba61314373cfab4b3c264b62efab02ababe83", - "sha256:ac7187bee72384b9cfedf09a29a3b2b6e8815cc64c095cdc8b5e6aec81e9fd5f", - "sha256:ae9d83a81b09ce3a817e2cbb23aabc07f86a3abc664c613cd283ce7a03541e95", - "sha256:afeabb382c1256a7477b739820bce7fe782bb807d82927102cee73e79b41b38b", - "sha256:b2a4cd924d0e2f4b1a68034abe4cadc73d69ad5f4cf02db6481c0d4d749f548f", - "sha256:b414ef79f1f06fb90b5165db8aef77512c1a5e3ed1b4807da8476b7e2c853283", - "sha256:b4ecbba7efd82bd2a4bb88aab7f984eb5470991c1347bdd1f35fb34ea28dba6e", - "sha256:b61d5096e75fd71018b25da50b82dd70ec39b5e15bb2134daf7eb7bbbc103644", - "sha256:b629db53fe17e6ce478a969d30bd1d0e8b53238c46e3a9c9db39e8b65a9ef973", - "sha256:b70b45a40ad0798b69748b34d508259ef2bdc84fb2aad4048bc7c9cafb68ddb3", - "sha256:b88c3ab98556bc351b36d6208a6089de8c8db14a7f6e1f57f82a334bd2c18f0b", - "sha256:baf744e5f9d5ee6531deea443be78b36ed1cd36c65a0b95ea4e8d69fa0102268", - "sha256:bbc7421cbd28b4316d1d017db338039a7943f945c6f2bb15e1439b14b5682d28", - "sha256:c31272c674f725dfe0f343d73b0abe8c878c646967ec1c6106122faae1efc15b", - "sha256:c51a899792ee2c696072791e56b2020caff58b275abecbc9ae0cb71af0645c95", - "sha256:c61e42b4ceb9759727045765e87d51c1bb9f89987aca1fcc8a040232138cad1c", - "sha256:c7cd0841a586b7105513a7c8c3d5c276f3adc762a072d81ef7fae80632afad1e", - "sha256:c827a931c6b57f50f1bb5de400dcfb00bad8117e3753e80b96adb72d9d811514", - "sha256:d2aa3ca9552f83b0b4fa6ca8c6ce08da6580f37e3e0ab7afac73a1cfdc230c0e", - "sha256:d46ee458452727a147d7897bb33886981ae1235775e05decae5d5d07f537695a", - "sha256:d64a657de7aae8db2da60dc0c9e4638a0c3893b4d60101fd564a3362b2bfeb34", - "sha256:d800a8e2ac62db1b9ea5d6d1724f1a93c53907ca061de4d05ed94e8dfa79050c", - "sha256:d9d7ebcd11ea76ba0feaae98485cd8e31467c3d7985210fab46983278214736b", - "sha256:dd7d3608589072f63078b4063a6c536af832e76b0b3885f1bfe9e892abe6c207", - "sha256:ec19e823b4ccd87bd69e990879acbce9e961fc7aebe150156b8f4418d4b27b7f", - "sha256:ee40206d1d6e95eaa2b7b919195e3689a5cf6ded730632de7f187f35a1b6052c", - "sha256:f138f550b83554f5b344d6be35d3ed59348510edc3cb96f75309db6e9bfe8210", - "sha256:f3e6e2e502c4043c52a99316d89dc49f416acda5b0c6886e0dd8ea7bb35859e8", - "sha256:fb10bb720348fe1647a94eb605accb9ef6a9b1875d8845f9e763d9d71a706387", - "sha256:fc066395e6332da1e7525d605b4c96055669f8336600bef8ac569d5226a7c76f", - "sha256:fc33267d58dfbb2361baed52668c5d8c15d24bc0372cecbb79fed77339b55e0d" + "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", + "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", + "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", + "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", + "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", + "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", + "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d", + "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", + "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", + "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", + "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", + "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", + "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518", + "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", + "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", + "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", + "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", + "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", + "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6", + "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", + "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", + "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", + "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f", + "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3", + "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", + "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1", + "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76", + "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", + "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", + "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", + "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", + "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", + "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", + "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", + "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", + "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", + "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", + "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", + "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", + "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", + "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", + "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", + "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", + "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", + "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", + "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", + "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", + "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", + "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", + "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", + "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", + "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", + "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", + "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", + "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb", + "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", + "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", + "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", + "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", + "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", + "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", + "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", + "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", + "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf", + "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", + "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", + "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", + "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", + "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", + "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", + "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", + "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", + "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", + "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", + "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", + "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", + "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", + "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", + "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", + "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", + "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", + "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", + "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", + "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", + "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a", + "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", + "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", + "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", + "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", + "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", + "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", + "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", + "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", + "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", + "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", + "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", + "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", + "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", + "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a" ], "markers": "python_version >= '3.8'", - "version": "==0.15.2" + "version": "==0.17.1" }, "rtree": { "hashes": [ @@ -3131,7 +3151,7 @@ "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.6.2" }, "scipy": { @@ -3179,11 +3199,11 @@ }, "setuptools": { "hashes": [ - "sha256:1e8fdff6797d3865f37397be788a4e3cba233608e9b509382a2777d25ebde7f2", - "sha256:735896e78a4742605974de002ac60562d286fa8051a7e2299445e8e8fbb01aa6" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==69.0.2" + "version": "==69.0.3" }, "shapely": { "hashes": [ @@ -3346,7 +3366,7 @@ "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.3.0" }, "snuggs": { @@ -3414,7 +3434,7 @@ "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==1.2.1" }, "tomli": { @@ -3427,11 +3447,11 @@ }, "toolz": { "hashes": [ - "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f", - "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194" + "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", + "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" ], - "markers": "python_version >= '3.5'", - "version": "==0.12.0" + "markers": "python_full_version >= '3.7.0'", + "version": "==0.12.1" }, "tornado": { "hashes": [ @@ -3460,11 +3480,11 @@ }, "traitlets": { "hashes": [ - "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33", - "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.14.0" + "version": "==5.14.1" }, "typeguard": { "hashes": [ @@ -3476,10 +3496,11 @@ }, "types-python-dateutil": { "hashes": [ - "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b", - "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9" + "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f", + "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2" ], - "version": "==2.8.19.14" + "markers": "python_version >= '3.8'", + "version": "==2.8.19.20240106" }, "typing-extensions": { "hashes": [ @@ -3498,11 +3519,11 @@ }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", + "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" ], "markers": "python_version >= '2'", - "version": "==2023.3" + "version": "==2023.4" }, "uri-template": { "hashes": [ @@ -3524,15 +3545,15 @@ "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==20.25.0" }, "wcwidth": { "hashes": [ - "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02", - "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.12" + "version": "==0.2.13" }, "webcolors": { "hashes": [ @@ -3569,7 +3590,7 @@ "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385", "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==4.0.9" }, "wrapt": { @@ -3661,7 +3682,7 @@ "sha256:8a356ac66a61ff9522453194db5d184e1eccee8ab890c7ec723bb48c6eafd392", "sha256:fd7e3b447236f6e8f8c5110684a7ca50f97149c806f56ebf4ed1eeef1dd681ce" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.3.5" }, "xyzservices": { @@ -3756,7 +3777,7 @@ "sha256:43a001473f5c8abcf182f603049cf305cbc855ad8deaa9dfa0f3b5a7cea9d0ff", "sha256:b1ba0dfcc9762f0ca168d2378062d3ca1299d39076b0f145d961359121042be5" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==0.8.4" }, "zipp": { @@ -3801,11 +3822,11 @@ }, "ipython": { "hashes": [ - "sha256:2f55d59370f59d0d2b2212109fe0e6035cfea436b1c0e6150ad2244746272ec5", - "sha256:ac4da4ecf0042fb4e0ce57c60430c2db3c719fa8bdf92f8631d6bd8a5785d1f0" + "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5", + "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73" ], "markers": "python_version >= '3.10'", - "version": "==8.19.0" + "version": "==8.21.0" }, "jedi": { "hashes": [ @@ -3851,7 +3872,7 @@ "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.0.43" }, "ptyprocess": { @@ -3874,7 +3895,7 @@ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==2.17.2" }, "six": { @@ -3894,18 +3915,18 @@ }, "traitlets": { "hashes": [ - "sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33", - "sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.14.0" + "version": "==5.14.1" }, "wcwidth": { "hashes": [ - "sha256:f01c104efdf57971bcb756f054dd58ddec5204dd15fa31d6503ea57947d97c02", - "sha256:f26ec43d96c8cbfed76a5075dac87680124fa84e0855195a6184da9c187f133c" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.12" + "version": "==0.2.13" } } } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index be5e9c1be..d367487a5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.9.1 - 2024-02-02 - [PR#1073](https://github.com/NOAA-OWP/inundation-mapping/pull/1073) + +Dependabot requested two fixes. One for an upgrade to pillow [#1068](https://github.com/NOAA-OWP/inundation-mapping/pull/1068) and the other for juypterlab #[1067 ](https://github.com/NOAA-OWP/inundation-mapping/pull/1067) + +### Changes + +- `src` + - `Pipfile` and `Pipfile.lock`: Updated some packages. + +

+ ## v4.4.9.0 - 2024-01-12 - [PR#1058](https://github.com/NOAA-OWP/inundation-mapping/pull/1058) Upgrades base Docker image to GDAL v3.8.0. In order to upgrade past GDAL v.3.4.3 (see #1029), TauDEM's `aread8` was replaced with a module from the `pyflwdir` Python package. From 682c15bb6e4706ba673bd7a97199d617655db03b Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 2 Feb 2024 09:24:15 -0800 Subject: [PATCH 23/51] v4.4.9.2 Add index to aggregated crosswalk table (#1066) --- docs/CHANGELOG.md | 11 +++++++++++ tools/combine_crosswalk_tables.py | 12 +++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d367487a5..1c49ad73a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + +## v4.4.9.2 - 2024-02-02 - [PR#1066](https://github.com/NOAA-OWP/inundation-mapping/pull/1066) + +Adds an index to the aggregated `crosswalk_table.csv`. The index is a consecutive integer that starts at 1. Columns have been reordered, renamed, and sorted. + +### Changes + +`tools/combine_crosswalk_tables.py`: Adds index and sorts and renames columns + +

+ ## v4.4.9.1 - 2024-02-02 - [PR#1073](https://github.com/NOAA-OWP/inundation-mapping/pull/1073) Dependabot requested two fixes. One for an upgrade to pillow [#1068](https://github.com/NOAA-OWP/inundation-mapping/pull/1068) and the other for juypterlab #[1067 ](https://github.com/NOAA-OWP/inundation-mapping/pull/1067) diff --git a/tools/combine_crosswalk_tables.py b/tools/combine_crosswalk_tables.py index 9acc2292e..79f0d8d90 100644 --- a/tools/combine_crosswalk_tables.py +++ b/tools/combine_crosswalk_tables.py @@ -22,7 +22,6 @@ def combine_crosswalk_tables(data_directory, output_filename): filename, usecols=['HUC', 'HydroID', 'feature_id', 'LakeID'], dtype={'HUC': str} ) file_df = file_df.drop_duplicates() - file_df = file_df.rename(columns={'HUC': 'huc8'}) file_df['BranchID'] = os.path.split(os.path.dirname(filename))[1] dfs.append(file_df) @@ -32,6 +31,17 @@ def combine_crosswalk_tables(data_directory, output_filename): if len(dfs) > 1: df = pd.concat(dfs) + df = df.rename( + columns={'HUC': 'huc8', 'HydroID': 'hydro_id', 'LakeID': 'lake_id', 'BranchID': 'branch_id'} + ) + + df = df.sort_values(by=['feature_id', 'huc8', 'branch_id', 'hydro_id']) + + df = df.reset_index(drop=True) + df['hand_id'] = df.index + 1 + + df = df[['hand_id', 'feature_id', 'huc8', 'branch_id', 'hydro_id', 'lake_id']] + df.to_csv(output_filename, index=False) From a14e5e1cfbe10a4572b0e1f0cddca7506949ce72 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:27:24 +0000 Subject: [PATCH 24/51] v4.4.10.0 Updates for acquire, logging and cpu test (#1054) --- .gitattributes | 1 + .pre-commit-config.yaml | 5 +- CONTRIBUTING.md | 84 +++++++++++------ data/usgs/acquire_and_preprocess_3dep_dems.py | 91 +++++++++---------- data/usgs/preprocess_ahps_usgs.py | 0 data/usgs/preprocess_download_usgs_grids.py | 0 docs/CHANGELOG.md | 28 ++++++ fim_pipeline.sh | 6 +- fim_post_processing.sh | 2 + fim_pre_processing.sh | 18 ++-- fim_process_unit_wb.sh | 2 +- src/bash_functions.env | 28 ++++++ src/delineate_hydros_and_produce_HAND.sh | 83 ++--------------- src/derive_level_paths.py | 2 +- src/run_by_branch.sh | 38 +++----- src/run_unit_wb.sh | 86 +++--------------- src/split_flows.py | 3 +- 17 files changed, 214 insertions(+), 263 deletions(-) mode change 100644 => 100755 data/usgs/acquire_and_preprocess_3dep_dems.py mode change 100644 => 100755 data/usgs/preprocess_ahps_usgs.py mode change 100644 => 100755 data/usgs/preprocess_download_usgs_grids.py diff --git a/.gitattributes b/.gitattributes index 6033e76e7..76ebc9c6c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,3 @@ # Set the default behavior for end of lines. * text eol=lf +docs/CHANGELOG.md merge=union diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 98fbcea77..6c2bb6513 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -6,9 +6,10 @@ repos: rev: v4.4.0 hooks: - id: trailing-whitespace - exclude: CHANGELOG.md + # Below is python regex to exclude all .md files + exclude: .*md$ - id: end-of-file-fixer - exclude: Pipfile.lock + exclude: Pipfile.lock - id: check-added-large-files args: ['--maxkb=5000'] - id: check-json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 940cfe712..a66e1971f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,46 +45,77 @@ If you would like to contribute, please follow these steps: ``` git checkout -b ``` -4. [pre-commit](https://pre-commit.com/) is used to run auto-formatting and linting tools. Please follow the steps in the link provided to install `pre-commit` locally. `pre-commit` can be installed as a git hook to verify your staged changes adhere to the project's style and format requirements (configuration defined in [pyproject.toml](/pyproject.toml)). -5. After you've installed `pre-commit` via `pip` , `homebrew`, or `conda`, check the version to verify installation: - ``` - $ pre-commit --version - ``` - -6. Initialize the pre-commit hooks included within the root directory of `inundation-mapping`: - +4. Pre-commit installation: + + [pre-commit](https://pre-commit.com/) is used to run auto-formatting and enforce styling rules. + It is a critical part of development and is enforced at the 'git commit' step. Key tools are included **inside the docker container** if you want to execute the correctly configured linting and formatting command line executables there. If you intend to execute `flake8`, `black` or `isort` from the command line **outside of the docker container**, additional configuration and installation is required, which will not be described here. + + **Note: These steps below are similar to another required critical step (pre-commit configuration) later in this document, which also needs to be run**. + + If pre-commit is not already installed on your system: + ``` + pip install pre-commit + ``` + All related tools (git hook scripts) are installed under the `pre-commit install` step, not at this level. See https://pre-commit.com/#install + + If you get an error message during the install of pre-commit which says: + + *Installing collected packages: pre-commit + WARNING: The script pre-commit is installed in '/home/{your_user_name}/.local/bin' which is not on PATH. + Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.`, + then you will need to do some additional configuration. You need to adjust your path.* + ``` + (Adjusting the path to be exactly the path you see in the WARNING message above from your console output). + export PATH="/home/{your_user_name}/.local/bin:$PATH" + ``` + To test that it installed correctly, is pathed correctly and check the version: + ``` + pre-commit --version + ``` + It should respond with the phrase *pre-commit 3.6.0* (version may not be exact). + + +5. pre-commit configuration: + + Now, you need to configure your local clone of the repo to honor the pre-commit hooks. + The `pre-commit` package is used to pick up the pre-commit hooks which verify your staged changes adhere to the project's style and format requirements (configuration defined in [pyproject.toml](/pyproject.toml)). + + Initialize the pre-commit hooks included within the root directory of this code repository (`inundation-mapping`): ``` $ pre-commit install ``` -7. At this point, you should be set up with `pre-commit`. When a commit is made it will run the pre-commit hooks defined in [`.pre-commit-config.yaml`](.pre-commit-config.yaml). For reference, you may run any of the pre-commit hooks manually before issuing the `git commit` command (see below). Some tools used by the pre commit git hook (`isort`, `flake8`, & `black`) are also available as command line executables within the Docker container, however, it is recommend to run them through `pre-commit` outside of the container, as it picks up the correct configuration. + +6. At this point, you should be set up with `pre-commit`. When a commit is made it will run the pre-commit hooks defined in [`.pre-commit-config.yaml`](.pre-commit-config.yaml). For reference, you may run any of the pre-commit hooks manually before issuing the `git commit` command (see below). Some tools used by the pre commit git hook (`isort`, `flake8`, & `black`) are also available as command line executables **within the Docker container***, however, it is recommended to run them through `pre-commit` **outside of the container**, as it picks up the correct configuration. - ``` - # Check only the staged changes - pre-commit run - - # Check all files in the repo - pre-commit run -a + ``` + # Check only the staged changes + pre-commit run - # Run only the flake8 formatting tool - pre-commit run -a flake8 - ``` + # Check all files in the repo + pre-commit run -a -8. Build the Docker container: + # Run only the flake8, isort, or black. + pre-commit run -a flake8 + pre-commit run -a isort + pre-commit run -a black + ``` +7. Build the Docker container: ``` Docker build -f Dockerfile -t : ``` -9. [Within the container](README.md#startrun-the-docker-container), ensure sure unit tests pass ([instructions here](/unit_tests/README.md)). + +8. [Within the container](README.md#startrun-the-docker-container), ensure sure unit tests pass ([instructions here](/unit_tests/README.md)). ``` pytest unit_tests/ ``` -10. Outside of the Docker container, commit your changes: +9. Outside of the Docker container, commit your changes: ``` - git commit -m + git commit -m "" ``` - This will invoke pre-commit hooks mentioned in step 7 that will lint & format the code. In many cases non-compliant code will be rectified automatically, but in some cases manual changes will be necessary. Make sure all of these checks pass, if not, make necessary changes and re-issue `git commit -m <...>`. - -9. Push to your forked branch: + This will invoke pre-commit hooks mentioned in step 6 that will lint & format the code (some others as well). In many cases non-compliant code will be rectified automatically, but in some cases manual changes will be necessary. Make sure all of these checks pass. If not, make necessary changes (`git add <...>`), and re-issue `git commit -m "<...>"`. + +10. Push to your forked branch: ``` git push -u origin ``` @@ -93,4 +124,5 @@ If you would like to contribute, please follow these steps: git push --set-upstream origin ``` -10. Submit a pull request on [inundation-mapping's GitHub page](https://github.com/NOAA-OWP/inundation-mapping) (please review checklist in [PR template](/.github/PULL_REQUEST_TEMPLATE.md) for additional PR guidance). +11. Submit a pull request on [inundation-mapping's GitHub page](https://github.com/NOAA-OWP/inundation-mapping) (please review checklist in [PR template](/.github/PULL_REQUEST_TEMPLATE.md) for additional PR guidance). + diff --git a/data/usgs/acquire_and_preprocess_3dep_dems.py b/data/usgs/acquire_and_preprocess_3dep_dems.py old mode 100644 new mode 100755 index 3e08dc14c..b6ded4198 --- a/data/usgs/acquire_and_preprocess_3dep_dems.py +++ b/data/usgs/acquire_and_preprocess_3dep_dems.py @@ -39,7 +39,7 @@ def acquire_and_preprocess_3dep_dems( extent_file_path, target_output_folder_path='', number_of_jobs=1, - retry=False, + repair=False, skip_polygons=False, target_projection='EPSG:5070', ): @@ -79,9 +79,11 @@ def acquire_and_preprocess_3dep_dems( - number_of_jobs (int): This program supports multiple procs if multiple procs/cores are available. - - retry (True / False): - If retry is True and the file exists (either the raw downloaded DEM and/or) - the projected one, then skip it + - repair (True / False): + If repair is True then look for output DEMs that are missing or are too small (under 10mg). + This happens often as there can be instabilty when running long running processes. + USGS calls and networks can blip and some of the full BED can take many, many hours. + It will also look for DEMs that were missed entirely on previous runs. - skip_polygons (bool) If True, then we will not attempt to create polygon files for each dem file. If false, @@ -120,37 +122,28 @@ def acquire_and_preprocess_3dep_dems( f"For the output path of {target_output_folder_path}, the child directory" " need not exist but the parent folder must." ) - os.makedirs(target_output_folder_path) + os.makedir(target_output_folder_path) + else: # path exists - if not retry: + if repair is False: file_list = os.listdir(target_output_folder_path) if len(file_list) > 0: print() - msg = f"The target output folder of {target_output_folder_path} appears to not be empty.\n\n" - "Do you want to empty the folder first?\n" - " -- Type 'overwrite' if you want to empty the folder and continue.\n" - " -- Type any other value to abort and stop the program.\n" - " ?=" - - resp = input(msg).lower() + msg = ( + f"The target output folder of {target_output_folder_path} appears to not be empty.\n\n" + "Do you want to empty the folder first?\n" + " -- Type 'overwrite' if you want to empty the folder and continue.\n" + " -- Type any other value to abort and stop the program.\n" + ) + print(msg) + resp = input(" ?=").lower() if resp == "overwrite": shutil.rmtree(target_output_folder_path) os.mkdir(target_output_folder_path) else: print("Program stopped\n") sys.exit(0) - else: # might want to retry but the folder isn't there yet - # It is ok if the child diretory does not exist, but the parent folder must - # parent directory, we want to reset it - parent_dir = os.path.abspath(os.path.join(target_output_folder_path, os.pardir)) - print(parent_dir) - if not os.path.exists(parent_dir): - raise ValueError( - f"For the output path of {target_output_folder_path}, the child directory" - " need not exist but the parent folder must." - ) - shutil.rmtree(target_output_folder_path) - os.mkdir(target_output_folder_path) + # no else: # I don't need the crs_number for now crs_is_valid, err_msg, crs_number = val.is_valid_crs(target_projection) @@ -177,25 +170,25 @@ def acquire_and_preprocess_3dep_dems( # download dems, setting projection, block size, etc __download_usgs_dems( - extent_file_names, target_output_folder_path, number_of_jobs, retry, target_projection + extent_file_names, target_output_folder_path, number_of_jobs, repair, target_projection ) if skip_polygons is False: polygonize(target_output_folder_path) end_time = datetime.utcnow() - fh.print_end_header('Loading 3dep dems', start_time, end_time) + fh.print_end_header('Loading 3dep dems complete', start_time, end_time) print() print( '---- NOTE: Remember to scan the log file for any failures. If you find errors in the' - ' log file, delete the output file and retry' + ' log file, delete the output file and repair.' ) print() logging.info(fh.print_date_time_duration(start_time, end_time)) -def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry, target_projection): +def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, repair, target_projection): ''' Process: ---------- @@ -244,7 +237,7 @@ def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry 'download_url': __USGS_3DEP_10M_VRT_URL, 'target_projection': target_projection, 'base_cmd': base_cmd, - 'retry': retry, + 'repair': repair, } try: @@ -268,7 +261,9 @@ def __download_usgs_dems(extent_files, output_folder_path, number_of_jobs, retry print("==========================================================") -def download_usgs_dem_file(extent_file, output_folder_path, download_url, target_projection, base_cmd, retry): +def download_usgs_dem_file( + extent_file, output_folder_path, download_url, target_projection, base_cmd, repair +): ''' Process: ---------- @@ -289,8 +284,9 @@ def download_usgs_dem_file(extent_file, output_folder_path, download_url, target ie) EPSG:5070 or EPSG:2276, etc - base_cmd (str) The basic GDAL command with string formatting wholes for key values. - - retry (bool) - If True, and the file exists, downloading will be skipped. + - repair (bool) + If True, and the file does not exist or is too small (under 10mb), + it will attempt to download. ''' @@ -302,11 +298,14 @@ def download_usgs_dem_file(extent_file, output_folder_path, download_url, target # which is related to to the spatial extents of the dem and the vrt combined. # so, super small .tifs are correct. - if (retry) and (os.path.exists(target_path_raw)): - msg = f" - Downloading -- {target_file_name_raw} - Skipped (already exists (see retry flag))" - print(msg) - logging.info(msg) - return + if (repair) and (os.path.exists(target_path_raw)): + if os.stat(target_path_raw).st_size < 1000000: + os.remove(target_path_raw) + else: + msg = f" - Downloading -- {target_file_name_raw} - Skipped (already exists (see retry flag))" + print(msg) + logging.info(msg) + return msg = f" - Downloading -- {target_file_name_raw} - Started" print(msg) @@ -356,7 +355,7 @@ def polygonize(target_output_folder_path): """ dem_domain_file = os.path.join(target_output_folder_path, 'DEM_Domain.gpkg') - msg = f" - Polygonizing -- {dem_domain_file} - Started" + msg = f" - Polygonizing -- {dem_domain_file} - Started (be patient, it can take a while)" print(msg) logging.info(msg) @@ -368,6 +367,7 @@ def polygonize(target_output_folder_path): dem_gpkgs = gpd.GeoDataFrame() for n, dem_file in enumerate(dem_files): + print(f"Polygonizing: {dem_file}") edge_tif = f'{os.path.splitext(dem_file)[0]}_edge.tif' edge_gpkg = f'{os.path.splitext(edge_tif)[0]}.gpkg' @@ -446,9 +446,8 @@ def __setup_logger(output_folder_path): ''' sample usage (min params): python3 /foss_fim/data/usgs/acquire_and_preprocess_3dep_dems.py - -e /data/inputs/wbd/HUC6_ESPG_5070/ - -t /data/inputs/3dep_dems/10m_5070/ - -r + -e /data/inputs/wbd/wbd/HUC8_South_Alaska/ + -t /data/inputs/3dep_dems/10m_South_Alaska/ -j 20 Notes: @@ -499,10 +498,10 @@ def __setup_logger(output_folder_path): ) parser.add_argument( - '-r', - '--retry', - help='OPTIONAL: If included, it will skip files that already exist.' - 'Default is all will be loaded/reloaded.', + '-rp', + '--repair', + help='OPTIONAL: If included, it process only HUCs missing output DEMs or if the output DEM' + ' is too small (under 10 MB), which does happen.', required=False, action='store_true', default=False, diff --git a/data/usgs/preprocess_ahps_usgs.py b/data/usgs/preprocess_ahps_usgs.py old mode 100644 new mode 100755 diff --git a/data/usgs/preprocess_download_usgs_grids.py b/data/usgs/preprocess_download_usgs_grids.py old mode 100644 new mode 100755 diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1c49ad73a..9760431b2 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,34 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.10.0 - 2024-02-02 - [PR#1054](https://github.com/NOAA-OWP/inundation-mapping/pull/1054) + +Recent testing exposed a bug with the `acquire_and_preprocess_3dep_dems.py` script. It lost the ability to be re-run and look for files that were unsuccessful earlier attempts and try them again. It may have been lost due to confusion of the word "retry". Now "retry" means restart the entire run. A new flag called "repair" has been added meaning fix what failed earlier. This is a key feature it is common for communication failures when calling USGS to download DEMs. And with some runs taking many hours, this feature becomes important. + +Also used the opportunity to fix a couple of other minor issues: +1) Reduce log output +2) Add a test for ensuring the user does not submit job numbers (num of cpu requests) to exceed the system max cpus. This test exists in a number of places in the code but way later in the processing stack after alot of processing has been done. Now it is done at the start of the fim pipeline stack. +3) remove arguments for "isaws" which is no longer in use and has not been for a while. +4) quick upgrade to the tracker log that keeps track of duration of each unit being processed. + +### Changes + + +- `data\usgs\` + - `acquire_and_preprocess_3dep_dems.py`: Re-add a feature which allowed for restarting and redo missing outputs or partial outputs. System now named as a "repair" system. +- `fim_pipeline.sh`: remove the parallel `--eta` flag to reduce logging. It was not needed, also removed "isaws" flag. +- `fim_pre_processing.sh`: Added validation tests for maximum CPU requests (job numbers) +- `fim_post_processing.sh`: Added a permissions updated as output folders were being locked due to permissions. +- `fim_process_unit_wb.sh`: Fixed a bug with output folders being locked due to permissions, but it was not recursive. +- `src` + - `bash_functions.sh`: Added function so the unit timing logs would also have a time in percentage so it can easily be used to calculate averages. + - `delineate_hydros_and_produce_HAND.sh`: Removed some unnecessary logging. Changed a few gdal calls to be less verbose. + - `derive_level_paths.py`: Changed verbose to false to reduce unnecessary logging. + - `run_by_branch.sh`: Removed some unnecessary logging. Added a duration system so we know how long the branch took to process. + - `run_unit_by_wb.sh`: Removed some unnecessary logging. Changed a few gdal calls to be less verbose. + - `split_flows.py`: Removed progress bar which was unnecessary and was adding to logging. + +

## v4.4.9.2 - 2024-02-02 - [PR#1066](https://github.com/NOAA-OWP/inundation-mapping/pull/1066) diff --git a/fim_pipeline.sh b/fim_pipeline.sh index 4e1e76159..8fc4ae9d7 100755 --- a/fim_pipeline.sh +++ b/fim_pipeline.sh @@ -46,8 +46,6 @@ usage() -o : Overwrite outputs if they already exist. -skipcal : If this param is included, the S.R.C. will be updated via the calibration points. will be skipped. - -isaws : If this param is included, AWS objects will be used where possible - - Note: This feature is not yet implemented. -x : If this param is included, the crosswalk will be evaluated. @@ -104,13 +102,13 @@ if [ -f "$hucList" ]; then if [ "$jobHucLimit" = "1" ]; then parallel --verbose --lb -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName :::: $hucList else - parallel --eta -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName :::: $hucList + parallel -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName :::: $hucList fi else if [ "$jobHucLimit" = "1" ]; then parallel --verbose --lb -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName ::: $hucList else - parallel --eta -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName ::: $hucList + parallel -j $jobHucLimit --colsep ',' --joblog $logFile -- $process_wb_file $runName ::: $hucList fi fi diff --git a/fim_post_processing.sh b/fim_post_processing.sh index 4ebb7b5fa..a157db6f6 100755 --- a/fim_post_processing.sh +++ b/fim_post_processing.sh @@ -216,6 +216,8 @@ python3 $toolsDir/combine_crosswalk_tables.py \ Tcount date -u +find $outputDestDir -type d -exec chmod -R 777 {} + + echo echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" echo "---- End of fim_post_processing" diff --git a/fim_pre_processing.sh b/fim_pre_processing.sh index cff84fa23..f8453c8e3 100755 --- a/fim_pre_processing.sh +++ b/fim_pre_processing.sh @@ -45,8 +45,6 @@ usage() -o : Overwrite outputs if they already exist. -skipcal : If this param is included, the S.R.C. will be updated via the calibration points. will be skipped. - -isaws : If this param is included, AWS objects will be used where possible - - Note: This feature is not yet implemented. " exit } @@ -98,9 +96,6 @@ in -skipcal) skipcal=1 ;; - -isaws) - isAWS=1 - ;; -x) evaluateCrosswalk=1 ;; @@ -131,7 +126,6 @@ if [ "$jobHucLimit" = "" ]; then jobHucLimit=1; fi if [ "$jobBranchLimit" = "" ]; then jobBranchLimit=1; fi if [ -z "$overwrite" ]; then overwrite=0; fi if [ -z "$skipcal" ]; then skipcal=0; fi -if [ -z "$isAWS" ]; then isAWS=0; fi if [ -z "$evaluateCrosswalk" ]; then evaluateCrosswalk=0; fi # validate and set defaults for the deny lists @@ -186,6 +180,17 @@ if [ -d $outputDestDir ] && [ $overwrite -eq 0 ]; then usage fi +# Test to ensure we are not overuseing cores +num_available_cores=$(echo $(grep -c processor /proc/cpuinfo)) +let total_requested_jobs=$jobHucLimit*$jobBranchLimit +if [[ $total_requested_jobs -gt $num_available_cores ]]; then + echo + echo "ERROR: There are $num_available_cores available, but -jh (jobHucLimit) * -jb (jobBranchLimit)"\ + "exceed the number of available cores" + echo + usage +fi + ## SOURCE ENV FILE AND FUNCTIONS ## source $srcDir/bash_functions.env @@ -236,7 +241,6 @@ echo "export deny_unit_list=$deny_unit_list" >> $args_file echo "export deny_branches_list=$deny_branches_list" >> $args_file echo "export deny_branch_zero_list=$deny_branch_zero_list" >> $args_file echo "export has_deny_branch_zero_override=$has_deny_branch_zero_override" >> $args_file -echo "export isAWS=$isAWS" >> $args_file echo "export skipcal=$skipcal" >> $args_file echo "export evaluateCrosswalk=$evaluateCrosswalk" >> $args_file diff --git a/fim_process_unit_wb.sh b/fim_process_unit_wb.sh index 0d164543d..1c013f777 100755 --- a/fim_process_unit_wb.sh +++ b/fim_process_unit_wb.sh @@ -129,7 +129,7 @@ fi # Move the contents of the temp directory into the outputs directory and update file permissions mv -f $tempHucDataDir $outputHucDataDir -find $outputHucDataDir -type d -exec chmod 777 {} + +find $outputHucDataDir -type d -exec chmod -R 777 {} + echo "=============================================================================================" echo diff --git a/src/bash_functions.env b/src/bash_functions.env index 89a21aba7..72a33f450 100644 --- a/src/bash_functions.env +++ b/src/bash_functions.env @@ -43,6 +43,34 @@ Calc_Time() { fi } +Calc_Time_Minutes_in_Percent(){ + + # git actions didn't like this. It says it returns a exit code of 1 ??? works here. + # so we will just copy paste code from Calc_Time + #local actual_duration=$(Calc_Time $1) + + + # split off the seconds and turn it into a a percent. + #readarray -d ":" -t time_array <<< "$actual_duration" + + #local dur_min="${time_array[0]}" + #local dur_sec="${time_array[1]}" + #local num_dur_sec=$((dur_sec)) + + local start_time=$1 + local end_time=`date +%s` + local total_sec=$(( $end_time - $start_time )) + local dur_min=$((total_sec / 60)) + local dur_remainder_sec=$((total_sec % 60)) + local dur_sec_percent=$((100*$dur_remainder_sec/60)) + + if (( $dur_sec_percent < 10 )); then + echo "$dur_min.$dur_sec_percent" + else + echo "$dur_min.$dur_sec_percent" + fi +} + export -f T_total_start export -f Tstart export -f Tcount diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index b69aa339a..276da3741 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -12,14 +12,10 @@ elif [ "$level" = "unit" ]; then z_arg=$tempHucDataDir/nwm_catchments_proj_subset.gpkg fi -## INITIALIZE TOTAL TIME TIMER ## -T_total_start ## MASK LEVEE-PROTECTED AREAS FROM DEM ## if [ "$mask_leveed_area_toggle" = "True" ] && [ -f $tempHucDataDir/LeveeProtectedAreas_subset.gpkg ]; then echo -e $startDiv"Mask levee-protected areas from DEM (*Overwrite dem_meters.tif output) $hucNumber $current_branch_id" - date -u - Tstart python3 $srcDir/mask_dem.py \ -dem $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -nld $tempHucDataDir/LeveeProtectedAreas_subset.gpkg \ @@ -30,34 +26,27 @@ if [ "$mask_leveed_area_toggle" = "True" ] && [ -f $tempHucDataDir/LeveeProtecte -b0 $branch_zero_id \ -csv $tempHucDataDir/levee_levelpaths.csv \ -l $levee_id_attribute - Tcount fi ## D8 FLOW ACCUMULATIONS ## echo -e $startDiv"D8 Flow Accumulations $hucNumber $current_branch_id" -date -u -Tstart python3 $srcDir/accumulate_headwaters.py \ -fd $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ -fa $tempCurrentBranchDataDir/flowaccum_d8_burned_filled_$current_branch_id.tif \ -wg $tempCurrentBranchDataDir/headwaters_$current_branch_id.tif \ -stream $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -thresh 1 -Tcount + ## PREPROCESSING FOR LATERAL THALWEG ADJUSTMENT ### echo -e $startDiv"Preprocessing for lateral thalweg adjustment $hucNumber $current_branch_id" -date -u -Tstart python3 $srcDir/unique_pixel_and_allocation.py \ -s $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -o $tempCurrentBranchDataDir/demDerived_streamPixels_ids_$current_branch_id.tif -Tcount + ## ADJUST THALWEG MINIMUM USING LATERAL ZONAL MINIMUM ## echo -e $startDiv"Performing lateral thalweg adjustment $hucNumber $current_branch_id" -date -u -Tstart python3 $srcDir/adjust_thalweg_lateral.py \ -e $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -s $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ @@ -66,42 +55,31 @@ python3 $srcDir/adjust_thalweg_lateral.py \ -t 50 \ -o $tempCurrentBranchDataDir/dem_lateral_thalweg_adj_$current_branch_id.tif \ -th $thalweg_lateral_elev_threshold -Tcount + ## MASK BURNED DEM FOR STREAMS ONLY ### echo -e $startDiv"Mask Burned DEM for Thalweg Only $hucNumber $current_branch_id" -date -u -Tstart gdal_calc.py --quiet --type=Int32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ -A $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ -B $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ --calc="A/B" \ --outfile="$tempCurrentBranchDataDir/flowdir_d8_burned_filled_flows_$current_branch_id.tif" \ --NoDataValue=0 -Tcount ## FLOW CONDITION STREAMS ## echo -e $startDiv"Flow Condition Thalweg $hucNumber $current_branch_id" -date -u -Tstart $taudemDir/flowdircond -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_flows_$current_branch_id.tif \ -z $tempCurrentBranchDataDir/dem_lateral_thalweg_adj_$current_branch_id.tif \ -zfdc $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif -Tcount ## D8 SLOPES ## echo -e $startDiv"D8 Slopes from DEM $hucNumber $current_branch_id" -date -u -Tstart mpiexec -n $ncores_fd $taudemDir2/d8flowdir \ -fel $tempCurrentBranchDataDir/dem_lateral_thalweg_adj_$current_branch_id.tif \ -sd8 $tempCurrentBranchDataDir/slopes_d8_dem_meters_$current_branch_id.tif -Tcount ## STREAMNET FOR REACHES ## echo -e $startDiv"Stream Net for Reaches $hucNumber $current_branch_id" -date -u -Tstart $taudemDir/streamnet \ -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ -fel $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ @@ -112,12 +90,9 @@ $taudemDir/streamnet \ -coord $tempCurrentBranchDataDir/coordFile_$current_branch_id.txt \ -w $tempCurrentBranchDataDir/sn_catchments_reaches_$current_branch_id.tif \ -net $tempCurrentBranchDataDir/demDerived_reaches_$current_branch_id.shp -Tcount ## SPLIT DERIVED REACHES ## echo -e $startDiv"Split Derived Reaches $hucNumber $current_branch_id" -date -u -Tstart $srcDir/split_flows.py -f $tempCurrentBranchDataDir/demDerived_reaches_$current_branch_id.shp \ -d $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ -s $tempCurrentBranchDataDir/demDerived_reaches_split_$current_branch_id.gpkg \ @@ -127,83 +102,60 @@ $srcDir/split_flows.py -f $tempCurrentBranchDataDir/demDerived_reaches_$current_ -m $max_split_distance_meters \ -t $slope_min \ -b $lakes_buffer_dist_meters -Tcount ## GAGE WATERSHED FOR REACHES ## echo -e $startDiv"Gage Watershed for Reaches $hucNumber $current_branch_id" -date -u -Tstart mpiexec -n $ncores_gw $taudemDir/gagewatershed \ -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$current_branch_id.tif \ -gw $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.tif \ -o $tempCurrentBranchDataDir/demDerived_reaches_split_points_$current_branch_id.gpkg \ -id $tempCurrentBranchDataDir/idFile_$current_branch_id.txt -Tcount ## VECTORIZE FEATURE ID CENTROIDS ## echo -e $startDiv"Vectorize Pixel Centroids $hucNumber $current_branch_id" -date -u -Tstart $srcDir/reachID_grid_to_vector_points.py \ -r $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif \ -i featureID \ -p $tempCurrentBranchDataDir/flows_points_pixels_$current_branch_id.gpkg -Tcount ## GAGE WATERSHED FOR PIXELS ## echo -e $startDiv"Gage Watershed for Pixels $hucNumber $current_branch_id" -date -u -Tstart mpiexec -n $ncores_gw $taudemDir/gagewatershed \ -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_"$current_branch_id".tif \ -gw $tempCurrentBranchDataDir/gw_catchments_pixels_$current_branch_id.tif \ -o $tempCurrentBranchDataDir/flows_points_pixels_$current_branch_id.gpkg \ -id $tempCurrentBranchDataDir/idFile_$current_branch_id.txt -Tcount # D8 REM ## echo -e $startDiv"D8 REM $hucNumber $current_branch_id" -date -u -Tstart $srcDir/make_rem.py -d $tempCurrentBranchDataDir/dem_thalwegCond_"$current_branch_id".tif \ -w $tempCurrentBranchDataDir/gw_catchments_pixels_$current_branch_id.tif \ -o $tempCurrentBranchDataDir/rem_$current_branch_id.tif \ -t $tempCurrentBranchDataDir/demDerived_streamPixels_$current_branch_id.tif -Tcount ## BRING DISTANCE DOWN TO ZERO & MASK TO CATCHMENTS## echo -e $startDiv"Bring negative values in REM to zero and mask to catchments $hucNumber $current_branch_id" -date -u gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ -A $tempCurrentBranchDataDir/rem_$current_branch_id.tif \ -B $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.tif \ --calc="(A*(A>=0)*(B>0))" --NoDataValue=$ndv \ --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" -Tcount ## RASTERIZE LANDSEA (OCEAN AREA) POLYGON (IF APPLICABLE) ## if [ -f $tempHucDataDir/LandSea_subset.gpkg ]; then echo -e $startDiv"Rasterize filtered/dissolved ocean/Glake polygon $hucNumber $current_branch_id" - date -u - Tstart - gdal_rasterize -ot Int32 -burn $ndv -a_nodata $ndv -init 1 -co "COMPRESS=LZW" -co "BIGTIFF=YES" \ + gdal_rasterize -q -ot Int32 -burn $ndv -a_nodata $ndv -init 1 -co "COMPRESS=LZW" -co "BIGTIFF=YES" \ -co "TILED=YES" -te $xmin $ymin $xmax $ymax -ts $ncols $nrows $tempHucDataDir/LandSea_subset.gpkg \ $tempCurrentBranchDataDir/LandSea_subset_$current_branch_id.tif - Tcount fi ## POLYGONIZE REACH WATERSHEDS ## echo -e $startDiv"Polygonize Reach Watersheds $hucNumber $current_branch_id" -date -u -Tstart -gdal_polygonize.py -8 -f GPKG $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.tif \ +gdal_polygonize.py -q -8 -f GPKG $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.tif \ $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.gpkg catchments HydroID -Tcount ## PROCESS CATCHMENTS AND MODEL STREAMS STEP 1 ## echo -e $startDiv"Process catchments and model streams $hucNumber $current_branch_id" -date -u -Tstart python3 $srcDir/filter_catchments_and_add_attributes.py \ -i $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.gpkg \ -f $tempCurrentBranchDataDir/demDerived_reaches_split_$current_branch_id.gpkg \ @@ -211,32 +163,24 @@ python3 $srcDir/filter_catchments_and_add_attributes.py \ -o $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$current_branch_id.gpkg \ -w $tempHucDataDir/wbd8_clp.gpkg \ -u $hucNumber -Tcount ## RASTERIZE NEW CATCHMENTS AGAIN ## echo -e $startDiv"Rasterize filtered catchments $hucNumber $current_branch_id" -date -u -Tstart -gdal_rasterize -ot Int32 -a HydroID -a_nodata 0 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ +gdal_rasterize -q -ot Int32 -a HydroID -a_nodata 0 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax -ts $ncols $nrows \ $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.gpkg \ $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.tif -Tcount ## MASK SLOPE TO CATCHMENTS ## echo -e $startDiv"Mask to slopes to catchments $hucNumber $current_branch_id" -date -u gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ -A $tempCurrentBranchDataDir/slopes_d8_dem_meters_$current_branch_id.tif \ -B $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.tif \ --calc="A*(B>0)" --NoDataValue=$ndv \ --outfile=$tempCurrentBranchDataDir/slopes_d8_dem_meters_masked_$current_branch_id.tif -Tcount ## MAKE CATCHMENT AND STAGE FILES ## echo -e $startDiv"Generate Catchment List and Stage List Files $hucNumber $current_branch_id" -date -u -Tstart $srcDir/make_stages_and_catchlist.py \ -f $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$current_branch_id.gpkg \ -c $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.gpkg \ @@ -245,38 +189,28 @@ $srcDir/make_stages_and_catchlist.py \ -m $stage_min_meters \ -i $stage_interval_meters \ -t $stage_max_meters -Tcount ## MASK REM RASTER TO REMOVE OCEAN AREAS ## if [ -f $tempCurrentBranchDataDir/LandSea_subset_$current_branch_id.tif ]; then echo -e $startDiv"Additional masking to REM raster to remove ocean/Glake areas $hucNumber $current_branch_id" - date -u - Tstart gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ -A $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ -B $tempCurrentBranchDataDir/LandSea_subset_$current_branch_id.tif \ --calc="(A*B)" --NoDataValue=$ndv \ --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" - Tcount fi ## HYDRAULIC PROPERTIES ## echo -e $startDiv"Sample reach averaged parameters $hucNumber $current_branch_id" -date -u -Tstart $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ -catch $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.tif \ -catchlist $tempCurrentBranchDataDir/catch_list_$current_branch_id.txt \ -slp $tempCurrentBranchDataDir/slopes_d8_dem_meters_masked_$current_branch_id.tif \ -h $tempCurrentBranchDataDir/stage_$current_branch_id.txt \ -table $tempCurrentBranchDataDir/src_base_$current_branch_id.csv -Tcount ## FINALIZE CATCHMENTS AND MODEL STREAMS ## echo -e $startDiv"Finalize catchments and model streams $hucNumber $current_branch_id" -date -u -Tstart - python3 $srcDir/add_crosswalk.py \ -d $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_$current_branch_id.gpkg \ -a $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$current_branch_id.gpkg \ @@ -295,13 +229,11 @@ python3 $srcDir/add_crosswalk.py \ -k $tempCurrentBranchDataDir/small_segments_$current_branch_id.csv \ -e $min_catchment_area \ -g $min_stream_length -Tcount + ## EVALUATE CROSSWALK ## if [ "$current_branch_id" = "$branch_zero_id" ] && [ "$evaluateCrosswalk" = "1" ] ; then echo -e $startDiv"Evaluate crosswalk $hucNumber $current_branch_id" - date -u - Tstart python3 $toolsDir/evaluate_crosswalk.py \ -a $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_addedAttributes_crosswalked_$current_branch_id.gpkg \ -b $b_arg \ @@ -309,5 +241,4 @@ if [ "$current_branch_id" = "$branch_zero_id" ] && [ "$evaluateCrosswalk" = "1" -d $tempHucDataDir/nwm_headwater_points_subset.gpkg \ -u $hucNumber \ -z $current_branch_id - Tcount fi diff --git a/src/derive_level_paths.py b/src/derive_level_paths.py index 01a405437..8fc1102dc 100755 --- a/src/derive_level_paths.py +++ b/src/derive_level_paths.py @@ -98,7 +98,7 @@ def Derive_level_paths( reach_id_attribute=reach_id_attribute, toNode_attribute=toNode_attribute, fromNode_attribute=fromNode_attribute, - verbose=True, + verbose=False, ) # derive arbolate sum diff --git a/src/run_by_branch.sh b/src/run_by_branch.sh index c158e3522..53db98bee 100755 --- a/src/run_by_branch.sh +++ b/src/run_by_branch.sh @@ -30,12 +30,14 @@ mkdir -p $tempCurrentBranchDataDir ## START MESSAGE ## echo -e $startDiv"Processing HUC: $hucNumber - branch_id: $current_branch_id" -echo + +## INITIALIZE TOTAL BRANCH TIMER ## +T_total_start +branch_start_time=`date +%s` +date -u ## SUBSET VECTORS echo -e $startDiv"Subsetting vectors to branches $hucNumber $current_branch_id" -date -u -Tstart echo -e "Querying NWM streams ..." ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ $tempCurrentBranchDataDir/nwm_subset_streams_levelPaths_$current_branch_id.gpkg \ @@ -52,48 +54,36 @@ ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute=" # ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ # $tempCurrentBranchDataDir/nwm_headwaters_$current_branch_id.gpkg \ # $tempHucDataDir/nwm_headwaters.gpkg -Tcount ## GET RASTERS FROM ROOT HUC DIRECTORY AND CLIP TO CURRENT BRANCH BUFFER ## echo -e $startDiv"Clipping rasters to branches $hucNumber $current_branch_id" -date -u -Tstart $srcDir/clip_rasters_to_branches.py -d $current_branch_id \ -b $tempHucDataDir/branch_polygons.gpkg \ -i $branch_id_attribute \ -r $tempHucDataDir/dem_meters.tif $tempHucDataDir/flowdir_d8_burned_filled.tif \ - -c $tempCurrentBranchDataDir/dem_meters.tif $tempCurrentBranchDataDir/flowdir_d8_burned_filled.tif \ - -v -Tcount + -c $tempCurrentBranchDataDir/dem_meters.tif $tempCurrentBranchDataDir/flowdir_d8_burned_filled.tif + ## GET RASTER METADATA echo -e $startDiv"Get DEM Metadata $hucNumber $current_branch_id" -date -u -Tstart read fsize ncols nrows ndv xmin ymin xmax ymax cellsize_resx cellsize_resy\ <<<$($srcDir/getRasterInfoNative.py $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif) -Tcount + ## RASTERIZE REACH BOOLEAN (1 & 0) ## echo -e $startDiv"Rasterize Reach Boolean $hucNumber $current_branch_id" -date -u -Tstart -gdal_rasterize -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ +gdal_rasterize -q -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax \ -ts $ncols $nrows $tempCurrentBranchDataDir/nwm_subset_streams_levelPaths_$current_branch_id.gpkg \ $tempCurrentBranchDataDir/flows_grid_boolean_$current_branch_id.tif -Tcount ## RASTERIZE NWM Levelpath HEADWATERS (1 & 0) ## echo -e $startDiv"Rasterize NHD Headwaters $hucNumber $current_branch_id" -date -u -Tstart -gdal_rasterize -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ +gdal_rasterize -q -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax \ -ts $ncols $nrows \ $tempCurrentBranchDataDir/nwm_subset_streams_levelPaths_dissolved_headwaters_$current_branch_id.gpkg \ $tempCurrentBranchDataDir/headwaters_$current_branch_id.tif -Tcount ## PRODUCE THE REM AND OTHER HAND FILE OUTPUTS ## export hucNumber=$hucNumber @@ -112,8 +102,6 @@ $srcDir/delineate_hydros_and_produce_HAND.sh "branch" ## USGS CROSSWALK ## if [ -f $tempHucDataDir/usgs_subset_gages.gpkg ]; then echo -e $startDiv"USGS Crosswalk $hucNumber $current_branch_id" - date -u - Tstart python3 $srcDir/usgs_gage_crosswalk.py \ -gages $tempHucDataDir/usgs_subset_gages.gpkg \ -flows $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$current_branch_id.gpkg \ @@ -122,17 +110,15 @@ if [ -f $tempHucDataDir/usgs_subset_gages.gpkg ]; then -dem_adj $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ -out $tempCurrentBranchDataDir \ -b $current_branch_id - Tcount fi ## REMOVE FILES FROM DENY LIST ## if [ -f $deny_branches_list ]; then echo -e $startDiv"Remove files $hucNumber $current_branch_id" - date -u - Tstart $srcDir/outputs_cleanup.py -d $tempCurrentBranchDataDir -l $deny_branches_list -b $current_branch_id - Tcount fi echo -e $startDiv"End Branch Processing $hucNumber $current_branch_id ..." +date -u +Calc_Duration $branch_start_time echo diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 6c17078fa..ca6c9979a 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -17,10 +17,10 @@ branch_list_lst_file=$tempHucDataDir/branch_ids.lst branchSummaryLogFile=$outputDestDir/logs/branch/"$hucNumber"_summary_branch.log -## INITIALIZE TOTAL TIME TIMER ## +## INITIALIZE TOTAL UNIT AND IT'S BRANCHES TIMER ## T_total_start huc_start_time=`date +%s` - +date -u ## Copy HUC's pre-clipped .gpkg files from $pre_clip_huc_dir (use -a & /. -- only copies folder's contents) echo -e $startDiv"Copying staged wbd and .gpkg files from $pre_clip_huc_dir/$hucNumber" @@ -36,8 +36,6 @@ cp $inputsDir/ahps_sites/nws_lid.gpkg $tempHucDataDir ## DERIVE LEVELPATH ## echo -e $startDiv"Generating Level Paths for $hucNumber" -date -u -Tstart $srcDir/derive_level_paths.py -i $tempHucDataDir/nwm_subset_streams.gpkg \ -s $tempHucDataDir/wbd_buffered_streams.gpkg \ -b $branch_id_attribute \ @@ -62,13 +60,9 @@ $srcDir/derive_level_paths.py -i $tempHucDataDir/nwm_subset_streams.gpkg \ # check if level paths exists levelpaths_exist=1 if [ ! -f $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg ]; then levelpaths_exist=0; fi -Tcount ## ASSOCIATE LEVEL PATHS WITH LEVEES echo -e $startDiv"Associate level paths with levees" -date -u -Tstart - [ -f $tempHucDataDir/nld_subset_levees.gpkg ] && \ python3 $srcDir/associate_levelpaths_with_levees.py -nld $tempHucDataDir/nld_subset_levees.gpkg \ -s $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg \ @@ -78,27 +72,19 @@ python3 $srcDir/associate_levelpaths_with_levees.py -nld $tempHucDataDir/nld_sub -b $branch_id_attribute \ -l $levee_id_attribute -Tcount - ## STREAM BRANCH POLYGONS echo -e $startDiv"Generating Stream Branch Polygons for $hucNumber" -date -u -Tstart $srcDir/buffer_stream_branches.py -a $tempHucDataDir/HUC6_dem_domain.gpkg \ -s $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg \ -i $branch_id_attribute \ -d $branch_buffer_distance_meters \ -b $tempHucDataDir/branch_polygons.gpkg -Tcount ## CREATE BRANCHID LIST FILE echo -e $startDiv"Create list file of branch ids for $hucNumber" -date -u -Tstart $srcDir/generate_branch_list.py -d $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg \ -b $branch_id_attribute \ -o $branch_list_lst_file -Tcount ## CREATE BRANCH ZERO ## echo -e $startDiv"Creating branch zero for $hucNumber" @@ -110,84 +96,60 @@ mkdir -p $tempCurrentBranchDataDir ## CLIP RASTERS echo -e $startDiv"Clipping rasters to branches $hucNumber $branch_zero_id" # Note: don't need to use gdalwarp -cblend as we are using a buffered wbd -date -u -Tstart - [ ! -f $tempCurrentBranchDataDir/dem_meters.tif ] && \ gdalwarp -cutline $tempHucDataDir/wbd_buffered.gpkg -crop_to_cutline -ot Float32 -r bilinear -of "GTiff" \ -overwrite -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "TILED=YES" -co "COMPRESS=LZW" \ - -co "BIGTIFF=YES" -t_srs $DEFAULT_FIM_PROJECTION_CRS $input_DEM $tempHucDataDir/dem_meters.tif - -Tcount + -co "BIGTIFF=YES" -t_srs $DEFAULT_FIM_PROJECTION_CRS $input_DEM $tempHucDataDir/dem_meters.tif -q ## GET RASTER METADATA echo -e $startDiv"Get DEM Metadata $hucNumber $branch_zero_id" -date -u -Tstart read fsize ncols nrows ndv xmin ymin xmax ymax cellsize_resx cellsize_resy\ <<<$($srcDir/getRasterInfoNative.py $tempHucDataDir/dem_meters.tif) ## RASTERIZE NLD MULTILINES ## echo -e $startDiv"Rasterize all NLD multilines using zelev vertices $hucNumber $branch_zero_id" -date -u -Tstart # REMAINS UNTESTED FOR AREAS WITH LEVEES [ -f $tempHucDataDir/3d_nld_subset_levees_burned.gpkg ] && \ -gdal_rasterize -l 3d_nld_subset_levees_burned -3d -at -a_nodata $ndv \ +gdal_rasterize -q -l 3d_nld_subset_levees_burned -3d -at -a_nodata $ndv \ -te $xmin $ymin $xmax $ymax -ts $ncols $nrows \ -ot Float32 -of GTiff -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "COMPRESS=LZW" -co "BIGTIFF=YES" \ -co "TILED=YES" $tempHucDataDir/3d_nld_subset_levees_burned.gpkg \ $tempCurrentBranchDataDir/nld_rasterized_elev_$branch_zero_id.tif -Tcount ## BURN LEVEES INTO DEM ## echo -e $startDiv"Burn nld levees into dem & convert nld elev to meters" echo -e "(*Overwrite dem_meters.tif output) $hucNumber $branch_zero_id" -date -u -Tstart # REMAINS UNTESTED FOR AREAS WITH LEVEES [ -f $tempCurrentBranchDataDir/nld_rasterized_elev_$branch_zero_id.tif ] && \ python3 $srcDir/burn_in_levees.py \ -dem $tempHucDataDir/dem_meters.tif \ -nld $tempCurrentBranchDataDir/nld_rasterized_elev_$branch_zero_id.tif \ -out $tempHucDataDir/dem_meters.tif -Tcount ## RASTERIZE REACH BOOLEAN (1 & 0) - BRANCH 0 (include all NWM streams) ## echo -e $startDiv"Rasterize Reach Boolean $hucNumber $branch_zero_id" -date -u -Tstart -gdal_rasterize -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ +gdal_rasterize -q -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax -ts $ncols $nrows \ $tempHucDataDir/nwm_subset_streams.gpkg $tempCurrentBranchDataDir/flows_grid_boolean_$branch_zero_id.tif -Tcount ## RASTERIZE REACH BOOLEAN (1 & 0) - BRANCHES (Not 0) (NWM levelpath streams) ## if [ "$levelpaths_exist" = "1" ]; then echo -e $startDiv"Rasterize Reach Boolean $hucNumber (Branches)" - date -u - Tstart - gdal_rasterize -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ + gdal_rasterize -q -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax -ts $ncols $nrows \ $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg $tempHucDataDir/flows_grid_boolean.tif - Tcount fi ## RASTERIZE NWM Levelpath HEADWATERS (1 & 0) ## echo -e $startDiv"Rasterize NWM Headwaters $hucNumber $branch_zero_id" -date -u -Tstart -gdal_rasterize -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ +gdal_rasterize -q -ot Int32 -burn 1 -init 0 -co "COMPRESS=LZW" -co "BIGTIFF=YES" -co "TILED=YES" \ -te $xmin $ymin $xmax $ymax -ts $ncols $nrows \ $tempHucDataDir/nwm_headwater_points_subset.gpkg $tempCurrentBranchDataDir/headwaters_$branch_zero_id.tif -Tcount ## DEM Reconditioning - BRANCH 0 (include all NWM streams) ## # Using AGREE methodology, hydroenforce the DEM so that it is consistent with the supplied stream network. # This allows for more realistic catchment delineation which is ultimately reflected in the output FIM mapping. echo -e $startDiv"Creating AGREE DEM using $agree_DEM_buffer meter buffer $hucNumber $branch_zero_id" -date -u -Tstart python3 $srcDir/agreedem.py \ -r $tempCurrentBranchDataDir/flows_grid_boolean_$branch_zero_id.tif \ -d $tempHucDataDir/dem_meters.tif \ @@ -196,15 +158,12 @@ python3 $srcDir/agreedem.py \ -b $agree_DEM_buffer \ -sm 10 \ -sh 1000 -Tcount ## DEM Reconditioning - BRANCHES (NOT 0) (NWM levelpath streams) ## # Using AGREE methodology, hydroenforce the DEM so that it is consistent with the supplied stream network. # This allows for more realistic catchment delineation which is ultimately reflected in the output FIM mapping. if [ "$levelpaths_exist" = "1" ]; then echo -e $startDiv"Creating AGREE DEM using $agree_DEM_buffer meter buffer $hucNumber (Branches)" - date -u - Tstart python3 $srcDir/agreedem.py -r $tempHucDataDir/flows_grid_boolean.tif \ -d $tempHucDataDir/dem_meters.tif \ -w $tempHucDataDir \ @@ -212,52 +171,37 @@ if [ "$levelpaths_exist" = "1" ]; then -b $agree_DEM_buffer \ -sm 10 \ -sh 1000 - Tcount fi ## PIT REMOVE BURNED DEM - BRANCH 0 (include all NWM streams) ## echo -e $startDiv"Pit remove Burned DEM $hucNumber $branch_zero_id" -date -u -Tstart rd_depression_filling $tempCurrentBranchDataDir/dem_burned_$branch_zero_id.tif \ $tempCurrentBranchDataDir/dem_burned_filled_$branch_zero_id.tif -Tcount ## PIT REMOVE BURNED DEM - BRANCHES (NOT 0) (NWM levelpath streams) ## if [ "$levelpaths_exist" = "1" ]; then echo -e $startDiv"Pit remove Burned DEM $hucNumber (Branches)" - date -u - Tstart rd_depression_filling $tempHucDataDir/dem_burned.tif $tempHucDataDir/dem_burned_filled.tif - Tcount fi ## D8 FLOW DIR - BRANCH 0 (include all NWM streams) ## echo -e $startDiv"D8 Flow Directions on Burned DEM $hucNumber $branch_zero_id" -date -u -Tstart mpiexec -n $ncores_fd $taudemDir2/d8flowdir \ -fel $tempCurrentBranchDataDir/dem_burned_filled_$branch_zero_id.tif \ -p $tempCurrentBranchDataDir/flowdir_d8_burned_filled_$branch_zero_id.tif -Tcount ## D8 FLOW DIR - BRANCHES (NOT 0) (NWM levelpath streams) ## if [ "$levelpaths_exist" = "1" ]; then echo -e $startDiv"D8 Flow Directions on Burned DEM $hucNumber (Branches)" - date -u - Tstart mpiexec -n $ncores_fd $taudemDir2/d8flowdir \ -fel $tempHucDataDir/dem_burned_filled.tif \ -p $tempHucDataDir/flowdir_d8_burned_filled.tif - Tcount fi ## MAKE A COPY OF THE DEM FOR BRANCH 0 echo -e $startDiv"Copying DEM to Branch 0" -date -u -Tstart cp $tempHucDataDir/dem_meters.tif $tempCurrentBranchDataDir/dem_meters_$branch_zero_id.tif -Tcount + ## PRODUCE THE REM AND OTHER HAND FILE OUTPUTS ## export hucNumber=$hucNumber @@ -278,8 +222,6 @@ $srcDir/delineate_hydros_and_produce_HAND.sh "unit" ## CREATE USGS GAGES FILE if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then echo -e $startDiv"Assigning USGS gages to branches for $hucNumber" - date -u - Tstart python3 $srcDir/usgs_gage_unit_setup.py \ -gages $tempHucDataDir/usgs_gages.gpkg \ -nwm $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg \ @@ -288,14 +230,11 @@ if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then -huc $hucNumber \ -ahps $tempHucDataDir/nws_lid.gpkg \ -bzero_id $branch_zero_id - Tcount fi ## USGS CROSSWALK ## if [ -f $tempHucDataDir/usgs_subset_gages_$branch_zero_id.gpkg ]; then echo -e $startDiv"USGS Crosswalk $hucNumber $branch_zero_id" - date -u - Tstart python3 $srcDir/usgs_gage_crosswalk.py \ -gages $tempHucDataDir/usgs_subset_gages_$branch_zero_id.gpkg \ -flows $tempCurrentBranchDataDir/demDerived_reaches_split_filtered_$branch_zero_id.gpkg \ @@ -303,7 +242,6 @@ if [ -f $tempHucDataDir/usgs_subset_gages_$branch_zero_id.gpkg ]; then -dem $tempCurrentBranchDataDir/dem_meters_$branch_zero_id.tif \ -dem_adj $tempCurrentBranchDataDir/dem_thalwegCond_$branch_zero_id.tif \ -out $tempCurrentBranchDataDir -b $branch_zero_id - Tcount fi ## CLEANUP BRANCH ZERO OUTPUTS ## @@ -322,10 +260,13 @@ echo "---- Start of branch processing for $hucNumber" branch_processing_start_time=`date +%s` if [ -f $branch_list_lst_file ]; then + date -u + Tstart # There may not be a branch_ids.lst if there were no level paths (no stream orders 3+) # but there will still be a branch zero - parallel --eta --timeout $branch_timeout -j $jobBranchLimit --joblog $branchSummaryLogFile --colsep ',' \ + parallel --timeout $branch_timeout -j $jobBranchLimit --joblog $branchSummaryLogFile --colsep ',' \ -- $srcDir/process_branch.sh $runName $hucNumber :::: $branch_list_lst_file + Tcount else echo "No level paths exist with this HUC. Processing branch zero only." fi @@ -344,7 +285,8 @@ Calc_Duration $branch_processing_start_time echo # WRITE TO LOG FILE CONTAINING ALL HUC PROCESSING TIMES -echo "$hucNumber, $(Calc_Time $huc_start_time)" >> "$outputDestDir/logs/unit/total_duration_run_by_unit_all_HUCs.csv" +total_duration_display="$hucNumber,$(Calc_Time $huc_start_time),$(Calc_Time_Minutes_in_Percent $huc_start_time)" +echo "$total_duration_display" >> "$outputDestDir/logs/unit/total_duration_run_by_unit_all_HUCs.csv" date -u echo "---- HUC processing for $hucNumber is complete" diff --git a/src/split_flows.py b/src/split_flows.py index b44d59deb..5c47d4ae2 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -22,7 +22,6 @@ from shapely import ops, wkt from shapely.geometry import LineString, Point from shapely.ops import split as shapely_ops_split -from tqdm import tqdm import build_stream_traversal from utils.fim_enums import FIM_exit_codes @@ -202,7 +201,7 @@ def snap_and_trim_flow(snapped_point, flows): print("No relevant streams within HUC boundaries.") sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # will send a 61 back - for i, lineString in tqdm(enumerate(flows.geometry), total=len(flows.geometry)): + for i, lineString in enumerate(flows.geometry): # Reverse geometry order (necessary for BurnLines) lineString = LineString(lineString.coords[::-1]) From b7f81386d54172b8fda224d47cde7a62c8dd00b2 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Fri, 16 Feb 2024 17:21:26 +0000 Subject: [PATCH 25/51] v4.4.10.1 Fix return error status from pre-processing and remove CPU test (#1075) --- docs/CHANGELOG.md | 17 +++++++++++++++++ fim_post_processing.sh | 2 ++ fim_pre_processing.sh | 20 ++++++++------------ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 9760431b2..d8c074dbb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,23 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.10.1 - 2024-02-16 - [PR#1075](https://github.com/NOAA-OWP/inundation-mapping/pull/1075) + +We recently added code to fim_pre_processing.sh that checks the CPU count. Earlier this test was being done in post-processing and was killing a pipeline that had already been running for a while. + +Fix: +- Removed the CPU test from pre-processing. This puts us back to it possibly failing in post-processing but we have to leave it for now. +- Exit status codes (non 0) are now returned in pre-processing and post-processing when an error has occurred. + +Tested that the a non zero return exit from pre-processing shuts down the AWS step functions. + +### Changes +- `fim_pre_processing.sh`: added non zero exit codes when in error, plus removed CPU test +- `fim_post_processing.sh`: added non zero exit codes when in error + +

+ + ## v4.4.10.0 - 2024-02-02 - [PR#1054](https://github.com/NOAA-OWP/inundation-mapping/pull/1054) Recent testing exposed a bug with the `acquire_and_preprocess_3dep_dems.py` script. It lost the ability to be re-run and look for files that were unsuccessful earlier attempts and try them again. It may have been lost due to confusion of the word "retry". Now "retry" means restart the entire run. A new flag called "repair" has been added meaning fix what failed earlier. This is a key feature it is common for communication failures when calling USGS to download DEMs. And with some runs taking many hours, this feature becomes important. diff --git a/fim_post_processing.sh b/fim_post_processing.sh index a157db6f6..9a176e695 100755 --- a/fim_post_processing.sh +++ b/fim_post_processing.sh @@ -46,6 +46,7 @@ if [ "$runName" = "" ] then echo "ERROR: Missing -n run time name argument" usage + exit 22 fi outputDestDir=$outputsDir/$runName @@ -217,6 +218,7 @@ Tcount date -u find $outputDestDir -type d -exec chmod -R 777 {} + +find $outputDestDir -type f -exec chmod -R 777 {} + echo echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" diff --git a/fim_pre_processing.sh b/fim_pre_processing.sh index f8453c8e3..0846b522e 100755 --- a/fim_pre_processing.sh +++ b/fim_pre_processing.sh @@ -46,7 +46,6 @@ usage() -skipcal : If this param is included, the S.R.C. will be updated via the calibration points. will be skipped. " - exit } set -e @@ -104,16 +103,20 @@ in shift done +# exit 22 means bad argument + # print usage if arguments empty if [ "$hucList" = "" ] then echo "ERROR: Missing -u Huclist argument" usage + exit 22 fi if [ "$runName" = "" ] then echo "ERROR: Missing -n run time name argument" usage + exit 22 fi # outputsDir & workDir come from the Dockerfile @@ -137,6 +140,7 @@ then # NONE is not case sensitive echo "Error: The -ud does not exist and is not the word NONE" usage + exit 22 fi # validate and set defaults for the deny lists @@ -148,6 +152,7 @@ then # NONE is not case sensitive echo "Error: The -bd does not exist and is not the word NONE" usage + exit 22 fi # We do a 1st cleanup of branch zero using branchZeroDenylist (which might be none). @@ -164,6 +169,7 @@ then then echo "Error: The -zd does not exist and is not the word NONE" usage + exit 22 else # only if the deny branch zero has been overwritten and file exists has_deny_branch_zero_override=1 @@ -178,17 +184,7 @@ if [ -d $outputDestDir ] && [ $overwrite -eq 0 ]; then echo "ERROR: Output dir $outputDestDir exists. Use overwrite -o to run." echo usage -fi - -# Test to ensure we are not overuseing cores -num_available_cores=$(echo $(grep -c processor /proc/cpuinfo)) -let total_requested_jobs=$jobHucLimit*$jobBranchLimit -if [[ $total_requested_jobs -gt $num_available_cores ]]; then - echo - echo "ERROR: There are $num_available_cores available, but -jh (jobHucLimit) * -jb (jobBranchLimit)"\ - "exceed the number of available cores" - echo - usage + exit 22 fi ## SOURCE ENV FILE AND FUNCTIONS ## From 073e4a30d4ea92e53453220c9cbff68942650bbe Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 16 Feb 2024 10:24:24 -0700 Subject: [PATCH 26/51] v4.4.11.0 Replace fiona with pyogrio (#1077) --- Pipfile | 5 +- Pipfile.lock | 455 ++++++++++-------- data/bathymetry/preprocess_bathymetry.py | 4 +- .../create_flow_forecast_file.py | 3 + data/esri.py | 3 + data/nld/levee_download.py | 3 + data/usgs/acquire_and_preprocess_3dep_dems.py | 3 + data/wbd/clip_vectors_to_wbd.py | 4 +- data/wbd/preprocess_wbd.py | 3 + data/write_parquet_from_calib_pts.py | 3 + docs/CHANGELOG.md | 20 + src/add_crosswalk.py | 10 +- src/associate_levelpaths_with_levees.py | 3 + src/bash_variables.env | 3 + src/bathy_rc_adjust.py | 3 + src/bathymetric_adjustment.py | 8 +- src/buffer_stream_branches.py | 3 + src/build_stream_traversal.py | 3 + src/crosswalk_nwm_demDerived.py | 3 + src/derive_headwaters.py | 3 + src/derive_level_paths.py | 3 + src/edit_points.py | 3 + src/filter_catchments_and_add_attributes.py | 3 + src/finalize_srcs.py | 5 +- src/make_stages_and_catchlist.py | 4 +- src/mask_dem.py | 3 + src/reachID_grid_to_vector_points.py | 3 + src/split_flows.py | 3 + src/src_adjust_spatial_obs.py | 3 + src/src_roughness_optimization.py | 3 + src/stream_branches.py | 4 +- src/subset_catch_list_by_branch_id.py | 3 + src/usgs_gage_crosswalk.py | 2 + src/usgs_gage_unit_setup.py | 2 + src/utils/shared_functions.py | 3 + tools/adjust_rc_with_feedback.py | 3 + tools/check_deep_flooding.py | 3 + tools/create_flow_forecast_file.py | 3 + tools/eval_plots.py | 3 + tools/evaluate_continuity.py | 3 + tools/evaluate_crosswalk.py | 3 + tools/fimr_to_benchmark.py | 3 + tools/find_max_catchment_breadth.py | 3 + tools/generate_categorical_fim.py | 3 + tools/generate_categorical_fim_flows.py | 3 + tools/generate_categorical_fim_mapping.py | 3 + tools/generate_nws_lid.py | 3 + tools/hash_compare.py | 3 + tools/inundate_events.py | 3 + tools/inundation.py | 3 + tools/make_boxes_from_bounds.py | 4 +- tools/mosaic_inundation.py | 2 + tools/overlapping_inundation.py | 3 + tools/rating_curve_comparison.py | 3 + tools/rating_curve_get_usgs_curves.py | 3 + tools/test_case_by_hydro_id.py | 3 + tools/tools_shared_functions.py | 3 + 57 files changed, 428 insertions(+), 230 deletions(-) diff --git a/Pipfile b/Pipfile index 97bac2944..5aee10468 100644 --- a/Pipfile +++ b/Pipfile @@ -9,7 +9,7 @@ ipython = "==8.12.0" [packages] certifi = "==2023.7.22" fiona = "==1.8.22" -geopandas = "==0.12.2" +geopandas = "==0.14.3" numba = "==0.56.4" numpy = "==1.23.5" pandas = "==2.0.2" @@ -43,8 +43,9 @@ flake8-pyproject = "==1.2.3" pre-commit = "==3.3.3" isort = "==5.12.0" urllib3 = "==1.26.18" -pyflwdir = "*" +pyflwdir = "==0.5.8" pillow = "==10.2.0" +pyogrio = "==0.7.2" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 61248b1d8..0c47c4a04 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5f29b79268530835205eb8a550b43c847acfcb16ede4de1a6dc1d22c176f5ac1" + "sha256": "a3ed6a563de9000738a1df55a5cbce4a7584fcee0725bf71f917916edf6eef3b" }, "pipfile-spec": 6, "requires": { @@ -21,7 +21,7 @@ "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.4.0" }, "aiofiles": { @@ -29,7 +29,7 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version < '4' and python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==22.1.0" }, "aiosqlite": { @@ -37,7 +37,7 @@ "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d", "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.19.0" }, "anyio": { @@ -60,7 +60,7 @@ "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==23.1.0" }, "argon2-cffi-bindings": { @@ -110,7 +110,7 @@ "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==23.2.0" }, "babel": { @@ -118,7 +118,7 @@ "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.14.0" }, "beautifulsoup4": { @@ -189,7 +189,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4'", + "markers": "python_version >= '3.8' and python_version < '4.0'", "version": "==2.0.0" }, "boto3": { @@ -205,7 +205,7 @@ "sha256:6f35d59e230095aed7cd747604fe248fa384bebb7d09549077892f936a8ca3df", "sha256:988b948be685006b43c4bbd8f5c0cb93e77c66deb70561994e0c5b31b5a67210" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.29.165" }, "brotli": { @@ -302,7 +302,7 @@ "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2", "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==5.3.2" }, "certifi": { @@ -499,7 +499,7 @@ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.3.2" }, "click": { @@ -507,7 +507,7 @@ "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==8.1.7" }, "click-plugins": { @@ -522,7 +522,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", "version": "==0.7.2" }, "cloudpickle": { @@ -697,27 +697,31 @@ }, "debugpy": { "hashes": [ - "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332", - "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0", - "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f", - "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa", - "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6", - "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637", - "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6", - "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8", - "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb", - "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b", - "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4", - "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153", - "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f", - "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd", - "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595", - "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926", - "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e", - "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada" + "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb", + "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146", + "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8", + "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242", + "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0", + "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741", + "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539", + "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23", + "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3", + "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39", + "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd", + "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9", + "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace", + "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42", + "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0", + "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7", + "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e", + "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234", + "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98", + "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703", + "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42", + "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099" ], "markers": "python_version >= '3.8'", - "version": "==1.8.0" + "version": "==1.8.1" }, "decorator": { "hashes": [ @@ -831,51 +835,51 @@ }, "fonttools": { "hashes": [ - "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e", - "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37", - "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac", - "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae", - "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b", - "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc", - "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b", - "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07", - "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70", - "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71", - "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df", - "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6", - "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1", - "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670", - "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7", - "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6", - "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635", - "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899", - "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50", - "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9", - "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085", - "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb", - "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c", - "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3", - "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184", - "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8", - "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506", - "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c", - "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c", - "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b", - "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0", - "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c", - "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa", - "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f", - "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4", - "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c", - "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1", - "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946", - "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d", - "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952", - "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703", - "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8" + "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252", + "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea", + "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4", + "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e", + "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac", + "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61", + "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e", + "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d", + "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348", + "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee", + "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199", + "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01", + "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2", + "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81", + "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814", + "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070", + "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68", + "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5", + "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7", + "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f", + "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a", + "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1", + "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e", + "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a", + "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092", + "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31", + "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7", + "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48", + "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2", + "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec", + "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a", + "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f", + "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5", + "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0", + "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d", + "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a", + "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738", + "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95", + "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e", + "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124", + "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784", + "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703" ], "markers": "python_version >= '3.8'", - "version": "==4.47.2" + "version": "==4.48.1" }, "fqdn": { "hashes": [ @@ -886,11 +890,11 @@ }, "fsspec": { "hashes": [ - "sha256:8548d39e8810b59c38014934f6b31e57f40c1b20f911f4cc2b85389c7e9bf0cb", - "sha256:d800d87f72189a745fa3d6b033b9dc4a34ad069f60ca60b943a63599f5501960" + "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8", + "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84" ], "markers": "python_version >= '3.8'", - "version": "==2023.12.2" + "version": "==2024.2.0" }, "geocube": { "hashes": [ @@ -905,23 +909,23 @@ "sha256:6b7225248e45ff7edcee32becc4e0a1504c606ac5ee163a5656d482e0cd38734", "sha256:f7f41c85dc3e1c2d3d935ec86660dc3b2c848c83e17f9a9e51ba9d5146a15859" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.0" }, "geopandas": { "hashes": [ - "sha256:0a470e4bf6f5367e6fd83ab6b40405e0b805c8174665bbcb7c4077ed90202912", - "sha256:0acdacddefa176525e4da6d9aeeece225da26055c4becdc6e97cf40fa97c27f4" + "sha256:41b31ad39e21bc9e8c4254f78f8dc4ce3d33d144e22e630a00bb336c83160204", + "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac" ], "index": "pypi", - "version": "==0.12.2" + "version": "==0.14.3" }, "geopy": { "hashes": [ "sha256:50283d8e7ad07d89be5cb027338c6365a32044df3ae2556ad3f52f4840b3d0d1", "sha256:ae8b4bc5c1131820f4d75fce9d4aaaca0c85189b3aa5d64c3dcaf5e3b7b882a7" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.4.1" }, "gval": { @@ -934,11 +938,11 @@ }, "identify": { "hashes": [ - "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d", - "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34" + "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed", + "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d" ], "markers": "python_version >= '3.8'", - "version": "==2.5.33" + "version": "==2.5.34" }, "idna": { "hashes": [ @@ -1012,7 +1016,7 @@ "sha256:f5924499dc8800928c0ee4580fa8eb4ffa880b2cce4431537d0390e503a9c9ee", "sha256:f79542478e49e471e8b23556700e6f688a40dc93e9a746f77a546c13251b59b1" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.0.0" }, "iniconfig": { @@ -1020,16 +1024,16 @@ "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.0.0" }, "ipykernel": { "hashes": [ - "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f", - "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f" + "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0", + "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055" ], "markers": "python_version >= '3.8'", - "version": "==6.29.0" + "version": "==6.29.2" }, "ipympl": { "hashes": [ @@ -1056,11 +1060,11 @@ }, "ipywidgets": { "hashes": [ - "sha256:2b88d728656aea3bbfd05d32c747cfd0078f9d7e159cf982433b58ad717eed7f", - "sha256:40211efb556adec6fa450ccc2a77d59ca44a060f4f9f136833df59c9f538e6e8" + "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60", + "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==8.1.1" + "markers": "python_version >= '3.7'", + "version": "==8.1.2" }, "isoduration": { "hashes": [ @@ -1090,7 +1094,7 @@ "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.1.3" }, "jmespath": { @@ -1098,7 +1102,7 @@ "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.0.1" }, "joblib": { @@ -1106,7 +1110,7 @@ "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.3.2" }, "json5": { @@ -1156,7 +1160,7 @@ "sha256:214668aaea208195f4c13d28eb272ba79f945fc0cf3f11c7092c20b2ca1980e7", "sha256:52be28e04171f07aed8f20e1616a5a552ab9fee9cbbe6c1896ae170c3880d392" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==7.4.9" }, "jupyter-console": { @@ -1164,7 +1168,7 @@ "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==6.6.3" }, "jupyter-core": { @@ -1196,7 +1200,7 @@ "sha256:7486bca3acf9bbaab7ce5127f9f64d2df58f5d2de377609fb833291a7217a6a2", "sha256:76dd05a45b78c7ec0cba0be98ece289984c6bcfc1ca2da216d42930e506a4d68" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.9.1" }, "jupyter-server-terminals": { @@ -1212,7 +1216,7 @@ "sha256:969a3a1a77ed4e99487d60a74048dc9fa7d3b0dcd32e60885d835bbf7ba7be11", "sha256:a6fe125091792d16c962cc3720c950c2b87fcc8c3ecf0c54c84e9a20b814526c" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.8.0" }, "jupyter-ydoc": { @@ -1220,7 +1224,7 @@ "sha256:5759170f112c70320a84217dd98d287699076ae65a7f88d458d57940a9f2b882", "sha256:5a02ca7449f0d875f73e8cb8efdf695dddef15a8e71378b1f4eda6b7c90f5382" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.2.5" }, "jupyterlab": { @@ -1249,11 +1253,11 @@ }, "jupyterlab-widgets": { "hashes": [ - "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d", - "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c" + "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0", + "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.9" + "markers": "python_version >= '3.7'", + "version": "==3.0.10" }, "kiwisolver": { "hashes": [ @@ -1362,7 +1366,7 @@ "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.4.5" }, "llvmlite": { @@ -1396,7 +1400,7 @@ "sha256:fa9b26939ae553bf30a9f5c4c754db0fb2d2677327f2511e674aa2f5df941789", "sha256:fb62fc7016b592435d3e3a8f680e3ea8897c3c9e62e6e6cc58011e7a4801439e" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.39.1" }, "locket": { @@ -1409,69 +1413,69 @@ }, "markupsafe": { "hashes": [ - "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69", - "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0", - "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d", - "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec", - "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5", - "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411", - "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3", - "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74", - "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0", - "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949", - "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d", - "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279", - "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f", - "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6", - "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc", - "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e", - "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954", - "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656", - "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc", - "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518", - "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56", - "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc", - "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa", - "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565", - "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4", - "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb", - "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250", - "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4", - "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959", - "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc", - "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474", - "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863", - "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8", - "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f", - "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2", - "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e", - "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e", - "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb", - "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f", - "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a", - "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26", - "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d", - "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2", - "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131", - "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789", - "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6", - "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a", - "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858", - "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e", - "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb", - "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e", - "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84", - "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7", - "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea", - "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b", - "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6", - "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475", - "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74", - "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a", - "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==2.1.4" + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" }, "matplotlib": { "hashes": [ @@ -1548,7 +1552,7 @@ "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.2" }, "morecantile": { @@ -1673,7 +1677,7 @@ "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3", "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.0.0" }, "nbclient": { @@ -1686,11 +1690,11 @@ }, "nbconvert": { "hashes": [ - "sha256:a7f8808fd4e082431673ac538400218dd45efd076fbeb07cc6e5aa5a3a4e949e", - "sha256:db28590cef90f7faf2ebbc71acd402cbecf13d29176df728c0a9025a49345ea1" + "sha256:813e6553796362489ae572e39ba1bff978536192fb518e10826b0e8cadf03ec8", + "sha256:ad3dc865ea6e2768d31b7eb6c7ab3be014927216a5ece3ef276748dd809054c7" ], "markers": "python_version >= '3.8'", - "version": "==7.14.2" + "version": "==7.16.0" }, "nbformat": { "hashes": [ @@ -1754,7 +1758,7 @@ "sha256:b4625a4b7a597839dd3156b140d5ba2c7123761f98245a3290f67a8b8ee048d9", "sha256:c1e2eb2e3b6079a0552a04974883a48d04c3c05792170d64a4b23d707d453181" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==6.5.6" }, "notebook-shim": { @@ -1762,7 +1766,7 @@ "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7", "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.2.3" }, "numba": { @@ -1897,7 +1901,7 @@ "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==23.2" }, "pandas": { @@ -1936,7 +1940,7 @@ "sha256:1cc70f5f182f5b4bd2e248f49372fcd88eba8423b8604ea9e1ebd64222730a41", "sha256:1cf13c06068d64edb1630b0e50d6588243b7c202d7ce00d968fe3d6bef7684f8" ], - "markers": "python_version < '3.12' and python_full_version >= '3.7.0'", + "markers": "python_version < '3.12' and python_version >= '3.7'", "version": "==0.15.1" }, "pandocfilters": { @@ -1968,7 +1972,7 @@ "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6", "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.4.1" }, "pathspec": { @@ -2098,7 +2102,7 @@ "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.43" }, "psutil": { @@ -2368,7 +2372,7 @@ "sha256:a4038a8885059ab8cac6f946ea30e0b5e6bdbe0b92b6723f06737035f9d65e8c", "sha256:dd9f4ac5cbd8e37c352c04036062d3c5f67efec76d404761ef16b0cbf26aa6a0" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.5.0" }, "pydantic": { @@ -2410,7 +2414,7 @@ "sha256:f3d4ee957a727ccb5a36f1b0a6dbd9fad5dedd2a41eada99a8df55c12896e18d", "sha256:f79db3652ed743309f116ba863dae0c974a41b688242482638b892246b7db21d" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.10.10" }, "pyflakes": { @@ -2434,9 +2438,40 @@ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.17.2" }, + "pyogrio": { + "hashes": [ + "sha256:1b7197c72f034ac7187da2a8d50a063a5f1256aab732b154f11f887a7652dc3d", + "sha256:234b0d1d22e9680229b0618c25077a0cb2428cbbc2939b4bb9bdd8ee77e0f3e0", + "sha256:3001efd5dfee36459d0cfdafbe91ed88fc5ae734353d771cdb75546ef1427735", + "sha256:31112bb0b6a4a3f80ec3252d7eeb7be81045860d49fd76e297c073759450652b", + "sha256:33ae5aafcf3a557e107a33f5b3e878750d2e467b8cc911dc4bf261c1a602b534", + "sha256:33afb7d211c6434613f24174722347a5cb11d22a212f28c817f67c89d30d0c0d", + "sha256:429dcff4c36f0e0a15ba4a20f2d4478b9c6d095e70c4bcc007a536ea420a1a93", + "sha256:436de39f57e8f8cc41682981518b9490d64d3a1c48bf78d415e5747c296790dc", + "sha256:5654e7c33442cbd98e7a56f705e160415d7503b2420d724d4f81b8cc88360b3e", + "sha256:5feeb7a0da7ee82580f6aa6508a80602413675b99c60c822929e0e8b925e0517", + "sha256:73577fecebeecf0d06e78c1a4bddd460a4d57c6d918affab7594c0bc72f5fa14", + "sha256:7e2c856961efdc6cb3809b97b49016cbbcee17c8a1e85fc4000b5fcb3cfcb9b1", + "sha256:7e39bb6bfdd74e63ae96acced7297bbe8a157f85c0107f1cbb395d2a937f3a38", + "sha256:860b04ddf23b8c253ceb3621e4b0e0dc0f293eab66cb14f799a5c9f9fe0a882c", + "sha256:892fdab0e1c44c0125254d92928081c14f93ac553f371addc2c9a1d4bde41cad", + "sha256:9cc6db2e5dc50dfe23554d10502920eafa0648c365725e552aaa523432a9bf35", + "sha256:a23136d1bffa9d811263807b850c6e9854201710276f09de650131e89f2486aa", + "sha256:b9a8a4854c7af2c76683ce5666ee765b207901b362576465219d75deb6159821", + "sha256:ba386a02c9b5934c568b40acc95c9863f92075f6990167635e51368976569c66", + "sha256:be46be43c4148a3ad09da38670411485ec544a51cbd6b7d004a0eca5035023fc", + "sha256:bee556ca305b7e8c68aada259d925c612131205074fb2373badafacbef610b77", + "sha256:caaf61d473ac207f170082e602ea57c096e8dd4c4be51de58fba96f1a5944096", + "sha256:d5fc2304aeb927564f77caaa4da9a47e2d77a8ceb1c624ea84c505140886b221", + "sha256:f219c1edb010d0248891a3d27d15faf17c91cfe69daef84d7471e22e4ed4fcff", + "sha256:f2ff58184020da39540a2f5d4a5412005a01b0c4cd03c7b8294bc670d1f3fe50" + ], + "index": "pypi", + "version": "==0.7.2" + }, "pyparsing": { "hashes": [ "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", @@ -2604,10 +2639,10 @@ }, "pytz": { "hashes": [ - "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40", - "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "version": "==2023.4" + "version": "==2024.1" }, "pyyaml": { "hashes": [ @@ -2889,7 +2924,7 @@ "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.4.1" }, "rasterio": { @@ -2936,7 +2971,7 @@ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.31.0" }, "rfc3339-validator": { @@ -3151,7 +3186,7 @@ "sha256:b014be3a8a2aab98cfe1abc7229cc5a9a0cf05eb9c1f2b86b230fd8df3f78084", "sha256:cab66d3380cca3e70939ef2255d01cd8aece6a4907a9528740f668c4b0611861" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.6.2" }, "scipy": { @@ -3199,11 +3234,11 @@ }, "setuptools": { "hashes": [ - "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", - "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" + "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401", + "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6" ], "markers": "python_version >= '3.8'", - "version": "==69.0.3" + "version": "==69.1.0" }, "shapely": { "hashes": [ @@ -3366,7 +3401,7 @@ "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.3.0" }, "snuggs": { @@ -3434,7 +3469,7 @@ "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==1.2.1" }, "tomli": { @@ -3450,7 +3485,7 @@ "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.12.1" }, "tornado": { @@ -3519,11 +3554,11 @@ }, "tzdata": { "hashes": [ - "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", - "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" + "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", + "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" ], "markers": "python_version >= '2'", - "version": "==2023.4" + "version": "==2024.1" }, "uri-template": { "hashes": [ @@ -3545,7 +3580,7 @@ "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==20.25.0" }, "wcwidth": { @@ -3587,11 +3622,11 @@ }, "widgetsnbextension": { "hashes": [ - "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385", - "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175" + "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f", + "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc" ], - "markers": "python_full_version >= '3.7.0'", - "version": "==4.0.9" + "markers": "python_version >= '3.7'", + "version": "==4.0.10" }, "wrapt": { "hashes": [ @@ -3682,7 +3717,7 @@ "sha256:8a356ac66a61ff9522453194db5d184e1eccee8ab890c7ec723bb48c6eafd392", "sha256:fd7e3b447236f6e8f8c5110684a7ca50f97149c806f56ebf4ed1eeef1dd681ce" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.3.5" }, "xyzservices": { @@ -3777,7 +3812,7 @@ "sha256:43a001473f5c8abcf182f603049cf305cbc855ad8deaa9dfa0f3b5a7cea9d0ff", "sha256:b1ba0dfcc9762f0ca168d2378062d3ca1299d39076b0f145d961359121042be5" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==0.8.4" }, "zipp": { @@ -3872,7 +3907,7 @@ "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==3.0.43" }, "ptyprocess": { @@ -3895,7 +3930,7 @@ "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], - "markers": "python_full_version >= '3.7.0'", + "markers": "python_version >= '3.7'", "version": "==2.17.2" }, "six": { diff --git a/data/bathymetry/preprocess_bathymetry.py b/data/bathymetry/preprocess_bathymetry.py index f4788c996..aeda133c1 100644 --- a/data/bathymetry/preprocess_bathymetry.py +++ b/data/bathymetry/preprocess_bathymetry.py @@ -68,7 +68,7 @@ def preprocessing_ehydro(tif, bathy_bounds, survey_gdb, output, min_depth_thresh bathy_gdal = gdal_array.OpenArray(bathy_m) # Read in shapefiles - bathy_bounds = gpd.read_file(survey_gdb, layer=bathy_bounds) + bathy_bounds = gpd.read_file(survey_gdb, layer=bathy_bounds, engine="pyogrio", use_arrow=True) nwm_streams = gpd.read_file("/data/inputs/nwm_hydrofabric/nwm_flows.gpkg", mask=bathy_bounds) nwm_catchments = gpd.read_file("/data/inputs/nwm_hydrofabric/nwm_catchments.gpkg", mask=bathy_bounds) bathy_bounds = bathy_bounds.to_crs(nwm_streams.crs) @@ -125,7 +125,7 @@ def preprocessing_ehydro(tif, bathy_bounds, survey_gdb, output, min_depth_thresh bathy_nwm_streams = bathy_nwm_streams.to_crs(epsg=5070) if os.path.exists(output): print(f"{output} already exists. Concatinating now...") - existing_bathy_file = gpd.read_file(output) + existing_bathy_file = gpd.read_file(output, engine="pyogrio", use_arrow=True) bathy_nwm_streams = pd.concat([existing_bathy_file, bathy_nwm_streams]) bathy_nwm_streams.to_file(output, index=False) print(f"Added {num_streams} new NWM features") diff --git a/data/ble/ble_benchmark/create_flow_forecast_file.py b/data/ble/ble_benchmark/create_flow_forecast_file.py index 62bdb7b1e..65c22daf0 100755 --- a/data/ble/ble_benchmark/create_flow_forecast_file.py +++ b/data/ble/ble_benchmark/create_flow_forecast_file.py @@ -9,6 +9,9 @@ import pandas as pd +gpd.options.io_engine = "pyogrio" + + def create_flow_forecast_file( huc, ble_geodatabase, diff --git a/data/esri.py b/data/esri.py index 4b3f9fbd9..9a762fb5f 100644 --- a/data/esri.py +++ b/data/esri.py @@ -5,6 +5,9 @@ from tqdm import tqdm +gpd.options.io_engine = "pyogrio" + + class ESRI_REST(object): """ This class was built for querying ESRI REST endpoints for the purpose of downloading datasets. diff --git a/data/nld/levee_download.py b/data/nld/levee_download.py index 995537f84..8893f00bb 100755 --- a/data/nld/levee_download.py +++ b/data/nld/levee_download.py @@ -14,6 +14,9 @@ from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS +gpd.options.io_engine = "pyogrio" + + epsg_code = re.search(r'\d+$', DEFAULT_FIM_PROJECTION_CRS).group() today = datetime.now().strftime('%y%m%d') nld_vector_output = os.path.join(INPUTS_DIR, 'nld_vectors', f'System_Routes_NLDFS_5070_{today}.gpkg') diff --git a/data/usgs/acquire_and_preprocess_3dep_dems.py b/data/usgs/acquire_and_preprocess_3dep_dems.py index b6ded4198..c43ce1e44 100755 --- a/data/usgs/acquire_and_preprocess_3dep_dems.py +++ b/data/usgs/acquire_and_preprocess_3dep_dems.py @@ -19,6 +19,9 @@ from utils.shared_functions import FIM_Helpers as fh +gpd.options.io_engine = "pyogrio" + + ''' TODO: - Add input args for resolution size, which means URL and block size also hve to be parameterized. diff --git a/data/wbd/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py index 2bf752bbb..2425bfc45 100755 --- a/data/wbd/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -41,8 +41,8 @@ def subset_vector_layers( with rio.open(dem_filename) as dem_raster: dem_cellsize = max(dem_raster.res) - wbd = gpd.read_file(wbd_filename) - dem_domain = gpd.read_file(dem_domain) + wbd = gpd.read_file(wbd_filename, engine="pyogrio", use_arrow=True) + dem_domain = gpd.read_file(dem_domain, engine="pyogrio", use_arrow=True) # Get wbd buffer print(f"Create wbd buffer for {hucCode}", flush=True) diff --git a/data/wbd/preprocess_wbd.py b/data/wbd/preprocess_wbd.py index a61a8010c..0a9d4ef46 100755 --- a/data/wbd/preprocess_wbd.py +++ b/data/wbd/preprocess_wbd.py @@ -9,6 +9,9 @@ from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS +gpd.options.io_engine = "pyogrio" + + def clip_wbd_to_dem_domain(dem: str, wbd_in: str, wbd_out: str, huc_level: int): """ Clips Watershed Boundary Dataset (WBD) to DEM domain diff --git a/data/write_parquet_from_calib_pts.py b/data/write_parquet_from_calib_pts.py index 5ffb7a50b..181d99bdc 100644 --- a/data/write_parquet_from_calib_pts.py +++ b/data/write_parquet_from_calib_pts.py @@ -11,6 +11,9 @@ from dotenv import load_dotenv +gpd.options.io_engine = "pyogrio" + + ###################################################################################################### # # # Overview: # diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d8c074dbb..51488055a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,26 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + +## v4.4.11.0 - 2024-02-16 - [PR#1077](https://github.com/NOAA-OWP/inundation-mapping/pull/1077) + +Replace `fiona` with `pyogrio` to improve I/O speed. `geopandas` will use `pyogrio` by default starting with version 1.0. `pyarrow` was also added as an environment variable to further speedup I/O. As a result of the changes in this PR, `fim_pipeline.sh` runs approximately 10% faster. + +### Changes + +- `Pipfile`: Upgraded `geopandas` from v0.12.2 to v0.14.3, added `pyogrio`, and fixed version of `pyflwdir`. +- `src/bash_variables.env`: Added environment variable for `pyogrio` to use `pyarrow` +- To all of the following files: Added `pyogrio` and `pyarrow` + - `data/` + - `bathymetry/preprocess_bathymetry.py`, `ble/ble_benchmark/create_flow_forecast_file.py`, `esri.py`, `nld/levee_download.py`, `usgs/acquire_and_preprocess_3dep_dems.py`, `wbd/clip_vectors_to_wbd.py`, `wbd/preprocess_wbd.py`, `write_parquet_from_calib_pts.py` + - `src/` + - `add_crosswalk.py`, `associate_levelpaths_with_levees.py`, `bathy_rc_adjust.py`, `bathymetric_adjustment.py`, `buffer_stream_branches.py`, `build_stream_traversal.py`, `crosswalk_nwm_demDerived.py`, `derive_headwaters.py`, `derive_level_paths.py`, `edit_points.py`, `filter_catchments_and_add_attributes.py`, `finalize_srcs.py`, `make_stages_and_catchlist.py`, `mask_dem.py`, `reachID_grid_to_vector_points.py`, `split_flows.py`, `src_adjust_spatial_obs.py`, `stream_branches.py`, `subset_catch_list_by_branch_id.py`, `usgs_gage_crosswalk.py`, `usgs_gage_unit_setup.py`, `utils/shared_functions.py` + - `tools/` + - `adjust_rc_with_feedback.py`, `check_deep_flooding.py`, `create_flow_forecast_file.py`, `eval_plots.py`, `evaluate_continuity.py`, `evaluate_crosswalk.py`, `fimr_to_benchmark.py`, `find_max_catchment_breadth.py`, `generate_categorical_fim.py`, `generate_categorical_fim_flows.py`, `generate_categorical_fim_mapping.py`, `generate_nws_lid.py`, `hash_compare.py`, `inundate_events.py`, `inundation.py`, `make_boxes_from_bounds.py`, `mosaic_inundation.py`, `overlapping_inundation.py`, `rating_curve_comparison.py`, `rating_curve_get_usgs_curves.py`, `test_case_by_hydro_id.py`, `tools_shared_functions.py` + +

+ + ## v4.4.10.1 - 2024-02-16 - [PR#1075](https://github.com/NOAA-OWP/inundation-mapping/pull/1075) We recently added code to fim_pre_processing.sh that checks the CPU count. Earlier this test was being done in post-processing and was killing a pipeline that had already been running for a while. diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index b10453f61..2331e4c65 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -37,10 +37,10 @@ def add_crosswalk( min_stream_length, calibration_mode=False, ): - input_catchments = gpd.read_file(input_catchments_fileName) - input_flows = gpd.read_file(input_flows_fileName) - input_huc = gpd.read_file(input_huc_fileName) - input_nwmflows = gpd.read_file(input_nwmflows_fileName) + input_catchments = gpd.read_file(input_catchments_fileName, engine="pyogrio", use_arrow=True) + input_flows = gpd.read_file(input_flows_fileName, engine="pyogrio", use_arrow=True) + input_huc = gpd.read_file(input_huc_fileName, engine="pyogrio", use_arrow=True) + input_nwmflows = gpd.read_file(input_nwmflows_fileName, engine="pyogrio", use_arrow=True) min_catchment_area = float(min_catchment_area) # 0.25# min_stream_length = float(min_stream_length) # 0.5# @@ -87,7 +87,7 @@ def add_crosswalk( elif (extent == 'MS') | (extent == 'GMS'): ## crosswalk using stream segment midpoint method - input_nwmcat = gpd.read_file(input_nwmcat_fileName, mask=input_huc) + input_nwmcat = gpd.read_file(input_nwmcat_fileName, mask=input_huc, engine="fiona") # only reduce nwm catchments to mainstems if running mainstems if extent == 'MS': diff --git a/src/associate_levelpaths_with_levees.py b/src/associate_levelpaths_with_levees.py index 181a41d99..29c069ba4 100644 --- a/src/associate_levelpaths_with_levees.py +++ b/src/associate_levelpaths_with_levees.py @@ -9,6 +9,9 @@ import pandas as pd +gpd.options.io_engine = "pyogrio" + + def associate_levelpaths_with_levees( levees_filename: str, levee_id_attribute: str, diff --git a/src/bash_variables.env b/src/bash_variables.env index a853a78eb..c62f2ef7a 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -39,6 +39,9 @@ export fim_obs_pnt_data=${inputsDir}/rating_curve/water_edge_da # Input file location with HUC, nwm feature_id and manual calibration coefficients export man_calb_file=${inputsDir}/rating_curve/manual_calibration_coefficients.csv +# Use pyarrow +export PYOGRIO_USE_ARROW=1 + # Styling export startDiv="\n-----------------------------------------------------------------\n" diff --git a/src/bathy_rc_adjust.py b/src/bathy_rc_adjust.py index c99fc3ebe..b3c408e44 100755 --- a/src/bathy_rc_adjust.py +++ b/src/bathy_rc_adjust.py @@ -7,6 +7,9 @@ import pandas as pd +gpd.options.io_engine = "pyogrio" + + sa_ratio_flag = float(environ['surf_area_thalweg_ratio_flag']) # 10x thal_stg_limit = float(environ['thalweg_stg_search_max_limit']) # 3m bankful_xs_ratio_flag = float(environ['bankful_xs_area_ratio_flag']) # 10x diff --git a/src/bathymetric_adjustment.py b/src/bathymetric_adjustment.py index a102d0a80..372f60038 100644 --- a/src/bathymetric_adjustment.py +++ b/src/bathymetric_adjustment.py @@ -40,7 +40,7 @@ def correct_rating_for_bathymetry(fim_dir, huc, bathy_file, verbose): # Load wbd and use it as a mask to pull the bathymetry data fim_huc_dir = join(fim_dir, huc) - wbd8_clp = gpd.read_file(join(fim_huc_dir, 'wbd8_clp.gpkg')) + wbd8_clp = gpd.read_file(join(fim_huc_dir, 'wbd8_clp.gpkg'), engine="pyogrio", use_arrow=True) bathy_data = gpd.read_file(bathy_file, mask=wbd8_clp) bathy_data = bathy_data.rename(columns={'ID': 'feature_id'}) @@ -171,9 +171,11 @@ def multi_process_hucs(fim_dir, bathy_file, wbd_buffer, wbd, output_suffix, numb # NOTE: This block can be removed if we have estimated bathymetry data for # the whole domain later. fim_hucs = [h for h in os.listdir(fim_dir) if re.match(r'\d{8}', h)] - bathy_gdf = gpd.read_file(bathy_file) + bathy_gdf = gpd.read_file(bathy_file, engine="pyogrio", use_arrow=True) buffered_bathy = bathy_gdf.geometry.buffer(wbd_buffer) # We buffer the bathymetric data to get adjacent - wbd = gpd.read_file(wbd, mask=buffered_bathy) # HUCs that could also have bathymetric reaches included + wbd = gpd.read_file( + wbd, mask=buffered_bathy, engine="fiona" + ) # HUCs that could also have bathymetric reaches included hucs_with_bathy = wbd.HUC8.to_list() hucs = [h for h in fim_hucs if h in hucs_with_bathy] log_file.write(f"Identified {len(hucs)} HUCs that have bathymetric data: {hucs}\n") diff --git a/src/buffer_stream_branches.py b/src/buffer_stream_branches.py index 6d4e29724..3c877af88 100755 --- a/src/buffer_stream_branches.py +++ b/src/buffer_stream_branches.py @@ -8,6 +8,9 @@ from stream_branches import StreamBranchPolygons, StreamNetwork +gpd.options.io_engine = "pyogrio" + + def buffer_stream_branches( streams_file: str, branch_id_attribute: str, diff --git a/src/build_stream_traversal.py b/src/build_stream_traversal.py index 590398c12..9c287807f 100644 --- a/src/build_stream_traversal.py +++ b/src/build_stream_traversal.py @@ -4,6 +4,9 @@ import geopandas as gpd +gpd.options.io_engine = "pyogrio" + + ''' Description: This tool creates unique IDs for each segment and builds the To_Node, From_Node, and NextDownID diff --git a/src/crosswalk_nwm_demDerived.py b/src/crosswalk_nwm_demDerived.py index 4ef4469b0..f30d5b3c7 100755 --- a/src/crosswalk_nwm_demDerived.py +++ b/src/crosswalk_nwm_demDerived.py @@ -12,6 +12,9 @@ from utils.shared_variables import FIM_ID +gpd.options.io_engine = "pyogrio" + + def Crosswalk_nwm_demDerived( nwm_streams, demDerived, diff --git a/src/derive_headwaters.py b/src/derive_headwaters.py index aabcedc66..19d9dcf76 100644 --- a/src/derive_headwaters.py +++ b/src/derive_headwaters.py @@ -8,6 +8,9 @@ from utils.shared_functions import getDriver +gpd.options.io_engine = "pyogrio" + + def findHeadWaterPoints(flows): flows = flows.explode(index_parts=True) headwater_points = [] diff --git a/src/derive_level_paths.py b/src/derive_level_paths.py index 8fc1102dc..ca25819dc 100755 --- a/src/derive_level_paths.py +++ b/src/derive_level_paths.py @@ -10,6 +10,9 @@ from utils.fim_enums import FIM_exit_codes +gpd.options.io_engine = "pyogrio" + + def Derive_level_paths( in_stream_network, wbd, diff --git a/src/edit_points.py b/src/edit_points.py index a6f078df5..2a91a3471 100755 --- a/src/edit_points.py +++ b/src/edit_points.py @@ -5,6 +5,9 @@ import geopandas as gpd +gpd.options.io_engine = "pyogrio" + + def Edit_points( stream_reaches, branch_id_attribute, diff --git a/src/filter_catchments_and_add_attributes.py b/src/filter_catchments_and_add_attributes.py index bef42fd35..d7e35444c 100755 --- a/src/filter_catchments_and_add_attributes.py +++ b/src/filter_catchments_and_add_attributes.py @@ -10,6 +10,9 @@ from utils.shared_variables import FIM_ID +gpd.options.io_engine = "pyogrio" + + def filter_catchments_and_add_attributes( input_catchments_filename, input_flows_filename, diff --git a/src/finalize_srcs.py b/src/finalize_srcs.py index 33899aeb5..369a3a77d 100755 --- a/src/finalize_srcs.py +++ b/src/finalize_srcs.py @@ -1,13 +1,12 @@ #!/usr/bin/env python3 import argparse -import json import geopandas as gpd import pandas as pd -from numpy import unique -from utils.shared_functions import getDriver + +gpd.options.io_engine = "pyogrio" def finalize_srcs(srcbase, srcfull, hydrotable, output_srcfull=None, output_hydrotable=None): diff --git a/src/make_stages_and_catchlist.py b/src/make_stages_and_catchlist.py index c8007ed19..39d700c09 100755 --- a/src/make_stages_and_catchlist.py +++ b/src/make_stages_and_catchlist.py @@ -1,12 +1,14 @@ #!/usr/bin/env python3 import argparse -import sys import geopandas as gpd import numpy as np +gpd.options.io_engine = "pyogrio" + + def make_stages_and_catchlist( flows_filename, catchments_filename, diff --git a/src/mask_dem.py b/src/mask_dem.py index bf8897ec7..f551c9df4 100755 --- a/src/mask_dem.py +++ b/src/mask_dem.py @@ -11,6 +11,9 @@ from rasterio.mask import mask +gpd.options.io_engine = "pyogrio" + + def mask_dem( dem_filename: str, nld_filename: str, diff --git a/src/reachID_grid_to_vector_points.py b/src/reachID_grid_to_vector_points.py index 912bc719f..08e051b61 100755 --- a/src/reachID_grid_to_vector_points.py +++ b/src/reachID_grid_to_vector_points.py @@ -11,6 +11,9 @@ from utils.shared_variables import PREP_PROJECTION +gpd.options.io_engine = "pyogrio" + + def convert_grid_cells_to_points(raster, index_option, output_points_filename=False): # Input raster if isinstance(raster, str): diff --git a/src/split_flows.py b/src/split_flows.py index 5c47d4ae2..575b473c0 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -29,6 +29,9 @@ from utils.shared_variables import FIM_ID +gpd.options.io_engine = "pyogrio" + + def split_flows( flows_filename, dem_filename, diff --git a/src/src_adjust_spatial_obs.py b/src/src_adjust_spatial_obs.py index 8b39dec45..fba11571f 100644 --- a/src/src_adjust_spatial_obs.py +++ b/src/src_adjust_spatial_obs.py @@ -20,6 +20,9 @@ ) +gpd.options.io_engine = "pyogrio" + + # Import variables from .env file load_dotenv('/foss_fim/src/bash_variables.env') outputsDir = os.getenv("outputsDir") diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index fd8d502aa..bcd860a13 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -16,6 +16,9 @@ from utils.shared_variables import DOWNSTREAM_THRESHOLD, ROUGHNESS_MAX_THRESH, ROUGHNESS_MIN_THRESH +gpd.options.io_engine = "pyogrio" + + def update_rating_curve( fim_directory, water_edge_median_df, diff --git a/src/stream_branches.py b/src/stream_branches.py index 849d6e92f..b9718ea91 100755 --- a/src/stream_branches.py +++ b/src/stream_branches.py @@ -22,8 +22,10 @@ from utils.shared_variables import PREP_CRS -class StreamNetwork(gpd.GeoDataFrame): +gpd.options.io_engine = "pyogrio" + +class StreamNetwork(gpd.GeoDataFrame): """ Notes: - Many of the methods support two attributes called branch_id_attribute and values_excluded. diff --git a/src/subset_catch_list_by_branch_id.py b/src/subset_catch_list_by_branch_id.py index bf80a9da9..0d7a774a0 100755 --- a/src/subset_catch_list_by_branch_id.py +++ b/src/subset_catch_list_by_branch_id.py @@ -9,6 +9,9 @@ from stream_branches import StreamNetwork +gpd.options.io_engine = "pyogrio" + + def Subset_catch_list( catch_list, stream_network, branch_id_attribute, branch_id_list=None, out_catch_list=None, verbose=False ): diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index b87dfc430..99d3fc29e 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -9,6 +9,8 @@ import rasterio +gpd.options.io_engine = "pyogrio" + warnings.simplefilter("ignore") diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index 61e82c797..a4f014fd5 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -13,6 +13,8 @@ from utils.shared_variables import PREP_CRS +gpd.options.io_engine = "pyogrio" + warnings.simplefilter("ignore") diff --git a/src/utils/shared_functions.py b/src/utils/shared_functions.py index aacc3b687..8344d5baa 100644 --- a/src/utils/shared_functions.py +++ b/src/utils/shared_functions.py @@ -18,6 +18,9 @@ import utils.shared_variables as sv +gp.options.io_engine = "pyogrio" + + def getDriver(fileName): driverDictionary = {'.gpkg': 'GPKG', '.geojson': 'GeoJSON', '.shp': 'ESRI Shapefile'} driver = driverDictionary[splitext(fileName)[1]] diff --git a/tools/adjust_rc_with_feedback.py b/tools/adjust_rc_with_feedback.py index dfd16229e..88a2dab9c 100644 --- a/tools/adjust_rc_with_feedback.py +++ b/tools/adjust_rc_with_feedback.py @@ -12,6 +12,9 @@ from geopandas.tools import sjoin +gpd.options.io_engine = "pyogrio" + + temp_workspace = r'' HAND_CRS = 'EPSG:3857' diff --git a/tools/check_deep_flooding.py b/tools/check_deep_flooding.py index daf60aa58..5ed19511f 100644 --- a/tools/check_deep_flooding.py +++ b/tools/check_deep_flooding.py @@ -14,6 +14,9 @@ from shapely.geometry import box +gpd.options.io_engine = "pyogrio" + + def check_deep_flooding(args): depth_grid_path = args[0] shapefile_path = args[1] diff --git a/tools/create_flow_forecast_file.py b/tools/create_flow_forecast_file.py index 3512074e7..f716082dd 100755 --- a/tools/create_flow_forecast_file.py +++ b/tools/create_flow_forecast_file.py @@ -6,6 +6,9 @@ import geopandas as gpd +gpd.options.io_engine = "pyogrio" + + def create_flow_forecast_file( ble_geodatabase, nwm_geodatabase, diff --git a/tools/eval_plots.py b/tools/eval_plots.py index 75773deec..d7ff97209 100644 --- a/tools/eval_plots.py +++ b/tools/eval_plots.py @@ -20,6 +20,9 @@ from utils.shared_variables import VIZ_PROJECTION +gpd.options.io_engine = "pyogrio" + + # Get variables from .env file. load_dotenv() WBD_LAYER = os.getenv("WBD_LAYER") diff --git a/tools/evaluate_continuity.py b/tools/evaluate_continuity.py index 85baffeb9..3d86f063e 100644 --- a/tools/evaluate_continuity.py +++ b/tools/evaluate_continuity.py @@ -8,6 +8,9 @@ import pandas as pd +gpd.options.io_engine = "pyogrio" + + def evaluate_continuity( stream_network_file, forecast_file, stream_network_outfile=None, confluences_only=False, plot_file=None ): diff --git a/tools/evaluate_crosswalk.py b/tools/evaluate_crosswalk.py index 0051c3600..6e0fe3db5 100644 --- a/tools/evaluate_crosswalk.py +++ b/tools/evaluate_crosswalk.py @@ -7,6 +7,9 @@ import pandas as pd +gpd.options.io_engine = "pyogrio" + + def evaluate_crosswalk( input_flows_fileName: str, input_nwmflows_fileName: str, diff --git a/tools/fimr_to_benchmark.py b/tools/fimr_to_benchmark.py index f10dac19a..9f3359bdc 100644 --- a/tools/fimr_to_benchmark.py +++ b/tools/fimr_to_benchmark.py @@ -13,6 +13,9 @@ from tools_shared_functions import get_metadata +gpd.options.io_engine = "pyogrio" + + load_dotenv() diff --git a/tools/find_max_catchment_breadth.py b/tools/find_max_catchment_breadth.py index 0f7405399..600e79ec4 100755 --- a/tools/find_max_catchment_breadth.py +++ b/tools/find_max_catchment_breadth.py @@ -9,6 +9,9 @@ from shapely.geometry import Point +gpd.options.io_engine = "pyogrio" + + def Find_max_catchment_breadth(hydrofabric_dir): catchments_fileNames = glob_file_paths_for_catchments(hydrofabric_dir) diff --git a/tools/generate_categorical_fim.py b/tools/generate_categorical_fim.py index 3749bb4fe..e3d248be2 100755 --- a/tools/generate_categorical_fim.py +++ b/tools/generate_categorical_fim.py @@ -36,6 +36,9 @@ from utils.shared_variables import VIZ_PROJECTION +gpd.options.io_engine = "pyogrio" + + def process_generate_categorical_fim( fim_run_dir, job_number_huc, diff --git a/tools/generate_categorical_fim_flows.py b/tools/generate_categorical_fim_flows.py index faf539a0c..a89459e06 100755 --- a/tools/generate_categorical_fim_flows.py +++ b/tools/generate_categorical_fim_flows.py @@ -24,6 +24,9 @@ from utils.shared_variables import VIZ_PROJECTION +gpd.options.io_engine = "pyogrio" + + def get_env_paths(): load_dotenv() # import variables from .env file diff --git a/tools/generate_categorical_fim_mapping.py b/tools/generate_categorical_fim_mapping.py index df44a4a52..9ff6cab18 100755 --- a/tools/generate_categorical_fim_mapping.py +++ b/tools/generate_categorical_fim_mapping.py @@ -19,6 +19,9 @@ from utils.shared_variables import PREP_PROJECTION, VIZ_PROJECTION +gpd.options.io_engine = "pyogrio" + + def generate_categorical_fim( fim_run_dir, source_flow_dir, output_catfim_dir, job_number_huc, job_number_inundate, depthtif, log_file ): diff --git a/tools/generate_nws_lid.py b/tools/generate_nws_lid.py index 88ca96e60..ac769134b 100644 --- a/tools/generate_nws_lid.py +++ b/tools/generate_nws_lid.py @@ -14,6 +14,9 @@ from utils.shared_variables import PREP_PROJECTION +gpd.options.io_engine = "pyogrio" + + load_dotenv() # import variables from .env file API_BASE_URL = os.getenv("API_BASE_URL") diff --git a/tools/hash_compare.py b/tools/hash_compare.py index 8de401be2..33c2dfad1 100755 --- a/tools/hash_compare.py +++ b/tools/hash_compare.py @@ -8,6 +8,9 @@ from geopandas.testing import assert_geodataframe_equal +geopandas.options.io_engine = "pyogrio" + + def main(arg1, arg2, image_only, log_file, gpkg): """ This tool compares either directories or single files. It will create and compare a hashing for diff --git a/tools/inundate_events.py b/tools/inundate_events.py index 90d415a85..b8b33b614 100755 --- a/tools/inundate_events.py +++ b/tools/inundate_events.py @@ -11,6 +11,9 @@ from tqdm import tqdm +gpd.options.io_engine = "pyogrio" + + def inundate_events(hydrofabric_dir, forecast_file, inundation_file, inundation_polygon=None, jobs=1): forecast_df = pd.read_csv( forecast_file, infer_datetime_format=True, dtype={'huc': str}, parse_dates=['date_time'] diff --git a/tools/inundation.py b/tools/inundation.py index b39d9d191..4dc7232c4 100755 --- a/tools/inundation.py +++ b/tools/inundation.py @@ -18,6 +18,9 @@ from shapely.geometry import shape +gpd.options.io_engine = "pyogrio" + + class hydroTableHasOnlyLakes(Exception): """Raised when a Hydro-Table only has lakes""" diff --git a/tools/make_boxes_from_bounds.py b/tools/make_boxes_from_bounds.py index 2810cac37..9f0101d93 100755 --- a/tools/make_boxes_from_bounds.py +++ b/tools/make_boxes_from_bounds.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import argparse -from datetime import datetime import geopandas as gpd import pandas as pd @@ -10,6 +9,9 @@ from utils.shared_functions import getDriver +gpd.options.io_engine = "pyogrio" + + def find_hucs_of_bounding_boxes( bounding_boxes_file, wbd=None, diff --git a/tools/mosaic_inundation.py b/tools/mosaic_inundation.py index 7baa7f5dc..4513f067f 100755 --- a/tools/mosaic_inundation.py +++ b/tools/mosaic_inundation.py @@ -158,6 +158,8 @@ def mosaic_final_inundation_extent_to_poly(inundation_raster, inundation_polygon from shapely.geometry.multipolygon import MultiPolygon from shapely.geometry.polygon import Polygon + gpd.options.io_engine = "pyogrio" + with rasterio.open(inundation_raster) as src: # Open inundation_raster using rasterio. image = src.read(1) diff --git a/tools/overlapping_inundation.py b/tools/overlapping_inundation.py index d1ee54516..23c6575d8 100644 --- a/tools/overlapping_inundation.py +++ b/tools/overlapping_inundation.py @@ -16,6 +16,9 @@ from scipy.optimize import newton +gpd.options.io_engine = "pyogrio" + + class OverlapWindowMerge: def __init__(self, inundation_rsts, num_partitions=None, window_xy_size=None): """ diff --git a/tools/rating_curve_comparison.py b/tools/rating_curve_comparison.py index 2df1c179b..58e316068 100755 --- a/tools/rating_curve_comparison.py +++ b/tools/rating_curve_comparison.py @@ -25,6 +25,9 @@ from shapely.geometry import Polygon +gpd.options.io_engine = "pyogrio" + + warnings.simplefilter(action='ignore', category=FutureWarning) """ diff --git a/tools/rating_curve_get_usgs_curves.py b/tools/rating_curve_get_usgs_curves.py index 7068f4eb4..65553d4f2 100644 --- a/tools/rating_curve_get_usgs_curves.py +++ b/tools/rating_curve_get_usgs_curves.py @@ -29,6 +29,9 @@ from utils.shared_variables import PREP_PROJECTION +gpd.options.io_engine = "pyogrio" + + ''' This script calls the NOAA Tidal API for datum conversions. Experience shows that running script outside of business hours seems to be most consistent way diff --git a/tools/test_case_by_hydro_id.py b/tools/test_case_by_hydro_id.py index 65ca47e5a..5b24fdd3a 100644 --- a/tools/test_case_by_hydro_id.py +++ b/tools/test_case_by_hydro_id.py @@ -12,6 +12,9 @@ from tools_shared_functions import compute_stats_from_contingency_table +gpd.options.io_engine = "pyogrio" + + ##################################################### # Perform zonal stats is a funtion stored in pixel_counter.py. # The input huc_gpkg is a single huc8 geopackage, the second input argument must be input as a dict. diff --git a/tools/tools_shared_functions.py b/tools/tools_shared_functions.py index 96a7e24bd..4542cf879 100755 --- a/tools/tools_shared_functions.py +++ b/tools/tools_shared_functions.py @@ -22,6 +22,9 @@ from shapely.geometry import MultiPolygon, Polygon, shape +gpd.options.io_engine = "pyogrio" + + def get_env_paths(): load_dotenv() # import variables from .env file From bfba3792b9df3526251fce3b75086100b783a607 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 8 Mar 2024 13:11:38 -0700 Subject: [PATCH 27/51] v4.4.11.1 pyogrio bug fix (#1080) --- docs/CHANGELOG.md | 11 ++++++++++- src/bathymetric_adjustment.py | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 51488055a..c605bc973 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,16 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.11.1 - 2024-03-08 - [PR#1080](https://github.com/NOAA-OWP/inundation-mapping/pull/1080) + +Fixes bug in bathymetric adjustment where `mask` is used with `geopandas.read_file`. The solution is to force `read_file` to use `fiona` instead of `pyogrio`. + +### Changes + +`src/bathymetric_adjustment.py`: Use `engine=fiona` instead of default `pyogrio` to use `mask=` with `geopandas.read_file` + +

+ ## v4.4.11.0 - 2024-02-16 - [PR#1077](https://github.com/NOAA-OWP/inundation-mapping/pull/1077) Replace `fiona` with `pyogrio` to improve I/O speed. `geopandas` will use `pyogrio` by default starting with version 1.0. `pyarrow` was also added as an environment variable to further speedup I/O. As a result of the changes in this PR, `fim_pipeline.sh` runs approximately 10% faster. @@ -20,7 +30,6 @@ Replace `fiona` with `pyogrio` to improve I/O speed. `geopandas` will use `pyogr

- ## v4.4.10.1 - 2024-02-16 - [PR#1075](https://github.com/NOAA-OWP/inundation-mapping/pull/1075) We recently added code to fim_pre_processing.sh that checks the CPU count. Earlier this test was being done in post-processing and was killing a pipeline that had already been running for a while. diff --git a/src/bathymetric_adjustment.py b/src/bathymetric_adjustment.py index 372f60038..9c114173b 100644 --- a/src/bathymetric_adjustment.py +++ b/src/bathymetric_adjustment.py @@ -41,7 +41,7 @@ def correct_rating_for_bathymetry(fim_dir, huc, bathy_file, verbose): # Load wbd and use it as a mask to pull the bathymetry data fim_huc_dir = join(fim_dir, huc) wbd8_clp = gpd.read_file(join(fim_huc_dir, 'wbd8_clp.gpkg'), engine="pyogrio", use_arrow=True) - bathy_data = gpd.read_file(bathy_file, mask=wbd8_clp) + bathy_data = gpd.read_file(bathy_file, mask=wbd8_clp, engine="fiona") bathy_data = bathy_data.rename(columns={'ID': 'feature_id'}) # Get src_full from each branch From 23d2d6de0060f83bea5d5eb50e082538ebd07fea Mon Sep 17 00:00:00 2001 From: EmilyDeardorff-NOAA <60829052+EmilyDeardorff@users.noreply.github.com> Date: Mon, 11 Mar 2024 12:35:12 -0700 Subject: [PATCH 28/51] v4.4.12.0 Add South Alaska to pre-clip vectors system (#1078) --- data/wbd/clip_vectors_to_wbd.py | 54 +++------ data/wbd/generate_pre_clip_fim_huc8.py | 157 +++++++++++++++++-------- docs/CHANGELOG.md | 20 ++++ src/bash_variables.env | 41 ++++--- 4 files changed, 172 insertions(+), 100 deletions(-) diff --git a/data/wbd/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py index 2425bfc45..ede7a6526 100755 --- a/data/wbd/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -9,7 +9,9 @@ from shapely.geometry import MultiPolygon, Polygon from utils.shared_functions import getDriver -from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS + + +# from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS def subset_vector_layers( @@ -36,6 +38,7 @@ def subset_vector_layers( wbd_buffer_distance, levee_protected_areas, subset_levee_protected_areas, + huc_CRS, ): print(f"Getting Cell Size for {hucCode}", flush=True) with rio.open(dem_filename) as dem_raster: @@ -56,26 +59,16 @@ def subset_vector_layers( wbd_buffer = wbd_buffer[['geometry']] wbd_streams_buffer = wbd_streams_buffer[['geometry']] - wbd_buffer.to_file( - wbd_buffer_filename, - driver=getDriver(wbd_buffer_filename), - index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, - ) + wbd_buffer.to_file(wbd_buffer_filename, driver=getDriver(wbd_buffer_filename), index=False, crs=huc_CRS) wbd_streams_buffer.to_file( - wbd_streams_buffer_filename, - driver=getDriver(wbd_streams_buffer_filename), - index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + wbd_streams_buffer_filename, driver=getDriver(wbd_streams_buffer_filename), index=False, crs=huc_CRS ) # Clip ocean water polygon for future masking ocean areas (where applicable) landsea = gpd.read_file(landsea, mask=wbd_buffer) if not landsea.empty: print(f"Create landsea gpkg for {hucCode}", flush=True) - landsea.to_file( - subset_landsea, driver=getDriver(subset_landsea), index=False, crs=DEFAULT_FIM_PROJECTION_CRS - ) + landsea.to_file(subset_landsea, driver=getDriver(subset_landsea), index=False, crs=huc_CRS) del landsea # Clip levee-protected areas polygons for future masking ocean areas (where applicable) @@ -86,7 +79,7 @@ def subset_vector_layers( subset_levee_protected_areas, driver=getDriver(subset_levee_protected_areas), index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + crs=huc_CRS, ) del levee_protected_areas @@ -104,28 +97,24 @@ def subset_vector_layers( # Loop through the filled polygons and insert the new geometry for i in range(len(nwm_lakes_fill_holes.geoms)): nwm_lakes.loc[i, 'geometry'] = nwm_lakes_fill_holes.geoms[i] - nwm_lakes.to_file( - subset_nwm_lakes, driver=getDriver(subset_nwm_lakes), index=False, crs=DEFAULT_FIM_PROJECTION_CRS - ) + nwm_lakes.to_file(subset_nwm_lakes, driver=getDriver(subset_nwm_lakes), index=False, crs=huc_CRS) del nwm_lakes # Find intersecting levee lines print(f"Subsetting NLD levee lines for {hucCode}", flush=True) nld_lines = gpd.read_file(nld_lines, mask=wbd_buffer) if not nld_lines.empty: - nld_lines.to_file( - subset_nld_lines, driver=getDriver(subset_nld_lines), index=False, crs=DEFAULT_FIM_PROJECTION_CRS - ) + nld_lines.to_file(subset_nld_lines, driver=getDriver(subset_nld_lines), index=False, crs=huc_CRS) del nld_lines - # Preprocced levee lines for burning + # Preprocessed levee lines for burning nld_lines_preprocessed = gpd.read_file(nld_lines_preprocessed, mask=wbd_buffer) if not nld_lines_preprocessed.empty: nld_lines_preprocessed.to_file( subset_nld_lines_preprocessed, driver=getDriver(subset_nld_lines_preprocessed), index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + crs=huc_CRS, ) del nld_lines_preprocessed @@ -135,14 +124,12 @@ def subset_vector_layers( if len(nwm_headwaters) > 0: nwm_headwaters.to_file( - subset_nwm_headwaters, - driver=getDriver(subset_nwm_headwaters), - index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + subset_nwm_headwaters, driver=getDriver(subset_nwm_headwaters), index=False, crs=huc_CRS ) else: print("No headwater point(s) within HUC " + str(hucCode) + " boundaries.") sys.exit(0) + del nwm_headwaters # Find intersecting nwm_catchments @@ -151,14 +138,12 @@ def subset_vector_layers( if len(nwm_catchments) > 0: nwm_catchments.to_file( - subset_nwm_catchments, - driver=getDriver(subset_nwm_catchments), - index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + subset_nwm_catchments, driver=getDriver(subset_nwm_catchments), index=False, crs=huc_CRS ) else: print("No NWM catchments within HUC " + str(hucCode) + " boundaries.") sys.exit(0) + del nwm_catchments # Subset nwm streams @@ -192,10 +177,7 @@ def subset_vector_layers( nwm_streams = pd.concat([nwm_streams_nonoutlets, nwm_streams_outlets]) nwm_streams.to_file( - subset_nwm_streams, - driver=getDriver(subset_nwm_streams), - index=False, - crs=DEFAULT_FIM_PROJECTION_CRS, + subset_nwm_streams, driver=getDriver(subset_nwm_streams), index=False, crs=huc_CRS ) else: print("No NWM stream segments within HUC " + str(hucCode) + " boundaries.") @@ -248,6 +230,8 @@ def subset_vector_layers( '-lps', '--subset-levee-protected-areas', help='Levee-protected areas subset', required=True ) + parser.add_argument('-crs', '--huc-crs', help='HUC crs', required=True) + args = vars(parser.parse_args()) subset_vector_layers(**args) diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py index 71dbbc9b4..ca6ee44d8 100755 --- a/data/wbd/generate_pre_clip_fim_huc8.py +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -27,7 +27,6 @@ Usage: generate_pre_clip_fim_huc8.py - -wbd /data/inputs/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg -n /data/inputs/pre_clip_huc8/24_3_20 -u /data/inputs/huc_lists/included_huc8.lst -j 6 @@ -48,18 +47,37 @@ # Variables from src/bash_variables.env DEFAULT_FIM_PROJECTION_CRS = os.getenv('DEFAULT_FIM_PROJECTION_CRS') +ALASKA_CRS = os.getenv('ALASKA_CRS') # alaska + inputsDir = os.getenv('inputsDir') + input_WBD_gdb = os.getenv('input_WBD_gdb') +input_WBD_gdb_Alaska = os.getenv('input_WBD_gdb_Alaska') # alaska + input_DEM = os.getenv('input_DEM') +input_DEM_Alaska = os.getenv('input_DEM_Alaska') # alaska + input_DEM_domain = os.getenv('input_DEM_domain') +input_DEM_domain_Alaska = os.getenv('input_DEM_domain_Alaska') # alaska + input_nwm_lakes = os.getenv('input_nwm_lakes') input_nwm_catchments = os.getenv('input_nwm_catchments') +input_nwm_catchments_Alaska = os.getenv('input_nwm_catchments_Alaska') + input_NLD = os.getenv('input_NLD') +input_NLD_Alaska = os.getenv('input_NLD_Alaska') + input_levees_preprocessed = os.getenv('input_levees_preprocessed') +input_levees_preprocessed_Alaska = os.getenv('input_levees_preprocessed_Alaska') + input_GL_boundaries = os.getenv('input_GL_boundaries') input_nwm_flows = os.getenv('input_nwm_flows') +input_nwm_flows_Alaska = os.getenv('input_nwm_flows_Alaska') # alaska input_nwm_headwaters = os.getenv('input_nwm_headwaters') +input_nwm_headwaters_Alaska = os.getenv('input_nwm_headwaters_Alaska') + input_nld_levee_protected_areas = os.getenv('input_nld_levee_protected_areas') +input_nld_levee_protected_areas_Alaska = os.getenv('input_nld_levee_protected_areas_Alaska') # Variables from config/params_template.env wbd_buffer = os.getenv('wbd_buffer') @@ -100,13 +118,12 @@ def __setup_logger(outputs_dir): logging.info(f"\n \t Started: {start_time_string} \n") -def pre_clip_hucs_from_wbd(wbd_file, outputs_dir, huc_list, number_of_jobs, overwrite): +def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): ''' The function is the main driver of the program to iterate and parallelize writing pre-clipped HUC8 vector files. Inputs: - - wbd_file: Default take from src/bash_variables.env, or provided as argument. - outputs_dir: Output directory to stage pre-clipped vectors. - huc_list: List of Hucs to generate pre-clipped .gpkg files. - number_of_jobs: Amount of cpus used for parallelization. @@ -143,8 +160,8 @@ def pre_clip_hucs_from_wbd(wbd_file, outputs_dir, huc_list, number_of_jobs, over if os.path.exists(huc_list): hucs_to_pre_clip_list = open(huc_list).read().splitlines() else: - logging.info("The huclist is not valid. Please check arguemnt.") - raise Exception("The huclist is not valid. Please check arguemnt.") + logging.info("The huclist is not valid. Please check argument.") + raise Exception("The huclist is not valid. Please check argument.") if os.path.exists(outputs_dir) and not overwrite: raise Exception( @@ -175,7 +192,9 @@ def pre_clip_hucs_from_wbd(wbd_file, outputs_dir, huc_list, number_of_jobs, over procs_list = [] for huc in hucs_to_pre_clip_list: print(f"Generating vectors for {huc}. ") - procs_list.append([huc, outputs_dir, wbd_file]) + procs_list.append([huc, outputs_dir]) + + # procs_list.append([huc, outputs_dir, wbd_alaska_file]) # Parallelize each huc in hucs_to_parquet_list logging.info('Parallelizing HUC level wbd pre-clip vector creation. ') @@ -210,7 +229,6 @@ def huc_level_clip_vectors_to_wbd(args): Inputs: - huc: Individual HUC to generate vector files for. - outputs_dir: Output directory to stage pre-clipped vectors. - - input_WBD_filename: Filename of WBD to generate pre-clipped .gpkg files. Processing: - Define (unpack) arguments. @@ -227,19 +245,32 @@ def huc_level_clip_vectors_to_wbd(args): # We have to explicitly unpack the args from pool.map() huc = args[0] outputs_dir = args[1] - input_WBD_filename = args[2] huc_directory = os.path.join(outputs_dir, huc) # SET VARIABLES AND FILE INPUTS # hucUnitLength = len(huc) huc2Identifier = huc[:2] - input_NHD_WBHD_layer = f"WBDHU{hucUnitLength}" + + # Check whether the HUC is in Alaska or not and assign the CRS and filenames accordingly + if huc2Identifier == '19': + huc_CRS = ALASKA_CRS + input_NHD_WBHD_layer = 'WBD_National_South_Alaska' + input_WBD_filename = input_WBD_gdb_Alaska + wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National_South_Alaska.gpkg' + else: + huc_CRS = DEFAULT_FIM_PROJECTION_CRS + input_NHD_WBHD_layer = f"WBDHU{hucUnitLength}" + input_WBD_filename = input_WBD_gdb + wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National.gpkg' # Define the landsea water body mask using either Great Lakes or Ocean polygon input # if huc2Identifier == "04": input_LANDSEA = f"{input_GL_boundaries}" print(f'Using {input_LANDSEA} for water body mask (Great Lakes)') + elif huc2Identifier == "19": + input_LANDSEA = f"{inputsDir}/landsea/water_polygons_alaska.gpkg" + print(f'Using {input_LANDSEA} for water body mask (Alaska)') else: input_LANDSEA = f"{inputsDir}/landsea/water_polygons_us.gpkg" @@ -252,7 +283,7 @@ def huc_level_clip_vectors_to_wbd(args): '-f', 'GPKG', '-t_srs', - DEFAULT_FIM_PROJECTION_CRS, + huc_CRS, f'{huc_directory}/wbd.gpkg', input_WBD_filename, input_NHD_WBHD_layer, @@ -286,32 +317,64 @@ def huc_level_clip_vectors_to_wbd(args): print(msg) logging.info(msg) - # Subset Vector Layers - subset_vector_layers( - subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", - subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", - hucCode=huc, - subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", - wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", - wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", - wbd_filename=f"{huc_directory}/wbd.gpkg", - dem_filename=input_DEM, - dem_domain=input_DEM_domain, - nwm_lakes=input_nwm_lakes, - nwm_catchments=input_nwm_catchments, - subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", - nld_lines=input_NLD, - nld_lines_preprocessed=input_levees_preprocessed, - landsea=input_LANDSEA, - nwm_streams=input_nwm_flows, - subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", - nwm_headwaters=input_nwm_headwaters, - subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", - subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", - wbd_buffer_distance=wbd_buffer_int, - levee_protected_areas=input_nld_levee_protected_areas, - subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", - ) + # Subset Vector Layers (after determining whether it's alaska or not) + if huc2Identifier == '19': + # Yes Alaska + subset_vector_layers( + subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", + subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", + hucCode=huc, + subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", + wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", + wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", + wbd_filename=f"{huc_directory}/wbd.gpkg", + dem_filename=input_DEM_Alaska, + dem_domain=input_DEM_domain_Alaska, + nwm_lakes=input_nwm_lakes, + nwm_catchments=input_nwm_catchments_Alaska, + subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", + nld_lines=input_NLD_Alaska, + nld_lines_preprocessed=input_levees_preprocessed_Alaska, + landsea=input_LANDSEA, + nwm_streams=input_nwm_flows_Alaska, + subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", + nwm_headwaters=input_nwm_headwaters_Alaska, + subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", + subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", + wbd_buffer_distance=wbd_buffer_int, + levee_protected_areas=input_nld_levee_protected_areas_Alaska, + subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + huc_CRS=huc_CRS, # TODO: simplify + ) + + else: + # Not Alaska + subset_vector_layers( + subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", + subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", + hucCode=huc, + subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", + wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", + wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", + wbd_filename=f"{huc_directory}/wbd.gpkg", + dem_filename=input_DEM, + dem_domain=input_DEM_domain, + nwm_lakes=input_nwm_lakes, + nwm_catchments=input_nwm_catchments, + subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", + nld_lines=input_NLD, + nld_lines_preprocessed=input_levees_preprocessed, + landsea=input_LANDSEA, + nwm_streams=input_nwm_flows, + subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", + nwm_headwaters=input_nwm_headwaters, + subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", + subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", + wbd_buffer_distance=wbd_buffer_int, + levee_protected_areas=input_nld_levee_protected_areas, + subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + huc_CRS=huc_CRS, # TODO: simplify + ) msg = f"\n\t Completing Get Vector Layers and Subset: {huc} \n" print(msg) @@ -326,12 +389,12 @@ def huc_level_clip_vectors_to_wbd(args): '-f', 'GPKG', '-t_srs', - DEFAULT_FIM_PROJECTION_CRS, + huc_CRS, '-clipsrc', f'{huc_directory}/wbd_buffered.gpkg', f'{huc_directory}/wbd8_clp.gpkg', - f'{inputsDir}/wbd/WBD_National.gpkg', - 'WBDHU8', + wbd_gpkg_path, + input_NHD_WBHD_layer, ], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -364,30 +427,24 @@ def huc_level_clip_vectors_to_wbd(args): 'the output directory specified as the argument.', usage=''' ./generate_pre_clip_fim_huc8.py - -wbd /data/inputs/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg - -n /data/inputs/pre_clip_huc8/24_3_20 + -n /data/inputs/pre_clip_huc8/2024_3_20 -u /data/inputs/huc_lists/included_huc8.lst -j 6 -o ''', ) - parser.add_argument( - '-wbd', - '--wbd_file', - help='.wbd file to clip into individual HUC.gpkg files. Default is $input_WBD_gdb from src/bash_variables.env.', - default=input_WBD_gdb, - ) + parser.add_argument( '-n', '--outputs_dir', help='Directory to output all of the HUC level .gpkg files. Use the format: ' - ' (i.e. September 26, 2023 would be 23_9_26)', + ' (i.e. September 26, 2023 would be 2023_9_26)', ) parser.add_argument('-u', '--huc_list', help='List of HUCs to genereate pre-clipped vectors for.') parser.add_argument( '-j', '--number_of_jobs', - help='OPTIONAL: number of cores/processes (default=4). This is a memory intensive ' + help='OPTIONAL: Number of cores/processes (default=4). This is a memory intensive ' 'script, and the multiprocessing will crash if too many CPUs are used. It is recommended to provide ' 'half the amount of available CPUs.', type=int, @@ -397,7 +454,7 @@ def huc_level_clip_vectors_to_wbd(args): parser.add_argument( '-o', '--overwrite', - help='Overwrite the file if already existing? (default false)', + help='OPTIONAL: Overwrite the file if already existing? (default false)', action='store_true', ) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c605bc973..ea1f51669 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,26 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.12.0 - 2024-03-11 - [PR#1078](https://github.com/NOAA-OWP/inundation-mapping/pull/1078) + +Resolves issue #1033 by adding Alaska-specific data to the FIM input folders and updating the pre-clip vector process to use the proper data and CRS when an Alaska HUC is detected. The `-wbd` flag was removed from the optional arguments of `generate_pre_clip_fim_huc8`. The WBD file path will now only be sourced from the `bash_variables.env` file. The `bash_variables.env` file has been updated to include the new Alaska-specific FIM input files. + +### Changes + +- `/data/wbd/` + - `clip_vectors_to_wbd.py`: Replaced all CRS inputs with the `huc_CRS` variable, which is input based on whether the HUC is Alaska or CONUS. Previously, the default FIM projection was automatically assigned as the CRS (which had been retrieved from `utils.shared_variables`). + + - `generate_pre_clip_fim_huc8.py`: + - Added Alaska projection and links to the new Alaska data file paths that were added to `bash_variables.env`. + - Removed the `wbd` argument from the `pre_clip_hucs_from_wbd` function and made it so that the code gets the WBD path from `bash_variables.env`. + - Added logic to check whether the HUC is in Alaska and, if so, use the Alaska-specific HUC and input file paths. + - Cleaned up the spelling and formatting of some comments +- `/src/` + - `bash_variables.env`: Added the Alaska-specific projection (EPSG:3338) and file paths for Alaska-specific data (see data changelog for list of new input data) + +

+ + ## v4.4.11.1 - 2024-03-08 - [PR#1080](https://github.com/NOAA-OWP/inundation-mapping/pull/1080) Fixes bug in bathymetric adjustment where `mask` is used with `geopandas.read_file`. The solution is to force `read_file` to use `fiona` instead of `pyogrio`. diff --git a/src/bash_variables.env b/src/bash_variables.env index c62f2ef7a..d8d2237b6 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -1,21 +1,32 @@ ## Define inputs # NOTE: $inputsDir is defined in Dockerfile -export DEFAULT_FIM_PROJECTION_CRS=EPSG:5070 -export input_DEM=${inputsDir}/3dep_dems/10m_5070/fim_seamless_3dep_dem_10m_5070.vrt -export input_DEM_domain=${inputsDir}/3dep_dems/10m_5070/HUC6_dem_domain.gpkg -export input_GL_boundaries=${inputsDir}/landsea/gl_water_polygons.gpkg -export input_NLD=${inputsDir}/nld_vectors/System_Routes_NLDFS_5070_230314.gpkg -export input_levees_preprocessed=${inputsDir}/nld_vectors/3d_nld_preprocessed_230314.gpkg -export input_nld_levee_protected_areas=${inputsDir}/nld_vectors/Leveed_Areas_NLDFS_5070_230314.gpkg -export input_nwm_catchments=${inputsDir}/nwm_hydrofabric/nwm_catchments.gpkg -export input_nwm_flows=${inputsDir}/nwm_hydrofabric/nwm_flows.gpkg -export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwaters.gpkg -export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg -export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg -export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ -export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 -export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg +export DEFAULT_FIM_PROJECTION_CRS=EPSG:5070 +export ALASKA_CRS=EPSG:3338 +export input_DEM=${inputsDir}/3dep_dems/10m_5070/fim_seamless_3dep_dem_10m_5070.vrt +export input_DEM_Alaska=${inputsDir}/3dep_dems/10m_South_Alaska/23_11_07/FIM_3dep_dem_South_Alask_10m.vrt +export input_DEM_domain=${inputsDir}/3dep_dems/10m_5070/HUC6_dem_domain.gpkg +export input_DEM_domain_Alaska=${inputsDir}/3dep_dems/10m_South_Alaska/23_11_07/DEM_Domain.gpkg +export input_GL_boundaries=${inputsDir}/landsea/gl_water_polygons.gpkg +export input_NLD=${inputsDir}/nld_vectors/System_Routes_NLDFS_5070_230314.gpkg +export input_NLD_Alaska=${inputsDir}/nld_vectors/System_Routes_NLDFS_3338_230314.gpkg +export input_levees_preprocessed=${inputsDir}/nld_vectors/3d_nld_preprocessed_230314.gpkg +export input_levees_preprocessed_Alaska=${inputsDir}/nld_vectors/3d_nld_preprocessed_230314_3338.gpkg +export input_nld_levee_protected_areas=${inputsDir}/nld_vectors/Leveed_Areas_NLDFS_5070_230314.gpkg +export input_nld_levee_protected_areas_Alaska=${inputsDir}/nld_vectors/Leveed_Areas_NLDFS_3338_230314.gpkg +export input_nwm_catchments=${inputsDir}/nwm_hydrofabric/nwm_catchments.gpkg +export input_nwm_catchments_Alaska=${inputsDir}/nwm_hydrofabric/nwm_catchments_alaska.gpkg +export input_nwm_flows=${inputsDir}/nwm_hydrofabric/nwm_flows.gpkg +export input_nwm_flows_Alaska=${inputsDir}/nwm_hydrofabric/nwm_flows_alaska_nwmV3_ID.gpkg +export input_nwm_headwaters=${inputsDir}/nwm_hydrofabric/nwm_headwaters.gpkg +export input_nwm_headwaters_Alaska=${inputsDir}/nwm_hydrofabric/nwm_headwaters_alaska.gpkg +export input_nwm_lakes=${inputsDir}/nwm_hydrofabric/nwm_lakes.gpkg +export input_nwm_lakes_Alaska=${inputsDir}/nwm_hydrofabric/nwm_waterbodies_alaska.gpkg +export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg +export input_WBD_gdb_Alaska=${inputsDir}/wbd/WBD_National_South_Alaska.gpkg +export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ +export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 +export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg # input file location with nwm feature_id and recurrence flow values export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv From 4907da22ae80a2f114bab717d338893a03c44a57 Mon Sep 17 00:00:00 2001 From: EmilyDeardorff-NOAA <60829052+EmilyDeardorff@users.noreply.github.com> Date: Mon, 11 Mar 2024 12:38:45 -0700 Subject: [PATCH 29/51] v4.4.13.0 Remove GMS branch outlet backpools (#1006) --- docs/CHANGELOG.md | 22 +- src/delineate_hydros_and_produce_HAND.sh | 22 +- src/mitigate_branch_outlet_backpool.py | 543 +++++++++++++++++++++++ src/split_flows.py | 185 ++++++-- 4 files changed, 720 insertions(+), 52 deletions(-) create mode 100755 src/mitigate_branch_outlet_backpool.py diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ea1f51669..42df9c18e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,27 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.13.0 - 2024-03-11 - [PR#1006](https://github.com/NOAA-OWP/inundation-mapping/pull/1006) + +Adds a new module that mitigates the branch outlet backpool error. In some HUCs, an overly-large catchment appears at the outlet of the branch (as in issue #985) which causes an artificially large amount of water to get routed to the smaller stream instead of the main stem. This issue is mitigated by trimming the levelpath just above the outlet and removing the offending pixel catchment from the pixel catchments and catchment reaches files. + +The branch outlet backpool issue is identified based on two criteria: + 1. There is a pixel catchment that is abnormally large (more than two standard deviations above the mean.) + 2. The abnormally-large pixel catchment occurs at the outlet of the levelpath. + +If both criteria are met for a branch, then the issue is mitigated by trimming the flowline to the third-to-last point. + +### Additions + +- `src/mitigate_branch_outlet_backpool.py`: Detects and mitigates the branch outlet backpool error. If both branch outlet backpool criteria are met, the snapped point is set to be the penultimate vertex and then the flowline is trimmed to that point (instead of the last point). Trims the `gw_catchments_pixels_.tif` and `gw_catchments_reaches_.tif` rasters by using `gdal_polygonize.py` to polygonize the `gw_pixel_catchments_.tif` file, creating a mask that excludes the problematic pixel catchment, and then using that mask to trim the pixel catchment and catchment reaches rasters. + +### Changes + +- `src/delineate_hydros_and_produce_HAND.sh`: Adds the `mitigate_branch_outlet_backpool.py` module to run after the `Gage Watershed for Pixels` step. +- `src/split_flows.py`: Improves documentation and readability. + +

+ ## v4.4.12.0 - 2024-03-11 - [PR#1078](https://github.com/NOAA-OWP/inundation-mapping/pull/1078) @@ -180,7 +201,6 @@ The alpha test for v4.4.8.1 came back with a large degradation in skill and we n

- ## v4.4.8.1 - 2023-12-08 - [PR#1047](https://github.com/NOAA-OWP/inundation-mapping/pull/1047) Upgrades JDK to v.17.0.9 in Docker image to address security vulnerabilities. diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 276da3741..527ae54d2 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -97,7 +97,8 @@ $srcDir/split_flows.py -f $tempCurrentBranchDataDir/demDerived_reaches_$current_ -d $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ -s $tempCurrentBranchDataDir/demDerived_reaches_split_$current_branch_id.gpkg \ -p $tempCurrentBranchDataDir/demDerived_reaches_split_points_$current_branch_id.gpkg \ - -w $tempHucDataDir/wbd8_clp.gpkg -l $tempHucDataDir/nwm_lakes_proj_subset.gpkg \ + -w $tempHucDataDir/wbd8_clp.gpkg \ + -l $tempHucDataDir/nwm_lakes_proj_subset.gpkg \ -n $b_arg \ -m $max_split_distance_meters \ -t $slope_min \ @@ -126,7 +127,24 @@ mpiexec -n $ncores_gw $taudemDir/gagewatershed \ -o $tempCurrentBranchDataDir/flows_points_pixels_$current_branch_id.gpkg \ -id $tempCurrentBranchDataDir/idFile_$current_branch_id.txt -# D8 REM ## +## CATCH AND MITIGATE BRANCH OUTLET BACKPOOL ERROR ## +echo -e $startDiv"Catching and mitigating branch outlet backpool issue $hucNumber $current_branch_id" +date -u +Tstart +$srcDir/mitigate_branch_outlet_backpool.py \ + -b $tempCurrentBranchDataDir \ + -cp $tempCurrentBranchDataDir/gw_catchments_pixels_$current_branch_id.tif \ + -cpp $tempCurrentBranchDataDir/gw_catchments_pixels_$current_branch_id.gpkg \ + -cr $tempCurrentBranchDataDir/gw_catchments_reaches_$current_branch_id.tif \ + -s $tempCurrentBranchDataDir/demDerived_reaches_split_$current_branch_id.gpkg \ + -p $tempCurrentBranchDataDir/demDerived_reaches_split_points_$current_branch_id.gpkg \ + -n $b_arg \ + -d $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ + -t $slope_min \ + --calculate-stats +Tcount + +## D8 REM ## echo -e $startDiv"D8 REM $hucNumber $current_branch_id" $srcDir/make_rem.py -d $tempCurrentBranchDataDir/dem_thalwegCond_"$current_branch_id".tif \ -w $tempCurrentBranchDataDir/gw_catchments_pixels_$current_branch_id.tif \ diff --git a/src/mitigate_branch_outlet_backpool.py b/src/mitigate_branch_outlet_backpool.py new file mode 100755 index 000000000..ecbf52b14 --- /dev/null +++ b/src/mitigate_branch_outlet_backpool.py @@ -0,0 +1,543 @@ +#!/usr/bin/env python3 + +import argparse +import os +import subprocess +import warnings +from collections import Counter +from os import remove +from os.path import isfile + +import geopandas as gpd +import numpy as np +import pandas as pd +import rasterio +from rasterio.mask import mask +from shapely import ops +from shapely.geometry import Point + + +warnings.simplefilter(action='ignore', category=FutureWarning) + + +def mitigate_branch_outlet_backpool( + branch_dir, + catchment_pixels_filename, + catchment_pixels_polygonized_filename, + catchment_reaches_filename, + split_flows_filename, + split_points_filename, + nwm_streams_filename, + dem_filename, + slope_min, + calculate_stats, + dry_run, +): + # -------------------------------------------------------------- + # Define functions + + # Test whether there are catchment size outliers (backpool error criteria 1) + def catch_catchment_size_outliers(catchment_pixels_geom): + # Quantify the amount of pixels in each catchment + unique_values = np.unique(catchment_pixels_geom) + value_counts = Counter(catchment_pixels_geom.ravel()) + + vals, counts = [], [] + for value in unique_values: + vals.append(value) + counts.append(value_counts[value]) + + # Create a structured array from the two lists and convert to pd df + catchments_array = np.array(list(zip(vals, counts)), dtype=[('catchment_id', int), ('counts', int)]) + catchments_df = pd.DataFrame(catchments_array) + + # Remove row for a catchment_id of zero + catchments_df = catchments_df[catchments_df['catchment_id'] > 0] + + # Calculate the mean and standard deviation of the 'counts' column + mean_counts = catchments_df['counts'].mean() + std_dev_counts = catchments_df['counts'].std() + + # Define the threshold for outliers (1 standard deviation from the mean) + threshold = 1 * std_dev_counts + + # Create a new column 'outlier' with True for outliers and False for non-outliers + catchments_df['outlier'] = abs(catchments_df['counts'] - mean_counts) > threshold + + # Quantify outliers + num_outlier = catchments_df['outlier'].value_counts()[True] + + if num_outlier == 0: + print('No outliers detected in catchment size.') + + flagged_catchment = False + elif num_outlier >= 1: + print(f'{num_outlier} outlier catchment(s) found in catchment size.') + + flagged_catchment = True + else: + print('WARNING: Unable to check outlier count.') + + # Make a list of outlier catchment ID's + catchments_df['outlier'] = catchments_df['outlier'].astype('string') + outlier_catchment_ids = catchments_df[catchments_df['outlier'] == 'True']['catchment_id'].tolist() + + return flagged_catchment, outlier_catchment_ids + + # Extract raster catchment ID for the last point + def get_raster_value(point): + row, col = src.index(point.geometry.x, point.geometry.y) + value = catchment_pixels_geom[row, col] + return value + + # Function to test whether the catchment occurs at the outlet (Error Criteria 2) + def check_if_outlet(last_point_geom, outlier_catchment_ids): + # Get the catchment ID of the last_point_geom + last_point_geom['catchment_id'] = last_point_geom.apply(get_raster_value, axis=1) + + # Check if values in 'catchment_id' column of the snapped point are in outlier_catchments_df + outlet_flag = last_point_geom['catchment_id'].isin(outlier_catchment_ids) + outlet_flag = any(outlet_flag) + + outlet_catchment_id = last_point_geom['catchment_id'] + + return outlet_flag, outlet_catchment_id + + # Function to extract the last point from the line + def extract_last_point(line): + return line.coords[-1] + + # Function to extract the third-to-last point from the line + def extract_pt_3tl(line): + return line.coords[-3] + + # Function to count coordinates in a linestring + def count_coordinates(line_string): + return len(line_string.coords) + + # Function to trim the flow to the specified outlet point + # Based on snap_and_trim_flow() from split_flows.py (as of 10/20/23) + def snap_and_trim_splitflow(outlet_point, flows): + if len(flows.index) == 1: + flow = flows + + else: + # Get the nearest flowline to the outlet point + near_flows = [] + for index, point in outlet_point.iterrows(): + nearest_line = flows.loc[flows.distance(point['geometry']).idxmin()] + near_flows.append(nearest_line) + + # Create a new GeoDataFrame with the closest flowline(s) + near_flows_gdf = gpd.GeoDataFrame(near_flows, crs=flows.crs) + + # Trim the near flows to get the furthest downstream one + if len(near_flows_gdf) == 1: + flow = near_flows_gdf + + elif len(near_flows_gdf) > 1: + # Get the highest node value (i.e. furthest down) + last_node = near_flows_gdf['From_Node'].max() + + # Subset flows to get furthest down flow + flow = near_flows_gdf[near_flows_gdf['From_Node'] == last_node] + + # Calculate flowline initial length + toMetersConversion = 1e-3 + initial_length_km = flow.geometry.length.iloc[0] * toMetersConversion + + # Reset index if there is an index mismatch + if flow.index != outlet_point.index: + print('WARNING: Index mismatch detected') + print(f'flow.index: {flow.index}; outlet_point.index: {outlet_point.index}') + print('Resetting index of flow and outlet_point geometries.') + + flow = flow.reset_index() + outlet_point = outlet_point.reset_index() + + # Snap the point to the line + outlet_point['geometry'] = flow.interpolate(flow.project(outlet_point)) + + # Split the flows at the snapped point + # Note: Buffering is to account for python precision issues + outlet_point_buffer = outlet_point.iloc[0]['geometry'].buffer(1) + split_lines = ops.split(flow.iloc[0]['geometry'], outlet_point_buffer) + + # Get a list of the split line object indices + split_lines_indices = list(range(0, len(split_lines.geoms), 1)) + + # Produce a table of the geometry length of each splitlines geometries + linestring_lengths = [] + linestring_geoms = [] + + for index in split_lines_indices: + linestring_geoms.append(split_lines.geoms[index]) + linestring_lengths.append(split_lines.geoms[index].length) + + split_lines_df = pd.DataFrame( + { + 'split_lines_indices': split_lines_indices, + 'geometry': linestring_geoms, + 'len_flow': linestring_lengths, + } + ) + + # Select the longest line segment from the split + longest_split_line_df = split_lines_df[split_lines_df.len_flow == split_lines_df.len_flow.max()] + + # Convert the longest split line into a geodataframe + # This removes the bits that got cut off + longest_split_line_gdf = gpd.GeoDataFrame( + longest_split_line_df, geometry=longest_split_line_df['geometry'], crs=flows.crs + ) + + # Get the new flow geometry + flow_geometry = longest_split_line_gdf.iloc[0]['geometry'] + + # Replace geometry in merged flowine + if len(flows) > 1: + flows.loc[flows['NextDownID'] == '-1', 'geometry'] = flow_geometry + else: + flows['geometry'] = flow_geometry + + return flows, initial_length_km + + def calculate_length_and_slope(flows, dem, slope_min): + print('Recalculating length and slope of outlet segment...') + + # Select the last flowline segment (if there are multiple segments) + if len(flows) > 1: + flow = flows[flows['NextDownID'] == '-1'] + else: + flow = flows + + # Calculate channel slope (adapted from split_flows.py on 11/21/23) + start_point = flow.geometry.iloc[0].coords[0] + end_point = flow.geometry.iloc[0].coords[-1] + + # Get start and end elevation + start_elev, end_elev = [i[0] for i in rasterio.sample.sample_gen(dem, [start_point, end_point])] + + # Calculate the slope by differencing the elevations and dividing it by the length + slope = float(abs(start_elev - end_elev) / flow.length) + + if slope < slope_min: + slope = slope_min + + # Calculate length + toMetersConversion = 1e-3 + LengthKm = flow.geometry.length * toMetersConversion + + # Update flows with the updated flow object + if len(flows) > 1: + flows.loc[flows['NextDownID'] == '-1', 'S0'] = slope + flows.loc[flows['NextDownID'] == '-1', 'LengthKm'] = LengthKm + + else: + flows['S0'] = slope + flows['LengthKm'] = LengthKm + + return flows, LengthKm + + # Convert the geodataframe into a json format compatible to rasterio + def gdf_to_json(gdf): + import json + + return [json.loads(gdf.to_json())['features'][0]['geometry']] + + # Mask a raster to a json boundary and save the new raster + def mask_raster_to_boundary(raster_path, boundary_json, save_path): + with rasterio.open(raster_path) as raster: + # Copy profile + raster_profile = raster.profile.copy() + + # Mask catchment reaches to new boundary + raster_masked, _ = mask(raster, boundary_json) + + if isfile(save_path): + remove(save_path) + + # Save new catchment reaches TODO: update output path + with rasterio.open(save_path, "w", **raster_profile, BIGTIFF='YES') as dest: + dest.write(raster_masked[0, :, :], indexes=1) + + # -------------------------------------------------------------- + # Read in nwm lines, explode to ensure linestrings are the only geometry + nwm_streams = gpd.read_file(nwm_streams_filename).explode(index_parts=True) + + # Check whether it's branch zero + if 'levpa_id' in nwm_streams.columns: + # -------------------------------------------------------------- + # If it's NOT branch zero, check for the two criteria and mitigate issue if needed + + # Read in data and check if the files exist + print() + print('Non-branch zero, loading data for test ...') + + # Read in the catchment pixels tif + if isfile(catchment_pixels_filename): + with rasterio.open(catchment_pixels_filename) as src: + catchment_pixels_geom = src.read(1) + else: + catchment_pixels_geom = None + print(f'WARNING: No catchment pixels geom at {catchment_pixels_filename}.') + + # # Read in the catchment reaches tif + # if isfile(catchment_reaches_filename): + # with rasterio.open(catchment_reaches_filename) as src: + # catchment_reaches_geom = src.read(1) + # else: + # catchment_reaches_geom = None + # print(f'No catchment pixels geome at {catchment_reaches_filename}.') + + # Read in split_flows_file and split_points_filename + split_flows_geom = gpd.read_file(split_flows_filename) + split_points_geom = gpd.read_file(split_points_filename) + + # Subset the split flows to get the last one + split_flows_last_geom = split_flows_geom[split_flows_geom['NextDownID'] == '-1'] + + # Check whether there are multiple NextDownID's of -1 + if len(split_flows_last_geom.index) == 1: + one_neg1_nextdownid = True + elif len(split_flows_last_geom.index) > 1: + print('WARNING: Multiple stream segments found with NextDownID of -1.') + one_neg1_nextdownid = False + elif len(split_flows_last_geom.index) == 0: + print('WARNING: Zero stream segments found with NextDownID of -1.') + one_neg1_nextdownid = False + + # Check whether catchment_pixels_geom exists + if (catchment_pixels_geom is not None) and (one_neg1_nextdownid is True): + print( + 'A catchment geom file and only one NextDownID of -1 were found, testing for backpool criteria...' + ) # verbose + + # Check whether any pixel catchment is substantially larger than other catchments + # (Backpool Error Criteria 1) + flagged_catchment, outlier_catchment_ids = catch_catchment_size_outliers(catchment_pixels_geom) + + # -------------------------------------------------------------- + # If there are outlier catchments, test whether the catchment occurs at the outlet + # (Backpool Error Criteria 2) + + if flagged_catchment is True: + # Apply the function to create a new GeoDataFrame + last_point = split_flows_last_geom['geometry'].apply(extract_last_point).apply(Point) + last_point_geom = gpd.GeoDataFrame(last_point, columns=['geometry'], crs=split_flows_geom.crs) + + # Check whether the last vertex corresponds with any of the outlier catchment ID's + print('Flagged catchment(s) detected. Testing for second criteria.') + outlet_flag, outlet_catchment_id = check_if_outlet(last_point_geom, outlier_catchment_ids) + + else: + # If the catchment flag is False, just set the outlet flag to False automatically + outlet_flag = False + + # If there is an outlier catchment at the outlet, set the snapped point as penultimate vertex + if outlet_flag is True: + # -------------------------------------------------------------- + # Trim flowline and flow points to penultimate vertex + + print( + 'Incorrectly-large outlet pixel catchment detected. \ + Snapping line points to penultimate vertex.' + ) + + # Count coordinates in 'geometry' column + split_flows_last_geom['num_coordinates'] = split_flows_last_geom['geometry'].apply( + lambda x: count_coordinates(x) if x.geom_type == 'LineString' else None + ) + + # Get the last geometry and check the length of the last geometry + if split_flows_last_geom['num_coordinates'].iloc[0] < 3: + # If the length is shorter than 3, extract the first point of the 2nd-to-last geometry + if len(split_flows_geom.index) > 1: + print('Extract first point of second-to-last geometry.') + + # Get "from_node" of last segment + node_2tl = split_flows_last_geom['From_Node'].iloc[0] + + # Subset second-to-last segment by selecting by the node connection + split_flows_2tl_geom = split_flows_geom[split_flows_geom['To_Node'] == node_2tl] + + # Get last point of second-to-last segment + pt_3tl = split_flows_2tl_geom['geometry'].apply(extract_last_point).apply(Point) + trim_flowlines_proceed = True + + else: + print('Geom length is shorter than 3 coords and no second-to-last geom available.') + print('Skipping branch outlet backpool mitigation for this branch.') + trim_flowlines_proceed = False + + else: + # If the length is 3 coords or greater, extract the third-to-last point of the last geom + print('Extract third-to-last point of last geometry.') + pt_3tl = split_flows_last_geom['geometry'].apply(extract_pt_3tl).apply(Point) + trim_flowlines_proceed = True + + if trim_flowlines_proceed is True: + # Apply the function to create a new GeoDataFrame + pt_3tl_geom = gpd.GeoDataFrame(pt_3tl, columns=['geometry'], crs=split_flows_geom.crs) + + # Get the catchment ID of the new snapped point + pt_3tl_geom['catchment_id'] = pt_3tl_geom.apply(get_raster_value, axis=1) + + # Snap and trim the flowline to the selected point + trimmed_flows, inital_length_km = snap_and_trim_splitflow(pt_3tl_geom, split_flows_geom) + + # Create buffer around the updated flows geodataframe (and make sure it's all one shape) + buffer = trimmed_flows.buffer(10).geometry.unary_union + + # Remove flowpoints that don't intersect with the trimmed flow line + split_points_filtered_geom = split_points_geom[split_points_geom.geometry.within(buffer)] + + # -------------------------------------------------------------- + # Calculate the slope and length of the newly trimmed flows + dem = rasterio.open(dem_filename, 'r') + output_flows, new_length_km = calculate_length_and_slope(trimmed_flows, dem, slope_min) + + # -------------------------------------------------------------- + # Polygonize pixel catchments using subprocess + + # print('Polygonizing pixel catchments...') # verbose + + gdal_args = [ + f'gdal_polygonize.py -8 -f GPKG {catchment_pixels_filename} \ + {catchment_pixels_polygonized_filename} catchments HydroID' + ] + return_code = subprocess.call(gdal_args, shell=True) + + if return_code != 0: + print("gdal_polygonize failed with return code", return_code) + # else: + # print("gdal_polygonize executed successfully.") # verbose + + # Read in the polygonized catchment pixels + cp_poly_geom = gpd.read_file(catchment_pixels_polygonized_filename) + + # -------------------------------------------------------------- + # Mask problematic pixel catchment from the catchments rasters + + # Convert series to number object + outlet_catchment_id = outlet_catchment_id.iloc[0] + + # Filter out the flagged pixel catchment + cp_poly_filt_geom = cp_poly_geom[cp_poly_geom['HydroID'] != outlet_catchment_id] + + # Dissolve the filtered pixel catchments into one geometry (the new boundary) + cp_new_boundary_geom = cp_poly_filt_geom.dissolve() + + # Convert the geodataframe into a format compatible to rasterio + catchment_pixels_new_boundary_json = gdf_to_json(cp_new_boundary_geom) + + if dry_run is True: + print('Dry run: Skipping raster masking!') + + elif dry_run is False: + # Mask catchment reaches raster + mask_raster_to_boundary( + catchment_reaches_filename, + catchment_pixels_new_boundary_json, + catchment_reaches_filename, + ) + + # Mask catchment pixels raster + mask_raster_to_boundary( + catchment_pixels_filename, + catchment_pixels_new_boundary_json, + catchment_pixels_filename, + ) + + # print('Finished masking!') # verbose + + # -------------------------------------------------------------- + if calculate_stats is True: + print('Calculating stats...') # verbose + + # Get the area of the old and new catchment boundaries + catchment_pixels_old_boundary_geom = cp_poly_geom.dissolve() + + old_boundary_area = catchment_pixels_old_boundary_geom.area + new_boundary_area = cp_new_boundary_geom.area + + # Calculate the km and percent differences of the catchment area + boundary_area_km_diff = float(old_boundary_area - new_boundary_area) + boundary_area_percent_diff = float( + ((boundary_area_km_diff) / old_boundary_area) * 100 + ) + + # Calculate the difference (km) of the flowlines + flowlength_km_diff = float(inital_length_km - new_length_km) + + # Create a dataframe with this data + backpool_stats_df = pd.DataFrame( + { + 'flowlength_km_diff': [flowlength_km_diff], + 'area_km_diff': [boundary_area_km_diff], + 'area_percent_diff': [boundary_area_percent_diff], + } + ) + + backpool_stats_filepath = os.path.join(branch_dir, 'backpool_stats.csv') + + # Save stats + backpool_stats_df.to_csv(backpool_stats_filepath, index=False) + print(f'Saved backpool stats to {backpool_stats_filepath}') + + # -------------------------------------------------------------- + # Save the outputs + + if dry_run is True: + print('Test run... not saving outputs!') + + elif dry_run is False: + if isfile(split_flows_filename): + remove(split_flows_filename) + if isfile(split_points_filename): + remove(split_points_filename) + + output_flows.to_file(split_flows_filename, driver='GPKG', index=False) + split_points_filtered_geom.to_file(split_points_filename, driver='GPKG', index=False) + + else: + print('Incorrectly-large outlet pixel catchment was NOT detected.') + + else: + print('Will not test for outlet backpool error.') + + else: + print('Will not test for outlet backpool error in branch zero.') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Detect and mitigate branch outlet backpools issue.') + parser.add_argument('-b', '--branch-dir', help='branch directory', required=True) + parser.add_argument('-cp', '--catchment-pixels-filename', help='catchment-pixels-filename', required=True) + parser.add_argument( + '-cpp', + '--catchment-pixels-polygonized-filename', + help='catchment-pixels-polygonized-filename', + required=True, + ) + parser.add_argument( + '-cr', '--catchment-reaches-filename', help='catchment-reaches-filename', required=True + ) + parser.add_argument('-s', '--split-flows-filename', help='split-flows-filename', required=True) + parser.add_argument('-p', '--split-points-filename', help='split-points-filename', required=True) + parser.add_argument('-n', '--nwm-streams-filename', help='nwm-streams-filename', required=True) + parser.add_argument('-d', '--dem-filename', help='dem-filename', required=True) + parser.add_argument('-t', '--slope-min', help='Minimum slope', required=True) + parser.add_argument( + '--calculate-stats', help='Optional flag to calculate stats', required=False, action='store_true' + ) + parser.add_argument( + '--dry-run', help='Optional flag to run without changing files.', required=False, action='store_true' + ) + + # Extract to dictionary and assign to variables + args = vars(parser.parse_args()) + args['slope_min'] = float(args['slope_min']) + args['calculate_stats'] = bool(args['calculate_stats']) + + mitigate_branch_outlet_backpool(**args) diff --git a/src/split_flows.py b/src/split_flows.py index 575b473c0..0a14943ce 100755 --- a/src/split_flows.py +++ b/src/split_flows.py @@ -1,17 +1,57 @@ #!/usr/bin/env python3 ''' -Description: - 1) split stream segments based on lake boundaries and input threshold distance - 2) calculate channel slope, manning's n, and LengthKm for each segment - 3) create unique ids using HUC8 boundaries (and unique FIM_ID column) - 4) create network traversal attribute columns (To_Node, From_Node, NextDownID) - 5) create points layer with segment verticies encoded with HydroID's (used for catchment delineation in next step) +Description + + ARGUMENTS + + flows_filename: + Filename of existing DEM-derived reaches input file. i.e. /demDerived_reaches_.shp + + dem_filename: + Filename of existing DEM input file. i.e. /dem_thalwegCond_.tif + + catchment_pixels_filename: + Filename of existing catchment pixels input file. i.e. /gw_catchments_pixels_.tif + + split_flows_filename: + Save location for output flowlines. i.e. /demDerived_reaches_split_.gpkg + + split_points_filename: + Save location for output flowpoints. i.e. /demDerived_reaches_split_points_.gpkg + + wbd8_clp_filename: + Filename of existing HUC8 geometry file. i.e. /wbd8_clp.gpkg + + lakes_filename: + Filename of existing Lakes geometry file. i.e. /nwm_lakes_proj_subset.gpkg + + nwm_streams_filename: + Filename of existing NWM streams input layer. + + max_length: + Maximum acceptable length of stream segments (in meters). + + slope_min: + Channel slope minimum value. + + lakes_buffer_input: + Buffer size to use with lakes (in meters). + + + PROCESSING STEPS + + 1) Split stream segments based on lake boundaries and input threshold distance + 2) Calculate channel slope, manning's n, and LengthKm for each segment + 3) Create unique ids using HUC8 boundaries (and unique FIM_ID column) + 4) Create network traversal attribute columns (To_Node, From_Node, NextDownID) + 5) Create points layer with segment verticies encoded with HydroID's (used for catchment delineation in next step) + ''' import argparse import sys -from collections import OrderedDict +from collections import Counter, OrderedDict from os import remove from os.path import isfile @@ -44,8 +84,11 @@ def split_flows( slope_min, lakes_buffer_input, ): + # -------------------------------------------------------------- + # Define functions + def snap_and_trim_flow(snapped_point, flows): - # Find nearest flow line + # Find the flowline nearest to the snapped point (if there's multiple flowlines) if len(flows) > 1: sjoin_nearest = gpd.sjoin_nearest(snapped_point, flows, max_distance=100) if sjoin_nearest.empty: @@ -66,23 +109,26 @@ def snap_and_trim_flow(snapped_point, flows): snapped_point['geometry'] = flow.interpolate(flow.project(snapped_point.geometry))[0] # Trim flows to snapped point - # buffer here because python precision issues, print(demDerived_reaches.distance(snapped_point) < 1e-8) trimmed_line = shapely_ops_split( flow.iloc[0]['geometry'], snapped_point.iloc[0]['geometry'].buffer(1) ) + # Note: Buffering is to account for python precision issues, print(demDerived_reaches.distance(snapped_point) < 1e-8) + # Edge cases: line string not split?, nothing is returned, split does not preserve linestring order? - # Note to dear reader: last here is really the most upstream segment (see crevats above). + # Note to dear reader: last here is really the most upstream segment (see caveats above). # When we split we should get 3 segments, the most downstream one # the tiny 1 meter segment that falls within the snapped point buffer, and the most upstream one. # We want that last one which is why we trimmed_line[len(trimmed_line)-1] + last_line_segment = pd.DataFrame( {'id': ['first'], 'geometry': [trimmed_line.geoms[len(trimmed_line.geoms) - 1].wkt]} ) - # when we update geopandas verison: last_line_segment = gpd.GeoSeries.from_wkt(last_line_segment) + + # Note: When we update geopandas verison: last_line_segment = gpd.GeoSeries.from_wkt(last_line_segment) last_line_segment['geometry'] = last_line_segment['geometry'].apply(wkt.loads) last_line_segment_geodataframe = gpd.GeoDataFrame(last_line_segment).set_crs(flow.crs) - # replace geometry in merged flowine + # Replace geometry in merged flowine flow_geometry = last_line_segment_geodataframe.iloc[0]['geometry'] if nearest_index is not None: @@ -93,19 +139,31 @@ def snap_and_trim_flow(snapped_point, flows): return flows - toMetersConversion = 1e-3 + # -------------------------------------------------------------- + # Read in data and set constants print('Loading data ...') - flows = gpd.read_file(flows_filename) + toMetersConversion = 1e-3 + + # Read in flows data and check for relevant streams within HUC boundary + flows = gpd.read_file(flows_filename) if len(flows) == 0: - # this is not an exception, but a custom exit code that can be trapped + # Note: This is not an exception, but a custom exit code that can be trapped print("No relevant streams within HUC boundaries.") sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # will send a 61 back + # Read in and format other data wbd8 = gpd.read_file(wbd8_clp_filename) dem = rasterio.open(dem_filename, 'r') + # if isfile(catchment_pixels_filename): + # with rasterio.open(catchment_pixels_filename) as src: + # catchments_geom = src.read(1) + # else: + # catchments_geom = None + # print(f'No catchment pixels geometry found at {catchment_pixels_filename}.') ## debug + if isfile(lakes_filename): lakes = gpd.read_file(lakes_filename) else: @@ -113,58 +171,64 @@ def snap_and_trim_flow(snapped_point, flows): wbd8 = wbd8.filter(items=[FIM_ID, 'geometry']) wbd8 = wbd8.set_index(FIM_ID) - # don't index parts because the new index format causes problems later on + + # Note: We don't index parts because the new index format causes problems later on flows = flows.explode(index_parts=False) - # temp - flows = flows.to_crs(wbd8.crs) + flows = flows.to_crs(wbd8.crs) # Note: temporary solution split_flows = [] slopes = [] hydro_id = 'HydroID' + # -------------------------------------------------------------- + # Trim DEM streams to NWM branch terminus # If loop addressing: https://github.com/NOAA-OWP/inundation-mapping/issues/560 - print('trimming DEM stream to NWM branch terminus') - # read in nwm lines, explode to ensure linestrings are the only geometry + + print('Trimming DEM stream to NWM branch terminus...') + + # Read in nwm lines, explode to ensure linestrings are the only geometry nwm_streams = gpd.read_file(nwm_streams_filename).explode(index_parts=True) - # Dissolve levelpath if not branch 0 + # If it's NOT branch 0: Dissolve levelpath if 'levpa_id' in nwm_streams.columns: if len(nwm_streams) > 1: - # Dissolve the linestring (how much faith should I hold that these are digitized with flow?) + # Dissolve the linestring TODO: How much faith should I hold that these are digitized with flow? (JC) linestring_geo = ops.linemerge(nwm_streams.dissolve(by='levpa_id').iloc[0]['geometry']) else: linestring_geo = nwm_streams.iloc[0]['geometry'] - # Identify the end vertex (most downstream, should be last), transform into geodataframe - terminal_nwm_point = [] - + # If the linesting is in MultiLineString format, get the last LineString if linestring_geo.geom_type == 'MultiLineString': - # Get last LineString linestring_geo = linestring_geo.geoms[-1] + # Identify the end vertex (most downstream, should be last), transform into geodataframe + terminal_nwm_point = [] last = Point(linestring_geo.coords[-1]) terminal_nwm_point.append({'ID': 'terminal', 'geometry': last}) snapped_point = gpd.GeoDataFrame(terminal_nwm_point).set_crs(nwm_streams.crs) + # Snap and trim the flowline to the snapped point flows = snap_and_trim_flow(snapped_point, flows) - # If branch 0: loop over NWM terminal segments + # If it is branch 0: Loop over NWM terminal segments else: nwm_streams_terminal = nwm_streams[nwm_streams['to'] == 0] if not nwm_streams_terminal.empty: for i, row in nwm_streams_terminal.iterrows(): linestring_geo = row['geometry'] + # Identify the end vertex (most downstream, should be last), transform into geodataframe terminal_nwm_point = [] last = Point(linestring_geo.coords[-1]) terminal_nwm_point.append({'ID': 'terminal', 'geometry': last}) snapped_point = gpd.GeoDataFrame(terminal_nwm_point).set_crs(nwm_streams.crs) + # Snap and trim the flowline to the snapped point flows = snap_and_trim_flow(snapped_point, flows) - # split at HUC8 boundaries - print('splitting stream segments at HUC8 boundaries') + # Split stream segments at HUC8 boundaries + print('Splitting stream segments at HUC8 boundaries...') flows = ( gpd.overlay(flows, wbd8, how='union', keep_geom_type=True) .explode(index_parts=True) @@ -172,16 +236,18 @@ def snap_and_trim_flow(snapped_point, flows): ) flows = flows[~flows.is_empty] + # Make sure flows object doesn't have a length of zero if len(flows) == 0: - # this is not an exception, but a custom exit code that can be trapped + # Note: This is not an exception, but a custom exit code that can be trapped print("No relevant streams within HUC boundaries.") - sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # will send a 61 back + sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # Note: Will send a 61 back - # check for lake features + # Check for lake features and split flows at lake boundaries, if needed if lakes is not None and len(flows) > 0: if len(lakes) > 0: - print('splitting stream segments at ' + str(len(lakes)) + ' waterbodies') - # create splits at lake boundaries + print('Splitting stream segments at ' + str(len(lakes)) + ' waterbodies...') + + # Create splits at lake boundaries lakes = lakes.filter(items=['newID', 'geometry']) lakes = lakes.set_index('newID') flows = ( @@ -192,27 +258,36 @@ def snap_and_trim_flow(snapped_point, flows): lakes_buffer = lakes.copy() lakes_buffer['geometry'] = lakes.buffer( lakes_buffer_input - ) # adding X meter buffer for spatial join comparison (currently using 20meters) - - print('splitting ' + str(len(flows)) + ' stream segments based on ' + str(max_length) + ' m max length') + ) # Note: adding X meter buffer for spatial join comparison (currently using 20meters) + + print( + 'Splitting ' + + str(len(flows)) + + ' stream segments using on max length of ' + + str(max_length) + + ' meters' + ) - # remove empty geometries + # Remove empty flow geometries flows = flows.loc[~flows.is_empty, :] + # Exit processing if length of flows is zero if len(flows) == 0: - # this is not an exception, but a custom exit code that can be trapped + # Note: This is not an exception, but a custom exit code that can be trapped print("No relevant streams within HUC boundaries.") sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # will send a 61 back + # --- begin copied into branch outlet backpool --- DEBUG -- maybe make this a function so we can call both? + # Iterate through flows and calculate channel slope, manning's n, and LengthKm for each segment for i, lineString in enumerate(flows.geometry): # Reverse geometry order (necessary for BurnLines) lineString = LineString(lineString.coords[::-1]) - # skip lines of zero length + # Skip lines of zero length if lineString.length == 0: continue - # existing reaches of less than max_length + # Process existing reaches that are less than the max_length if lineString.length < max_length: split_flows = split_flows + [lineString] line_points = [point for point in zip(*lineString.coords.xy)] @@ -227,6 +302,7 @@ def snap_and_trim_flow(snapped_point, flows): slopes = slopes + [slope] continue + # Calculate the split length splitLength = lineString.length / np.ceil(lineString.length / max_length) cumulative_line = [] @@ -235,6 +311,7 @@ def snap_and_trim_flow(snapped_point, flows): last_point_in_entire_lineString = list(zip(*lineString.coords.xy))[-1] + # Calculate cumulative length and channel slope, for point in zip(*lineString.coords.xy): cumulative_line = cumulative_line + [point] line_points = line_points + [point] @@ -248,6 +325,7 @@ def snap_and_trim_flow(snapped_point, flows): cumulative_length = LineString(cumulative_line).length + # If the cumulative line length is greater than or equal to the split length.... if cumulative_length >= splitLength: splitLineString = LineString(cumulative_line) split_flows = split_flows + [splitLineString] @@ -283,6 +361,7 @@ def snap_and_trim_flow(snapped_point, flows): slope = slope_min slopes = slopes + [slope] + # Assemble the slopes and split flows into a geodataframe split_flows_gdf = gpd.GeoDataFrame( {'S0': slopes, 'geometry': split_flows}, crs=flows.crs, geometry='geometry' ) @@ -290,15 +369,19 @@ def snap_and_trim_flow(snapped_point, flows): if lakes is not None: split_flows_gdf = gpd.sjoin( split_flows_gdf, lakes_buffer, how='left', predicate='within' - ) # options: intersects, within, contains, crosses + ) # Note: Options include intersects, within, contains, crosses split_flows_gdf = split_flows_gdf.rename(columns={"index_right": "LakeID"}).fillna(-999) else: split_flows_gdf['LakeID'] = -999 - # need to figure out why so many duplicate stream segments for 04010101 FR - split_flows_gdf = split_flows_gdf.drop_duplicates() + # --- end of copied into branch outlet backpool --- DEBUG -- maybe make this a function so we can call both? + + # Drop duplicate stream segments + split_flows_gdf = ( + split_flows_gdf.drop_duplicates() + ) # TODO: Need to figure out why so many duplicate stream segments for 04010101 FR (JC) - # Create Ids and Network Traversal Columns + # Create IDs and Network Traversal Columns addattributes = build_stream_traversal.build_stream_traversal_columns() tResults = None tResults = addattributes.execute(split_flows_gdf, wbd8, hydro_id) @@ -307,12 +390,14 @@ def snap_and_trim_flow(snapped_point, flows): else: print('Error: Could not add network attributes to stream segments') - # remove single node segments + # Remove single node segments split_flows_gdf = split_flows_gdf.query("From_Node != To_Node") - # Get all vertices split_points = OrderedDict() + + # Iterate through split flows line segments and create the points along each segment for index, segment in split_flows_gdf.iterrows(): + # Get the points of the linestring geometry lineString = segment.geometry for point in zip(*lineString.coords.xy): @@ -331,6 +416,8 @@ def snap_and_trim_flow(snapped_point, flows): {'id': hydroIDs_points, 'geometry': split_points}, crs=flows.crs, geometry='geometry' ) + # -------------------------------------------------------------- + # Save the outputs print('Writing outputs ...') if isfile(split_flows_filename): @@ -339,9 +426,9 @@ def snap_and_trim_flow(snapped_point, flows): remove(split_points_filename) if len(split_flows_gdf) == 0: - # this is not an exception, but a custom exit code that can be trapped + # Note: This is not an exception, but a custom exit code that can be trapped print("There are no flowlines after stream order filtering.") - sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # will send a 61 back + sys.exit(FIM_exit_codes.NO_FLOWLINES_EXIST.value) # Note: Will send a 61 back split_flows_gdf.to_file(split_flows_filename, driver=getDriver(split_flows_filename), index=False) From f2062140b5d7f709710ccdbc34bb9137406396dc Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Mon, 11 Mar 2024 13:44:21 -0600 Subject: [PATCH 30/51] v4.4.13.1 Fix bug in levee masking in branch 0 (#1086) --- docs/CHANGELOG.md | 12 ++++++++++++ src/mask_dem.py | 26 +++++++++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 42df9c18e..a61567601 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + +## v4.4.13.1 - 2024-03-11 - [PR#1086](https://github.com/NOAA-OWP/inundation-mapping/pull/1086) + +Fixes bug where levee-protected areas were not being masked from branch 0 DEMs. + +### Changes + +`src/mask_dem.py`: Corrects indentation preventing masked branch 0 from overwriting existing DEM. + +

+ ## v4.4.13.0 - 2024-03-11 - [PR#1006](https://github.com/NOAA-OWP/inundation-mapping/pull/1006) Adds a new module that mitigates the branch outlet backpool error. In some HUCs, an overly-large catchment appears at the outlet of the branch (as in issue #985) which causes an artificially large amount of water to get routed to the smaller stream instead of the main stem. This issue is mitigated by trimming the levelpath just above the outlet and removing the offending pixel catchment from the pixel catchments and catchment reaches files. @@ -53,6 +64,7 @@ Fixes bug in bathymetric adjustment where `mask` is used with `geopandas.read_fi

+ ## v4.4.11.0 - 2024-02-16 - [PR#1077](https://github.com/NOAA-OWP/inundation-mapping/pull/1077) Replace `fiona` with `pyogrio` to improve I/O speed. `geopandas` will use `pyogrio` by default starting with version 1.0. `pyarrow` was also added as an environment variable to further speedup I/O. As a result of the changes in this PR, `fim_pipeline.sh` runs approximately 10% faster. diff --git a/src/mask_dem.py b/src/mask_dem.py index f551c9df4..a9dc55dd8 100755 --- a/src/mask_dem.py +++ b/src/mask_dem.py @@ -55,6 +55,7 @@ def mask_dem( assert os.path.exists(catchments_filename), f"Catchments file {catchments_filename} does not exist" dem_masked = None + levee_catchments_masked = None with rio.open(dem_filename) as dem: dem_profile = dem.profile.copy() @@ -104,24 +105,23 @@ def mask_dem( geoms = [feature["geometry"] for i, feature in levee_catchments_to_mask.iterrows()] - levee_catchments_masked = None if len(geoms) > 0: levee_catchments_masked, _ = mask(dem, geoms, invert=True) - out_masked = None - if dem_masked is None: - if levee_catchments_masked is not None: - out_masked = levee_catchments_masked + out_masked = None + if dem_masked is None: + if levee_catchments_masked is not None: + out_masked = levee_catchments_masked + else: + if levee_catchments_masked is None: + out_masked = dem_masked else: - if levee_catchments_masked is None: - out_masked = dem_masked - else: - out_masked = np.where(levee_catchments_masked == nodata, nodata, dem_masked) - - if out_masked is not None: - with rio.open(out_dem_filename, "w", **dem_profile, BIGTIFF='YES') as dest: - dest.write(out_masked[0, :, :], indexes=1) + out_masked = np.where(levee_catchments_masked == nodata, nodata, dem_masked) + + if out_masked is not None: + with rio.open(out_dem_filename, "w", **dem_profile, BIGTIFF='YES') as dest: + dest.write(out_masked[0, :, :], indexes=1) if __name__ == '__main__': From 27f74d5cf459a7bf1d7fe7a57563942b325d7e1d Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Thu, 4 Apr 2024 21:07:01 +0000 Subject: [PATCH 31/51] v4.4.13.2 Updates for newer openjdk and black packages (#1110) --- .pre-commit-config.yaml | 2 +- Dockerfile | 2 + Pipfile | 2 +- Pipfile.lock | 65 ++++++++++--------- data/aws/aws_base.py | 1 - docs/CHANGELOG.md | 16 +++++ src/src_roughness_optimization.py | 18 ++--- src/usgs_gage_crosswalk.py | 6 +- tools/overlapping_inundation.py | 9 +-- tools/rating_curve_comparison.py | 6 +- unit_tests/__template.py | 1 - unit_tests/aggregate_branch_lists_test.py | 1 - unit_tests/clip_vectors_to_wbd_test.py | 1 - unit_tests/derive_level_paths_test.py | 1 - ...lter_catchments_and_add_attributes_test.py | 1 - unit_tests/generate_branch_list_csv_test.py | 1 - unit_tests/generate_branch_list_test.py | 1 - unit_tests/inundate_gms_test.py | 1 - unit_tests/inundation_test.py | 1 - unit_tests/outputs_cleanup_test.py | 1 - unit_tests/rating_curve_comparison_test.py | 1 - unit_tests/shared_functions_test.py | 1 - unit_tests/split_flows_test.py | 1 - unit_tests/usgs_gage_crosswalk_test.py | 1 - 24 files changed, 71 insertions(+), 70 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6c2bb6513..ff510b185 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,7 +21,7 @@ repos: additional_dependencies: [flake8-pyproject] - repo: https://github.com/psf/black - rev: 23.7.0 + rev: 24.3.0 hooks: - id: black args: ['--line-length=110', '--skip-magic-trailing-comma', '--skip-string-normalization'] diff --git a/Dockerfile b/Dockerfile index 70f7d336f..68be823cf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,6 +66,8 @@ RUN mkdir -p $workDir RUN mkdir -p $depDir COPY --from=builder $depDir $depDir +RUN apt-get update --fix-missing && apt-get install -y openjdk-19-jdk && rm -rf /var/lib/apt/lists/* + RUN apt update --fix-missing RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt install -y p7zip-full python3-pip time mpich parallel libgeos-dev expect tmux rsync tzdata diff --git a/Pipfile b/Pipfile index 5aee10468..31a386c5c 100644 --- a/Pipfile +++ b/Pipfile @@ -38,7 +38,7 @@ py7zr = "==0.20.4" scipy = "==1.10.1" gval = "==0.2.3" flake8 = "==6.0.0" -black = "==23.7.0" +black = "==24.3.0" flake8-pyproject = "==1.2.3" pre-commit = "==3.3.3" isort = "==5.12.0" diff --git a/Pipfile.lock b/Pipfile.lock index 0c47c4a04..76e73a340 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a3ed6a563de9000738a1df55a5cbce4a7584fcee0725bf71f917916edf6eef3b" + "sha256": "6b97aa17b943660fc1d53242b0424db6cdf340811d2ead934e4fececef750ba3" }, "pipfile-spec": 6, "requires": { @@ -131,31 +131,32 @@ }, "black": { "hashes": [ - "sha256:01ede61aac8c154b55f35301fac3e730baf0c9cf8120f65a9cd61a81cfb4a0c3", - "sha256:022a582720b0d9480ed82576c920a8c1dde97cc38ff11d8d8859b3bd6ca9eedb", - "sha256:25cc308838fe71f7065df53aedd20327969d05671bac95b38fdf37ebe70ac087", - "sha256:27eb7a0c71604d5de083757fbdb245b1a4fae60e9596514c6ec497eb63f95320", - "sha256:327a8c2550ddc573b51e2c352adb88143464bb9d92c10416feb86b0f5aee5ff6", - "sha256:47e56d83aad53ca140da0af87678fb38e44fd6bc0af71eebab2d1f59b1acf1d3", - "sha256:501387a9edcb75d7ae8a4412bb8749900386eaef258f1aefab18adddea1936bc", - "sha256:552513d5cd5694590d7ef6f46e1767a4df9af168d449ff767b13b084c020e63f", - "sha256:5c4bc552ab52f6c1c506ccae05681fab58c3f72d59ae6e6639e8885e94fe2587", - "sha256:642496b675095d423f9b8448243336f8ec71c9d4d57ec17bf795b67f08132a91", - "sha256:6d1c6022b86f83b632d06f2b02774134def5d4d4f1dac8bef16d90cda18ba28a", - "sha256:7f3bf2dec7d541b4619b8ce526bda74a6b0bffc480a163fed32eb8b3c9aed8ad", - "sha256:831d8f54c3a8c8cf55f64d0422ee875eecac26f5f649fb6c1df65316b67c8926", - "sha256:8417dbd2f57b5701492cd46edcecc4f9208dc75529bcf76c514864e48da867d9", - "sha256:86cee259349b4448adb4ef9b204bb4467aae74a386bce85d56ba4f5dc0da27be", - "sha256:893695a76b140881531062d48476ebe4a48f5d1e9388177e175d76234ca247cd", - "sha256:9fd59d418c60c0348505f2ddf9609c1e1de8e7493eab96198fc89d9f865e7a96", - "sha256:ad0014efc7acf0bd745792bd0d8857413652979200ab924fbf239062adc12491", - "sha256:b5b0ee6d96b345a8b420100b7d71ebfdd19fab5e8301aff48ec270042cd40ac2", - "sha256:c333286dc3ddca6fdff74670b911cccedacb4ef0a60b34e491b8a67c833b343a", - "sha256:f9062af71c59c004cd519e2fb8f5d25d39e46d3af011b41ab43b9c74e27e236f", - "sha256:fb074d8b213749fa1d077d630db0d5f8cc3b2ae63587ad4116e8a436e9bbe995" + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", - "version": "==23.7.0" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "bleach": { "hashes": [ @@ -1898,11 +1899,11 @@ }, "packaging": { "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], "markers": "python_version >= '3.7'", - "version": "==23.2" + "version": "==24.0" }, "pandas": { "hashes": [ @@ -3539,11 +3540,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", - "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" + "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", + "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], - "markers": "python_version >= '3.8'", - "version": "==4.9.0" + "markers": "python_version < '3.11'", + "version": "==4.10.0" }, "typing-inspect": { "hashes": [ @@ -3964,4 +3965,4 @@ "version": "==0.2.13" } } -} +} \ No newline at end of file diff --git a/data/aws/aws_base.py b/data/aws/aws_base.py index b0f6befad..af3688abf 100644 --- a/data/aws/aws_base.py +++ b/data/aws/aws_base.py @@ -10,7 +10,6 @@ class AWS_Base(object): - ''' This class implements all common variables related when communicating to AWS ''' diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a61567601..875709249 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,22 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.13.2 - 2024-04-04 - [PR#1110](https://github.com/NOAA-OWP/inundation-mapping/pull/1110) + +This PR reflects upgrades for openJDK from 17.0.8 to something higher, minimum of 17.0.9. After some research, we can not upgrade all the way to the latest openJDK but can jump up to 19.0. This limitation is related to version of our base docker image. openJDK was identified as requiring an upgrade by a system wide security scan. + +The "black" packages is also be upgraded from 23.7.0 to 24.3. + +**NOTE: the update of "black" has change the rules slightly for formatting. This is why you see a bunch of files being changed but only for the formatting changes.** + +### Files Change +- `Dockerfile`, `Pipfile`, `Pipefile.lock` +- `pre-commit-config.yaml` is also has Black upgraded for CI/CD tests for linting during GIT check ins. +- `many files`: + - 19 files have had minor formatting changes related to the upgrade in the "black" package. + +

+ ## v4.4.13.1 - 2024-03-11 - [PR#1086](https://github.com/NOAA-OWP/inundation-mapping/pull/1086) diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index bcd860a13..4c0913573 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -585,12 +585,12 @@ def branch_network_tracer(df_input_htable): while Q: q = Q.popleft() if q not in visited: - df_input_htable.loc[ - df_input_htable.HydroID == q, 'route_count' - ] = vert_count # assign var with flow order ranking - df_input_htable.loc[ - df_input_htable.HydroID == q, 'branch_id' - ] = branch_count # assign var with current branch id + df_input_htable.loc[df_input_htable.HydroID == q, 'route_count'] = ( + vert_count # assign var with flow order ranking + ) + df_input_htable.loc[df_input_htable.HydroID == q, 'branch_id'] = ( + branch_count # assign var with current branch id + ) vert_count += 1 visited.add(q) # find the id for the next downstream hydroid @@ -676,9 +676,9 @@ def group_manningn_calc(df_nmerge, down_dist_thresh): # only apply the group_calb_coef if there are 2 or more valid hydorids that contributed to the # upstream group_calb_coef if hyid_accum_count > 1: - df_nmerge.loc[ - index, 'group_calb_coef' - ] = group_calb_coef # output the group_calb_coef var + df_nmerge.loc[index, 'group_calb_coef'] = ( + group_calb_coef # output the group_calb_coef var + ) else: # reset the running average manningn variable (greater than 10km downstream) run_avg_mann = 0 diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index 99d3fc29e..4a477692c 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -113,9 +113,9 @@ def write(self, output_directory): # Prep and write out file elev_table = self.gages.copy() - elev_table.loc[ - elev_table['location_id'] == elev_table['nws_lid'], 'location_id' - ] = None # set location_id to None where there isn't a gage + elev_table.loc[elev_table['location_id'] == elev_table['nws_lid'], 'location_id'] = ( + None # set location_id to None where there isn't a gage + ) elev_table = elev_table[elev_table['location_id'].notna()] elev_table.source = elev_table.source.apply(str.lower) diff --git a/tools/overlapping_inundation.py b/tools/overlapping_inundation.py index 23c6575d8..34c0e1dad 100644 --- a/tools/overlapping_inundation.py +++ b/tools/overlapping_inundation.py @@ -57,12 +57,9 @@ def key_sort_func(x): ) # get transform, width, height and bounds - ( - self.proc_unit_transform, - self.proc_unit_width, - self.proc_unit_height, - final_bounds, - ) = self.get_final_dims() + (self.proc_unit_transform, self.proc_unit_width, self.proc_unit_height, final_bounds) = ( + self.get_final_dims() + ) self.proc_unit_bounds = np.array( [[final_bounds["top"], final_bounds["left"]], [final_bounds["bottom"], final_bounds["right"]]] diff --git a/tools/rating_curve_comparison.py b/tools/rating_curve_comparison.py index 58e316068..5b5369316 100755 --- a/tools/rating_curve_comparison.py +++ b/tools/rating_curve_comparison.py @@ -896,9 +896,9 @@ def generate_rc_and_rem_plots(rc, plot_filename, recurr_data_table, branches_fol dem_adj_elevation = rc[rc.location_id == gage].dem_adj_elevation.unique()[0] catchment_rem = (catchment_rem + dem_adj_elevation) * 3.28084 max_elev = rc[(rc.source == 'FIM') & (rc.location_id == gage)].elevation_ft.max() - catchment_rem[ - np.where(catchment_rem > max_elev) - ] = np.nan # <-- Comment out this line to get the full raster that is + catchment_rem[np.where(catchment_rem > max_elev)] = ( + np.nan + ) # <-- Comment out this line to get the full raster that is # used in rating curve creation # Create polygon for perimeter/area stats catchment_rem_1s = catchment_rem.copy() diff --git a/unit_tests/__template.py b/unit_tests/__template.py index bef8723b1..946e06474 100644 --- a/unit_tests/__template.py +++ b/unit_tests/__template.py @@ -10,7 +10,6 @@ class test_Your_original_source_python_file_name(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/aggregate_branch_lists_test.py b/unit_tests/aggregate_branch_lists_test.py index 961db481a..93c4f29d8 100644 --- a/unit_tests/aggregate_branch_lists_test.py +++ b/unit_tests/aggregate_branch_lists_test.py @@ -10,7 +10,6 @@ class test_aggregate_branch_lists(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/clip_vectors_to_wbd_test.py b/unit_tests/clip_vectors_to_wbd_test.py index 9c817a448..b9567a3d3 100644 --- a/unit_tests/clip_vectors_to_wbd_test.py +++ b/unit_tests/clip_vectors_to_wbd_test.py @@ -11,7 +11,6 @@ class test_clip_vectors_to_wbd(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/derive_level_paths_test.py b/unit_tests/derive_level_paths_test.py index acb89a538..6ee67973d 100644 --- a/unit_tests/derive_level_paths_test.py +++ b/unit_tests/derive_level_paths_test.py @@ -14,7 +14,6 @@ class test_Derive_level_paths(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/filter_catchments_and_add_attributes_test.py b/unit_tests/filter_catchments_and_add_attributes_test.py index 554f4fce4..098d6935f 100644 --- a/unit_tests/filter_catchments_and_add_attributes_test.py +++ b/unit_tests/filter_catchments_and_add_attributes_test.py @@ -17,7 +17,6 @@ # use deny_gms_branches_dev.lst or the word "none" for the deny list arguments # (unit and branch deny list parameters). Key files need to exist for this unit test to work. class test_filter_catchments_and_add_attributes(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/generate_branch_list_csv_test.py b/unit_tests/generate_branch_list_csv_test.py index 020556e97..5495767b6 100644 --- a/unit_tests/generate_branch_list_csv_test.py +++ b/unit_tests/generate_branch_list_csv_test.py @@ -11,7 +11,6 @@ class test_generate_branch_list_csv(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/generate_branch_list_test.py b/unit_tests/generate_branch_list_test.py index ab654db89..3a35f35ea 100644 --- a/unit_tests/generate_branch_list_test.py +++ b/unit_tests/generate_branch_list_test.py @@ -11,7 +11,6 @@ class test_Generate_branch_list(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/inundate_gms_test.py b/unit_tests/inundate_gms_test.py index c8cfdab5e..034830aa2 100644 --- a/unit_tests/inundate_gms_test.py +++ b/unit_tests/inundate_gms_test.py @@ -12,7 +12,6 @@ class test_inundate_gms(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/inundation_test.py b/unit_tests/inundation_test.py index c8348ae7e..ef580c15a 100644 --- a/unit_tests/inundation_test.py +++ b/unit_tests/inundation_test.py @@ -11,7 +11,6 @@ class test_inundate(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/outputs_cleanup_test.py b/unit_tests/outputs_cleanup_test.py index d339ff183..5d152864f 100644 --- a/unit_tests/outputs_cleanup_test.py +++ b/unit_tests/outputs_cleanup_test.py @@ -16,7 +16,6 @@ class test_outputs_cleanup(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/rating_curve_comparison_test.py b/unit_tests/rating_curve_comparison_test.py index 110d58c8a..89352cb26 100644 --- a/unit_tests/rating_curve_comparison_test.py +++ b/unit_tests/rating_curve_comparison_test.py @@ -10,7 +10,6 @@ class test_rating_curve_comparison(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/shared_functions_test.py b/unit_tests/shared_functions_test.py index e5046bb2e..62264ec75 100644 --- a/unit_tests/shared_functions_test.py +++ b/unit_tests/shared_functions_test.py @@ -10,7 +10,6 @@ class test_shared_functions(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/split_flows_test.py b/unit_tests/split_flows_test.py index b7ee9b0d8..a811fccfc 100644 --- a/unit_tests/split_flows_test.py +++ b/unit_tests/split_flows_test.py @@ -10,7 +10,6 @@ class test_split_flows(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ diff --git a/unit_tests/usgs_gage_crosswalk_test.py b/unit_tests/usgs_gage_crosswalk_test.py index 43d9fa2de..863c61590 100644 --- a/unit_tests/usgs_gage_crosswalk_test.py +++ b/unit_tests/usgs_gage_crosswalk_test.py @@ -12,7 +12,6 @@ class test_usgs_gage_crosswalk(unittest.TestCase): - """ Allows the params to be loaded one and used for all test methods """ From adb6e36b324693faaaf318a8af54ef55ea44164d Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Mon, 15 Apr 2024 20:54:32 +0000 Subject: [PATCH 32/51] v4.4.13.3 Updates for pkgs pillow, idna and openpynx (#1114) --- Pipfile | 3 +- Pipfile.lock | 1381 ++++++++++++++------------- README.md | 28 +- data/ble/ble_benchmark/Dockerfile | 9 - data/ble/ble_benchmark/Pipfile | 15 - data/ble/ble_benchmark/Pipfile.lock | 340 ------- data/ble/ble_benchmark/README.md | 12 +- docs/CHANGELOG.md | 23 + 8 files changed, 748 insertions(+), 1063 deletions(-) delete mode 100644 data/ble/ble_benchmark/Dockerfile delete mode 100755 data/ble/ble_benchmark/Pipfile delete mode 100644 data/ble/ble_benchmark/Pipfile.lock diff --git a/Pipfile b/Pipfile index 31a386c5c..35731f13c 100644 --- a/Pipfile +++ b/Pipfile @@ -44,8 +44,9 @@ pre-commit = "==3.3.3" isort = "==5.12.0" urllib3 = "==1.26.18" pyflwdir = "==0.5.8" -pillow = "==10.2.0" +pillow = "==10.3.0" pyogrio = "==0.7.2" +openpyxl = "*" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 76e73a340..a7d7bef21 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6b97aa17b943660fc1d53242b0424db6cdf340811d2ead934e4fececef750ba3" + "sha256": "13d8feb3cb31feea69831b7d547993f4adde0134668a95c9744aa54d45cae748" }, "pipfile-spec": 6, "requires": { @@ -29,24 +29,24 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version >= '3.7' and python_version < '4.0'", + "markers": "python_version >= '3.7' and python_version < '4'", "version": "==22.1.0" }, "aiosqlite": { "hashes": [ - "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d", - "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96" + "sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6", + "sha256:6d35c8c256637f4672f843c31021464090805bf925385ac39473fb16eaaca3d7" ], - "markers": "python_version >= '3.7'", - "version": "==0.19.0" + "markers": "python_version >= '3.8'", + "version": "==0.20.0" }, "anyio": { "hashes": [ - "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee", - "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f" + "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", + "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.3.0" }, "appdirs": { "hashes": [ @@ -155,7 +155,6 @@ "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.3.0" }, "bleach": { @@ -190,7 +189,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4.0'", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.0.0" }, "boto3": { @@ -300,11 +299,11 @@ }, "cachetools": { "hashes": [ - "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2", - "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1" + "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" ], "markers": "python_version >= '3.7'", - "version": "==5.3.2" + "version": "==5.3.3" }, "certifi": { "hashes": [ @@ -523,7 +522,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { @@ -536,19 +535,19 @@ }, "colorcet": { "hashes": [ - "sha256:51455a20353d12fac91f953772d8409f2474e6a0db1af3fa4f7005f405a2480b", - "sha256:8daff01824ee9935fdf762d15c444a67d3e361ad4f8b738ad59ac9bf38f30600" + "sha256:2921b3cd81a2288aaf2d63dbc0ce3c26dcd882e8c389cc505d6886bf7aa9a4eb", + "sha256:2a7d59cc8d0f7938eeedd08aad3152b5319b4ba3bcb7a612398cc17a384cb296" ], - "markers": "python_version >= '2.7'", - "version": "==3.0.1" + "markers": "python_version >= '3.7'", + "version": "==3.1.0" }, "comm": { "hashes": [ - "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a", - "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021" + "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", + "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" ], "markers": "python_version >= '3.8'", - "version": "==0.2.1" + "version": "==0.2.2" }, "contextily": { "hashes": [ @@ -560,53 +559,53 @@ }, "contourpy": { "hashes": [ - "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8", - "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956", - "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5", - "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063", - "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286", - "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a", - "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686", - "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9", - "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f", - "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4", - "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e", - "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0", - "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e", - "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488", - "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399", - "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431", - "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779", - "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9", - "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab", - "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0", - "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd", - "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e", - "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc", - "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6", - "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316", - "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808", - "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0", - "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f", - "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843", - "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9", - "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95", - "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9", - "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de", - "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4", - "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4", - "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa", - "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8", - "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776", - "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41", - "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108", - "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e", - "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8", - "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727", - "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a" + "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", + "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", + "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", + "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", + "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", + "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", + "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", + "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", + "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", + "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", + "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", + "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", + "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", + "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", + "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", + "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", + "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", + "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", + "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", + "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", + "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", + "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", + "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", + "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", + "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", + "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", + "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", + "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", + "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", + "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", + "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", + "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", + "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", + "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", + "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", + "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", + "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", + "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", + "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", + "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", + "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", + "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", + "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", + "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" ], "markers": "python_version >= '3.9'", - "version": "==1.2.0" + "version": "==1.2.1" }, "cycler": { "hashes": [ @@ -618,67 +617,67 @@ }, "cython": { "hashes": [ - "sha256:000dc9e135d0eec6ecb2b40a5b02d0868a2f8d2e027a41b0fe16a908a9e6de02", - "sha256:05d7eddc668ae7993643f32c7661f25544e791edb745758672ea5b1a82ecffa6", - "sha256:0c38c9f0bcce2df0c3347285863621be904ac6b64c5792d871130569d893efd7", - "sha256:0cb2dcc565c7851f75d496f724a384a790fab12d1b82461b663e66605bec429a", - "sha256:115f0a50f752da6c99941b103b5cb090da63eb206abbc7c2ad33856ffc73f064", - "sha256:13c2a5e57a0358da467d97667297bf820b62a1a87ae47c5f87938b9bb593acbd", - "sha256:16873d78be63bd38ffb759da7ab82814b36f56c769ee02b1d5859560e4c3ac3c", - "sha256:171b27051253d3f9108e9759e504ba59ff06e7f7ba944457f94deaf9c21bf0b6", - "sha256:17a642bb01a693e34c914106566f59844b4461665066613913463a719e0dd15d", - "sha256:18bfa387d7a7f77d7b2526af69a65dbd0b731b8d941aaff5becff8e21f6d7717", - "sha256:1ab75242869ff71e5665fe5c96f3378e79e792fa3c11762641b6c5afbbbbe026", - "sha256:1aca1b97e0095b3a9a6c33eada3f661a4ed0d499067d121239b193e5ba3bb4f0", - "sha256:289ce7838208211cd166e975865fd73b0649bf118170b6cebaedfbdaf4a37795", - "sha256:2cde23c555470db3f149ede78b518e8274853745289c956a0e06ad8d982e4db9", - "sha256:2cdfc32252f3b6dc7c94032ab744dcedb45286733443c294d8f909a4854e7f83", - "sha256:2f020fa1c0552052e0660790b8153b79e3fc9a15dbd8f1d0b841fe5d204a6ae6", - "sha256:314f2355a1f1d06e3c431eaad4708cf10037b5e91e4b231d89c913989d0bdafd", - "sha256:3a3d67f079598af49e90ff9655bf85bd358f093d727eb21ca2708f467c489cae", - "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520", - "sha256:4b983c8e6803f016146c26854d9150ddad5662960c804ea7f0c752c9266752f0", - "sha256:51d1426263b0e82fb22bda8ea60dc77a428581cc19e97741011b938445d383f1", - "sha256:547eb3cdb2f8c6f48e6865d5a741d9dd051c25b3ce076fbca571727977b28ac3", - "sha256:5a567d4b9ba70b26db89d75b243529de9e649a2f56384287533cf91512705bee", - "sha256:61a237bc9dd23c7faef0fcfce88c11c65d0c9bb73c74ccfa408b3a012073c20e", - "sha256:6717c06e9cfc6c1df18543cd31a21f5d8e378a40f70c851fa2d34f0597037abc", - "sha256:6c46939c3983217d140999de7c238c3141f56b1ea349e47ca49cae899969aa2c", - "sha256:78825a3774211e7d5089730f00cdf7f473042acc9ceb8b9eeebe13ed3a5541de", - "sha256:7990ca127e1f1beedaf8fc8bf66541d066ef4723ad7d8d47a7cbf842e0f47580", - "sha256:7e8f2454128974905258d86534f4fd4f91d2f1343605657ecab779d80c9d6d5e", - "sha256:80fd94c076e1e1b1ee40a309be03080b75f413e8997cddcf401a118879863388", - "sha256:8140597a8b5cc4f119a1190f5a2228a84f5ca6d8d9ec386cfce24663f48b2539", - "sha256:8333423d8fd5765e7cceea3a9985dd1e0a5dfeb2734629e1a2ed2d6233d39de6", - "sha256:85077915a93e359a9b920280d214dc0cf8a62773e1f3d7d30fab8ea4daed670c", - "sha256:870d2a0a7e3cbd5efa65aecdb38d715ea337a904ea7bb22324036e78fb7068e7", - "sha256:90d3fe31db55685d8cb97d43b0ec39ef614fcf660f83c77ed06aa670cb0e164f", - "sha256:96b028f044f5880e3cb18ecdcfc6c8d3ce9d0af28418d5ab464509f26d8adf12", - "sha256:97b2a45845b993304f1799664fa88da676ee19442b15fdcaa31f9da7e1acc434", - "sha256:9d3f74388db378a3c6fd06e79a809ed98df3f56484d317b81ee762dbf3c263e0", - "sha256:9e2be2b340fea46fb849d378f9b80d3c08ff2e81e2bfbcdb656e2e3cd8c6b2dc", - "sha256:a1df7a129344b1215c20096d33c00193437df1a8fcca25b71f17c23b1a44f782", - "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636", - "sha256:a973268d7ca1a2bdf78575e459a94a78e1a0a9bb62a7db0c50041949a73b02ff", - "sha256:aae26f9663e50caf9657148403d9874eea41770ecdd6caf381d177c2b1bb82ba", - "sha256:ae7ac561fd8253a9ae96311e91d12af5f701383564edc11d6338a7b60b285a6f", - "sha256:baa0b7f3f841fe087410cab66778e2d3fb20ae2d2078a2be3dffe66c6574be39", - "sha256:bfabe115deef4ada5d23c87bddb11289123336dcc14347011832c07db616dd93", - "sha256:c1949d6aa7bc792554bee2b67a9fe41008acbfe22f4f8df7b6ec7b799613a4b3", - "sha256:c26daaeccda072459b48d211415fd1e5507c06bcd976fa0d5b8b9f1063467d7b", - "sha256:c8aa05f5e17f8042a3be052c24f2edc013fb8af874b0bf76907d16c51b4e7871", - "sha256:c9c0f29246734561c90f36e70ed0506b61aa3d044e4cc4cba559065a2a741fae", - "sha256:c9f2c6e1b8f3bcd6cb230bac1843f85114780bb8be8614855b1628b36bb510e0", - "sha256:de892422582f5758bd8de187e98ac829330ec1007bc42c661f687792999988a7", - "sha256:df8093deabc55f37028190cf5e575c26aad23fc673f34b85d5f45076bc37ce39", - "sha256:e24791ddae2324e88e3c902a765595c738f19ae34ee66bfb1a6dac54b1833419", - "sha256:e87294e33e40c289c77a135f491cd721bd089f193f956f7b8ed5aa2d0b8c558f", - "sha256:f05c0bf9d085c031df8f583f0d506aa3be1692023de18c45d0aaf78685bbb944", - "sha256:fa97893d99385386925d00074654aeae3a98867f298d1e12ceaf38a9054a9bae", - "sha256:fe81b339cffd87c0069c6049b4d33e28bdd1874625ee515785bf42c9fdff3658" + "sha256:051069638abfb076900b0c2bcb6facf545655b3f429e80dd14365192074af5a4", + "sha256:076e9fd4e0ca33c5fa00a7479180dbfb62f17fe928e2909f82da814536e96d2b", + "sha256:077b61ee789e48700e25d4a16daa4258b8e65167136e457174df400cf9b4feab", + "sha256:09f2000041db482cad3bfce94e1fa3a4c82b0e57390a164c02566cbbda8c4f12", + "sha256:0bac3ccdd4e03924028220c62ae3529e17efa8ca7e9df9330de95de02f582b26", + "sha256:0e9a885ec63d3955a08cefc4eec39fefa9fe14989c6e5e2382bd4aeb6bdb9bc3", + "sha256:15b6d397f4ee5ad54e373589522af37935a32863f1b23fa8c6922adf833e28e2", + "sha256:206e803598010ecc3813db8748ed685f7beeca6c413f982df9f8a505fce56563", + "sha256:269f06e6961e8591d56e30b46e1a51b6ccb42cab04c29fa3b30d3e8723485fb4", + "sha256:2c9c1e3e78909488f3b16fabae02308423fa6369ed96ab1e250807d344cfffd7", + "sha256:2d29e617fd23cf4b83afe8f93f2966566c9f565918ad1e86a4502fe825cc0a79", + "sha256:32fbad02d1189be75eb96456d9c73f5548078e5338d8fa153ecb0115b6ee279f", + "sha256:35f6ede7c74024ed1982832ae61c9fad7cf60cc3f5b8c6a63bb34e38bc291936", + "sha256:38d40fa1324ac47c04483d151f5e092406a147eac88a18aec789cf01c089c3f2", + "sha256:3919a55ec9b6c7db6f68a004c21c05ed540c40dbe459ced5d801d5a1f326a053", + "sha256:3cffb666e649dba23810732497442fb339ee67ba4e0be1f0579991e83fcc2436", + "sha256:401aba1869a57aba2922ccb656a6320447e55ace42709b504c2f8e8b166f46e1", + "sha256:407840c56385b9c085826fe300213e0e76ba15d1d47daf4b58569078ecb94446", + "sha256:40fac59c3a7fbcd9c25aea64c342c890a5e2270ce64a1525e840807800167799", + "sha256:4f610964ab252a83e573a427e28b103e2f1dd3c23bee54f32319f9e73c3c5499", + "sha256:4fadb84193c25641973666e583df8df4e27c52cdc05ddce7c6f6510d690ba34a", + "sha256:541fbe725d6534a90b93f8c577eb70924d664b227a4631b90a6e0506d1469591", + "sha256:5a036d00caa73550a3a976432ef21c1e3fa12637e1616aab32caded35331ae96", + "sha256:5bd49a3a9fdff65446a3e1c2bfc0ec85c6ce4c3cad27cd4ad7ba150a62b7fb59", + "sha256:5f465443917d5c0f69825fca3b52b64c74ac3de0143b1fff6db8ba5b48c9fb4a", + "sha256:64f1f8bba9d8f37c0cffc934792b4ac7c42d0891077127c11deebe9fa0a0f7e4", + "sha256:651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd", + "sha256:6c5af936940a38c300977b81598d9c0901158f220a58c177820e17e1774f1cf1", + "sha256:712760879600907189c7d0d346851525545484e13cd8b787e94bfd293da8ccf0", + "sha256:81f356c1c8c0885b8435bfc468025f545c5d764aa9c75ab662616dd1193c331e", + "sha256:86998b01f6a6d48398df8467292c7637e57f7e3a2ca68655367f13f66fed7734", + "sha256:8adcde00a8a88fab27509b558cd8c2959ab0c70c65d3814cfea8c68b83fa6dcd", + "sha256:8c9c4c4f3ab8f8c02817b0e16e8fa7b8cc880f76e9b63fe9c010e60c1a6c2b13", + "sha256:8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914", + "sha256:90e2f514fc753b55245351305a399463103ec18666150bb1c36779b9862388e9", + "sha256:950c0c7b770d2a7cec74fb6f5ccc321d0b51d151f48c075c0d0db635a60ba1b5", + "sha256:9cc6a0e7e23a96dec3f3c9d39690d4281beabd5297855140d0d30855f950275e", + "sha256:9ea31184c7b3a728ef1f81fccb161d8948c05aa86c79f63b74fb6f3ddec860ec", + "sha256:9fa9e7786083b6aa61594c16979d621b62e61fcd9c2edd4761641b95c7fb34b2", + "sha256:a181144c2f893ed8e6a994d43d0b96300bc99873f21e3b7334ca26c61c37b680", + "sha256:a5e14a8c6a8157d2b0cdc2e8e3444905d20a0e78e19d2a097e89fb8b04b51f6b", + "sha256:a9bb402674788a7f4061aeef8057632ec440123e74ed0fb425308a59afdfa10e", + "sha256:a9c976e9ec429539a4367cb4b24d15a1e46b925976f4341143f49f5f161171f5", + "sha256:acfbe0fff364d54906058fc61f2393f38cd7fa07d344d80923937b87e339adcf", + "sha256:adc377aa33c3309191e617bf675fdbb51ca727acb9dc1aa23fc698d8121f7e23", + "sha256:b74b700d6a793113d03fb54b63bdbadba6365379424bac7c0470605672769260", + "sha256:bcc9795990e525c192bc5c0775e441d7d56d7a7d02210451e9e13c0448dba51b", + "sha256:d092c0ddba7e9e530a5c5be4ac06db8360258acc27675d1fc86294a5dc8994c5", + "sha256:d10fc9aa82e5e53a0b7fd118f9771199cddac8feb4a6d8350b7d4109085aa775", + "sha256:d4e83a8ceff7af60064da4ccfce0ac82372544dd5392f1b350c34f1b04d0fae6", + "sha256:dcc96739331fb854dcf503f94607576cfe8488066c61ca50dfd55836f132de99", + "sha256:e876272548d73583e90babda94c1299537006cad7a34e515a06c51b41f8657aa", + "sha256:e8df79b596633b8295eaa48b1157d796775c2bb078f32267d32f3001b687f2fd", + "sha256:f43a58bf2434870d2fc42ac2e9ff8138c9e00c6251468de279d93fa279e9ba3b", + "sha256:f4780d0f98ce28191c4d841c4358b5d5e79d96520650910cd59904123821c52d", + "sha256:f8a2b8fa0fd8358bccb5f3304be563c4750aae175100463d212d5ea0ec74cbe0", + "sha256:fc6e0faf5b57523b073f0cdefadcaef3a51235d519a0594865925cadb3aeadf0", + "sha256:fcbb679c0b43514d591577fd0d20021c55c240ca9ccafbdb82d3fb95e5edfee2" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.8" + "version": "==3.0.10" }, "dask": { "hashes": [ @@ -755,6 +754,14 @@ "markers": "python_version >= '3.6'", "version": "==0.4" }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_version >= '3.6'", + "version": "==1.1.0" + }, "exceptiongroup": { "hashes": [ "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", @@ -780,11 +787,11 @@ }, "filelock": { "hashes": [ - "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e", - "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c" + "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f", + "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4" ], "markers": "python_version >= '3.8'", - "version": "==3.13.1" + "version": "==3.13.4" }, "fiona": { "hashes": [ @@ -836,51 +843,51 @@ }, "fonttools": { "hashes": [ - "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252", - "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea", - "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4", - "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e", - "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac", - "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61", - "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e", - "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d", - "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348", - "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee", - "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199", - "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01", - "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2", - "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81", - "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814", - "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070", - "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68", - "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5", - "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7", - "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f", - "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a", - "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1", - "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e", - "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a", - "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092", - "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31", - "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7", - "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48", - "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2", - "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec", - "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a", - "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f", - "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5", - "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0", - "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d", - "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a", - "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738", - "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95", - "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e", - "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124", - "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784", - "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703" + "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636", + "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce", + "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f", + "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1", + "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc", + "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f", + "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e", + "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716", + "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15", + "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77", + "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034", + "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba", + "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7", + "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55", + "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a", + "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0", + "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b", + "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671", + "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a", + "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039", + "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74", + "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836", + "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2", + "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308", + "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2", + "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5", + "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1", + "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438", + "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74", + "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f", + "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097", + "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e", + "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037", + "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1", + "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051", + "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b", + "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed", + "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68", + "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14", + "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5", + "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e", + "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936" ], "markers": "python_version >= '3.8'", - "version": "==4.48.1" + "version": "==4.51.0" }, "fqdn": { "hashes": [ @@ -891,19 +898,19 @@ }, "fsspec": { "hashes": [ - "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8", - "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84" + "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", + "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9" ], "markers": "python_version >= '3.8'", - "version": "==2024.2.0" + "version": "==2024.3.1" }, "geocube": { "hashes": [ - "sha256:0049913c9ca0e0ff8bd4473ab6a87d185e5c2457ee053a7184abcfe9e9447b57", - "sha256:4fbcdcbb187cbf02d9f03bec0c30628f5d5161cd3e9c51aaf0877c5f69539ed7" + "sha256:3cd80d0866fec649001529b6d19502937b3f70be4b480fac53e0785ef8ef27d8", + "sha256:aa77b078516649d35b3907fcc630fc6a3c22e4d8b2b52add9a09c6b18dd3c462" ], "markers": "python_version >= '3.10'", - "version": "==0.5.0" + "version": "==0.5.1" }, "geographiclib": { "hashes": [ @@ -939,27 +946,28 @@ }, "identify": { "hashes": [ - "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed", - "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d" + "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791", + "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e" ], "markers": "python_version >= '3.8'", - "version": "==2.5.34" + "version": "==2.5.35" }, "idna": { "hashes": [ - "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", - "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], + "index": "pypi", "markers": "python_version >= '3.5'", - "version": "==3.6" + "version": "==3.7" }, "importlib-metadata": { "hashes": [ - "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", - "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" + "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" ], "markers": "python_version >= '3.8'", - "version": "==7.0.1" + "version": "==7.1.0" }, "inflate64": { "hashes": [ @@ -1030,11 +1038,11 @@ }, "ipykernel": { "hashes": [ - "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0", - "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055" + "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da", + "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c" ], "markers": "python_version >= '3.8'", - "version": "==6.29.2" + "version": "==6.29.4" }, "ipympl": { "hashes": [ @@ -1046,11 +1054,11 @@ }, "ipython": { "hashes": [ - "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5", - "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73" + "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1", + "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" ], "markers": "python_version >= '3.10'", - "version": "==8.21.0" + "version": "==8.23.0" }, "ipython-genutils": { "hashes": [ @@ -1108,18 +1116,19 @@ }, "joblib": { "hashes": [ - "sha256:92f865e621e17784e7955080b6d042489e3b8e294949cc44c6eac304f59772b1", - "sha256:ef4331c65f239985f3f2220ecc87db222f08fd22097a3dd5698f693875f8cbb9" + "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c", + "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7" ], - "markers": "python_version >= '3.7'", - "version": "==1.3.2" + "markers": "python_version >= '3.8'", + "version": "==1.4.0" }, "json5": { "hashes": [ - "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f", - "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02" + "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8", + "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13" ], - "version": "==0.9.14" + "markers": "python_version >= '3.8'", + "version": "==0.9.24" }, "jsonpointer": { "hashes": [ @@ -1174,27 +1183,27 @@ }, "jupyter-core": { "hashes": [ - "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7", - "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218" + "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", + "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" ], "markers": "python_version >= '3.8'", - "version": "==5.7.1" + "version": "==5.7.2" }, "jupyter-events": { "hashes": [ - "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399", - "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf" + "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960", + "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22" ], "markers": "python_version >= '3.8'", - "version": "==0.9.0" + "version": "==0.10.0" }, "jupyter-server": { "hashes": [ - "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689", - "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923" + "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b", + "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e" ], "markers": "python_version >= '3.8'", - "version": "==2.12.5" + "version": "==2.13.0" }, "jupyter-server-fileid": { "hashes": [ @@ -1206,11 +1215,11 @@ }, "jupyter-server-terminals": { "hashes": [ - "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80", - "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8" + "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", + "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269" ], "markers": "python_version >= '3.8'", - "version": "==0.5.2" + "version": "==0.5.3" }, "jupyter-server-ydoc": { "hashes": [ @@ -1246,11 +1255,11 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf", - "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63" + "sha256:54622cbd330526a385ee0c1fdccdff3a1e7219bf3e864a335284a1270a1973df", + "sha256:9b3ba91cf2837f7f124fca36d63f3ca80ace2bed4898a63dd47e6598c1ab006f" ], "markers": "python_version >= '3.8'", - "version": "==2.25.2" + "version": "==2.26.0" }, "jupyterlab-widgets": { "hashes": [ @@ -1566,73 +1575,73 @@ }, "msgpack": { "hashes": [ - "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862", - "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d", - "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3", - "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672", - "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0", - "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9", - "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee", - "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46", - "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524", - "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819", - "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc", - "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc", - "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1", - "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82", - "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81", - "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6", - "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d", - "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2", - "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c", - "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87", - "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84", - "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e", - "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95", - "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f", - "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b", - "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93", - "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf", - "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61", - "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c", - "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8", - "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d", - "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c", - "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4", - "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba", - "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415", - "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee", - "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d", - "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9", - "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075", - "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f", - "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7", - "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681", - "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329", - "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1", - "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf", - "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c", - "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5", - "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b", - "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5", - "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e", - "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b", - "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad", - "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd", - "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7", - "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002", - "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc" + "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982", + "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3", + "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40", + "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee", + "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693", + "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950", + "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151", + "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24", + "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305", + "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b", + "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c", + "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659", + "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d", + "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18", + "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746", + "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868", + "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2", + "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba", + "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228", + "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2", + "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273", + "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c", + "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653", + "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a", + "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596", + "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd", + "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8", + "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa", + "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85", + "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc", + "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836", + "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3", + "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58", + "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128", + "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db", + "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f", + "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77", + "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad", + "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13", + "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8", + "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b", + "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a", + "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543", + "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b", + "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce", + "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d", + "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a", + "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c", + "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f", + "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e", + "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011", + "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04", + "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480", + "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a", + "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d", + "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d" ], "markers": "python_version >= '3.8'", - "version": "==1.0.7" + "version": "==1.0.8" }, "multimethod": { "hashes": [ - "sha256:e57253f5b6d530b10696843e693c11f0dadbe299a327bd71cdf3edd0019a3853", - "sha256:ef40713d84da4015285122a16f57bf5066cc7876b5eaf183262f3c34668c6ad3" + "sha256:7f2a4863967142e6db68632fef9cd79053c09670ba0c5f113301e245140bba5c", + "sha256:cb338f09395c0ee87d36c7691cdd794d13d8864358082cf1205f812edd5ce05a" ], "markers": "python_version >= '3.9'", - "version": "==1.11" + "version": "==1.11.2" }, "multipledispatch": { "hashes": [ @@ -1683,27 +1692,27 @@ }, "nbclient": { "hashes": [ - "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e", - "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15" + "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09", + "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f" ], "markers": "python_version >= '3.8'", - "version": "==0.9.0" + "version": "==0.10.0" }, "nbconvert": { "hashes": [ - "sha256:813e6553796362489ae572e39ba1bff978536192fb518e10826b0e8cadf03ec8", - "sha256:ad3dc865ea6e2768d31b7eb6c7ab3be014927216a5ece3ef276748dd809054c7" + "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142", + "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b" ], "markers": "python_version >= '3.8'", - "version": "==7.16.0" + "version": "==7.16.3" }, "nbformat": { "hashes": [ - "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9", - "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192" + "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", + "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b" ], "markers": "python_version >= '3.8'", - "version": "==5.9.2" + "version": "==5.10.4" }, "nest-asyncio": { "hashes": [ @@ -1764,11 +1773,11 @@ }, "notebook-shim": { "hashes": [ - "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7", - "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9" + "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", + "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb" ], "markers": "python_version >= '3.7'", - "version": "==0.2.3" + "version": "==0.2.4" }, "numba": { "hashes": [ @@ -1806,38 +1815,38 @@ }, "numexpr": { "hashes": [ - "sha256:00dab81d49239ea5423861ad627097b44d10d802df5f883d1b00f742139c3349", - "sha256:0e2574cafb18373774f351cac45ed23b5b360d9ecd1dbf3c12dac6d6eefefc87", - "sha256:0f619e91034b346ea85a4e1856ff06011dcb7dce10a60eda75e74db90120f880", - "sha256:1a78b937861d13de67d440d54c85a835faed7572be5a6fd10d4f3bd4e66e157f", - "sha256:1fae6828042b70c2f52a132bfcb9139da704274ed11b982fbf537f91c075d2ef", - "sha256:2749bce1c48706d58894992634a43b8458c4ba9411191471c4565fa41e9979ec", - "sha256:374dc6ca54b2af813cb15c2b34e85092dfeac1f73d51ec358dd81876bd9adcec", - "sha256:37a7dd36fd79a2b69c3fd2bc2b51ac8270bebc69cc96e6d78f1148e147fcbfa8", - "sha256:3b03a6cf37a72f5b52f2b962d7ac7f565bea8eaba83c3c4e5fcf8fbb6a938153", - "sha256:50f57bc333f285e8c46b1ce61c6e94ec9bb74e4ea0d674d1c6c6f4a286f64fe4", - "sha256:520e55d75bd99c76e376b6326e35ecf44c5ce2635a5caed72799a3885fc49173", - "sha256:549afc1622296cca3478a132c6e0fb5e55a19e08d32bc0d5a415434824a9c157", - "sha256:5615497c3f34b637fda9b571f7774b6a82f2367cc1364b7a4573068dd1aabcaa", - "sha256:6eae6c0c2d5682c02e8ac9c4287c2232c2443c9148b239df22500eaa3c5d73b7", - "sha256:7c618a5895e34db0a364dcdb9960084c080f93f9d377c45b1ca9c394c24b4e77", - "sha256:7c77392aea53f0700d60eb270ad63174b4ff10b04f8de92861101ca2129fee51", - "sha256:8efd879839572bde5a38a1aa3ac23fd4dd9b956fb969bc5e43d1c403419e1e8c", - "sha256:943ba141f3884ffafa3fa1a3ebf3cdda9e9688a67a3c91986e6eae13dc073d43", - "sha256:972e29b5cecc21466c5b177e38568372ab66aab1f053ae04690a49cea09e747d", - "sha256:9761195526a228e05eba400b8c484c94bbabfea853b9ea35ab8fa1bf415331b1", - "sha256:977537f2a1cc843f888fb5f0507626f956ada674e4b3847168214a3f3c7446fa", - "sha256:aa6298fb46bd7ec69911b5b80927a00663d066e719b29f48eb952d559bdd8371", - "sha256:b04f12a6130094a251e3a8fff40130589c1c83be6d4eb223873bea14d8c8b630", - "sha256:bffcbc55dea5a5f5255e2586da08f00929998820e6592ee717273a08ad021eb3", - "sha256:c52b4ac54514f5d4d8ead66768810cd5f77aa198e6064213d9b5c7b2e1c97c35", - "sha256:d655b6eacc4e81006b662cba014e4615a9ddd96881b8b4db4ad0d7f6d38069af", - "sha256:e1c31f621a625c7be602f92b027d90f2d3d60dcbc19b106e77fb04a4362152af", - "sha256:ee48acd6339748a65c0e32403b802ebfadd9cb0e3b602ba5889896238eafdd61", - "sha256:f21d12f6c432ce349089eb95342babf6629aebb3fddf187a4492d3aadaadaaf0" + "sha256:03d0ba492e484a5a1aeb24b300c4213ed168f2c246177be5733abb4e18cbb043", + "sha256:04e8620e7e676504201d4082e7b3ee2d9b561d1cb9470b47a6104e10c1e2870e", + "sha256:05278bad96b5846d712eba58b44e5cec743bdb3e19ca624916c921d049fdbcf6", + "sha256:10789450032357afaeda4ac4d06da9542d1535c13151e8d32b49ae1a488d1358", + "sha256:1af6dc6b3bd2e11a802337b352bf58f30df0b70be16c4f863b70a3af3a8ef95e", + "sha256:1d8eb88b0ae3d3c609d732a17e71096779b2bf47b3a084320ffa93d9f9132786", + "sha256:3c66dc0188358cdcc9465b6ee54fd5eef2e83ac64b1d4ba9117c41df59bf6fca", + "sha256:416e0e9f0fc4cced67767585e44cb6b301728bdb9edbb7c534a853222ec62cac", + "sha256:4f0b045e1831953a47cc9fabae76a6794c69cbb60921751a5cf2d555034c55bf", + "sha256:4feafc65ea3044b8bf8f305b757a928e59167a310630c22b97a57dff07a56490", + "sha256:56d0d96b130f7cd4d78d0017030d6a0e9d9fc2a717ac51d4cf4860b39637e86a", + "sha256:629b66cc1b750671e7fb396506b3f9410612e5bd8bc1dd55b5a0a0041d839f95", + "sha256:6b5f8242c075477156d26b3a6b8e0cd0a06d4c8eb68d907bde56dd3c9c683e92", + "sha256:745b46a1fb76920a3eebfaf26e50bc94a9c13b5aee34b256ab4b2d792dbaa9ca", + "sha256:748e8d4cde22d9a5603165293fb293a4de1a4623513299416c64fdab557118c2", + "sha256:78e0a8bc4417c3dedcbae3c473505b69080535246edc977c7dccf3ec8454a685", + "sha256:83f1e7a7f7ee741b8dcd20c56c3f862a3a3ec26fa8b9fcadb7dcd819876d2f35", + "sha256:937d36c6d3cf15601f26f84f0f706649f976491e9e0892d16cd7c876d77fa7dc", + "sha256:96a64d0dd8f8e694da3f8582d73d7da8446ff375f6dd239b546010efea371ac3", + "sha256:a602692cd52ce923ce8a0a90fb1d6cf186ebe8706eed83eee0de685e634b9aa9", + "sha256:a6cdf9e64c5b3dbb61729edb505ea75ee212fa02b85c5b1d851331381ae3b0e1", + "sha256:b276e2ba3e87ace9a30fd49078ad5dcdc6a1674d030b1ec132599c55465c0346", + "sha256:c7517b774d309b1f0896c89bdd1ddd33c4418a92ecfbe5e1df3ac698698f6fcf", + "sha256:c89e930752639df040539160326d8f99a84159bbea41943ab8e960591edaaef0", + "sha256:cb5e12787101f1216f2cdabedc3417748f2e1f472442e16bbfabf0bab2336300", + "sha256:d47bb567e330ebe86781864219a36cbccb3a47aec893bd509f0139c6b23e8104", + "sha256:dc3506c30c03b082da2cadef43747d474e5170c1f58a6dcdf882b3dc88b1e849", + "sha256:e3a973265591b0a875fd1151c4549e468959c7192821aac0bb86937694a08efa", + "sha256:efa63ecdc9fcaf582045639ddcf56e9bdc1f4d9a01729be528f62df4db86c9d6" ], "markers": "python_version >= '3.9'", - "version": "==2.9.0" + "version": "==2.10.0" }, "numpy": { "hashes": [ @@ -1889,6 +1898,14 @@ "markers": "python_version >= '3.8'", "version": "==0.4.1" }, + "openpyxl": { + "hashes": [ + "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", + "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" + ], + "index": "pypi", + "version": "==3.1.2" + }, "overrides": { "hashes": [ "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", @@ -1954,19 +1971,19 @@ }, "param": { "hashes": [ - "sha256:785845a727a588eb94c7666d80551c7e2bb97d4309d3507beab66f95e57f7527", - "sha256:b269fd7397886ec609e544f81035fa52e1950da0e76d20080bfeca3d7a0317ca" + "sha256:a7b30b08b547e2b78b02aeba6ed34e3c6a638f8e4824a76a96ffa2d7cf57e71f", + "sha256:f31d3745d227347d29b5868c4e4e3077df07463889b91d3bb28e634fde211e1c" ], "markers": "python_version >= '3.8'", - "version": "==2.0.2" + "version": "==2.1.0" }, "parso": { "hashes": [ - "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", - "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" ], "markers": "python_version >= '3.6'", - "version": "==0.8.3" + "version": "==0.8.4" }, "partd": { "hashes": [ @@ -1989,82 +2006,83 @@ "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], - "markers": "sys_platform != 'win32'", + "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", "version": "==4.9.0" }, "pillow": { "hashes": [ - "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", - "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", - "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", - "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", - "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", - "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", - "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", - "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", - "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", - "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", - "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", - "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", - "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", - "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", - "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", - "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", - "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", - "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", - "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", - "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", - "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", - "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", - "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", - "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", - "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", - "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", - "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", - "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", - "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", - "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", - "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", - "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", - "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", - "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", - "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", - "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", - "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", - "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", - "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", - "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", - "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", - "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", - "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", - "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", - "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", - "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", - "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", - "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", - "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", - "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", - "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", - "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", - "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", - "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", - "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", - "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", - "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", - "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", - "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", - "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", - "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", - "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", - "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", - "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", - "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", - "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", - "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", - "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" + "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", + "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", + "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", + "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", + "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", + "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", + "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", + "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", + "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", + "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", + "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", + "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", + "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", + "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", + "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", + "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", + "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", + "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", + "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", + "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", + "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", + "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", + "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", + "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", + "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", + "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", + "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", + "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", + "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", + "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", + "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", + "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", + "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", + "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", + "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", + "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", + "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", + "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", + "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", + "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", + "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", + "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", + "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", + "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", + "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", + "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", + "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", + "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", + "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", + "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", + "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", + "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", + "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", + "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", + "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", + "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", + "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", + "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", + "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", + "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", + "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", + "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", + "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", + "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", + "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", + "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", + "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", + "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", + "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" ], "index": "pypi", - "version": "==10.2.0" + "version": "==10.3.0" }, "platformdirs": { "hashes": [ @@ -2092,11 +2110,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1", - "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92" + "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89", + "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7" ], "markers": "python_version >= '3.8'", - "version": "==0.19.0" + "version": "==0.20.0" }, "prompt-toolkit": { "hashes": [ @@ -2325,10 +2343,11 @@ }, "pycparser": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" ], - "version": "==2.21" + "markers": "python_version >= '3.8'", + "version": "==2.22" }, "pycryptodomex": { "hashes": [ @@ -2475,11 +2494,11 @@ }, "pyparsing": { "hashes": [ - "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", - "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" + "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", + "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.1" + "version": "==3.1.2" }, "pyppmd": { "hashes": [ @@ -2616,11 +2635,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "python-dotenv": { "hashes": [ @@ -2784,133 +2803,133 @@ }, "pyzstd": { "hashes": [ - "sha256:00c188704141c709da96cc4a79f058d51f5318e839d6f904c7cc9badcf78e98e", - "sha256:013321ddaff083b24e43a8b06303446771978343b488ed73adf56c70a46e2783", - "sha256:02c95d7109052c985b7d90dac6f6010bc0630227f15aec16302162107137bdbc", - "sha256:0a4334e972109bdd17fb40dbdd9fcca6137648cab416fca505a2dcd186f50533", - "sha256:12668ceb8329aaa908b4d907d3a77bb748ff28b309c3b105c995a8715d535d2b", - "sha256:14121a4d95070f54bdc9a80dab1dd8fd9093907a1e687926447ca69b5b40a4d5", - "sha256:145ca5ed6240af2cbfc09faa50aada8aacf1e2928ed6dd9da1d6b8ebe39cdc4c", - "sha256:1b9cda5314982d64c856f9298be0d9bf69fbff0ca514d1651037616354b473ff", - "sha256:1cbf212253abd65e6451acdfb608adafe98ad8f05462fb9a054ddab816545caa", - "sha256:1dbe76b6d8fe75f6dbec24793fc07b1d1ae9464de9941138d5b9668f7670e6b0", - "sha256:209a92fbe892bd69cde58ffcb4861468e2c3c2d0626763e16e122bb55cb1fb1a", - "sha256:20f2dd56d46441cd9277077060c34c0b9ce3469412665ea5ccd506dd2708d994", - "sha256:23695dabdfd5081beab25754dc0105b42fbd2085a7c293901bcb45045969c5ec", - "sha256:250dad90140a6faea4cef555f339b6ceaad5cf03ed1127b8d06de214ff0db2e7", - "sha256:289e25871fe232d2482c0985a75a1faa7c92e10a6c3e3914d165f62d005d0aa6", - "sha256:2919afd114fd12309ed2f831ef6e95730ebf13c2a92d258ad055769d00ef4d7a", - "sha256:29e452caaf0de9cc17319225921d8c28cdc7a879948e990ff1e7735e7f976517", - "sha256:305c232462dbe80d0ee5ec91b1b0ec9153ec6ba6393d5348741af5d30b07ef52", - "sha256:31f60f01884350aec24e7a68f3ad089151b7a636490203c41a1a7c8e0cddd9b8", - "sha256:3351ad2feb51dcbb936defd47cab00d6f114214f224636503ed08298f30164c9", - "sha256:346f835e368e1051f8ea187ad9b49759cf6249c9ebf2f2a3861e435a568104b8", - "sha256:370b34a7c2f9c53cee494028daa5a7264690e1756a89c3855fd0be5ad298ec30", - "sha256:3a26df749589d898cd3253d2139eb85b867ddffc49286059c8bdb3cb9ce9b545", - "sha256:3bc0e7e2cccf78e562ab416daf68448b6552a5b6450a1ff3e15cabfc19254883", - "sha256:3f0fe2ef7ebc6e9b347585e414c4fefd32270ba8bdf9eb82496f3030cbdca465", - "sha256:3f72f310b10b730cddfb654006ae497e7706c81e6a7642d3da7fd2439df7d88d", - "sha256:40bdb468281a5cd525e2e990b97344f0974e0589bd1b395501c25471fcd7edda", - "sha256:418e9a676cc7ce00edd2fd044ee063c8639fd8cd6897ffda395a152cdc66ec97", - "sha256:4358dd80b315c82d760b44c6df7857c9c898d04e7b0c14abb0eb3692354e9379", - "sha256:441078bfd3b508597415338af667c3575980364f1286eedde58291558b9c2832", - "sha256:47c2a4c319300c381f194274203f47b12c433e1fd86b90ecdc7fb258c630f93b", - "sha256:49c57ae18f138a4b66480b2364fe6a0f2345ada919e93fc729c95c6b17ec73a4", - "sha256:4a0dcb32ac4d1d67a77ae6a2d60ea0921af7e682b3427202d8acb8e86642391c", - "sha256:4ed01beb31d5177456ec2c4b66591a0df83dbc72df29f05f40502bfefe47bbe4", - "sha256:50ccbaafee80b4f1c5c55bbe07f80871b9b8fe3499bf7357dde2c23fb1c2ac0e", - "sha256:51607d7d44f94a364ef0e3ccf9a92390def0faf6e7572eef082f15c657b5d03a", - "sha256:52dcae42f32f7a25c6b90bd479f3d04902700e3214e8fffe1bfe70053eb35ccb", - "sha256:5345c7a697327e2fa7c37534bb2968ea84595d8ec7fc8c4a60216ec1be6e65bd", - "sha256:542808d88464d538f5d2c6b48b545a7fe15f0d20c7fa703b469d039a08c9fa10", - "sha256:5453ebe42a2c7462fa532fd03cbf64e5c6baf5508b3089736c78444148d3c593", - "sha256:5819d502dacd54114c30bc24efcb76e723b93f8f528be70851056a396a792c46", - "sha256:5aed5fc86d0bfc5f16e871cbb35ec93df61476d7fde4c1c6081015a075ecfbc1", - "sha256:5d9ec8634ab0cbfbcff535ac07555ebdae0282ad66762f0471fad11c16181e33", - "sha256:5fb00c706d0b59c53124f982bd84b7d46866a8ea2a7670aaaa1ab4dbe6001b50", - "sha256:5fd7cf79949174d1018b896638f88aea1ff2a969f87a6199ea23b25b506e26c5", - "sha256:606b2452d78f0f731566d392f8d83cd012c2ffadb2cb2e2903fdd360c1faac8a", - "sha256:6128cb653d011f3781554b70ce1f1f388cd516820fbaf8fd03ee245ecaa48349", - "sha256:639935b5b3d9ed3911493504581254b76cb578279302f7f340924ac5bfca4090", - "sha256:64564f4c175c5bb8e744de5816d69ee0b940e472160a5e665f30adc412b694f3", - "sha256:69f12ce4866a3725138e97f22f2c4cb21d3ae18cd422906cd57ed12a9ffd86c5", - "sha256:6a60ee6836599363a24367cf780ad45446b07eba49ec72d19bad761d5414aca7", - "sha256:6b9af8d62c087354abd071e01d9445ea51b31779c8a4a0d5c14ee12caee3d18f", - "sha256:6c456882baab2a48a5bfabe458a557af25d0768ff29acbe200461e84c0f697d5", - "sha256:6f281cc2f096530c339f122e0d9866545f5592dd9bffe0fade565c2771130a45", - "sha256:73877eebbdcb8259cf0099665f8c8274d4273b361371405a611fb6bd9f4d64f6", - "sha256:74455bd918e7bc9883e3178a1a8fe796308670f0ee4488c80a0d9514e13807a1", - "sha256:7452ae7e6d80e697d78d3f56d1b4d2a350286eea229afb35f55ab88b934b6acd", - "sha256:77294f0f797c97a46ffb3daff1fe097c9d5aa9f96867333978e6791286963e50", - "sha256:78c38850af6b990e8ec1bc87b48f73ed5cc633f4baaa7bbc78f9b2f4449cf081", - "sha256:7ac886e04f253960ae82e38ded8352085c61d78de99412d178a94ecf475b5e5f", - "sha256:7c420878726d677da7484f6021dbe7e1f9345a791b155de632c6ce36678fb621", - "sha256:836f1d85a4b5d3689d455aeb1dc6c42acb96aaf8e5282825c00ccf2545ad5630", - "sha256:84aa6eecba967bdac167451501dcaceec548d8b8c4ca7fa41ceda4dbfc279297", - "sha256:866ba6ce85f337fa1677516217b6f10fc25e19acb6e17a501d5822e66396bdd5", - "sha256:86e0e65e205793b337d62d9764700dfd02b5f83b01e26ad345736e7ac0554ebd", - "sha256:87a1a4ca93da414f3b6da8131e61aca6d48a4e837fb0b1cbde05ae9d13332317", - "sha256:8d3a1b6fa71a0ae7abc320d9db91b5a96a71eef1dbee0d62a6232b71c97af962", - "sha256:8f9eb97fb6fd4551ff9d5012b4fcee9abeea9c8af6b9e3ebc3c76cc2bd0a43a7", - "sha256:91453ce9476363d777b2ea2e9c6dccecd2073cf35697e048de2e8d47e1f36c7c", - "sha256:922f1bb8ef80c42a2fca297ba0b03442c143a9a1f717e83db79f190514888803", - "sha256:937f118fdd7a23654886634f650d6502a2dd12c8a8e2bf14beb2fa5fa95058bf", - "sha256:9596aeb8c71192f4fba1ca25cec420da195219398d2df811d5082559efd9561f", - "sha256:960ab83a977a44284c4ffab2820ccd6c9b332571a3d622fefa4b29b0a5de72b0", - "sha256:9638d40ec02a5b194a4c98a5b6e36cdfde4e9d6b721ae6167ef8e57d2e69002f", - "sha256:97e05f66c5847e6889594508298d78ddb84a0115e9234d598415dc5a06d3a4a7", - "sha256:9ac634753f6d26cba503cea7bb5b350aec7c5366f44fa68c79e9c90be9fd0ebc", - "sha256:9e1097d8b57f64878a3f176f4cd6b9a1bbe9fb2d236f1a85a4357722626d8f25", - "sha256:a1b81cc86b69ff530d45e735ed479e14704999f534ad28a39f04be4a8fe2b91f", - "sha256:a4f786f1b1ab39a0908db04ebe5b2c7cbc6f1ce07a27d3a12eb980bffd7fea7d", - "sha256:a594795ef89bd83297c860ff585f2d25580ce9805eb9cc44c831d311e7f1951a", - "sha256:a708b9e6ff1826504940beb6b5c2c9dfd4e3b55c16ab88a4572f5b9dbb64cc56", - "sha256:a90b901ccfd24b028faea19c927ff03f3cfefe82ba0b931fbb8da4ef0664911b", - "sha256:ae3d0575721a372c20130681bfaf873225fd9e1c290b7d56b7e0c14f413318f6", - "sha256:afef9eb882cf3b395eef9c85b737a4acd09528975e6a5d9faedf28874ca65f52", - "sha256:aff1b469187f6c789cdf17cd95c9b24e87396dc86953b1cf38b9a05cea873c80", - "sha256:b2ae8993f3863632d31ca8921c8a5dc9ecc5551c7b88895cefb5a26d17643391", - "sha256:b2dd39e12f7467a7422ce50711524759d4d22016714cbae6a7096b954bc2fa32", - "sha256:b4de7741d542a477387299bf9450e8be3e768c352d6b3438254eb02af1e59462", - "sha256:b5b517fbbc5d223fc36041673e7c2a0d3a82be6a5464a5f0599069330b76f97d", - "sha256:bdc09de97b1b3f6c3d87fec04d6fe29dd4fefe6b354ad2d822fc369b8aa0942b", - "sha256:c249741b10eb714578d765487b767e0e7fcc2ac84a299209a6073566e730dbea", - "sha256:c2b093a74b10232c70b5d29814fcee6544bb6f30e2d922d26db9ab4b4cd00c04", - "sha256:c31f6dd5bd60688d51487a3f5e2ae29ed1948926e44d7a2316b193b083f80d5d", - "sha256:c36dbbf71480f1fffeaeca901adb31e0c7d59270a239eca63fe26e4647b7aca8", - "sha256:c41e5457f4de5d38a270bc44619873589bbe6fe251225deec583ed20199df0f3", - "sha256:c46e77c2ad614a0399503dc675d72436cbf6332a20d49a0e5bad03058d6cbfad", - "sha256:c8d1966e38c220d5940f8cb6303651af261f0bcfce77218a030b1a24ec986e2f", - "sha256:c9589cb79d4e401630481755c92b072aa7ba5505ec81dec865ef43932ec037e4", - "sha256:ca19213785f864781848e0216cba07e97f563f60a50bbc7885b54461d8c64873", - "sha256:cbfdde6c5768ffa5d2f14127bbc1d7c3c2d03c0ceaeb0736946197e06275ccc7", - "sha256:cd6a8d43a0c294918e3afb7e4b1d8c04d2e4c3ea9ddf05475fdaf366c7e5b3a6", - "sha256:cfa981cedd54bb8862d9033440a0afac38845db89e7099ceeb4f4d064dffd2f8", - "sha256:cffaab46f9e04856dc3daa6097bfb3d3bea0b1771237e869c57b13f3dcc2c238", - "sha256:d0929302d187bfeca335b7f710f774f1b2ea3f610b2a80e8a1ac2da216cd9766", - "sha256:d44a7d4586f02b630658298c089ff755e74d0677b93c71e09d33dd35bdd4987a", - "sha256:d7ddbf234c9adc72189bb552d830e9a0c2c4401b5baf7b003eacd5c552ddcc00", - "sha256:da070933d4bcfcbf58472da12ffa77c9fbc90efb39e21a9b74eb04b5af4b412a", - "sha256:dca286c6c1ca5febf13f5f2ae7e8aa7536e49bd07f4232796651a43ff741ceca", - "sha256:dcb2172ca8b62f82af9d1f8db80c21c64c5ba3991935caefde88bb378f0afb51", - "sha256:e4e00c1600022b47ef0e9e1f893cb0c2322209ec6c1581a3e3f63ed78330ddf0", - "sha256:e789e19095b818f7126180b4387c0f01700c3ad2378a4e7649b2ddf4bf47ffbc", - "sha256:e79babb67b415aa54abb213897ceaa011515a5f3e146a2a97f4e6486b9743af4", - "sha256:e8f75e839ee253af60b03d9957182fdd069dfaebb62b4e999bd74016f4e120bb", - "sha256:e9934277abdddf9c733267e4dcc4886de8a3302d28f390237d447e215e8ce47d", - "sha256:ef3399e0544b46d31c2a8ff14ae1fb3c3571ae1153bbbc5ddf0d242c67bde624", - "sha256:f169e166774587227255f6ffe71f5b3303ea73cde0e2c6d52e53b9e12c03d787", - "sha256:f1d8b58f00137ccbe8b828a5ede92be3f0115cef75e6bed88d4d0bd1e7a0b1fc", - "sha256:f2839c13e486e4a23b19b1d2dc4624565cec6c228bbf803c066be1106515966b", - "sha256:f66790e4b2dcfcabc0aa54dd89317ea5671cabf06aa93cbef7cbdd4d2fdb7ee3", - "sha256:f6d8a881b50bb2015e9bdba5edb0331e85d41ff44ab33cde551047480b98d748", - "sha256:f73821d429bfbb04645b80ec491ab05b35078f031f9fa3273fbf9027d1406233", - "sha256:f7cfc683d320402d61205a196ace77f15dcfd16b5771f8b9ffaf406868c98e78", - "sha256:f9c5fc29a5b9d61a8f0a3494172107e0e6cf23d0cb800d6285c6722ba7fc3535", - "sha256:fc92a718bccb8ce5c9eb63fca743c38f3fa4c4e47f58f0c4ada51b2474668184" + "sha256:013b206c22b85512d59dd05f6684c02bf9db45e93f637facb5ce165c2447fbc4", + "sha256:015a6794196fcb75ddaaae8186f0dbdcbda4e84451361a808b3e96c8c8a63296", + "sha256:0561710b88d4895a7bb202335e802125da6a71c556b1292fd620224b2652f496", + "sha256:0691e54fb29a4d1f4f2a0064afaf5d1525824bf139d83f403e5ba5ee630ac4f5", + "sha256:0779ccd652113d75cd461fa6581149550b0da55e72b1a6e28e6f49e9978c2d41", + "sha256:13515a6abca6751482396b656e5b72279bd405fd6c71b5bc899fcb526d40e564", + "sha256:150a7c7004b9df00f7cbb6dad0bdbab5d77c8c54b0857b8b3e50beae2810a041", + "sha256:18167c8a16709631eaa2f4fd27e2a7570b4c37ec460b65ff098e948af2d37f33", + "sha256:1c3d0e784ea9b66b06c7b76895aa4c1a90975980b1ae136fa8bbd8fb2b93e9b3", + "sha256:1e045dc688bb618cf2a2e33cb487c0d8af5e31a4eaec18c9399b34e2aed58777", + "sha256:24d061047634971801649ff9aced68bb8403c6220b07c82aa2c0e90d8a61acd0", + "sha256:2e6fd189c85f2efe94d3945dfbb85cdbc4e213757be75aa9a45e186625498ddf", + "sha256:330062103d25e0d67681fcf5ef8692c71cd979dc17ed98f6cee3b3ba8bd86622", + "sha256:330d54a0e5886fa5ca21e3960b9352a7b21f8dd85f98d4b7c4e8a7d48ade6998", + "sha256:3443df2dcdfe6e57c2600617e8f377772703b7f907fe065b49948c05ace80fd7", + "sha256:357e6545203754e83a0431663aa86cae873abe160923bdf3db07e88f03100b05", + "sha256:39a912430c73aa585ede2dc7c9f09c5334862953f26a9a86ac048c3805ed6bb1", + "sha256:3aa0ad903da666cf88d8a993e5fe9b1bfa0e5792a53212335af0a89baa268911", + "sha256:3b9105a4977247ea8664b113345e66bf4b3ffd321a07797efc6b020ff363b39e", + "sha256:3f174c47c370641c5dba74d4fd99374ca0eadd47e43e7f76ee8b76dacdfa2406", + "sha256:4094ea7b80081bb024eb887c80eeb6bd8ae24dc2862cc61ae9eadb5bca11dcd6", + "sha256:41e0da402bf0d68067be2f16f65b9d1d7d7e6d726f27762226cba7a8badd618a", + "sha256:455d2258f247968d18a9eaeb11e214e048acc976a61f72a0282d4c40051458b8", + "sha256:468f12eb61cbef394ff412c86d8bc85b90f24dff19f675c864df88a1a398a3a3", + "sha256:49c99120f9ea0c512019948e55ba17e60dadb1d3578890d53b2a09858da4e1dd", + "sha256:4a5b54ebec1e606821192c86a3b85c05c3f789d33bf44f383fd245f148f8f93b", + "sha256:4cd0bd21e0c7721e9f4ea54d533d9196771ab1d6ae0a83a96564dc46147a26eb", + "sha256:4dfd0d97ac231c08551543d61d123cf44bdd2fc20ba5ebce1fb0c466036be15a", + "sha256:4ea6a794b8a4e0590bea1599e724d4877d34640058caf5c0b3f916ded06fc3a1", + "sha256:4ff57d2a67aaff47eb60c37c5476af2a5056319aa2a5cab4b276f78b764be785", + "sha256:50079bcfd087c8a8822c9fe940c887244cf2276ca0a4f0b55bec006b564b9541", + "sha256:50186fa41c72929d21727dcc6cb87bef0adf09df9e982325a0ae5bfd20a9456b", + "sha256:502ec85cb2c0a35350a196e25d5e1350d400102706eba05d7926eadb64ffa976", + "sha256:51c644157319e2ca87521bd9694df7f651aac3273e015f35cdfb47cb8597ce37", + "sha256:527bfd3e01b8dafa1c24cba1a0455a85bbcdb41a3eefe59e2849634f9206d4f0", + "sha256:53172f0781b3db9321a1286bb274121668c3fe560d3bddfa82f585475f7145fa", + "sha256:5494515f3d0df1eb54c9f4ce7b9ea0b285bc1ba87eba295604da5f8de711bdea", + "sha256:5942e8b7ad869ea5f44d928053d3eda16e877b5fed5326786388f6a377545ab3", + "sha256:5ae5f8ab4accc980fa8e6696a402176e20a717ab2b296cd8d62b6a86cafc5f9c", + "sha256:6023de5cc800c073cbf6a10a7aad0cbae0c1849c759bb5263a78d9ac774b167b", + "sha256:609cc4bed06942e51ebdfa9cc74629e1d19de2339161b65d555d01b9820aec46", + "sha256:6217f30c4341619c6066a044ca118f53a3121b5813a56257b1f9818e24450584", + "sha256:62a1614558478f7d1014eec94a9ae3bf21c95766ecbe0a4a1ab16d2f1e4a6b67", + "sha256:62b8c3801d739a9592c0503dd294fab7f8cd2b1d637429babe13671bedf7d6f7", + "sha256:63a90494aeea75d3298941b0b8ddd505cbb54d6b915e579368db21d93454e41d", + "sha256:656107ef6ff0966df2a58828f165a17b0b40977358512ade259c52c18bff0a13", + "sha256:65e99e57f5fb42ed391fc2f7ffa4b8cce5a32dfd74f52e03bd36bb2ac3b56536", + "sha256:6aed97ef51e20ea4fd7e12c4b9e3199cd8e4664054f5d84c3d83e6f4d3144055", + "sha256:6bfb81f36fd56664dbbd64a0af241797424c76861faa2682aca89de110fce5d4", + "sha256:6d6f7fcfef9166670df4b6710d1105b891efba68ec523f56c64cc8c7aa6c8e88", + "sha256:6e742a691f4fa73cadbe7f866b33e33161ede5bc777eee443a62504adcadd65f", + "sha256:6ed32af20eeeb7f8307b091fdd0ee8f5f8733dde7e8f560a3115c98a6ac33a61", + "sha256:6fa6495ec52ff29b097e6d1b619588ab61e998b198882ec622d947856d4a85b4", + "sha256:793077870191d54889cc472eda3bfd84c8cae5ed61c9fa9fb2ce29c31e23f812", + "sha256:7b2ac847e8d2ca55be038d29d20d6bfe86c03e66ac2d9741701e4f9eef2abda9", + "sha256:7bb791f16c810c98865c373202a44b7b313d01a2a7a6186c9dcc0ac1a0d156dc", + "sha256:801ab496766a858cc54b37a66f9d0169d590628e69bde2166f76c35dfc20f64f", + "sha256:80ca483ee2084d36dc570004b6793f99c58d2df201c630f60518bca3518faa5d", + "sha256:81154db47a9aa901d09a8cebcd1f6559dbbd02a93a16bc203dc3f94c06bea25a", + "sha256:8195b3fe2ed91db03f969c3c5cf6a9bcb3a961749caec94479e9e7a96d7af14f", + "sha256:83603a97fdbcf2139f475c940789f09e32703f931f29f4a8ddf3551e6700108b", + "sha256:846050f1d7520350d26076df12b8a78b540780d7d3478845be79d57e2e6d3612", + "sha256:85582502d3df1db8077475d88d0bf5f35b8ddb8abf9badd8625781024da5f346", + "sha256:8575d340ffcd89e4558448eec23c252da584f0de4528a73ed45a01f12d6700fd", + "sha256:88e8cbd8fdd2af2f94615c32ab113c5cff4dbd188454394c4cac9941d2f72204", + "sha256:8e3dff90b6abc56331a886b5067c3b6bc3fad1b6df5766247197b699afd013b7", + "sha256:8e4123de14a8dd7bccb1faed374c1f6c87111766279bbba5d6c4c52e39c383d9", + "sha256:8f356263a898b2c9961a2661ebb975f2fd20868d2c4fc4a165226fa7d36e1c76", + "sha256:91da52897e5219dc440d3b9d290fdee66fb70c65ae594555c8d2c887df77f2de", + "sha256:91e8a0852784c758b8de4179c61e80abae997155aa2b324cbee28dcaf9084b6f", + "sha256:92abe38cdd7ea3f98a0f1a4521e9e7e70aa001713bff62a5b97fae41b0a39d0d", + "sha256:94973e29acf813a572adf3ed2342a0998a41331781d7be82a0a1b02646181e34", + "sha256:94d970caaaf3f59d6c7aa0aaf38e755641351f99452c400fc06b7e365ab1620c", + "sha256:957751dd7bba26e651c689fc5f41bb269712efcbf19a97ad4f912f0f792e6e95", + "sha256:9593a76f516312ec59dbeb73a9f1915d1f67610c054a7b488912b972cbfbcb7e", + "sha256:965e04aeb83f594577ea4e8c975765d0953a75c8d6e3cd193ae25ef574bd83ee", + "sha256:99902df14861e4f40ed1eb403a17356188428d12bb10d53de10d1ea24996b838", + "sha256:9dca0cde0f02e08e11431fff0e5408ac46420912165d828bc148a3c8cedc8852", + "sha256:9fa20eb8f710a9d36801451d1cbcfc83d1dd9e400527ad9aba7e7cc635c2729b", + "sha256:a07742d42409c3ce98c58f2b155e2d8acdcd8ff49955062f5155dae94b24060a", + "sha256:a15a3ef14cb929b07e0a98639f2ebcd69a0038d6e31367157018ec841a54d8fa", + "sha256:a22c4b26fb6134ece45e875515961bc9c1777df775f3488800bea55a381df91e", + "sha256:a62e98375385ade756d1ea4975f79ec103c515b412884d146c98295c5300fb4a", + "sha256:a900a3dcda64b289cf35acfb6c90246b5ae9f2dd4bc05da8dcb8fbd04c91e37b", + "sha256:ad30429f499c30e8e19ed389b8e25116d43c63cafdb97d4f5617e94e671209c5", + "sha256:adb895a0081a932132aa3a233cfeba682a07ac0dc36b062152f240406eecfba1", + "sha256:b1752344c77dbb137244e6ab5af5a7576b8e8b8e5d440c58d935e69f83606e0d", + "sha256:b19cdecdc19ad863673709d27ddb0adc104b9ad341f2785ab23c51c9ab39cf3f", + "sha256:b62c408ddac3ae113b9dc4867fd2bb32a2ef669c68f256eb5486c02b31603afa", + "sha256:b856928e99a1d3080929b0f194c7922c7a7979b0eb21ad9d057f000dcf1a6ac7", + "sha256:ba0f1c0201845b769c92b2b3e7666010abe14d6e9dbf4214d04cdf23cbdcd1ae", + "sha256:bafef40c8b521ef9df81a118e278d5759c0127395883dcc10bf80ee32a46da39", + "sha256:be591f405d82f40acbe2a081f1dee5478a3cf1b694013cc5712e84159311e36a", + "sha256:c20a4ee0706db5c9f403e4c459fc81145f48cb20fccc1a64acfb6143f1a7b1fb", + "sha256:c2d2a7324fbd118dc951b63b1fc553aec0fc0c430474a6ab7b33608b9606658a", + "sha256:c309d50ee6a41053ad4c284295e5c5eedfd084ff94a5ee1148cf0dc64e3223fb", + "sha256:c6f67ac9d3ff65ca466821d573b3cb2fb01f0cd9eb082e92f49dfd88fa828a77", + "sha256:c7f7a398bcb0f4cfbaf0ddb3e831c43857701c63c66f48eb30011326ed03b0fa", + "sha256:c867d446b22a7288229a812da6f211d86934beb47edf8098e2e0dbe9e2529f86", + "sha256:ca3df18c269f9c11b40dde85336d3fc4a879867b05c74efdd4d5f8e64ac7e179", + "sha256:ca80bb0b8400888e16e8eaa01b506de7d1bbdc8cc78c9ff75272526fd36fcb8a", + "sha256:cccfb03f829ecde3ee126befb4fe827e2228a50e8d9eaa0275c4dd21a0e59765", + "sha256:ce8e8a4aa8246c615693b9d0504e1df98157ae48907a044baa80f80abecc44ad", + "sha256:cfa03e12c0c1bd357a0e1f20adae9c32bc166dcc6ed3be65885134830899b6ba", + "sha256:d077f76179de41cdd5ae39b0a6f16f033b077f27fa54a9e038d03e3f5ddeff23", + "sha256:d2cc02e94ff4df6a4a871bbd69149ba5fbc5150108a208c6cdd9bc728000995b", + "sha256:d55d9e1e22ebfa9cde606a7967eb21fbc65d0d3be600e550c38a1c05094c8015", + "sha256:d62a54dd438b51dd9f94bd88dd2f7c9d4093aadc44892143182d51f8488ab5f6", + "sha256:d62f357845f90d5327bdd3286ebd79c40b23b8e7c36772fc2949ef54a92bc6de", + "sha256:db3d4e991ee727f6c0a54fe975ebe169be3a463ce810cfd8e6edbe8a90ddeb8f", + "sha256:dc917e488a9bdc681cb4a9b0ed3d0c8b81816bc1a6b1f85ec4050c827ffa9e76", + "sha256:deb41298fb0c916875413373e5eba162e39309d8730be736b3a206d9b73afebf", + "sha256:dec319cdbba5ed3dfb2a8798364a8899751e732127c6ae74bc41276899e0311a", + "sha256:e0262bba03bb4d38b697c2039a8e48a9e889fb9ae9b727903e8d9c49d32883a4", + "sha256:e0f1f590a66769caea6cf47c3c5d06d004f01659449595d4bc737a42d4670bf0", + "sha256:e21208605759dc2eeebf607a002e1ddc09548c12f25886d2a2dd8efdf35535a3", + "sha256:e2dbb36017e5c7d7499dfc05f8d6ed781fce9fbfa45cc7bd888ec5f871aba3d3", + "sha256:e69d3d5257607a3b29f12192ad7bc9fdbdc8aa5f7e11c6f536cb61ee02dcd698", + "sha256:e71bb03c754934d7792aa0559b16f9effe1d4196f5834715c115363809f00c37", + "sha256:e7c4530ec6bf3a27c3cba229026fa3669e6e1832fdc37cf74c73b113f884cb2d", + "sha256:e9d44c5cfe2516a652131ddd91c3a48924e34f4a7b85640cda44694afbeee6cb", + "sha256:ea1fe83079c67c3f1549a735f11060350c87453bd86a8442bccb1f9b14c26aef", + "sha256:eb4d96fe5d6d8bf5c8c64d8a37edff55e6d9abbf84d9b8fd0fe8e0db1a557625", + "sha256:f0822c9f4852f9f6b1458f8fbf011bb887cefba792b0c7c10659e2c9c997d1c9" ], "markers": "python_version >= '3.5'", - "version": "==0.15.9" + "version": "==0.15.10" }, "qtconsole": { "hashes": [ @@ -2961,11 +2980,11 @@ }, "referencing": { "hashes": [ - "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", - "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7" + "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844", + "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4" ], "markers": "python_version >= '3.8'", - "version": "==0.33.0" + "version": "==0.34.0" }, "requests": { "hashes": [ @@ -3020,116 +3039,116 @@ }, "rioxarray": { "hashes": [ - "sha256:75c41e5836a9adba2a42a2cdbc62a50b81e01bd4fcc9f55a96f187322182d671", - "sha256:c6d30d8b1b12924dffc45c4d55764840039fa0c8b551589d6cc1364e158e6055" + "sha256:9dc57a66b3551644322bba6c4d5d4c4647b0e41c481c9f03b287c1d9e16407b6", + "sha256:d12441e696dbc8a6113658e75326009ef6fddd3f865f4bcdd659d7fcfe4d8c7f" ], "markers": "python_version >= '3.10'", - "version": "==0.15.1" + "version": "==0.15.3" }, "rpds-py": { "hashes": [ - "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147", - "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7", - "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2", - "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68", - "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1", - "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382", - "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d", - "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921", - "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38", - "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4", - "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a", - "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d", - "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518", - "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e", - "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d", - "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf", - "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5", - "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba", - "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6", - "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59", - "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253", - "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6", - "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f", - "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3", - "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea", - "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1", - "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76", - "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93", - "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad", - "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad", - "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc", - "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049", - "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d", - "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90", - "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d", - "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd", - "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25", - "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2", - "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f", - "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6", - "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4", - "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c", - "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8", - "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d", - "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b", - "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19", - "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453", - "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9", - "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde", - "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296", - "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58", - "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec", - "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99", - "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a", - "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb", - "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383", - "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d", - "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896", - "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc", - "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6", - "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b", - "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7", - "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22", - "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf", - "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394", - "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0", - "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57", - "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74", - "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83", - "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29", - "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9", - "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f", - "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745", - "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb", - "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811", - "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55", - "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342", - "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23", - "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82", - "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041", - "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb", - "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066", - "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55", - "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6", - "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a", - "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140", - "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b", - "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9", - "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256", - "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c", - "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772", - "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4", - "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae", - "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920", - "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a", - "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b", - "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361", - "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8", - "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a" + "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f", + "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c", + "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76", + "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e", + "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157", + "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f", + "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5", + "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05", + "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24", + "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1", + "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8", + "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b", + "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb", + "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07", + "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1", + "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6", + "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e", + "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e", + "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1", + "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab", + "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4", + "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17", + "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594", + "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d", + "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d", + "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3", + "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c", + "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66", + "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f", + "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80", + "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33", + "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f", + "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c", + "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022", + "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e", + "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f", + "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da", + "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1", + "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688", + "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795", + "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c", + "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98", + "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1", + "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20", + "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307", + "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4", + "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18", + "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294", + "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66", + "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467", + "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948", + "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e", + "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1", + "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0", + "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7", + "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd", + "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641", + "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d", + "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9", + "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1", + "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da", + "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3", + "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa", + "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7", + "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40", + "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496", + "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124", + "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836", + "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434", + "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984", + "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f", + "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6", + "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e", + "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461", + "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c", + "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432", + "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73", + "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58", + "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88", + "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337", + "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7", + "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863", + "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475", + "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3", + "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51", + "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf", + "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024", + "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40", + "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9", + "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec", + "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb", + "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7", + "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861", + "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880", + "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f", + "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd", + "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca", + "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58", + "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e" ], "markers": "python_version >= '3.8'", - "version": "==0.17.1" + "version": "==0.18.0" }, "rtree": { "hashes": [ @@ -3227,19 +3246,19 @@ }, "send2trash": { "hashes": [ - "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679", - "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312" + "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", + "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.8.2" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.8.3" }, "setuptools": { "hashes": [ - "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401", - "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6" + "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e", + "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c" ], "markers": "python_version >= '3.8'", - "version": "==69.1.0" + "version": "==69.2.0" }, "shapely": { "hashes": [ @@ -3399,11 +3418,11 @@ }, "sniffio": { "hashes": [ - "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101", - "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384" + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" ], "markers": "python_version >= '3.7'", - "version": "==1.3.0" + "version": "==1.3.1" }, "snuggs": { "hashes": [ @@ -3452,11 +3471,11 @@ }, "terminado": { "hashes": [ - "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded", - "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e" + "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", + "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e" ], "markers": "python_version >= '3.8'", - "version": "==0.18.0" + "version": "==0.18.1" }, "texttable": { "hashes": [ @@ -3516,35 +3535,35 @@ }, "traitlets": { "hashes": [ - "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", - "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" + "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", + "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" ], "markers": "python_version >= '3.8'", - "version": "==5.14.1" + "version": "==5.14.2" }, "typeguard": { "hashes": [ - "sha256:8923e55f8873caec136c892c3bed1f676eae7be57cdb94819281b3d3bc9c0953", - "sha256:ea0a113bbc111bcffc90789ebb215625c963411f7096a7e9062d4e4630c155fd" + "sha256:7da3bd46e61f03e0852f8d251dcbdc2a336aa495d7daff01e092b55327796eb8", + "sha256:c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee" ], "markers": "python_version >= '3.8'", - "version": "==4.1.5" + "version": "==4.2.1" }, "types-python-dateutil": { "hashes": [ - "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f", - "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2" + "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202", + "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" ], "markers": "python_version >= '3.8'", - "version": "==2.8.19.20240106" + "version": "==2.9.0.20240316" }, "typing-extensions": { "hashes": [ - "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", - "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" ], "markers": "python_version < '3.11'", - "version": "==4.10.0" + "version": "==4.11.0" }, "typing-inspect": { "hashes": [ @@ -3578,11 +3597,11 @@ }, "virtualenv": { "hashes": [ - "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3", - "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b" + "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a", + "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197" ], "markers": "python_version >= '3.7'", - "version": "==20.25.0" + "version": "==20.25.1" }, "wcwidth": { "hashes": [ @@ -3723,11 +3742,11 @@ }, "xyzservices": { "hashes": [ - "sha256:091229269043bc8258042edbedad4fcb44684b0473ede027b5672ad40dc9fa02", - "sha256:6a4c38d3a9f89d3e77153eff9414b36a8ee0850c9e8b85796fd1b2a85b8dfd68" + "sha256:6a04f11487a6fb77d92a98984cd107fbd9157fd5e65f929add9c3d6e604ee88c", + "sha256:b83e48c5b776c9969fffcfff57b03d02b1b1cd6607a9d9c4e7f568b01ef47f4c" ], "markers": "python_version >= '3.8'", - "version": "==2023.10.1" + "version": "==2024.4.0" }, "y-py": { "hashes": [ @@ -3818,11 +3837,11 @@ }, "zipp": { "hashes": [ - "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31", - "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0" + "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", + "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" ], "markers": "python_version >= '3.8'", - "version": "==3.17.0" + "version": "==3.18.1" } }, "develop": { @@ -3858,11 +3877,11 @@ }, "ipython": { "hashes": [ - "sha256:1050a3ab8473488d7eee163796b02e511d0735cf43a04ba2a8348bd0f2eaf8a5", - "sha256:48fbc236fbe0e138b88773fa0437751f14c3645fb483f1d4c5dee58b37e5ce73" + "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1", + "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" ], "markers": "python_version >= '3.10'", - "version": "==8.21.0" + "version": "==8.23.0" }, "jedi": { "hashes": [ @@ -3882,18 +3901,18 @@ }, "parso": { "hashes": [ - "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", - "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" ], "markers": "python_version >= '3.6'", - "version": "==0.8.3" + "version": "==0.8.4" }, "pexpect": { "hashes": [ "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], - "markers": "sys_platform != 'win32'", + "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", "version": "==4.9.0" }, "pickleshare": { @@ -3951,11 +3970,11 @@ }, "traitlets": { "hashes": [ - "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", - "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" + "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", + "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" ], "markers": "python_version >= '3.8'", - "version": "==5.14.1" + "version": "==5.14.2" }, "wcwidth": { "hashes": [ @@ -3965,4 +3984,4 @@ "version": "==0.2.13" } } -} \ No newline at end of file +} diff --git a/README.md b/README.md index 85c071822..7bb7207c6 100644 --- a/README.md +++ b/README.md @@ -25,24 +25,36 @@ AWS Resource Name: `arn:aws:s3:::noaa-nws-owp-fim` ### Accessing Data using the AWS CLI -This S3 Bucket (`s3://noaa-nws-owp-fim`) is set up as a "Requester Pays" bucket. Read more about what that means [here](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html). If you are using compute resources in the same region as the S3 Bucket, then there is no cost. +Before attempting to download, you will need ESIP AWS cli credentials (Access key ID and Secret Access Key). You do not have to have your own AWS account. Please contact Carson Pruitt (carson.pruitt@noaa.gov) or Fernando Salas (fernando.salas@noaa.gov). + +Once you get AWS credentials, open your terminal window and type: +``` +aws configure --profile esip +``` +It will ask you for the Access key ID, Secret Access Key, Region and default language (just hit tab for that entry). + +With the keys in place, you can test your credentials get a list folders prior to download as well as execute other S3 cli commands: +``` +aws s3 ls s3://noaa-nws-owp-fim --profile esip +``` + ### Examples **Note:** All examples are based on linux pathing. Also, for each sample below, remove the line breaks [backslash(s) "\"] before running the command. The available inputs, test cases, and versioned FIM outputs can be found by running: ``` -aws s3 ls s3://noaa-nws-owp-fim/hand_fim/ --request-payer +aws s3 ls s3://noaa-nws-owp-fim/hand_fim/ --profile esip ``` Download a directory of sample outputs for a single HUC8: ``` -aws s3 sync s3://noaa-nws-owp-fim/hand_fim/outputs/fim_4_3_11_0/12090301 \ - /your_local_folder_name/12090301 --request-payer +aws s3 sync s3://noaa-nws-owp-fim/hand_fim/outputs/fim_4_4_0_0/12090301 \ + /your_local_folder_name/12090301 --profile esip ``` -By adjusting pathing, you can also download entire directories such as the `fim_4_3_11_0` folder. An entire output FIM set (e.g. `fim_4_3_11_0`) is approximately 1.1 TB. +By adjusting pathing, you can also download entire directories such as the `fim_4_4_0_0` folder. An entire output FIM set (e.g. `fim_4_4_0_0`) is approximately 1.1 TB. -**Note**: There may be newer editions than `fim_4_3_11_0`, and it is recommended to adjust the command above for the latest version. +**Note**: There may be newer editions than `fim_4_4_0_0`, and it is recommended to adjust the command above for the latest version. ## Setting up your Environment @@ -83,7 +95,7 @@ Git will auto create a subfolder named `inundation-mapping` where the code will Input data can be found on the ESIP S3 Bucket (see "Accessing Data through ESIP S3 Bucket" section above). The FIM inputs directory can be found at `s3://noaa-nws-owp-fim/hand_fim/inputs`. It is appx 400GB and it needs to be in your `data` folder. ``` -aws s3 sync s3://noaa-nws-owp-fim/hand_fim/inputs /home/projects/fim/data/inputs --request-payer --dryrun +aws s3 sync s3://noaa-nws-owp-fim/hand_fim/inputs /home/projects/fim/data/inputs --profile esip --dryrun ``` **Note**: When you include the `--dryrun` argument in the command, a large list will be returned showing you exactly which files are to be downloaded and where they will be saved. We recommend including this argument the first time you run the command, then quickly aborting it (CTRL-C) so you don't get the full list. However, you can see that your chosen target path on your machine is correct. When you are happy with the pathing, run the `aws s3` command again and leave off the `--dryrun` argument. @@ -153,7 +165,7 @@ To test in HUCs other than the provided HUCs, the following processes can be fol ``` /foss_fim/src/acquire_and_preprocess_inputs.py -u ``` - Sorry, this tool is deprecated, updates will be coming soon. + Sorry, this tool is deprecated, replacement scripts are coming soon. ### Evaluating Inundation Map Performance diff --git a/data/ble/ble_benchmark/Dockerfile b/data/ble/ble_benchmark/Dockerfile deleted file mode 100644 index bb35c7c88..000000000 --- a/data/ble/ble_benchmark/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM ghcr.io/osgeo/gdal:ubuntu-small-3.7.0 - -RUN apt-get update && apt-get install -y \ - python3-pip - -## install python 3 modules ## -COPY Pipfile . -COPY Pipfile.lock . -RUN pip3 install pipenv==2022.4.8 && PIP_NO_CACHE_DIR=off pipenv install --system --deploy --ignore-pipfile diff --git a/data/ble/ble_benchmark/Pipfile b/data/ble/ble_benchmark/Pipfile deleted file mode 100755 index edb4c575e..000000000 --- a/data/ble/ble_benchmark/Pipfile +++ /dev/null @@ -1,15 +0,0 @@ -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -pandas = "*" -rasterio = "*" -geopandas = "*" -openpyxl = "*" - -[dev-packages] - -[requires] -python_version = "3.10" diff --git a/data/ble/ble_benchmark/Pipfile.lock b/data/ble/ble_benchmark/Pipfile.lock deleted file mode 100644 index 5e258cf1b..000000000 --- a/data/ble/ble_benchmark/Pipfile.lock +++ /dev/null @@ -1,340 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "43b6d8b600067ac2becfb2d00935884984da473d94e96a01d4943d31d3091e80" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "affine": { - "hashes": [ - "sha256:8a3df80e2b2378aef598a83c1392efd47967afec4242021a0b06b4c7cbc61a92", - "sha256:a24d818d6a836c131976d22f8c27b8d3ca32d0af64c1d8d29deb7bafa4da1eea" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.0" - }, - "attrs": { - "hashes": [ - "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04", - "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1.0" - }, - "certifi": { - "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" - ], - "index": "pypi", - "version": "==2023.7.22" - }, - "click": { - "hashes": [ - "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd", - "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.6" - }, - "click-plugins": { - "hashes": [ - "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b", - "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8" - ], - "version": "==1.1.1" - }, - "cligj": { - "hashes": [ - "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", - "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", - "version": "==0.7.2" - }, - "et-xmlfile": { - "hashes": [ - "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", - "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" - ], - "markers": "python_version >= '3.6'", - "version": "==1.1.0" - }, - "fiona": { - "hashes": [ - "sha256:1a585002a6385cc8ab0f66ddf3caf18711f531901906abd011a67a0cc89ab7b0", - "sha256:1da8b954f6f222c3c782bc285586ea8dd9d7e55e1bc7861da9cd772bca671660", - "sha256:285f3dd4f96aa0a3955ed469f0543375b20989731b2dddc85124453f11ac62bc", - "sha256:2c2c7b09eecee3bb074ef8aa518cd6ab30eb663c6fdd0eff3c88d454a9746eaa", - "sha256:39baf11ff0e4318397e2b2197de427b4eebdc49d4a9a7c1366f8a7ed682978a4", - "sha256:450561d308d3ce7c7e30294822b1de3f4f942033b703ddd4a91a7f7f5f506ca0", - "sha256:5679d3f7e0d513035eb72e59527bb90486859af4405755dfc739138633106120", - "sha256:71b023ef5248ebfa5524e7a875033f7db3bbfaf634b1b5c1ae36958d1eb82083", - "sha256:74511d3755695d75cea0f4ff6f5e0c6c5d5be8e0d46dafff124c6a219e99b1eb", - "sha256:7bfb1f49e0e53f6cd7ad64ae809d72646266b37a7b9881205977408b443a8d79", - "sha256:a670ea4262cb9140445bcfc97cbfd2f508a058be342f4a97e966b8ce7696601f", - "sha256:b0387cae39e27f338fd948b3b50b6e6ce198cc4cec257fc91660849697c69dc3", - "sha256:b633a2e550e083805c638d2ab8059c283ca112aaea8241e170c012d2ee0aa905", - "sha256:c1faa625d5202b8403471bbc9f9c96b1bf9099cfcb0ee02a80a3641d3d02383e", - "sha256:c671d8832287cda397621d79c5a635d52e4631f33a8f0e6fdc732a79a93cb96c", - "sha256:d6483a20037db2209c8e9a0c6f1e552f807d03c8f42ed0c865ab500945a37c4d", - "sha256:d93c993265f6378b23f47708c83bddb3377ca6814a1f0b5a0ae0bee9c8d72cf8", - "sha256:dbe158947099a83ad16f9acd3a21f50ff01114c64e2de67805e382e6b6e0083a", - "sha256:ea7c44c15b3a653452b9b3173181490b7afc5f153b0473c145c43c0fbf90448b", - "sha256:f5da66b723a876142937e683431bbaa5c3d81bb2ed3ec98941271bc99b7f8cd0" - ], - "markers": "python_version >= '3.7'", - "version": "==1.9.4.post1" - }, - "geopandas": { - "hashes": [ - "sha256:101cfd0de54bcf9e287a55b5ea17ebe0db53a5e25a28bacf100143d0507cabd9", - "sha256:e5b56d9c20800c77bcc0c914db3f27447a37b23b2cd892be543f5001a694a968" - ], - "index": "pypi", - "version": "==0.13.2" - }, - "numpy": { - "hashes": [ - "sha256:0d60fbae8e0019865fc4784745814cff1c421df5afee233db6d88ab4f14655a2", - "sha256:1a1329e26f46230bf77b02cc19e900db9b52f398d6722ca853349a782d4cff55", - "sha256:1b9735c27cea5d995496f46a8b1cd7b408b3f34b6d50459d9ac8fe3a20cc17bf", - "sha256:2792d23d62ec51e50ce4d4b7d73de8f67a2fd3ea710dcbc8563a51a03fb07b01", - "sha256:3e0746410e73384e70d286f93abf2520035250aad8c5714240b0492a7302fdca", - "sha256:4c3abc71e8b6edba80a01a52e66d83c5d14433cbcd26a40c329ec7ed09f37901", - "sha256:5883c06bb92f2e6c8181df7b39971a5fb436288db58b5a1c3967702d4278691d", - "sha256:5c97325a0ba6f9d041feb9390924614b60b99209a71a69c876f71052521d42a4", - "sha256:60e7f0f7f6d0eee8364b9a6304c2845b9c491ac706048c7e8cf47b83123b8dbf", - "sha256:76b4115d42a7dfc5d485d358728cdd8719be33cc5ec6ec08632a5d6fca2ed380", - "sha256:7dc869c0c75988e1c693d0e2d5b26034644399dd929bc049db55395b1379e044", - "sha256:834b386f2b8210dca38c71a6e0f4fd6922f7d3fcff935dbe3a570945acb1b545", - "sha256:8b77775f4b7df768967a7c8b3567e309f617dd5e99aeb886fa14dc1a0791141f", - "sha256:90319e4f002795ccfc9050110bbbaa16c944b1c37c0baeea43c5fb881693ae1f", - "sha256:b79e513d7aac42ae918db3ad1341a015488530d0bb2a6abcbdd10a3a829ccfd3", - "sha256:bb33d5a1cf360304754913a350edda36d5b8c5331a8237268c48f91253c3a364", - "sha256:bec1e7213c7cb00d67093247f8c4db156fd03075f49876957dca4711306d39c9", - "sha256:c5462d19336db4560041517dbb7759c21d181a67cb01b36ca109b2ae37d32418", - "sha256:c5652ea24d33585ea39eb6a6a15dac87a1206a692719ff45d53c5282e66d4a8f", - "sha256:d7806500e4f5bdd04095e849265e55de20d8cc4b661b038957354327f6d9b295", - "sha256:db3ccc4e37a6873045580d413fe79b68e47a681af8db2e046f1dacfa11f86eb3", - "sha256:dfe4a913e29b418d096e696ddd422d8a5d13ffba4ea91f9f60440a3b759b0187", - "sha256:eb942bfb6f84df5ce05dbf4b46673ffed0d3da59f13635ea9b926af3deb76926", - "sha256:f08f2e037bba04e707eebf4bc934f1972a315c883a9e0ebfa8a7756eabf9e357", - "sha256:fd608e19c8d7c55021dffd43bfe5492fab8cc105cc8986f813f8c3c048b38760" - ], - "markers": "python_version >= '3.9'", - "version": "==1.25.2" - }, - "openpyxl": { - "hashes": [ - "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184", - "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" - ], - "index": "pypi", - "version": "==3.1.2" - }, - "packaging": { - "hashes": [ - "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61", - "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f" - ], - "markers": "python_version >= '3.7'", - "version": "==23.1" - }, - "pandas": { - "hashes": [ - "sha256:02755de164da6827764ceb3bbc5f64b35cb12394b1024fdf88704d0fa06e0e2f", - "sha256:0a1e0576611641acde15c2322228d138258f236d14b749ad9af498ab69089e2d", - "sha256:1eb09a242184092f424b2edd06eb2b99d06dc07eeddff9929e8667d4ed44e181", - "sha256:30a89d0fec4263ccbf96f68592fd668939481854d2ff9da709d32a047689393b", - "sha256:50e451932b3011b61d2961b4185382c92cc8c6ee4658dcd4f320687bb2d000ee", - "sha256:51a93d422fbb1bd04b67639ba4b5368dffc26923f3ea32a275d2cc450f1d1c86", - "sha256:598e9020d85a8cdbaa1815eb325a91cfff2bb2b23c1442549b8a3668e36f0f77", - "sha256:66d00300f188fa5de73f92d5725ced162488f6dc6ad4cecfe4144ca29debe3b8", - "sha256:69167693cb8f9b3fc060956a5d0a0a8dbfed5f980d9fd2c306fb5b9c855c814c", - "sha256:6d6d10c2142d11d40d6e6c0a190b1f89f525bcf85564707e31b0a39e3b398e08", - "sha256:713f2f70abcdade1ddd68fc91577cb090b3544b07ceba78a12f799355a13ee44", - "sha256:7376e13d28eb16752c398ca1d36ccfe52bf7e887067af9a0474de6331dd948d2", - "sha256:77550c8909ebc23e56a89f91b40ad01b50c42cfbfab49b3393694a50549295ea", - "sha256:7b21cb72958fc49ad757685db1919021d99650d7aaba676576c9e88d3889d456", - "sha256:9ebb9f1c22ddb828e7fd017ea265a59d80461d5a79154b49a4207bd17514d122", - "sha256:a18e5c72b989ff0f7197707ceddc99828320d0ca22ab50dd1b9e37db45b010c0", - "sha256:a6b5f14cd24a2ed06e14255ff40fe2ea0cfaef79a8dd68069b7ace74bd6acbba", - "sha256:b42b120458636a981077cfcfa8568c031b3e8709701315e2bfa866324a83efa8", - "sha256:c4af689352c4fe3d75b2834933ee9d0ccdbf5d7a8a7264f0ce9524e877820c08", - "sha256:c7319b6e68de14e6209460f72a8d1ef13c09fb3d3ef6c37c1e65b35d50b5c145", - "sha256:cf3f0c361a4270185baa89ec7ab92ecaa355fe783791457077473f974f654df5", - "sha256:dd46bde7309088481b1cf9c58e3f0e204b9ff9e3244f441accd220dd3365ce7c", - "sha256:dd5476b6c3fe410ee95926873f377b856dbc4e81a9c605a0dc05aaccc6a7c6c6", - "sha256:e69140bc2d29a8556f55445c15f5794490852af3de0f609a24003ef174528b79", - "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774" - ], - "index": "pypi", - "version": "==2.0.2" - }, - "pyparsing": { - "hashes": [ - "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb", - "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.1" - }, - "pyproj": { - "hashes": [ - "sha256:00fab048596c17572fa8980014ef117dbb2a445e6f7ba3b9ddfcc683efc598e7", - "sha256:08dfc5c9533c78a97afae9d53b99b810a4a8f97c3be9eb2b8f323b726c736403", - "sha256:1283d3c1960edbb74828f5f3405b27578a9a27f7766ab6a3956f4bd851f08239", - "sha256:137a07404f937f264b11b7130cd4cfa00002dbe4333b222e8056db84849c2ea4", - "sha256:18a8bdb87aeb41b60a2e91d32f623227de3569fb83b4c64b174c3a7c5b0ed3ae", - "sha256:23787460fab85ba2f857ee60ffb2e8e21fd9bd5db9833c51c1c05b2a6d9f0be5", - "sha256:2799499a4045e4fb73e44c31bdacab0593a253a7a4b6baae6fdd27d604cf9bc2", - "sha256:3a4d2d438b007cb1f8d5f6f308d53d7ff9a2508cff8f9da6e2a93b76ffd98aaf", - "sha256:4d8a9773503085eada59b6892c96ddf686ab8cf64cfdc18ad744d13ee76dfa6f", - "sha256:557e6592855111c84eda176ddf6b130f55d5e2b9cb1c017b8c91b69f37f474f5", - "sha256:595376e4d3bb72b7dceeccbce0f4c43053d47561f17a1ad0224407e9980ee849", - "sha256:78276c6b0c831255c97c56dff7313a3571f327a284d8ac63d6a56437a72ed0e0", - "sha256:830e6de7cfe43853967afee5ef908dfd5aa72d1ec12af9b9e3fecc179886e346", - "sha256:8fbac2eb9a0e425d7d6b7c6f4ebacd675cf3bdef0c59887057b8b4b0374e7c12", - "sha256:95120d65cbc5983dfd877076f28dbc18b9b329cbee38ca6e217bb7a5a043c099", - "sha256:9de1aab71234bfd3fd648a1152519b5ee152c43113d7d8ea52590a0140129501", - "sha256:a5b111865b3f0f8b77b3983f2fbe4dd6248fc09d3730295949977c8dcd988062", - "sha256:ba5e7c8ddd6ed5a3f9fcf95ea80ba44c931913723de2ece841c94bb38b200c4a", - "sha256:d7f6cd045df29aae960391dfe06a575c110af598f1dea5add8be6ca42332b0f5", - "sha256:de6288b6ceabdeeac01abf627c74414822d322d8f55dc8efe4d29dedd27c5719", - "sha256:dfe392dfc0eba2248dc08c976a72f52ff9da2bddfddfd9ff5dcf18e8e88200c7", - "sha256:e342b3010b2b20134671564ff9a8c476e5e512bf589477480aded1a5813af7c8", - "sha256:e427ccdbb1763872416549bdfa9fa1f5f169054653c4daf674e71480cc39cf11", - "sha256:e600f6a2771d3b41aeb2cc1efd96771ae9a01451013da1dd48ff272e7c6e34ef", - "sha256:f04f6297c615c3b17f835df2556ac8fb9b4f51f281e960437eaf0cd80e7ae26a" - ], - "markers": "python_version >= '3.9'", - "version": "==3.6.0" - }, - "python-dateutil": { - "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" - }, - "pytz": { - "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" - ], - "version": "==2023.3" - }, - "rasterio": { - "hashes": [ - "sha256:075731165d26ef33e33e3ab903a0ecabb643893794bea1c78dd6c631713d1820", - "sha256:106e6519f5d2a0d35f0e963a8d07dc313ba7f6595a4c89fe9d6dcd8662a86617", - "sha256:41f233b7c85a74d66da4e31e37cfabe3c1aa116260063519d49f266e278bd4b3", - "sha256:5247affa7122f3c10a82d8cfa56b89fb60bfb981e4a22ebad8889d1caa138215", - "sha256:58d3d42cf06645f694911ea2707e6204868006784e0df3540e05e4615209b9c3", - "sha256:a8013826cdf540fb4f1507f92bb4ef440b594a4a8895d9038e25498e5b135f52", - "sha256:a97610a2997d9dc246ccd3f1361fdd63ae0b23a676e68af4f018f03e8c8a7592", - "sha256:abfdcb8f10210b8fad939f40d545d6c47e9e3b5cf4a43773ca8dd11c58204304", - "sha256:b4ad780117fefcd0fb81e2459d409a722f5964d1f655252278c7c56eb18f7ae6", - "sha256:baab6f3ba468d3b3ada05b282574af0f3110830f50888948d50c1f16aa6130af", - "sha256:c04a4932807ae64642f18d7c3f7cf504cb6703ec35496d07f2e5679ec5b9c4d3", - "sha256:c2ddc9cb2ccb0d296ca8c9da8af73b4d1c03c887a7dabbb4b4a6fa1e7450c1e7", - "sha256:cd21347b58fb60f2f0a8f7eb95ce58680590e205dee80562a67e868eebaaeea5", - "sha256:ce334df60b9d6ea66751b03afd1d138a551d27f2588e95ac6d7479856bb575a8", - "sha256:d6fa64dfda2ce1fe4c8b4e61d6e476ab3f389ac679e49b5386bb83708939a1b2", - "sha256:e3c06f1a62b28437c908851f0fc67abc6b31fce4a535e88e92311e73b8709996", - "sha256:feebf547b6785d57330f9ef69af54534a9548b24510c4e2fe87e5b9355112c28" - ], - "index": "pypi", - "version": "==1.3.7" - }, - "setuptools": { - "hashes": [ - "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f", - "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235" - ], - "markers": "python_version >= '3.7'", - "version": "==68.0.0" - }, - "shapely": { - "hashes": [ - "sha256:01224899ff692a62929ef1a3f5fe389043e262698a708ab7569f43a99a48ae82", - "sha256:05c51a29336e604c084fb43ae5dbbfa2c0ef9bd6fedeae0a0d02c7b57a56ba46", - "sha256:09d6c7763b1bee0d0a2b84bb32a4c25c6359ad1ac582a62d8b211e89de986154", - "sha256:193a398d81c97a62fc3634a1a33798a58fd1dcf4aead254d080b273efbb7e3ff", - "sha256:1a34a23d6266ca162499e4a22b79159dc0052f4973d16f16f990baa4d29e58b6", - "sha256:2569a4b91caeef54dd5ae9091ae6f63526d8ca0b376b5bb9fd1a3195d047d7d4", - "sha256:33403b8896e1d98aaa3a52110d828b18985d740cc9f34f198922018b1e0f8afe", - "sha256:3ad81f292fffbd568ae71828e6c387da7eb5384a79db9b4fde14dd9fdeffca9a", - "sha256:3cb256ae0c01b17f7bc68ee2ffdd45aebf42af8992484ea55c29a6151abe4386", - "sha256:45b4833235b90bc87ee26c6537438fa77559d994d2d3be5190dd2e54d31b2820", - "sha256:4641325e065fd3e07d55677849c9ddfd0cf3ee98f96475126942e746d55b17c8", - "sha256:502e0a607f1dcc6dee0125aeee886379be5242c854500ea5fd2e7ac076b9ce6d", - "sha256:66a6b1a3e72ece97fc85536a281476f9b7794de2e646ca8a4517e2e3c1446893", - "sha256:70a18fc7d6418e5aea76ac55dce33f98e75bd413c6eb39cfed6a1ba36469d7d4", - "sha256:7d3bbeefd8a6a1a1017265d2d36f8ff2d79d0162d8c141aa0d37a87063525656", - "sha256:83a8ec0ee0192b6e3feee9f6a499d1377e9c295af74d7f81ecba5a42a6b195b7", - "sha256:865bc3d7cc0ea63189d11a0b1120d1307ed7a64720a8bfa5be2fde5fc6d0d33f", - "sha256:90cfa4144ff189a3c3de62e2f3669283c98fb760cfa2e82ff70df40f11cadb39", - "sha256:91575d97fd67391b85686573d758896ed2fc7476321c9d2e2b0c398b628b961c", - "sha256:9a6ac34c16f4d5d3c174c76c9d7614ec8fe735f8f82b6cc97a46b54f386a86bf", - "sha256:a529218e72a3dbdc83676198e610485fdfa31178f4be5b519a8ae12ea688db14", - "sha256:a70a614791ff65f5e283feed747e1cc3d9e6c6ba91556e640636bbb0a1e32a71", - "sha256:ac1dfc397475d1de485e76de0c3c91cc9d79bd39012a84bb0f5e8a199fc17bef", - "sha256:b06d031bc64149e340448fea25eee01360a58936c89985cf584134171e05863f", - "sha256:b4f0711cc83734c6fad94fc8d4ec30f3d52c1787b17d9dca261dc841d4731c64", - "sha256:b50c401b64883e61556a90b89948297f1714dbac29243d17ed9284a47e6dd731", - "sha256:b519cf3726ddb6c67f6a951d1bb1d29691111eaa67ea19ddca4d454fbe35949c", - "sha256:bca57b683e3d94d0919e2f31e4d70fdfbb7059650ef1b431d9f4e045690edcd5", - "sha256:c43755d2c46b75a7b74ac6226d2cc9fa2a76c3263c5ae70c195c6fb4e7b08e79", - "sha256:c7eed1fb3008a8a4a56425334b7eb82651a51f9e9a9c2f72844a2fb394f38a6c", - "sha256:c8b0d834b11be97d5ab2b4dceada20ae8e07bcccbc0f55d71df6729965f406ad", - "sha256:ce88ec79df55430e37178a191ad8df45cae90b0f6972d46d867bf6ebbb58cc4d", - "sha256:d173d24e85e51510e658fb108513d5bc11e3fd2820db6b1bd0522266ddd11f51", - "sha256:d8f55f355be7821dade839df785a49dc9f16d1af363134d07eb11e9207e0b189", - "sha256:da71de5bf552d83dcc21b78cc0020e86f8d0feea43e202110973987ffa781c21", - "sha256:e55698e0ed95a70fe9ff9a23c763acfe0bf335b02df12142f74e4543095e9a9b", - "sha256:f32a748703e7bf6e92dfa3d2936b2fbfe76f8ce5f756e24f49ef72d17d26ad02", - "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.1" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, - "snuggs": { - "hashes": [ - "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b", - "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07" - ], - "version": "==1.4.7" - }, - "tzdata": { - "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" - ], - "markers": "python_version >= '2'", - "version": "==2023.3" - } - }, - "develop": {} -} diff --git a/data/ble/ble_benchmark/README.md b/data/ble/ble_benchmark/README.md index b64d484f4..eb9e7d4fb 100644 --- a/data/ble/ble_benchmark/README.md +++ b/data/ble/ble_benchmark/README.md @@ -11,16 +11,10 @@ been run for the HUCs being processed. ## Installation -1. A Dockerfile is provided in the root of the `/foss_fim/data/ble/ble_benchmark` directory. -The Docker image can be built using the following command from `/foss_fim/data/ble/ble_benchmark`: +1. The Docker image can be run using the following command: ``` -docker build --rm --no-cache --force-rm -t dev:ble_benchmark . -``` - -2. The Docker image can be run using the following command: -``` -docker run --rm -it -v ~/git/inundation-mapping:/foss_fim -v ~/efs/fim_data/fim_4_0_13_1:/data \ --v ~/efs/fim_data/fim_4_0_13_1/outputs:/outputs --name ble_benchmark dev:ble_benchmark +docker run --rm -it -v ~/git/inundation-mapping:/foss_fim -v ~/efs/fim_data/:/data \ +-v ~/efs/fim_data/fim_4_4_x_x/outputs:/outputs --name ble_benchmark dev:ble_benchmark {your docker image name} ``` ## Usage diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 875709249..b56c52809 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,29 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.13.3 - 2024-04-15 - [PR#1114](https://github.com/NOAA-OWP/inundation-mapping/pull/1114) + +Two recent dependabot PR's came in, one for upgrading the `pillow` package and the other for upgrading idna. Both have been adjusted in this PR. +In this PR, we also moved `openpyxl` package, which was part of an independent dockerfile, Pipfile and Pipefile.lock in the "dev" directory. This is now merged into the parent standard docker image. + +Covers [PR 1111](https://github.com/NOAA-OWP/inundation-mapping/pull/1111) and +Covers [PR 1119](https://github.com/NOAA-OWP/inundation-mapping/pull/1119) + +A small update to the README.md was also updated for an unrelated topic (about AWS S3 credentials). + +### Changes +- `Pipfile / Pipefile.lock`: As described above. +- `data/ble/ble_benchmark/README.md`: Updated notes to remove talking the specific ble docker image. + +### Removals +- `data/ble/ble_benchmark` + - `Dockerfile`: removed in favor the parent root Docker files. + - `Pipfile`: removed in favor the parent root Docker files. + - `Pipfile.lock` : removed in favor the parent root Docker files. + +

+ + ## v4.4.13.2 - 2024-04-04 - [PR#1110](https://github.com/NOAA-OWP/inundation-mapping/pull/1110) This PR reflects upgrades for openJDK from 17.0.8 to something higher, minimum of 17.0.9. After some research, we can not upgrade all the way to the latest openJDK but can jump up to 19.0. This limitation is related to version of our base docker image. openJDK was identified as requiring an upgrade by a system wide security scan. From 3ca0cebc84ef5fd6f4af61fca2adfd59084933e0 Mon Sep 17 00:00:00 2001 From: EmilyDeardorff-NOAA <60829052+EmilyDeardorff@users.noreply.github.com> Date: Wed, 17 Apr 2024 10:36:09 -0700 Subject: [PATCH 33/51] v4.4.14.0 Update FIM pipeline to process in Alaska (#1106) --- data/wbd/generate_pre_clip_fim_huc8.py | 2 +- docs/CHANGELOG.md | 18 ++++++++++++++- src/bash_variables.env | 2 +- src/check_huc_inputs.py | 4 +++- src/derive_level_paths.py | 24 ++++++++++++++----- src/run_by_branch.sh | 15 ++++++++---- src/run_unit_wb.sh | 32 ++++++++++++++++++++++---- src/utils/shared_variables.py | 20 ++++++++++++++++ 8 files changed, 98 insertions(+), 19 deletions(-) diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py index ca6ee44d8..d1391aaf7 100755 --- a/data/wbd/generate_pre_clip_fim_huc8.py +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -427,7 +427,7 @@ def huc_level_clip_vectors_to_wbd(args): 'the output directory specified as the argument.', usage=''' ./generate_pre_clip_fim_huc8.py - -n /data/inputs/pre_clip_huc8/2024_3_20 + -n /data/inputs/pre_clip_huc8/24_3_20 -u /data/inputs/huc_lists/included_huc8.lst -j 6 -o diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index b56c52809..44aeb7e05 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,23 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + +## v4.4.14.0 - 2024-04-17 - [PR#1106](https://github.com/NOAA-OWP/inundation-mapping/pull/10106) + +Updates the FIM pipeline so it can process HUCs in southern Alaska. Running FIM in southern Alaska requires that a different CRS and a few different files be used. Additionally, some of the Alaska HUCs displayed an issue where the input stream density was too high, so this update introduces some logic to adjust the threshold of stream orders to exclude based on whether an Alaska HUC is listed as high or medium-high stream density. This update intriduces new Alaska-specific inputs, which are listed in the PR. + +### Changes +- `data/wbd/generate_pre_clip_fim_huc8.py`: Adjusted comment. +- `src/bash_variables.env`: Changed pre-clip HUC 8 directory to be a folder with both Alaska and CONUS HUCs. +- `src/check_huc_inputs.py`: Changed the `included_huc_list` variable to refer to a HUC list that includes Alaska. +- `src/derive_level_paths.py`: Add in logic to exclude different stream orders based on whether the HUC falls into the high or medium-high density HUC lists. +- `src/run_by_branch.sh`: Add in logic to check whether the HUC is in Alaska or not and to use the correct CRS accordingly. +- `src/run_unit_wb.sh`: Add in logic to check whether the HUC is in Alaska or not and to use the correct CRS and DEM domain filename accordingly. +- `src/utils/shared_variables.py`: Add the Alaska CRS, a list of high stream density HUCs, and a list of medium-high stream density HUCs. + +

+ + ## v4.4.13.3 - 2024-04-15 - [PR#1114](https://github.com/NOAA-OWP/inundation-mapping/pull/1114) Two recent dependabot PR's came in, one for upgrading the `pillow` package and the other for upgrading idna. Both have been adjusted in this PR. @@ -40,7 +57,6 @@ The "black" packages is also be upgraded from 23.7.0 to 24.3.

- ## v4.4.13.1 - 2024-03-11 - [PR#1086](https://github.com/NOAA-OWP/inundation-mapping/pull/1086) Fixes bug where levee-protected areas were not being masked from branch 0 DEMs. diff --git a/src/bash_variables.env b/src/bash_variables.env index d8d2237b6..0fc032483 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -25,7 +25,7 @@ export input_nwm_lakes_Alaska=${inputsDir}/nwm_hydrofabric/nwm_ export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg export input_WBD_gdb_Alaska=${inputsDir}/wbd/WBD_National_South_Alaska.gpkg export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ -export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/23_10_17 +export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/24_4_3 # was 23_10_17 export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg # input file location with nwm feature_id and recurrence flow values diff --git a/src/check_huc_inputs.py b/src/check_huc_inputs.py index 6c6c2fad9..34ceb91f8 100755 --- a/src/check_huc_inputs.py +++ b/src/check_huc_inputs.py @@ -14,7 +14,9 @@ def __read_included_files(parent_dir_path): # I have just replaced the pattern, but later we might want to clean this up. # filename_patterns = glob(os.path.join(parent_dir_path, 'included_huc*.lst')) - filename_patterns = glob(os.path.join(parent_dir_path, 'included_huc8.lst')) + + included_huc_list = 'included_huc8_withAlaska.lst' # previous: 'included_huc8.lst' + filename_patterns = glob(os.path.join(parent_dir_path, included_huc_list)) accepted_hucs_set = set() for filename in filename_patterns: diff --git a/src/derive_level_paths.py b/src/derive_level_paths.py index ca25819dc..bb50a4e68 100755 --- a/src/derive_level_paths.py +++ b/src/derive_level_paths.py @@ -8,6 +8,7 @@ from stream_branches import StreamNetwork from utils.fim_enums import FIM_exit_codes +from utils.shared_variables import HIGH_STREAM_DENSITY_HUCS, MEDIUM_HIGH_STREAM_DENSITY_HUCS gpd.options.io_engine = "pyogrio" @@ -19,8 +20,8 @@ def Derive_level_paths( buffer_wbd_streams, out_stream_network, branch_id_attribute, + huc_id, out_stream_network_dissolved=None, - huc_id=None, headwaters_outfile=None, catchments=None, waterbodies=None, @@ -57,11 +58,22 @@ def Derive_level_paths( print("Sorry, no streams exist and processing can not continue. This could be an empty file.") sys.exit(FIM_exit_codes.UNIT_NO_BRANCHES.value) # will send a 60 back - # values_exluded of 1 and 2 mean where are dropping stream orders 1 and 2. We are leaving those - # for branch zero. - stream_network = stream_network.exclude_attribute_values( - branch_id_attribute="order_", values_excluded=[1, 2] - ) + if huc_id in HIGH_STREAM_DENSITY_HUCS: + print('HUC is in high density HUC list... removing additional stream segments.') + stream_network = stream_network.exclude_attribute_values( + branch_id_attribute="order_", values_excluded=[1, 2, 3, 4] + ) + elif huc_id in MEDIUM_HIGH_STREAM_DENSITY_HUCS: + print('HUC is in medium-high density HUC list... removing additional stream segments.') + stream_network = stream_network.exclude_attribute_values( + branch_id_attribute="order_", values_excluded=[1, 2, 3] + ) + else: + # values_exluded of 1 and 2 mean that we are dropping stream orders 1 and 2. We are leaving those + # for branch zero. + stream_network = stream_network.exclude_attribute_values( + branch_id_attribute="order_", values_excluded=[1, 2] + ) # if there are no reaches at this point (due to filtering) if len(stream_network) == 0: diff --git a/src/run_by_branch.sh b/src/run_by_branch.sh index 53db98bee..f052571b3 100755 --- a/src/run_by_branch.sh +++ b/src/run_by_branch.sh @@ -13,6 +13,13 @@ hucUnitLength=${#hucNumber} huc4Identifier=${hucNumber:0:4} huc2Identifier=${hucNumber:0:2} +## SET CRS +if [ $huc2Identifier -eq 19 ]; then + huc_CRS=$ALASKA_CRS +else + huc_CRS=$DEFAULT_FIM_PROJECTION_CRS +fi + # Skip branch zero if [ $current_branch_id = $branch_zero_id ]; then exit 0 @@ -39,19 +46,19 @@ date -u ## SUBSET VECTORS echo -e $startDiv"Subsetting vectors to branches $hucNumber $current_branch_id" echo -e "Querying NWM streams ..." -ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ +ogr2ogr -f GPKG -t_srs $huc_CRS -where $branch_id_attribute="$current_branch_id" \ $tempCurrentBranchDataDir/nwm_subset_streams_levelPaths_$current_branch_id.gpkg \ $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg echo -e "Querying NWM catchments ..." -ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ +ogr2ogr -f GPKG -t_srs $huc_CRS -where $branch_id_attribute="$current_branch_id" \ $tempCurrentBranchDataDir/nwm_catchments_proj_subset_levelPaths_$current_branch_id.gpkg \ $tempHucDataDir/nwm_catchments_proj_subset_levelPaths.gpkg echo -e "Querying NWM Dissolved Levelpaths headwaters ..." -ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ +ogr2ogr -f GPKG -t_srs $huc_CRS -where $branch_id_attribute="$current_branch_id" \ $tempCurrentBranchDataDir/nwm_subset_streams_levelPaths_dissolved_headwaters_$current_branch_id.gpkg \ $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved_headwaters.gpkg #echo -e "Querying NWM headwaters ..." -# ogr2ogr -f GPKG -t_srs $DEFAULT_FIM_PROJECTION_CRS -where $branch_id_attribute="$current_branch_id" \ +# ogr2ogr -f GPKG -t_srs $huc_CRS -where $branch_id_attribute="$current_branch_id" \ # $tempCurrentBranchDataDir/nwm_headwaters_$current_branch_id.gpkg \ # $tempHucDataDir/nwm_headwaters.gpkg diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index ca6c9979a..03129bfa3 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -17,7 +17,25 @@ branch_list_lst_file=$tempHucDataDir/branch_ids.lst branchSummaryLogFile=$outputDestDir/logs/branch/"$hucNumber"_summary_branch.log -## INITIALIZE TOTAL UNIT AND IT'S BRANCHES TIMER ## +huc2Identifier=${hucNumber:0:2} + + +## SET CRS and input DEM domain +if [ $huc2Identifier -eq 19 ]; then + huc_CRS=$ALASKA_CRS + huc_input_DEM_domain=$input_DEM_domain_Alaska + dem_domain_filename=DEM_Domain.gpkg + +else + huc_CRS=$DEFAULT_FIM_PROJECTION_CRS + huc_input_DEM_domain=$input_DEM_domain + dem_domain_filename=HUC6_dem_domain.gpkg + +fi + +echo -e $startDiv"Using CRS: $huc_CRS" ## debug + +## INITIALIZE TOTAL TIME TIMER ## T_total_start huc_start_time=`date +%s` date -u @@ -28,7 +46,7 @@ cp -a $pre_clip_huc_dir/$hucNumber/. $tempHucDataDir # Copy necessary files from $inputsDir into $tempHucDataDir to avoid File System Collisions # For buffer_stream_branches.py -cp $input_DEM_domain $tempHucDataDir +cp $huc_input_DEM_domain $tempHucDataDir # For usgs_gage_unit_setup.py cp $inputsDir/usgs_gages/usgs_gages.gpkg $tempHucDataDir cp $ras_rating_curve_points_gpkg $tempHucDataDir @@ -47,7 +65,9 @@ $srcDir/derive_level_paths.py -i $tempHucDataDir/nwm_subset_streams.gpkg \ -t $tempHucDataDir/nwm_catchments_proj_subset_levelPaths.gpkg \ -n $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved_headwaters.gpkg \ -w $tempHucDataDir/nwm_lakes_proj_subset.gpkg \ - -wbd $tempHucDataDir/wbd.gpkg + -wbd $tempHucDataDir/wbd.gpkg \ + -u $hucNumber + # test if we received a non-zero code back from derive_level_paths.py #subscript_exit_code=$? @@ -74,7 +94,7 @@ python3 $srcDir/associate_levelpaths_with_levees.py -nld $tempHucDataDir/nld_sub ## STREAM BRANCH POLYGONS echo -e $startDiv"Generating Stream Branch Polygons for $hucNumber" -$srcDir/buffer_stream_branches.py -a $tempHucDataDir/HUC6_dem_domain.gpkg \ +$srcDir/buffer_stream_branches.py -a $tempHucDataDir/$dem_domain_filename \ -s $tempHucDataDir/nwm_subset_streams_levelPaths_dissolved.gpkg \ -i $branch_id_attribute \ -d $branch_buffer_distance_meters \ @@ -99,7 +119,9 @@ echo -e $startDiv"Clipping rasters to branches $hucNumber $branch_zero_id" [ ! -f $tempCurrentBranchDataDir/dem_meters.tif ] && \ gdalwarp -cutline $tempHucDataDir/wbd_buffered.gpkg -crop_to_cutline -ot Float32 -r bilinear -of "GTiff" \ -overwrite -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "TILED=YES" -co "COMPRESS=LZW" \ - -co "BIGTIFF=YES" -t_srs $DEFAULT_FIM_PROJECTION_CRS $input_DEM $tempHucDataDir/dem_meters.tif -q + -co "BIGTIFF=YES" -t_srs $huc_CRS $input_DEM $tempHucDataDir/dem_meters.tif + +Tcount ## GET RASTER METADATA echo -e $startDiv"Get DEM Metadata $hucNumber $branch_zero_id" diff --git a/src/utils/shared_variables.py b/src/utils/shared_variables.py index c9e364730..c47cea1f5 100644 --- a/src/utils/shared_variables.py +++ b/src/utils/shared_variables.py @@ -30,6 +30,7 @@ 'Wyoming."],BBOX[24.41,-124.79,49.38,-66.91]],ID["EPSG",5070]]' ) DEFAULT_FIM_PROJECTION_CRS = os.getenv('DEFAULT_FIM_PROJECTION_CRS') +ALASKA_CRS = os.getenv('ALASKA_CRS') PREP_CRS = CRS(PREP_PROJECTION) VIZ_PROJECTION = ( 'PROJCS["WGS_1984_Web_Mercator_Auxiliary_Sphere",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",' @@ -79,6 +80,25 @@ # -- Field Names -- # FIM_ID = 'fimid' +# -- High stream density HUCs that require mitigation (currently just in Alaska) -- # +HIGH_STREAM_DENSITY_HUCS = {'19020602', '19020503', '19020402', '19020104'} # stream density 1.5+ + +MEDIUM_HIGH_STREAM_DENSITY_HUCS = { # stream density between 0.5 and 1.5 + '19020504', + '19020502', + '19020601', + '19020505', + '19020101', # 1.0-1.5 + '19020102', + '19020501', + '19020301', + '19020401', + '19020302', + '19020103', + '19020202', # 0.5-1.0 +} + + # -- Other -- # CONUS_STATE_LIST = { "AL", From 729cc0198819927d0aad3fa0c23e32b5d191ca46 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Wed, 17 Apr 2024 11:43:33 -0600 Subject: [PATCH 34/51] v4.4.14.1 Add checks for intermediate files in AGREE (#1103) --- docs/CHANGELOG.md | 11 +++++++++++ src/agreedem.py | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 44aeb7e05..c7f84703f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.14.1 - 2024-04-17 - [PR#1103](https://github.com/NOAA-OWP/inundation-mapping/pull/1103) + +Adds checks for intermediate files produced by Whitebox in the AGREE process (`src/agreedem.py`). Without these checks, if Whitebox fails to produce an output, no error is generated until much later in the `src/delineate_hydros_and_produce_HAND.sh` processing chain which makes troubleshooting difficult. + +### Changes + +- `src/agreedem.py`: Added checks to verify existence of intermediate files before continuing + +

+ + ## v4.4.14.0 - 2024-04-17 - [PR#1106](https://github.com/NOAA-OWP/inundation-mapping/pull/10106) Updates the FIM pipeline so it can process HUCs in southern Alaska. Running FIM in southern Alaska requires that a different CRS and a few different files be used. Additionally, some of the Alaska HUCs displayed an issue where the input stream density was too high, so this update introduces some logic to adjust the threshold of stream orders to exclude based on whether an Alaska HUC is listed as high or medium-high stream density. This update intriduces new Alaska-specific inputs, which are listed in the PR. diff --git a/src/agreedem.py b/src/agreedem.py index 437d129ac..b38c7f359 100755 --- a/src/agreedem.py +++ b/src/agreedem.py @@ -105,9 +105,17 @@ def agreedem( # Compute allocation and proximity grid using WhiteboxTools smo_output_zerod = os.path.join(workspace, 'agree_smogrid_zerod.tif') wbt.euclidean_distance(rivers_raster, vectdist_grid) + + assert os.path.exists(vectdist_grid), f'Vector distance grid not created: {vectdist_grid}' + wbt.convert_nodata_to_zero(smo_output, smo_output_zerod) + + assert os.path.exists(smo_output_zerod), f'Vector allocation grid not created: {smo_output_zerod}' + wbt.euclidean_allocation(smo_output_zerod, vectallo_grid) + assert os.path.exists(vectallo_grid), f'Vector allocation grid not created: {vectallo_grid}' + # ------------------------------------------------------------------ # 4. From Hellweger documentation: Compute the buffer grid # (bufgrid2). The cells in the buffer grid outside the buffer @@ -177,9 +185,17 @@ def agreedem( # Compute allocation and proximity grid using WhiteboxTools buf_output_zerod = os.path.join(workspace, 'agree_bufgrid_zerod.tif') wbt.euclidean_distance(bin_buf_output, bufdist_grid) + + assert os.path.exists(bufdist_grid), f'Buffer allocation grid not created: {bufdist_grid}' + wbt.convert_nodata_to_zero(buf_output, buf_output_zerod) + + assert os.path.exists(buf_output_zerod), f'Buffer allocation grid not created: {buf_output_zerod}' + wbt.euclidean_allocation(buf_output_zerod, bufallo_grid) + assert os.path.exists(bufallo_grid), f'Buffer allocation grid not created: {bufallo_grid}' + # Open distance, allocation, elevation grids. with rasterio.open(bufdist_grid) as bufdist, rasterio.open( bufallo_grid From f30a48627e81c4169a1ed53e46811ba42dbabf2b Mon Sep 17 00:00:00 2001 From: RyanSpies-NOAA Date: Wed, 17 Apr 2024 12:48:28 -0500 Subject: [PATCH 35/51] v4.4.15.0 synthetic rating curve calibration with USGS rating and up/down tracing (#1081) --- docs/CHANGELOG.md | 19 +- fim_post_processing.sh | 2 +- ...ing.py => src_adjust_usgs_rating_trace.py} | 171 ++++++++++++++++-- src/src_roughness_optimization.py | 2 + src/utils/shared_variables.py | 3 +- 5 files changed, 176 insertions(+), 21 deletions(-) rename src/{src_adjust_usgs_rating.py => src_adjust_usgs_rating_trace.py} (74%) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c7f84703f..d658d1c64 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,24 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.15.0 - 2024-04-17 - [PR#1081](https://github.com/NOAA-OWP/inundation-mapping/pull/1081) + +This enhancement includes changes to the SRC calibration routine that uses the USGS published rating curve database. The modifications attempt to mimic the technique used in the stage-based CatFIM where the USGS WSE/flow is propagated upstream and downstream of the gauge location. This closes #892 + +### Additions +`src/src_adjust_usgs_rating_trace.py`: updated SRC calibration routine to include the a new upstream/downstream tracing routine. The WSE(HAND stage) and flow targets obtained from the USGS rating curve are now applied to all hydroids within 8km (~5 miles) of the gauge location. + +### Changes +`fim_post_processing.sh`: using the new `src_adjust_usgs_rating_trace.py` in place of the `src_adjust_usgs_rating.py` +`src/src_roughness_optimization.py`: minor changes to facilitate new calibration input (reset index) +`src/utils/shared_variables.py`: added `USGS_CALB_TRACE_DIST` as the trace distance variable + +### Removals +`src/src_adjust_usgs_rating.py`: deprecated (replaced with the new `src_adjust_usgs_rating_trace.py`) + +

+ + ## v4.4.14.1 - 2024-04-17 - [PR#1103](https://github.com/NOAA-OWP/inundation-mapping/pull/1103) Adds checks for intermediate files produced by Whitebox in the AGREE process (`src/agreedem.py`). Without these checks, if Whitebox fails to produce an output, no error is generated until much later in the `src/delineate_hydros_and_produce_HAND.sh` processing chain which makes troubleshooting difficult. @@ -130,7 +148,6 @@ Fixes bug in bathymetric adjustment where `mask` is used with `geopandas.read_fi

- ## v4.4.11.0 - 2024-02-16 - [PR#1077](https://github.com/NOAA-OWP/inundation-mapping/pull/1077) Replace `fiona` with `pyogrio` to improve I/O speed. `geopandas` will use `pyogrio` by default starting with version 1.0. `pyarrow` was also added as an environment variable to further speedup I/O. As a result of the changes in this PR, `fim_pipeline.sh` runs approximately 10% faster. diff --git a/fim_post_processing.sh b/fim_post_processing.sh index 9a176e695..49ac3c29f 100755 --- a/fim_post_processing.sh +++ b/fim_post_processing.sh @@ -149,7 +149,7 @@ if [ "$src_adjust_usgs" = "True" ] && [ "$src_subdiv_toggle" = "True" ] && [ "$s echo echo -e $startDiv"Performing SRC adjustments using USGS rating curve database" # Run SRC Optimization routine using USGS rating curve data (WSE and flow @ NWM recur flow values) - python3 $srcDir/src_adjust_usgs_rating.py \ + python3 $srcDir/src_adjust_usgs_rating_trace.py \ -run_dir $outputDestDir \ -usgs_rc $usgs_rating_curve_csv \ -nwm_recur $nwm_recur_file \ diff --git a/src/src_adjust_usgs_rating.py b/src/src_adjust_usgs_rating_trace.py similarity index 74% rename from src/src_adjust_usgs_rating.py rename to src/src_adjust_usgs_rating_trace.py index d93c6848f..739a10af9 100644 --- a/src/src_adjust_usgs_rating.py +++ b/src/src_adjust_usgs_rating_trace.py @@ -5,10 +5,12 @@ import sys from multiprocessing import Pool +import geopandas as gpd import pandas as pd from src_roughness_optimization import update_rating_curve from utils.shared_functions import check_file_age, concat_huc_csv +from utils.shared_variables import USGS_CALB_TRACE_DIST ''' @@ -111,10 +113,10 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep for interval in recurr_intervals: log_text += '\n\nProcessing: ' + str(interval) + '-year NWM recurr intervals\n' print('Processing: ' + str(interval) + '-year NWM recurr intervals') - ## Calculate the closest SRC discharge value to the NWM flow value + # Calculate the closest SRC discharge value to the NWM flow value merge_df['Q_find'] = (merge_df['discharge_cms'] - merge_df[interval + "_0_year"]).abs() - ## Check for any missing/null entries in the input SRC + # Check for any missing/null entries in the input SRC # There may be null values for lake or coastal flow lines # (need to set a value to do groupby idxmin below) if merge_df['Q_find'].isnull().values.any(): @@ -125,15 +127,16 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep + str(merge_df['feature_id']) + ' --> Null values found in "Q_find" calc. These will be filled with 999999 () \n' ) - ## Fill missing/nan nwm 'Discharge (m3s-1)' values with 999999 to handle later + # Fill missing/nan nwm 'Discharge (m3s-1)' values with 999999 to handle later merge_df['Q_find'] = merge_df['Q_find'].fillna(999999) if merge_df['hydroid'].isnull().values.any(): log_text += 'HUC: ' + str(merge_df['huc']) + ' --> Null values found in "hydroid"... \n' - # Create dataframe with crosswalked USGS flow and NWM recurr flow + # Create dataframe with crosswalked USGS flow and NWM recurr flow & + # find the index of the closest matching flow btw USGS rating and NWM recur calc_df = merge_df.loc[merge_df.groupby(['location_id', 'levpa_id'])['Q_find'].idxmin()].reset_index( drop=True - ) # find the index of the Q_1_5_find (closest matching flow) + ) # Calculate flow difference (variance) to check for large discrepancies between # NWM flow and USGS closest flow calc_df['check_variance'] = ( @@ -191,6 +194,77 @@ def create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filep return final_df +def trace_network(df, start_id): + # This function creates a list of all upstream & downstream hydroids + # Input: df --> dataframe of demDerived_reaches with network attribs + # Input: start_id --> hydroid value where the trace routine will start + current_id = start_id + trace_up = [] + trace_down = [] + start_order = None # Variable to store the start_order + accumulated_length = 0 + + while True: + current_row = df[df['HydroID'] == current_id] + + if current_row.empty: + break + + next_id = current_row['NextDownID'].values[0] + order = current_row['order_'].values[0] + length = current_row['LengthKm'].values[0] + lake = current_row['LakeID'].values[0] + + # Assign start_order when first encountered + if start_order is None: + start_order = order + + if order != start_order: + break + + accumulated_length += length + if accumulated_length >= float(USGS_CALB_TRACE_DIST): + break + + if lake > 0: + break + + # not dropping the HydroID that has the gauge location (need later) + trace_down.append(int(current_id)) + + current_id = next_id + + current_id = start_id # Reset current_id for tracing down + accumulated_length = 0 + + while True: + current_row = df[(df['NextDownID'] == current_id) & (df['order_'] == start_order)] + if current_row.empty: + break + + next_id = current_row['HydroID'].values[0] + order = current_row['order_'].values[0] + length = current_row['LengthKm'].values[0] + lake = current_row['LakeID'].values[0] + + if order != start_order: + break + + accumulated_length += length + if accumulated_length >= float(USGS_CALB_TRACE_DIST): + break + + if lake > 0: + break + + if current_id != start_id: + trace_up.append(current_id) + + current_id = next_id + + return trace_up, trace_down + + def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): procs_list = [] # Initialize list for mulitprocessing. @@ -217,7 +291,67 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): 'gw_catchments_reaches_filtered_addedAttributes_crosswalked_' + branch_id + '.gpkg', ) htable_path = os.path.join(branch_dir, 'hydroTable_' + branch_id + '.csv') - water_edge_median_ds = usgs_df[(usgs_df['huc'] == huc) & (usgs_df['levpa_id'] == branch_id)] + dem_reaches_path = os.path.join( + branch_dir, + 'demDerived_reaches_split_filtered_addedAttributes_crosswalked_' + branch_id + '.gpkg', + ) + df = gpd.read_file(dem_reaches_path) + usgs_elev = usgs_df[(usgs_df['huc'] == huc) & (usgs_df['levpa_id'] == branch_id)] + + # Calculate updstream/downstream trace () + df = df[['HydroID', 'order_', 'LengthKm', 'NextDownID', 'LakeID']] + + # Change the data type of 'HydroID' and 'NextDownID' to int + df['HydroID'] = df['HydroID'].astype(int) + df['NextDownID'] = df['NextDownID'].astype(int) + + # Loop through every row in the "usgs_elev" dataframe + for index, row in usgs_elev.iterrows(): + start_id = row['hydroid'] + + # Trace the network for each row + up, down = trace_network(df, start_id) + + # Append the results to the "usgs_elev" dataframe + usgs_elev = usgs_elev.copy() + usgs_elev.loc[index, 'up'] = ','.join(map(str, up)) + usgs_elev.loc[index, 'down'] = ','.join(map(str, down)) + + # Handle NaN values and ignore rows where up/down trace list is empty + usgs_elev['up'] = ( + usgs_elev['up'] + .astype(str) + .apply(lambda x: [num.strip() for num in x.split(',')] if pd.notna(x) else []) + ) + usgs_elev['down'] = ( + usgs_elev['down'] + .astype(str) + .apply(lambda x: [num.strip() for num in x.split(',')] if pd.notna(x) else []) + ) + + # Combine the up & down hydroid lists into a new column + usgs_elev['trace_hydroid'] = [ + lst1 + lst2 for lst1, lst2 in zip(usgs_elev['up'], usgs_elev['down']) + ] + + # Drop up & down columns + columns_to_drop = ['up', 'down'] + usgs_elev.drop(columns=columns_to_drop, inplace=True) + + # Explode the trace column + usgs_elev_trace = usgs_elev.explode('trace_hydroid') + + # Check for empty or nan trace lists and convert the column to integers + usgs_elev_trace['trace_hydroid'] = usgs_elev_trace['trace_hydroid'].replace('nan', 0) + usgs_elev_trace['trace_hydroid'] = usgs_elev_trace['trace_hydroid'].replace('', 0) + usgs_elev_trace['trace_hydroid'] = usgs_elev_trace['trace_hydroid'].astype(int) + + # Rename columns + usgs_elev_trace.rename(columns={'hydroid': 'hydroid_gauge'}, inplace=True) + usgs_elev_trace.rename(columns={'trace_hydroid': 'hydroid'}, inplace=True) + + if debug_outputs_option: + usgs_elev_trace.to_csv(os.path.join(branch_dir, 'water_edge_trace.csv'), index=False) # Check to make sure the fim output files exist. Continue to next iteration if not and warn user. if not os.path.exists(hand_path): @@ -263,7 +397,7 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): + '\n' ) else: - ## Additional arguments for src_roughness_optimization + # Additional arguments for src_roughness_optimization source_tag = 'usgs_rating' # tag to use in source attribute field merge_prev_adj = False # merge in previous SRC adjustment calculations @@ -271,7 +405,7 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): procs_list.append( [ branch_dir, - water_edge_median_ds, + usgs_elev_trace, htable_path, huc, branch_id, @@ -287,6 +421,7 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): with Pool(processes=job_number) as pool: log_output = pool.starmap(update_rating_curve, procs_list) log_file.writelines(["%s\n" % item for item in log_output]) + # TO-DO update the error handling to properly capture issues in the multiprocessing # try statement for debugging # try: # with Pool(processes=job_number) as pool: @@ -300,10 +435,10 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_option, job_number): - ## Check input args are valid + # Check input args are valid assert os.path.isdir(run_dir), 'ERROR: could not find the input fim_dir location: ' + str(run_dir) - ## Create an aggregate dataframe with all usgs_elev_table.csv entries for hucs in fim_dir + # Create an aggregate dataframe with all usgs_elev_table.csv entries for hucs in fim_dir print('Reading USGS gage HAND elevation from usgs_elev_table.csv files...') # usgs_elev_file = os.path.join(branch_dir,'usgs_elev_table.csv') # usgs_elev_df = pd.read_csv( @@ -320,13 +455,13 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio + " max jobs will be used instead." ) - ## Create output dir for log and usgs rc database + # Create output dir for log and usgs rc database log_dir = os.path.join(run_dir, "logs", "src_optimization") print("Log file output here: " + str(log_dir)) if not os.path.isdir(log_dir): os.makedirs(log_dir) - ## Create a time var to log run time + # Create a time var to log run time begin_time = dt.datetime.now() # Create log file for processing records log_file = open(os.path.join(log_dir, 'log_usgs_rc_src_adjust.log'), "w") @@ -352,11 +487,11 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio log_file.write("starting create usgs rating db") usgs_df = create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filepath, log_dir) - ## Create huc proc_list for multiprocessing and execute the update_rating_curve function + # Create huc proc_list for multiprocessing and execute the update_rating_curve function branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file) - ## Record run time and close log file - log_file.write('#########################################################\n\n') + # Record run time and close log file + log_file.write('########################################################\n\n') end_time = dt.datetime.now() log_file.write('END TIME: ' + str(end_time) + '\n') tot_run_time = end_time - begin_time @@ -366,7 +501,7 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio if __name__ == '__main__': - ## Parse arguments. + # Parse arguments. parser = argparse.ArgumentParser( description='Adjusts rating curve with database of USGS rating curve (calculated WSE/flow).' ) @@ -390,7 +525,7 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio ) parser.add_argument('-j', '--job-number', help='Number of jobs to use', required=False, default=1) - ## Assign variables from arguments. + # Assign variables from arguments. args = vars(parser.parse_args()) run_dir = args['run_dir'] usgs_rc_filepath = args['usgs_ratings'] @@ -398,5 +533,5 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio debug_outputs_option = args['extra_outputs'] job_number = int(args['job_number']) - ## Prepare/check inputs, create log file, and spin up the proc list + # Prepare/check inputs, create log file, and spin up the proc list run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_option, job_number) diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index 4c0913573..8eac9ce64 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -115,6 +115,7 @@ def update_rating_curve( log_text += "DOWNSTREAM_THRESHOLD: " + str(down_dist_thresh) + 'km\n' log_text += "Merge Previous Adj Values: " + str(merge_prev_adj) + '\n' df_nvalues = water_edge_median_df.copy() + df_nvalues.reset_index(inplace=True) df_nvalues = df_nvalues[ (df_nvalues.hydroid.notnull()) & (df_nvalues.hydroid > 0) ] # remove null entries that do not have a valid hydroid @@ -243,6 +244,7 @@ def update_rating_curve( find_src_stage = df_htable_hydroid.loc[ df_htable_hydroid['stage'].sub(row.hand).abs().idxmin() ] # find closest matching stage to the user provided HAND value + ## copy the corresponding htable values for the matching stage->HAND lookup df_nvalues.loc[index, 'feature_id'] = find_src_stage.feature_id df_nvalues.loc[index, 'LakeID'] = find_src_stage.LakeID diff --git a/src/utils/shared_variables.py b/src/utils/shared_variables.py index c47cea1f5..99951e1d7 100644 --- a/src/utils/shared_variables.py +++ b/src/utils/shared_variables.py @@ -159,6 +159,7 @@ OVERWRITE_ALL = 'OVERWRITE_ALL' # Rating Curve Adjustment (local calibration) variables -DOWNSTREAM_THRESHOLD = 10 # distance in km to propogate new roughness values downstream +USGS_CALB_TRACE_DIST = 8.0 # distance in km to walk the network and perform USGS rating calibation for SRCs +DOWNSTREAM_THRESHOLD = 8.0 # distance in km to propogate new roughness values downstream (group mean) ROUGHNESS_MAX_THRESH = 0.8 # max allowable adjusted roughness value (void values larger than this) ROUGHNESS_MIN_THRESH = 0.001 # min allowable adjusted roughness value (void values smaller than this) From 013353eed85f435eb9aba5c5715ad1b4f31a4597 Mon Sep 17 00:00:00 2001 From: RyanSpies-NOAA Date: Mon, 6 May 2024 15:11:12 -0500 Subject: [PATCH 36/51] v4.4.15.1 Hotfix post-processing src adjust errors (#1138) --- docs/CHANGELOG.md | 11 ++++ src/src_adjust_usgs_rating_trace.py | 30 +++++++++- src/src_roughness_optimization.py | 89 ++++++++++++++++++++++------- 3 files changed, 107 insertions(+), 23 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d658d1c64..39dbad90c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.15.1 - 2024-05-06 - [PR#1081](https://github.com/NOAA-OWP/inundation-mapping/pull/1038) + +This hotfix address a bug within the SRC adjustment routine to filter out USGS gauge locations that were conflated to lakeid reaches. These fatal errors were preventing `fim_post_processing.sh` from completing. There are also new try except blocks to handle potential errors when opening/writing SRC adjustment attributes to the catchment gpkg (unknown issues with collisions or corrupt gpkg files). Closes #1137 + +### Changes + +- `src/src_adjust_usgs_rating_trace.py`: Added filter for processing valid hydroids that meet criteria (i.e non-lakes) and more robust logging. +- `src/src_roughness_optimization.py`: Added data checks and logging to ensure input calibration data files contains necessary attributes. Also included a new try/except block to trap and log issues with file collisions or corrupt catchment gpkg read/write. + +

+ ## v4.4.15.0 - 2024-04-17 - [PR#1081](https://github.com/NOAA-OWP/inundation-mapping/pull/1081) This enhancement includes changes to the SRC calibration routine that uses the USGS published rating curve database. The modifications attempt to mimic the technique used in the stage-based CatFIM where the USGS WSE/flow is propagated upstream and downstream of the gauge location. This closes #892 diff --git a/src/src_adjust_usgs_rating_trace.py b/src/src_adjust_usgs_rating_trace.py index 739a10af9..ac923a5be 100644 --- a/src/src_adjust_usgs_rating_trace.py +++ b/src/src_adjust_usgs_rating_trace.py @@ -296,7 +296,7 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): 'demDerived_reaches_split_filtered_addedAttributes_crosswalked_' + branch_id + '.gpkg', ) df = gpd.read_file(dem_reaches_path) - usgs_elev = usgs_df[(usgs_df['huc'] == huc) & (usgs_df['levpa_id'] == branch_id)] + usgs_elev = usgs_df[(usgs_df['huc'] == huc) & (usgs_df['levpa_id'].astype(int) == int(branch_id))] # Calculate updstream/downstream trace () df = df[['HydroID', 'order_', 'LengthKm', 'NextDownID', 'LakeID']] @@ -346,12 +346,36 @@ def branch_proc_list(usgs_df, run_dir, debug_outputs_option, log_file): usgs_elev_trace['trace_hydroid'] = usgs_elev_trace['trace_hydroid'].replace('', 0) usgs_elev_trace['trace_hydroid'] = usgs_elev_trace['trace_hydroid'].astype(int) + # Drop rows where 'trace_hydroid' column is empty + # Addresses backpool removals and lake gauges + usgs_elev_trace = usgs_elev_trace[usgs_elev_trace['trace_hydroid'].astype(int) != 0] + + # Check that there are still valid entries in the usgs_elev + # May have filtered out all if all locs were lakes + if usgs_elev_trace.empty: + print( + "ALERT: did not find any valid hydroids to process: " + + str(huc) + + ' - branch-id: ' + + str(branch_id) + ) + log_file.write( + "ALERT: did not find any valid hydroids to process: " + + str(huc) + + ' - branch-id: ' + + str(branch_id) + + '\n' + ) + continue + # Rename columns usgs_elev_trace.rename(columns={'hydroid': 'hydroid_gauge'}, inplace=True) usgs_elev_trace.rename(columns={'trace_hydroid': 'hydroid'}, inplace=True) if debug_outputs_option: - usgs_elev_trace.to_csv(os.path.join(branch_dir, 'water_edge_trace.csv'), index=False) + usgs_elev_trace.to_csv( + os.path.join(branch_dir, 'water_edge_trace_' + str(branch_id) + '.csv'), index=False + ) # Check to make sure the fim output files exist. Continue to next iteration if not and warn user. if not os.path.exists(hand_path): @@ -484,7 +508,7 @@ def run_prep(run_dir, usgs_rc_filepath, nwm_recurr_filepath, debug_outputs_optio else: print('This may take a few minutes...') - log_file.write("starting create usgs rating db") + log_file.write("starting create usgs rating db\n") usgs_df = create_usgs_rating_database(usgs_rc_filepath, usgs_elev_df, nwm_recurr_filepath, log_dir) # Create huc proc_list for multiprocessing and execute the update_rating_curve function diff --git a/src/src_roughness_optimization.py b/src/src_roughness_optimization.py index 8eac9ce64..7f3864875 100644 --- a/src/src_roughness_optimization.py +++ b/src/src_roughness_optimization.py @@ -255,6 +255,22 @@ def update_rating_curve( df_nvalues.loc[index, 'overbank_n'] = find_src_stage.overbank_n df_nvalues.loc[index, 'discharge_cms'] = find_src_stage.discharge_cms + if 'discharge_cms' not in df_nvalues: + print( + 'ERROR: "discharge_cms" column does not exist in df_nvalues df: ' + + str(huc) + + ' branch id: ' + + str(branch_id) + ) + log_text += ( + 'ERROR: "discharge_cms" column does not exist in df_nvalues df: ' + + str(huc) + + ' branch id: ' + + str(branch_id) + + '\n' + ) + return log_text + ## Calculate calibration coefficient df_nvalues = df_nvalues.rename(columns={'hydroid': 'HydroID'}) # rename the previous ManningN column df_nvalues['hydroid_calb_coef'] = df_nvalues['discharge_cms'] / df_nvalues['flow'] # Qobs / Qsrc @@ -430,27 +446,59 @@ def update_rating_curve( ## Update the catchments polygon .gpkg with joined attribute - "src_calibrated" if os.path.isfile(catchments_poly_path): - input_catchments = gpd.read_file(catchments_poly_path) - ## Create new "src_calibrated" column for viz query - if ( - 'src_calibrated' in input_catchments.columns - ): # check if this attribute already exists and drop if needed - input_catchments = input_catchments.drop( - ['src_calibrated', 'obs_source', 'calb_coef_final'], axis=1, errors='ignore' + try: + input_catchments = gpd.read_file(catchments_poly_path) + ## Create new "src_calibrated" column for viz query + if 'src_calibrated' in input_catchments.columns: + input_catchments = input_catchments.drop( + ['src_calibrated', 'obs_source', 'calb_coef_final'], axis=1, errors='ignore' + ) + df_nmerge['src_calibrated'] = np.where( + df_nmerge['calb_coef_final'].notnull(), 'True', 'False' ) - df_nmerge['src_calibrated'] = np.where( - df_nmerge['calb_coef_final'].notnull(), 'True', 'False' - ) - output_catchments = input_catchments.merge( - df_nmerge[['HydroID', 'src_calibrated', 'obs_source', 'calb_coef_final']], - how='left', - on='HydroID', - ) - output_catchments['src_calibrated'].fillna('False', inplace=True) - output_catchments.to_file( - catchments_poly_path, driver="GPKG", index=False - ) # overwrite the previous layer - df_nmerge = df_nmerge.drop(['src_calibrated'], axis=1, errors='ignore') + output_catchments = input_catchments.merge( + df_nmerge[['HydroID', 'src_calibrated', 'obs_source', 'calb_coef_final']], + how='left', + on='HydroID', + ) + output_catchments['src_calibrated'].fillna('False', inplace=True) + + try: + output_catchments.to_file( + catchments_poly_path, driver="GPKG", index=False, overwrite=True + ) # overwrite the previous layer + + except Exception as e: + error_message = ( + "ERROR occurred while writing to catchments gpkg " + f"for huc: {huc} & branch id: {branch_id}" + ) + print(error_message) + log_text += f"{error_message}\n" + log_text += f"Error details: {e}\n" + + # Delete the original GeoPackage file + if os.path.exists(catchments_poly_path): + os.remove(catchments_poly_path) + try: + # Attempt to write to the file again + output_catchments.to_file( + catchments_poly_path, driver="GPKG", index=False, overwrite=True + ) + log_text += 'Successful second attempt to write output_catchments gpkg' + '\n' + except Exception as e: + second_attempt_error_message = "ERROR: Failed to write to catchments gpkg file even after deleting the original" + print(second_attempt_error_message) + log_text += f"{second_attempt_error_message}\n" + log_text += f"Second attempt error details: {e}\n" + + except Exception as e: + print(f"Error reading GeoPackage file: {e}") + log_text += f"Error reading GeoPackage file: {e}\n" + output_catchments = None + + df_nmerge = df_nmerge.drop(['src_calibrated'], axis=1, errors='ignore') + ## Optional ouputs: # 1) merge_n_csv csv with all of the calculated n values # 2) a catchments .gpkg with new joined attributes @@ -468,6 +516,7 @@ def update_rating_curve( ) output_catchments = input_catchments.merge(df_nmerge, how='left', on='HydroID') output_catchments.to_file(output_catchments_fileName, driver="GPKG", index=False) + output_catchments = None ## Merge the final ManningN dataframe to the original hydroTable df_nmerge = df_nmerge.drop( From 58b3e36a4badd04e06229a79f3440ecc76fc6f80 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Mon, 6 May 2024 14:17:53 -0600 Subject: [PATCH 37/51] v4.4.15.2 Bug fix to prevent `listdir()` from returning filenames (#1133) --- docs/CHANGELOG.md | 15 +++++++++++++++ src/bathy_src_adjust_topwidth.py | 3 ++- src/identify_src_bankfull.py | 2 +- src/subdiv_chan_obank_src.py | 2 +- src/utils/shared_functions.py | 3 ++- tools/vary_mannings_n_composite.py | 2 +- 6 files changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 39dbad90c..0203f29f8 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.15.2 - 2024-05-06 - [PR#1133](https://github.com/NOAA-OWP/inundation-mapping/pull/1133) + +Bug fix for error when reading the subfolders of a directory using `listdir()` where files exist that start with an 8-digit number that are later interpreted as directories. + +### Changes + +The following files were modified to use `listdir()` to read only directories instead of both directories and files: +- `src/` + - `bathy_src_adjust_topwidth.py`, `identify_src_bankfull.py`, `subdiv_chan_obank_src.py`, `utils/shared_functions.py` +- `tools/vary_mannings_n_composite.py` + + +

+ + ## v4.4.15.1 - 2024-05-06 - [PR#1081](https://github.com/NOAA-OWP/inundation-mapping/pull/1038) This hotfix address a bug within the SRC adjustment routine to filter out USGS gauge locations that were conflated to lakeid reaches. These fatal errors were preventing `fim_post_processing.sh` from completing. There are also new try except blocks to handle potential errors when opening/writing SRC adjustment attributes to the catchment gpkg (unknown issues with collisions or corrupt gpkg files). Closes #1137 diff --git a/src/bathy_src_adjust_topwidth.py b/src/bathy_src_adjust_topwidth.py index c2db145d0..0edeeaf13 100644 --- a/src/bathy_src_adjust_topwidth.py +++ b/src/bathy_src_adjust_topwidth.py @@ -3,6 +3,7 @@ import argparse import datetime as dt import os +import re import sys from multiprocessing import Pool from os import environ @@ -540,7 +541,7 @@ def multi_process(bathy_rc_lookup, procs_list): begin_time = dt.datetime.now() ## Loop through hucs in the fim_dir and create list of variables to feed to multiprocessing - huc_list = os.listdir(fim_dir) + huc_list = [d for d in os.listdir(fim_dir) if re.match(r'^\d{8}$', d)] huc_pass_list = [] for huc in huc_list: if huc != 'logs' and huc[-3:] != 'log' and huc[-4:] != '.csv': diff --git a/src/identify_src_bankfull.py b/src/identify_src_bankfull.py index 5fe955ea4..8f38d4459 100755 --- a/src/identify_src_bankfull.py +++ b/src/identify_src_bankfull.py @@ -334,7 +334,7 @@ def run_prep(fim_dir, bankfull_flow_filepath, number_of_jobs, verbose, src_plot_ ] df_bflows = pd.read_csv(bankfull_flow_filepath, dtype={'feature_id': int}) - huc_list = os.listdir(fim_dir) + huc_list = [d for d in os.listdir(fim_dir) if re.match(r'^\d{8}$', d)] huc_list.sort() # sort huc_list for helping track progress in future print statments huc_pass_list = [] for huc in huc_list: diff --git a/src/subdiv_chan_obank_src.py b/src/subdiv_chan_obank_src.py index 1a8fa1435..e7482d1e7 100755 --- a/src/subdiv_chan_obank_src.py +++ b/src/subdiv_chan_obank_src.py @@ -408,7 +408,7 @@ def run_prep(fim_dir, mann_n_table, output_suffix, number_of_jobs, verbose, src_ print('Running the variable_mannings_calc function...') ## Loop through hucs in the fim_dir and create list of variables to feed to multiprocessing - huc_list = os.listdir(fim_dir) + huc_list = [d for d in os.listdir(fim_dir) if re.match(r'^\d{8}$', d)] huc_list.sort() # sort huc_list for helping track progress in future print statments for huc in huc_list: # if huc != 'logs' and huc[-3:] != 'log' and huc[-4:] != '.csv': diff --git a/src/utils/shared_functions.py b/src/utils/shared_functions.py index 8344d5baa..45e078b12 100644 --- a/src/utils/shared_functions.py +++ b/src/utils/shared_functions.py @@ -3,6 +3,7 @@ import glob import inspect import os +import re from concurrent.futures import as_completed from datetime import datetime, timezone from os.path import splitext @@ -216,7 +217,7 @@ def concat_huc_csv(fim_dir, csv_name): ''' merged_csv = [] - huc_list = os.listdir(fim_dir) + huc_list = [d for d in os.listdir(fim_dir) if re.match(r'^\d{8}$', d)] for huc in huc_list: if huc != 'logs': csv_file = os.path.join(fim_dir, huc, str(csv_name)) diff --git a/tools/vary_mannings_n_composite.py b/tools/vary_mannings_n_composite.py index e451eb5dd..42a70aacd 100755 --- a/tools/vary_mannings_n_composite.py +++ b/tools/vary_mannings_n_composite.py @@ -340,7 +340,7 @@ def run_prep( print('Running the variable_mannings_calc function...') ## Loop through hucs in the fim_dir and create list of variables to feed to multiprocessing - huc_list = os.listdir(fim_dir) + huc_list = [d for d in os.listdir(fim_dir) if re.match(r'^\d{8}$', d)] for huc in huc_list: # if huc != 'logs' and huc[-3:] != 'log' and huc[-4:] != '.csv': if re.match(r'\d{8}', huc): From 311ab97f75ecb82fe498c9e5a2936ae180423dc3 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Mon, 6 May 2024 14:22:09 -0600 Subject: [PATCH 38/51] v4.4.15.3 Fix KeyError in `mitigate_branch_outlet_backpool.py` (#1128) --- docs/CHANGELOG.md | 12 ++++++++++++ src/mitigate_branch_outlet_backpool.py | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0203f29f8..c3d6f97da 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.15.3 - 2024-05-06 - [PR#1128](https://github.com/NOAA-OWP/inundation-mapping/pull/1128) + +Fixes a KeyError in `src/mitigate_branch_outlet_backpool.py`. + +### Changes + +`src/mitigate_branch_outlet_backpool.py`: Addresses case where `catchments_df['outlier']` are all False. + + +

+ + ## v4.4.15.2 - 2024-05-06 - [PR#1133](https://github.com/NOAA-OWP/inundation-mapping/pull/1133) Bug fix for error when reading the subfolders of a directory using `listdir()` where files exist that start with an 8-digit number that are later interpreted as directories. diff --git a/src/mitigate_branch_outlet_backpool.py b/src/mitigate_branch_outlet_backpool.py index ecbf52b14..b056b9981 100755 --- a/src/mitigate_branch_outlet_backpool.py +++ b/src/mitigate_branch_outlet_backpool.py @@ -65,7 +65,10 @@ def catch_catchment_size_outliers(catchment_pixels_geom): catchments_df['outlier'] = abs(catchments_df['counts'] - mean_counts) > threshold # Quantify outliers - num_outlier = catchments_df['outlier'].value_counts()[True] + if catchments_df['outlier'].any(): + num_outlier = catchments_df['outlier'].value_counts()[True] + elif ~catchments_df['outlier'].all(): + num_outlier = 0 if num_outlier == 0: print('No outliers detected in catchment size.') From 2bdeb0da18bbd6ef6a89a37672487f1866e82f96 Mon Sep 17 00:00:00 2001 From: AliForghani-NOAA <124194814+AliForghani-NOAA@users.noreply.github.com> Date: Mon, 6 May 2024 16:26:11 -0400 Subject: [PATCH 39/51] v4.4.15.4 Update wrds api and get new USGS gages data (#1115) --- .../usgs}/rating_curve_get_usgs_curves.py | 29 ++++++++++++--- docs/CHANGELOG.md | 18 ++++++++++ pyproject.toml | 2 +- tools/tools_shared_functions.py | 35 +++++++++++++++---- 4 files changed, 71 insertions(+), 13 deletions(-) rename {tools => data/usgs}/rating_curve_get_usgs_curves.py (94%) diff --git a/tools/rating_curve_get_usgs_curves.py b/data/usgs/rating_curve_get_usgs_curves.py similarity index 94% rename from tools/rating_curve_get_usgs_curves.py rename to data/usgs/rating_curve_get_usgs_curves.py index 65553d4f2..e77e92857 100644 --- a/tools/rating_curve_get_usgs_curves.py +++ b/data/usgs/rating_curve_get_usgs_curves.py @@ -117,7 +117,7 @@ def write_categorical_flow_files(metadata, workspace): nws_lid = site.get('identifiers').get('nws_lid') # thresholds only provided for valid nws_lid. - if nws_lid == 'Bogus_ID': + if nws_lid == 'Bogus_ID' or nws_lid is None: continue # if invalid feature_id skip to next site @@ -145,8 +145,11 @@ def write_categorical_flow_files(metadata, workspace): all_data = pd.concat([all_data, data], ignore_index=True) # Write CatFIM flows to file - final_data = all_data[['feature_id', 'discharge_cms', 'recurr_interval']] - final_data.to_csv(workspace / 'catfim_flows_cms.csv', index=False) + print("writing for CatFIM") + if not all_data.empty: + final_data = all_data[['feature_id', 'discharge_cms', 'recurr_interval']] + final_data.to_csv(workspace / 'catfim_flows_cms.csv', index=False) + return all_data @@ -214,14 +217,16 @@ def usgs_rating_to_elev(list_of_gage_sites, workspace=False, sleep_time=1.0): os.mkdir(workspace) # If 'all' option passed to list of gages sites, it retrieves all sites within CONUS. - print('getting metadata for all sites') if list_of_gage_sites == ['all']: + print('getting metadata for all sites') sites_gdf, sites_list, metadata_list = get_all_active_usgs_sites() # Otherwise, if a list of sites is passed, retrieve sites from WRDS. else: # Define arguments to retrieve metadata and then get metadata from WRDS select_by = 'usgs_site_code' selector = list_of_gage_sites + print("Selected sites :", selector) + # Since there is a limit to number characters in url, split up selector if too many sites. max_sites = 150 if len(selector) > max_sites: @@ -252,6 +257,18 @@ def usgs_rating_to_elev(list_of_gage_sites, workspace=False, sleep_time=1.0): downstream_trace_distance=None, ) + # Get a geospatial layer (gdf) for all acceptable sites + print("Aggregating WBD HUCs...") + _, sites_gdf = aggregate_wbd_hucs(metadata_list, Path(WBD_LAYER), retain_attributes=True) + if not sites_gdf.empty: + # Get a list of all sites in gdf + list_of_sites = sites_gdf['identifiers_usgs_site_code'].to_list() + # Rename gdf fields + sites_gdf.columns = sites_gdf.columns.str.replace('identifiers_', '') + else: + print("There is no acceptable site.") + sys.exit() + # Create DataFrame to store all appended rating curves print('processing metadata') all_rating_curves = pd.DataFrame() @@ -265,7 +282,7 @@ def usgs_rating_to_elev(list_of_gage_sites, workspace=False, sleep_time=1.0): # Filter out sites that are not in contiguous US. If this section is removed be sure to test with # datum adjustment section (region will need changed) - if usgs['state'] in ['Alaska', 'Puerto Rico', 'Virgin Islands', 'Hawaii']: + if usgs['state'] in ['Puerto Rico', 'Virgin Islands', 'Hawaii']: continue # Get rating curve for site location_ids = usgs['usgs_site_code'] @@ -283,6 +300,7 @@ def usgs_rating_to_elev(list_of_gage_sites, workspace=False, sleep_time=1.0): # To prevent time-out errors time.sleep(sleep_time) # Get the datum adjustment to convert NGVD to NAVD. Region needs changed if not in CONUS. + datum_adj_ft = ngvd_to_navd_ft(datum_info=usgs, region='contiguous') # If datum API failed, print message and skip site. @@ -291,6 +309,7 @@ def usgs_rating_to_elev(list_of_gage_sites, workspace=False, sleep_time=1.0): api_failure_messages.append(api_message) print(api_message) continue + # If datum adjustment succeeded, calculate datum in NAVD88 navd88_datum = round(usgs['datum'] + datum_adj_ft, 2) message = f'{location_ids}:succesfully converted NGVD29 to NAVD88' diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c3d6f97da..dc1d3e722 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,24 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.15.4 - 2024-05-06 - [PR#1115](https://github.com/NOAA-OWP/inundation-mapping/pull/1115) + +This PR addresses issue #1040 and includes the following updates: +- Upgraded to WRDS API version 3 and ensured schema compatibility of new USGS gages data. +- Expanded data retrieval to include Alaska gages alongside CONUS gages. +- Enables retrieving SRC data for individual USGS gages, removing the necessity of using 'all' for the '-l' flag in rating_curve_get_usgs_curves.py." + + +### Changes + - `tools/tools_shared_functions.py` + - Improved the stability of API calls. + - Removed the exclusion of Alaska gages from USGS gages metadata (`usgs_gages.gpkg` output), preserving Alaska gages in the metadata. +- `rating_curve_get_usgs_curves.py` + - Removed the exclusion of Alaska gages when retrieving SRC values. + - Enabled retrieving SRC data for individual USGS gages. +- Moved the script `rating_curve_get_usgs_curves.py` from `tools` folder into `data/usgs`. + +

## v4.4.15.3 - 2024-05-06 - [PR#1128](https://github.com/NOAA-OWP/inundation-mapping/pull/1128) diff --git a/pyproject.toml b/pyproject.toml index 0476fe148..ac0432b03 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -75,10 +75,10 @@ per-file-ignores = """ src/build_stream_traversal.py: E722 tools/vary_mannings_n_composite.py: E712 tools/tools_shared_functions.py: F821, F841, E711 - tools/rating_curve_get_usgs_curves.py: F841 tools/rating_curve_comparison.py: F821, F841 tools/run_test_case.py: E711 tools/inundation.py: F821 tools/eval_alt_catfim.py: F841 tools/check_deep_flooding.py: E712 + data/usgs/rating_curve_get_usgs_curves.py: F841 """ diff --git a/tools/tools_shared_functions.py b/tools/tools_shared_functions.py index 4542cf879..f59c1be5b 100755 --- a/tools/tools_shared_functions.py +++ b/tools/tools_shared_functions.py @@ -19,7 +19,10 @@ from gval import CatStats from rasterio import features from rasterio.warp import Resampling, calculate_default_transform, reproject +from requests.adapters import HTTPAdapter +from requests.packages.urllib3.exceptions import InsecureRequestWarning from shapely.geometry import MultiPolygon, Polygon, shape +from urllib3.util.retry import Retry gpd.options.io_engine = "pyogrio" @@ -619,6 +622,9 @@ def get_metadata( params['must_include'] = must_include params['upstream_trace_distance'] = upstream_trace_distance params['downstream_trace_distance'] = downstream_trace_distance + # Suppress Insecure Request Warning + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + # Request data from url response = requests.get(url, params=params, verify=False) # print(response) @@ -754,9 +760,6 @@ def aggregate_wbd_hucs(metadata_list, wbd_huc8_path, retain_attributes=False): ) joined_gdf = joined_gdf.drop(columns='index_wbd') - # Remove all Alaska HUCS (Not in NWM v2.0 domain) - joined_gdf = joined_gdf[~joined_gdf.states.str.contains('AK')] - # Create a dictionary of huc [key] and nws_lid[value] dictionary = joined_gdf.groupby('HUC8')['identifiers_nws_lid'].apply(list).to_dict() @@ -932,8 +935,18 @@ def get_thresholds(threshold_url, select_by, selector, threshold='all'): params = {} params['threshold'] = threshold url = f'{threshold_url}/{select_by}/{selector}' - response = requests.get(url, params=params, verify=False) - if response.ok: + + # response = requests.get(url, params=params, verify=False) + + # Call the API + session = requests.Session() + retry = Retry(connect=3, backoff_factor=0.5) + adapter = HTTPAdapter(max_retries=retry) + session.mount('http://', adapter) + + response = session.get(url, params=params, verify=False) + + if response.status_code == 200: thresholds_json = response.json() # Get metadata thresholds_info = thresholds_json['value_set'] @@ -1157,11 +1170,19 @@ def ngvd_to_navd_ft(datum_info, region='contiguous'): params['t_v_frame'] = 'NAVD88' # Target vertical datum params['tar_vertical_unit'] = 'm' # Target vertical height + # Suppress Insecure Request Warning + requests.packages.urllib3.disable_warnings(InsecureRequestWarning) + # Call the API - response = requests.get(datum_url, params=params, verify=False) + session = requests.Session() + retry = Retry(connect=3, backoff_factor=0.5) + adapter = HTTPAdapter(max_retries=retry) + session.mount('http://', adapter) + + response = session.get(datum_url, params=params, verify=False) # If successful get the navd adjustment - if response: + if response.status_code == 200: results = response.json() # Get adjustment in meters (NGVD29 to NAVD88) adjustment = results['t_z'] From ad51dc25a922d21aba8820a6cb08485545d8b083 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Mon, 6 May 2024 14:32:43 -0600 Subject: [PATCH 40/51] v4.4.16.0 Clip ocean mask from DEM and extend outlet streams (#1121) --- data/wbd/clip_vectors_to_wbd.py | 177 +++++++++-- data/wbd/generate_pre_clip_fim_huc8.py | 405 ++++++++++++++----------- docs/CHANGELOG.md | 13 + 3 files changed, 385 insertions(+), 210 deletions(-) diff --git a/data/wbd/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py index ede7a6526..5d4b1ebbe 100755 --- a/data/wbd/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -1,17 +1,83 @@ #!/usr/bin/env python3 import argparse +import logging import sys import geopandas as gpd import pandas as pd import rasterio as rio -from shapely.geometry import MultiPolygon, Polygon +from shapely.geometry import LineString, MultiPolygon, Point, Polygon +from shapely.ops import nearest_points from utils.shared_functions import getDriver -# from utils.shared_variables import DEFAULT_FIM_PROJECTION_CRS +gpd.options.io_engine = "pyogrio" + + +def extend_outlet_streams(streams, wbd_buffered, wbd): + """ + Extend outlet streams to nearest buffered WBD boundary + """ + + wbd['geometry'] = wbd.geometry.boundary + wbd = gpd.GeoDataFrame(data=wbd, geometry='geometry') + + wbd_buffered["linegeom"] = wbd_buffered.geometry + + # Select only the streams that are outlets + levelpath_outlets = streams[streams['to'] == 0] + + # Select only the streams that don't intersect the WBD boundary line + levelpath_outlets = levelpath_outlets[~levelpath_outlets.intersects(wbd['geometry'].iloc[0])] + + levelpath_outlets['nearest_point'] = None + levelpath_outlets['last'] = None + + # print(list(levelpath_outlets.columns)) + + levelpath_outlets = levelpath_outlets.explode(index_parts=False) + + for index, row in levelpath_outlets.iterrows(): + coords = [(coords) for coords in list(row['geometry'].coords)] + last_coord = coords[-1] + levelpath_outlets.at[index, 'last'] = Point(last_coord) + + wbd_buffered['geometry'] = wbd_buffered.geometry.boundary + wbd_buffered = gpd.GeoDataFrame(data=wbd_buffered, geometry='geometry') + + for index, row in levelpath_outlets.iterrows(): + levelpath_geom = row['last'] + nearest_point = nearest_points(levelpath_geom, wbd_buffered) + + levelpath_outlets.at[index, 'nearest_point'] = nearest_point[1]['geometry'].iloc[0] + + levelpath_outlets_nearest_points = levelpath_outlets.at[index, 'nearest_point'] + if isinstance(levelpath_outlets_nearest_points, pd.Series): + levelpath_outlets_nearest_points = levelpath_outlets_nearest_points.iloc[-1] + + # tlist = list([levelpath_outlets.at[index, 'nearest_point'].coords[0]]) + # tlist = list([levelpath_outlets.at[index, 'nearest_point'].row.geometry.get_coordinates().oords[0]]) + + levelpath_outlets.at[index, 'geometry'] = LineString( + list(row['geometry'].coords) + list([levelpath_outlets_nearest_points.coords[0]]) + ) + + # levelpath_outlets.at[index, 'geometry'] = LineString( + # list(row.geometry.get_coordinates()) + list([levelpath_outlets.at[index, 'nearest_point'].coords[0]]) + # ) + + # geometry.get_coordinates() + + levelpath_outlets = gpd.GeoDataFrame(data=levelpath_outlets, geometry='geometry') + levelpath_outlets = levelpath_outlets.drop(columns=['last', 'nearest_point']) + + # Replace the streams in the original file with the extended streams + streams = streams[~streams['ID'].isin(levelpath_outlets['ID'])] + streams = pd.concat([streams, levelpath_outlets], ignore_index=True) + + return streams def subset_vector_layers( @@ -40,7 +106,8 @@ def subset_vector_layers( subset_levee_protected_areas, huc_CRS, ): - print(f"Getting Cell Size for {hucCode}", flush=True) + + # print(f"Getting Cell Size for {hucCode}", flush=True) with rio.open(dem_filename) as dem_raster: dem_cellsize = max(dem_raster.res) @@ -48,44 +115,71 @@ def subset_vector_layers( dem_domain = gpd.read_file(dem_domain, engine="pyogrio", use_arrow=True) # Get wbd buffer - print(f"Create wbd buffer for {hucCode}", flush=True) + logging.info(f"Create wbd buffer for {hucCode}") wbd_buffer = wbd.copy() wbd_buffer.geometry = wbd_buffer.geometry.buffer(wbd_buffer_distance, resolution=32) wbd_buffer = gpd.clip(wbd_buffer, dem_domain) + # Clip ocean water polygon for future masking ocean areas (where applicable) + logging.info(f"Clip ocean water polygon for {hucCode}") + landsea = gpd.read_file(landsea, mask=wbd_buffer, engine="fiona") + if not landsea.empty: + # print(f"Create landsea gpkg for {hucCode}", flush=True) + landsea.to_file( + subset_landsea, driver=getDriver(subset_landsea), index=False, crs=huc_CRS, engine="fiona" + ) + + # Exclude landsea area from WBD and wbd_buffer + wbd = wbd.overlay(landsea, how='difference') + wbd.to_file( + wbd_filename, + layer='WBDHU8', + driver=getDriver(wbd_filename), + index=False, + crs=huc_CRS, + engine="fiona", + ) + + wbd_buffer = wbd_buffer.overlay(landsea, how='difference') + + del landsea + # Make the streams buffer smaller than the wbd_buffer so streams don't reach the edge of the DEM + logging.info(f"Create stream buffer for {hucCode}") wbd_streams_buffer = wbd_buffer.copy() wbd_streams_buffer.geometry = wbd_streams_buffer.geometry.buffer(-8 * dem_cellsize, resolution=32) wbd_buffer = wbd_buffer[['geometry']] wbd_streams_buffer = wbd_streams_buffer[['geometry']] - wbd_buffer.to_file(wbd_buffer_filename, driver=getDriver(wbd_buffer_filename), index=False, crs=huc_CRS) + wbd_buffer.to_file( + wbd_buffer_filename, driver=getDriver(wbd_buffer_filename), index=False, crs=huc_CRS, engine="fiona" + ) wbd_streams_buffer.to_file( - wbd_streams_buffer_filename, driver=getDriver(wbd_streams_buffer_filename), index=False, crs=huc_CRS + wbd_streams_buffer_filename, + driver=getDriver(wbd_streams_buffer_filename), + index=False, + crs=huc_CRS, + engine="fiona", ) - # Clip ocean water polygon for future masking ocean areas (where applicable) - landsea = gpd.read_file(landsea, mask=wbd_buffer) - if not landsea.empty: - print(f"Create landsea gpkg for {hucCode}", flush=True) - landsea.to_file(subset_landsea, driver=getDriver(subset_landsea), index=False, crs=huc_CRS) - del landsea - # Clip levee-protected areas polygons for future masking ocean areas (where applicable) - print(f"Subsetting Levee Protected Areas for {hucCode}", flush=True) - levee_protected_areas = gpd.read_file(levee_protected_areas, mask=wbd_buffer) + # print(f"Subsetting Levee Protected Areas for {hucCode}", flush=True) + logging.info(f"Clip levee-protected areas for {hucCode}") + levee_protected_areas = gpd.read_file(levee_protected_areas, mask=wbd_buffer, engine="fiona") if not levee_protected_areas.empty: levee_protected_areas.to_file( subset_levee_protected_areas, driver=getDriver(subset_levee_protected_areas), index=False, crs=huc_CRS, + engine="fiona", ) del levee_protected_areas # Find intersecting lakes and writeout - print(f"Subsetting NWM Lakes for {hucCode}", flush=True) - nwm_lakes = gpd.read_file(nwm_lakes, mask=wbd_buffer) + # print(f"Subsetting NWM Lakes for {hucCode}", flush=True) + logging.info(f"Subsetting NWM Lakes for {hucCode}") + nwm_lakes = gpd.read_file(nwm_lakes, mask=wbd_buffer, engine="fiona") nwm_lakes = nwm_lakes.loc[nwm_lakes.Shape_Area < 18990454000.0] if not nwm_lakes.empty: @@ -97,63 +191,79 @@ def subset_vector_layers( # Loop through the filled polygons and insert the new geometry for i in range(len(nwm_lakes_fill_holes.geoms)): nwm_lakes.loc[i, 'geometry'] = nwm_lakes_fill_holes.geoms[i] - nwm_lakes.to_file(subset_nwm_lakes, driver=getDriver(subset_nwm_lakes), index=False, crs=huc_CRS) + nwm_lakes.to_file( + subset_nwm_lakes, driver=getDriver(subset_nwm_lakes), index=False, crs=huc_CRS, engine="fiona" + ) del nwm_lakes # Find intersecting levee lines - print(f"Subsetting NLD levee lines for {hucCode}", flush=True) - nld_lines = gpd.read_file(nld_lines, mask=wbd_buffer) + logging.info(f"Subsetting NLD levee lines for {hucCode}") + nld_lines = gpd.read_file(nld_lines, mask=wbd_buffer, engine="fiona") if not nld_lines.empty: - nld_lines.to_file(subset_nld_lines, driver=getDriver(subset_nld_lines), index=False, crs=huc_CRS) + nld_lines.to_file( + subset_nld_lines, driver=getDriver(subset_nld_lines), index=False, crs=huc_CRS, engine="fiona" + ) del nld_lines # Preprocessed levee lines for burning - nld_lines_preprocessed = gpd.read_file(nld_lines_preprocessed, mask=wbd_buffer) + nld_lines_preprocessed = gpd.read_file(nld_lines_preprocessed, mask=wbd_buffer, engine="fiona") if not nld_lines_preprocessed.empty: nld_lines_preprocessed.to_file( subset_nld_lines_preprocessed, driver=getDriver(subset_nld_lines_preprocessed), index=False, crs=huc_CRS, + engine="fiona", ) del nld_lines_preprocessed # Subset NWM headwaters - print(f"Subsetting NWM Headwater Points for {hucCode}", flush=True) - nwm_headwaters = gpd.read_file(nwm_headwaters, mask=wbd_streams_buffer) + logging.info(f"Subsetting NWM Headwater Points for {hucCode}") + nwm_headwaters = gpd.read_file(nwm_headwaters, mask=wbd_streams_buffer, engine="fiona") if len(nwm_headwaters) > 0: nwm_headwaters.to_file( - subset_nwm_headwaters, driver=getDriver(subset_nwm_headwaters), index=False, crs=huc_CRS + subset_nwm_headwaters, + driver=getDriver(subset_nwm_headwaters), + index=False, + crs=huc_CRS, + engine="fiona", ) else: print("No headwater point(s) within HUC " + str(hucCode) + " boundaries.") + logging.info("No headwater point(s) within HUC " + str(hucCode) + " boundaries.") sys.exit(0) del nwm_headwaters # Find intersecting nwm_catchments - print(f"Subsetting NWM Catchments for {hucCode}", flush=True) - nwm_catchments = gpd.read_file(nwm_catchments, mask=wbd_buffer) + # print(f"Subsetting NWM Catchments for {hucCode}", flush=True) + nwm_catchments = gpd.read_file(nwm_catchments, mask=wbd_buffer, engine="fiona") if len(nwm_catchments) > 0: nwm_catchments.to_file( - subset_nwm_catchments, driver=getDriver(subset_nwm_catchments), index=False, crs=huc_CRS + subset_nwm_catchments, + driver=getDriver(subset_nwm_catchments), + index=False, + crs=huc_CRS, + engine="fiona", ) else: print("No NWM catchments within HUC " + str(hucCode) + " boundaries.") + logging.info("No NWM catchments within HUC " + str(hucCode) + " boundaries.") sys.exit(0) del nwm_catchments # Subset nwm streams - print(f"Subsetting NWM Streams for {hucCode}", flush=True) - - nwm_streams = gpd.read_file(nwm_streams, mask=wbd_buffer) + logging.info(f"Subsetting NWM Streams for {hucCode}") + nwm_streams = gpd.read_file(nwm_streams, mask=wbd_buffer, engine="fiona") # NWM can have duplicate records, but appear to always be identical duplicates nwm_streams.drop_duplicates(subset="ID", keep="first", inplace=True) + nwm_streams = extend_outlet_streams(nwm_streams, wbd_buffer, wbd) + nwm_streams_outlets = nwm_streams[~nwm_streams['to'].isin(nwm_streams['ID'])] nwm_streams_nonoutlets = nwm_streams[nwm_streams['to'].isin(nwm_streams['ID'])] @@ -177,10 +287,11 @@ def subset_vector_layers( nwm_streams = pd.concat([nwm_streams_nonoutlets, nwm_streams_outlets]) nwm_streams.to_file( - subset_nwm_streams, driver=getDriver(subset_nwm_streams), index=False, crs=huc_CRS + subset_nwm_streams, driver=getDriver(subset_nwm_streams), index=False, crs=huc_CRS, engine="fiona" ) else: print("No NWM stream segments within HUC " + str(hucCode) + " boundaries.") + logging.info("No NWM stream segments within HUC " + str(hucCode) + " boundaries.") sys.exit(0) del nwm_streams @@ -230,7 +341,7 @@ def subset_vector_layers( '-lps', '--subset-levee-protected-areas', help='Levee-protected areas subset', required=True ) - parser.add_argument('-crs', '--huc-crs', help='HUC crs', required=True) + parser.add_argument('-crs', '--huc-CRS', help='HUC crs', required=True) args = vars(parser.parse_args()) diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py index d1391aaf7..6bf2ea581 100755 --- a/data/wbd/generate_pre_clip_fim_huc8.py +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -6,11 +6,15 @@ import os import shutil import subprocess -from multiprocessing import Pool +import traceback +from concurrent.futures import ProcessPoolExecutor, as_completed +from pathlib import Path from clip_vectors_to_wbd import subset_vector_layers from dotenv import load_dotenv +from utils.shared_functions import FIM_Helpers as fh + ''' Overview: @@ -27,8 +31,8 @@ Usage: generate_pre_clip_fim_huc8.py - -n /data/inputs/pre_clip_huc8/24_3_20 - -u /data/inputs/huc_lists/included_huc8.lst + -n /data/inputs/pre_clip_huc8/24_04_23 + -u /data/inputs/huc_lists/included_huc8_withAlaska.lst -j 6 -o @@ -36,7 +40,7 @@ If running this script to generate new data, modify the pre_clip_huc_dir variable in src/bash_variables.env to the corresponding outputs_dir argument after running and testing this script. The newly generated data should be created in a new folder using the format - (i.e. September 26, 2023 would be 23_9_26) + (i.e. September 26, 2023 would be 23_09_26) ''' srcDir = os.getenv('srcDir') @@ -84,7 +88,7 @@ wbd_buffer_int = int(wbd_buffer) -def __setup_logger(outputs_dir): +def __setup_logger(outputs_dir, huc=None): ''' Set up logging to file. Since log file includes the date, it will be overwritten if this script is run more than once on the same day. @@ -92,7 +96,10 @@ def __setup_logger(outputs_dir): datetime_now = dt.datetime.now(dt.timezone.utc) curr_date = datetime_now.strftime("%m_%d_%Y") - log_file_name = f"generate_pre_clip_fim_huc8_{curr_date}.log" + if huc is None: + log_file_name = f"generate_pre_clip_fim_huc8_{curr_date}.log" + else: + log_file_name = f"mp_{huc}_generate_pre_clip_fim_huc8_{curr_date}.log" log_file_path = os.path.join(outputs_dir, log_file_name) @@ -118,6 +125,22 @@ def __setup_logger(outputs_dir): logging.info(f"\n \t Started: {start_time_string} \n") +def __merge_mp_logs(outputs_dir): + log_file_list = list(Path(outputs_dir).rglob("mp_*")) + if len(log_file_list) > 0: + log_file_list.sort() + + log_mp_rollup_file = os.path.join(outputs_dir, "mp_merged_logs.log") + + with open(log_mp_rollup_file, 'a') as main_log: + # Iterate through list + for temp_log_file in log_file_list: + # Open each file in read mode + with open(temp_log_file) as infile: + main_log.write(infile.read()) + os.remove(temp_log_file) + + def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): ''' The function is the main driver of the program to iterate and parallelize writing @@ -185,8 +208,6 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): elif not os.path.isdir(os.path.join(outputs_dir, huc)): os.mkdir(os.path.join(outputs_dir, huc)) - logging.info(f"Created directory: {outputs_dir}/{huc}, huc level files will be written there.") - print(f"Created directory: {outputs_dir}/{huc}, huc level files will be written there.") # Build arguments (procs_list) for each process to execute (huc_level_clip_vectors_to_wbd) procs_list = [] @@ -199,8 +220,23 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): # Parallelize each huc in hucs_to_parquet_list logging.info('Parallelizing HUC level wbd pre-clip vector creation. ') print('Parallelizing HUC level wbd pre-clip vector creation. ') - with Pool(processes=number_of_jobs) as pool: - pool.map(huc_level_clip_vectors_to_wbd, procs_list) + # with Pool(processes=number_of_jobs) as pool: + # pool.map(huc_level_clip_vectors_to_wbd, procs_list) + + with ProcessPoolExecutor(max_workers=number_of_jobs) as executor: + futures = {} + for huc in hucs_to_pre_clip_list: + args = {"huc": huc, "outputs_dir": outputs_dir} + future = executor.submit(huc_level_clip_vectors_to_wbd, **args) + futures[future] = future + + for future in as_completed(futures): + if future is not None: + if future.exception(): + raise future.exception() + + print("Merging MP log files") + __merge_mp_logs(outputs_dir) # Get time metrics end_time = dt.datetime.now(dt.timezone.utc) @@ -220,7 +256,7 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): print(f"\t \t TOTAL RUN TIME: {str(time_duration).split('.')[0]}") -def huc_level_clip_vectors_to_wbd(args): +def huc_level_clip_vectors_to_wbd(huc, outputs_dir): ''' Create pre-clipped vectors at the huc level. Necessary to have this as an additional function for multiprocessing. This is mostly a wrapper for the subset_vector_layers() method in @@ -242,182 +278,197 @@ def huc_level_clip_vectors_to_wbd(args): - .gpkg files* dependant on HUC's WBD (*differing amount based on individual huc) ''' - # We have to explicitly unpack the args from pool.map() - huc = args[0] - outputs_dir = args[1] - - huc_directory = os.path.join(outputs_dir, huc) + huc_processing_start = dt.datetime.now(dt.timezone.utc) + # with this in Multi-proc, it needs it's own logger and unique logging file. + __setup_logger(outputs_dir, huc) + logging.info(f"Processing {huc}") + + try: + + huc_directory = os.path.join(outputs_dir, huc) + + # SET VARIABLES AND FILE INPUTS # + hucUnitLength = len(huc) + huc2Identifier = huc[:2] + + # Check whether the HUC is in Alaska or not and assign the CRS and filenames accordingly + if huc2Identifier == '19': + huc_CRS = ALASKA_CRS + input_NHD_WBHD_layer = 'WBD_National_South_Alaska' + input_WBD_filename = input_WBD_gdb_Alaska + wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National_South_Alaska.gpkg' + else: + huc_CRS = DEFAULT_FIM_PROJECTION_CRS + input_NHD_WBHD_layer = f"WBDHU{hucUnitLength}" + input_WBD_filename = input_WBD_gdb + wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National.gpkg' + + # Define the landsea water body mask using either Great Lakes or Ocean polygon input # + if huc2Identifier == "04": + input_LANDSEA = f"{input_GL_boundaries}" + # print(f'Using {input_LANDSEA} for water body mask (Great Lakes)') + elif huc2Identifier == "19": + input_LANDSEA = f"{inputsDir}/landsea/water_polygons_alaska.gpkg" + # print(f'Using {input_LANDSEA} for water body mask (Alaska)') + else: + input_LANDSEA = f"{inputsDir}/landsea/water_polygons_us.gpkg" + + print(f"\n Get WBD {huc}") + + # TODO: Use Python API (osgeo.ogr) instead of using ogr2ogr executable + get_wbd_subprocess = subprocess.run( + [ + 'ogr2ogr', + '-f', + 'GPKG', + '-t_srs', + huc_CRS, + f'{huc_directory}/wbd.gpkg', + input_WBD_filename, + input_NHD_WBHD_layer, + '-where', + f"HUC{hucUnitLength}='{huc}'", + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, + ) - # SET VARIABLES AND FILE INPUTS # - hucUnitLength = len(huc) - huc2Identifier = huc[:2] + logging.info(f"{huc} : {get_wbd_subprocess.stdout}") + + if get_wbd_subprocess.stderr != "": + if "ERROR" in get_wbd_subprocess.stderr.upper(): + msg = ( + f" - Creating -- {huc_directory}/wbd.gpkg" + f" ERROR -- details: ({get_wbd_subprocess.stderr})" + ) + print(msg) + logging.info(msg) + else: + msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete \n" + print(msg) + logging.info(msg) - # Check whether the HUC is in Alaska or not and assign the CRS and filenames accordingly - if huc2Identifier == '19': - huc_CRS = ALASKA_CRS - input_NHD_WBHD_layer = 'WBD_National_South_Alaska' - input_WBD_filename = input_WBD_gdb_Alaska - wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National_South_Alaska.gpkg' - else: - huc_CRS = DEFAULT_FIM_PROJECTION_CRS - input_NHD_WBHD_layer = f"WBDHU{hucUnitLength}" - input_WBD_filename = input_WBD_gdb - wbd_gpkg_path = f'{inputsDir}/wbd/WBD_National.gpkg' - - # Define the landsea water body mask using either Great Lakes or Ocean polygon input # - if huc2Identifier == "04": - input_LANDSEA = f"{input_GL_boundaries}" - print(f'Using {input_LANDSEA} for water body mask (Great Lakes)') - elif huc2Identifier == "19": - input_LANDSEA = f"{inputsDir}/landsea/water_polygons_alaska.gpkg" - print(f'Using {input_LANDSEA} for water body mask (Alaska)') - else: - input_LANDSEA = f"{inputsDir}/landsea/water_polygons_us.gpkg" - - print(f"\n Get WBD {huc}") - - # TODO: Use Python API (osgeo.ogr) instead of using ogr2ogr executable - get_wbd_subprocess = subprocess.run( - [ - 'ogr2ogr', - '-f', - 'GPKG', - '-t_srs', - huc_CRS, - f'{huc_directory}/wbd.gpkg', - input_WBD_filename, - input_NHD_WBHD_layer, - '-where', - f"HUC{hucUnitLength}='{huc}'", - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - check=True, - universal_newlines=True, - ) + msg = f"Get Vector Layers and Subset {huc}" + # print(msg) + logging.info(msg) - msg = get_wbd_subprocess.stdout - print(msg) - logging.info(msg) + # Subset Vector Layers (after determining whether it's alaska or not) + if huc2Identifier == '19': + # Yes Alaska + subset_vector_layers( + subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", + subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", + hucCode=huc, + subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", + wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", + wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", + wbd_filename=f"{huc_directory}/wbd.gpkg", + dem_filename=input_DEM_Alaska, + dem_domain=input_DEM_domain_Alaska, + nwm_lakes=input_nwm_lakes, + nwm_catchments=input_nwm_catchments_Alaska, + subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", + nld_lines=input_NLD_Alaska, + nld_lines_preprocessed=input_levees_preprocessed_Alaska, + landsea=input_LANDSEA, + nwm_streams=input_nwm_flows_Alaska, + subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", + nwm_headwaters=input_nwm_headwaters_Alaska, + subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", + subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", + wbd_buffer_distance=wbd_buffer_int, + levee_protected_areas=input_nld_levee_protected_areas_Alaska, + subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + huc_CRS=huc_CRS, # TODO: simplify + ) - if get_wbd_subprocess.stderr != "": - if "ERROR" in get_wbd_subprocess.stderr.upper(): - msg = ( - f" - Creating -- {huc_directory}/wbd.gpkg" - f" ERROR -- details: ({get_wbd_subprocess.stderr})" + else: + # Not Alaska + subset_vector_layers( + subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", + subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", + hucCode=huc, + subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", + wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", + wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", + wbd_filename=f"{huc_directory}/wbd.gpkg", + dem_filename=input_DEM, + dem_domain=input_DEM_domain, + nwm_lakes=input_nwm_lakes, + nwm_catchments=input_nwm_catchments, + subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", + nld_lines=input_NLD, + nld_lines_preprocessed=input_levees_preprocessed, + landsea=input_LANDSEA, + nwm_streams=input_nwm_flows, + subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", + nwm_headwaters=input_nwm_headwaters, + subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", + subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", + wbd_buffer_distance=wbd_buffer_int, + levee_protected_areas=input_nld_levee_protected_areas, + subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + huc_CRS=huc_CRS, # TODO: simplify ) - print(msg) - logging.error(msg) - else: - msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete \n" + + msg = f" Completing Get Vector Layers and Subset: {huc} \n" print(msg) logging.info(msg) - msg = f"Get Vector Layers and Subset {huc}" - print(msg) - logging.info(msg) - - # Subset Vector Layers (after determining whether it's alaska or not) - if huc2Identifier == '19': - # Yes Alaska - subset_vector_layers( - subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", - subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", - hucCode=huc, - subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", - wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", - wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", - wbd_filename=f"{huc_directory}/wbd.gpkg", - dem_filename=input_DEM_Alaska, - dem_domain=input_DEM_domain_Alaska, - nwm_lakes=input_nwm_lakes, - nwm_catchments=input_nwm_catchments_Alaska, - subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", - nld_lines=input_NLD_Alaska, - nld_lines_preprocessed=input_levees_preprocessed_Alaska, - landsea=input_LANDSEA, - nwm_streams=input_nwm_flows_Alaska, - subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", - nwm_headwaters=input_nwm_headwaters_Alaska, - subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", - subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", - wbd_buffer_distance=wbd_buffer_int, - levee_protected_areas=input_nld_levee_protected_areas_Alaska, - subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", - huc_CRS=huc_CRS, # TODO: simplify - ) - - else: - # Not Alaska - subset_vector_layers( - subset_nwm_lakes=f"{huc_directory}/nwm_lakes_proj_subset.gpkg", - subset_nwm_streams=f"{huc_directory}/nwm_subset_streams.gpkg", - hucCode=huc, - subset_nwm_headwaters=f"{huc_directory}/nwm_headwater_points_subset.gpkg", - wbd_buffer_filename=f"{huc_directory}/wbd_buffered.gpkg", - wbd_streams_buffer_filename=f"{huc_directory}/wbd_buffered_streams.gpkg", - wbd_filename=f"{huc_directory}/wbd.gpkg", - dem_filename=input_DEM, - dem_domain=input_DEM_domain, - nwm_lakes=input_nwm_lakes, - nwm_catchments=input_nwm_catchments, - subset_nwm_catchments=f"{huc_directory}/nwm_catchments_proj_subset.gpkg", - nld_lines=input_NLD, - nld_lines_preprocessed=input_levees_preprocessed, - landsea=input_LANDSEA, - nwm_streams=input_nwm_flows, - subset_landsea=f"{huc_directory}/LandSea_subset.gpkg", - nwm_headwaters=input_nwm_headwaters, - subset_nld_lines=f"{huc_directory}/nld_subset_levees.gpkg", - subset_nld_lines_preprocessed=f"{huc_directory}/3d_nld_subset_levees_burned.gpkg", - wbd_buffer_distance=wbd_buffer_int, - levee_protected_areas=input_nld_levee_protected_areas, - subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", - huc_CRS=huc_CRS, # TODO: simplify + ## Clip WBD8 ## + print(f" Creating WBD buffer and clip version {huc}") + + clip_wbd8_subprocess = subprocess.run( + [ + 'ogr2ogr', + '-f', + 'GPKG', + '-t_srs', + huc_CRS, + '-clipsrc', + f'{huc_directory}/wbd_buffered.gpkg', + f'{huc_directory}/wbd8_clp.gpkg', + wbd_gpkg_path, + input_NHD_WBHD_layer, + ], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, + universal_newlines=True, ) - msg = f"\n\t Completing Get Vector Layers and Subset: {huc} \n" - print(msg) - logging.info(msg) - - ## Clip WBD8 ## - print(f" Clip WBD {huc}") - - clip_wbd8_subprocess = subprocess.run( - [ - 'ogr2ogr', - '-f', - 'GPKG', - '-t_srs', - huc_CRS, - '-clipsrc', - f'{huc_directory}/wbd_buffered.gpkg', - f'{huc_directory}/wbd8_clp.gpkg', - wbd_gpkg_path, - input_NHD_WBHD_layer, - ], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - check=True, - universal_newlines=True, - ) + # msg = clip_wbd8_subprocess.stdout + # print(f"{huc} : {msg}") + # logging.info(f"{huc} : {msg}") + + if clip_wbd8_subprocess.stderr != "": + if "ERROR" in clip_wbd8_subprocess.stderr.upper(): + msg = ( + f" - Creating -- {huc_directory}/wbd.gpkg" + f" ERROR -- details: ({clip_wbd8_subprocess.stderr})" + ) + print(msg) + logging.info(msg) + else: + msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete" + print(msg) + logging.info(msg) - msg = clip_wbd8_subprocess.stdout - print(msg) - logging.info(msg) + except Exception: + print(f"*** An error occurred while processing {huc}") + print(traceback.format_exc()) + logging.info(f"*** An error occurred while processing {huc}") + logging.info(traceback.format_exc()) + print() - if clip_wbd8_subprocess.stderr != "": - if "ERROR" in clip_wbd8_subprocess.stderr.upper(): - msg = ( - f" - Creating -- {huc_directory}/wbd.gpkg" - f" ERROR -- details: ({clip_wbd8_subprocess.stderr})" - ) - print(msg) - logging.error(msg) - else: - msg = f" - Creating -- {huc_directory}/wbd.gpkg - Complete" - print(msg) - logging.info(msg) + huc_processing_end = dt.datetime.now(dt.timezone.utc) + time_duration = huc_processing_end - huc_processing_start + duraton_msg = f"\t \t run time for huc {huc}: is {str(time_duration).split('.')[0]}" + print(duraton_msg) + logging.info(duraton_msg) + return if __name__ == '__main__': @@ -428,7 +479,7 @@ def huc_level_clip_vectors_to_wbd(args): usage=''' ./generate_pre_clip_fim_huc8.py -n /data/inputs/pre_clip_huc8/24_3_20 - -u /data/inputs/huc_lists/included_huc8.lst + -u /data/inputs/huc_lists/included_huc8_withAlaska.lst -j 6 -o ''', @@ -438,7 +489,7 @@ def huc_level_clip_vectors_to_wbd(args): '-n', '--outputs_dir', help='Directory to output all of the HUC level .gpkg files. Use the format: ' - ' (i.e. September 26, 2023 would be 2023_9_26)', + ' (i.e. September 26, 2023 would be 23_09_26)', ) parser.add_argument('-u', '--huc_list', help='List of HUCs to genereate pre-clipped vectors for.') parser.add_argument( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index dc1d3e722..64be87feb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,18 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.4.16.0 - 2024-05-06 - [PR#1121](https://github.com/NOAA-OWP/inundation-mapping/pull/1121) + +Some NWM streams, particularly in coastal areas, fail to reach the edge of the DEM resulting in reverse flow. This issue was resolved by clipping the ocean mask from the buffered WBD and DEM, and any remaining streams that didn't have outlets reaching the edge of the buffered WBD boundary were extended by snapping the end to the nearest point on the buffered WBD. + +### Changes + +- `data/wbd/clip_vectors_to_wbd.py`: Clips `landsea` ocean mask from the buffered WBD and adds a function to extend outlet streams to the buffered WBD +- `data/wbd/clip_vectors_to_wbd.py`: Updated multi-processing and added more logging. + +

+ + ## v4.4.15.4 - 2024-05-06 - [PR#1115](https://github.com/NOAA-OWP/inundation-mapping/pull/1115) This PR addresses issue #1040 and includes the following updates: @@ -142,6 +154,7 @@ The "black" packages is also be upgraded from 23.7.0 to 24.3.

+ ## v4.4.13.1 - 2024-03-11 - [PR#1086](https://github.com/NOAA-OWP/inundation-mapping/pull/1086) Fixes bug where levee-protected areas were not being masked from branch 0 DEMs. From 4466db046fa01d2fffd0f16aa278d87f6dfc6a31 Mon Sep 17 00:00:00 2001 From: LauraKeys-NOAA <70279180+LauraKeys-NOAA@users.noreply.github.com> Date: Mon, 6 May 2024 15:56:17 -0500 Subject: [PATCH 41/51] v4.5.0.0 Adding Open Street Map bridge data pulling and healing scripts (#1122) --- Pipfile | 1 + Pipfile.lock | 151 ++++++----- data/bridges/pull_osm_bridges.py | 311 +++++++++++++++++++++++ data/wbd/clip_vectors_to_wbd.py | 41 ++- data/wbd/generate_pre_clip_fim_huc8.py | 43 +++- docs/CHANGELOG.md | 24 ++ src/bash_variables.env | 3 +- src/delineate_hydros_and_produce_HAND.sh | 19 ++ src/heal_bridges_osm.py | 146 +++++++++++ src/utils/shared_functions.py | 31 --- src/utils/shared_variables.py | 59 ----- 11 files changed, 651 insertions(+), 178 deletions(-) create mode 100644 data/bridges/pull_osm_bridges.py create mode 100644 src/heal_bridges_osm.py diff --git a/Pipfile b/Pipfile index 35731f13c..16e8eed68 100644 --- a/Pipfile +++ b/Pipfile @@ -47,6 +47,7 @@ pyflwdir = "==0.5.8" pillow = "==10.3.0" pyogrio = "==0.7.2" openpyxl = "*" +osmnx = "*" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index a7d7bef21..4162d23ab 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "13d8feb3cb31feea69831b7d547993f4adde0134668a95c9744aa54d45cae748" + "sha256": "a7f3b5a12b051d29d0dee120d17361cca1ce11c412d15be4c207f6ca43e615b9" }, "pipfile-spec": 6, "requires": { @@ -689,11 +689,11 @@ }, "datashader": { "hashes": [ - "sha256:a2cb0f839067bf29cf6cc9c07a1dad35f0e4aed3768387056fcbac8748087bfa", - "sha256:ed4c111957578dcb3fcff972d954f77586dafd71a7345fd5cd069d9fb050d0d1" + "sha256:317c16a32a7d1c5208444a83fd6d2cb68d9bfb81802c323489bd24f6b7cf5c5f", + "sha256:5b2f1dd448defce206ecc16e9960fe9378f32307ea1fcb0c298c22c14f58c881" ], "markers": "python_version >= '3.9'", - "version": "==0.16.0" + "version": "==0.16.1" }, "debugpy": { "hashes": [ @@ -764,11 +764,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", - "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" ], "markers": "python_version < '3.11'", - "version": "==1.2.0" + "version": "==1.2.1" }, "executing": { "hashes": [ @@ -906,11 +906,11 @@ }, "geocube": { "hashes": [ - "sha256:3cd80d0866fec649001529b6d19502937b3f70be4b480fac53e0785ef8ef27d8", - "sha256:aa77b078516649d35b3907fcc630fc6a3c22e4d8b2b52add9a09c6b18dd3c462" + "sha256:2fb9e193c67f47f47cdade85748f17cd69bf8ac1cf5194d683846022b8d5c4e4", + "sha256:908e13900535a8ba2d6598ed3e69924f8dc60620bde242d760655d5a2a8244f2" ], "markers": "python_version >= '3.10'", - "version": "==0.5.1" + "version": "==0.5.2" }, "geographiclib": { "hashes": [ @@ -946,18 +946,17 @@ }, "identify": { "hashes": [ - "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791", - "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e" + "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa", + "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d" ], "markers": "python_version >= '3.8'", - "version": "==2.5.35" + "version": "==2.5.36" }, "idna": { "hashes": [ "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" ], - "index": "pypi", "markers": "python_version >= '3.5'", "version": "==3.7" }, @@ -1124,11 +1123,11 @@ }, "json5": { "hashes": [ - "sha256:0c638399421da959a20952782800e5c1a78c14e08e1dc9738fa10d8ec14d58c8", - "sha256:4ca101fd5c7cb47960c055ef8f4d0e31e15a7c6c48c3b6f1473fc83b6c462a13" + "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f", + "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae" ], "markers": "python_version >= '3.8'", - "version": "==0.9.24" + "version": "==0.9.25" }, "jsonpointer": { "hashes": [ @@ -1199,19 +1198,19 @@ }, "jupyter-server": { "hashes": [ - "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b", - "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e" + "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677", + "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210" ], "markers": "python_version >= '3.8'", - "version": "==2.13.0" + "version": "==2.14.0" }, "jupyter-server-fileid": { "hashes": [ - "sha256:7486bca3acf9bbaab7ce5127f9f64d2df58f5d2de377609fb833291a7217a6a2", - "sha256:76dd05a45b78c7ec0cba0be98ece289984c6bcfc1ca2da216d42930e506a4d68" + "sha256:76a2fbcea6950968485dcd509c2d6ac417ca11e61ab1ad447a475f0878ca808f", + "sha256:ffb11460ca5f8567644f6120b25613fca8e3f3048b38d14c6e3fe1902f314a9b" ], "markers": "python_version >= '3.7'", - "version": "==0.9.1" + "version": "==0.9.2" }, "jupyter-server-terminals": { "hashes": [ @@ -1255,11 +1254,11 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:54622cbd330526a385ee0c1fdccdff3a1e7219bf3e864a335284a1270a1973df", - "sha256:9b3ba91cf2837f7f124fca36d63f3ca80ace2bed4898a63dd47e6598c1ab006f" + "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d", + "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75" ], "markers": "python_version >= '3.8'", - "version": "==2.26.0" + "version": "==2.27.1" }, "jupyterlab-widgets": { "hashes": [ @@ -1536,11 +1535,11 @@ }, "matplotlib-inline": { "hashes": [ - "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", - "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" ], - "markers": "python_version >= '3.5'", - "version": "==0.1.6" + "markers": "python_version >= '3.8'", + "version": "==0.1.7" }, "mccabe": { "hashes": [ @@ -1755,6 +1754,14 @@ "index": "pypi", "version": "==1.6.3" }, + "networkx": { + "hashes": [ + "sha256:0c127d8b2f4865f59ae9cb8aafcd60b5c70f3241ebd66f7defad7c4ab90126c9", + "sha256:28575580c6ebdaf4505b22c6256a2b9de86b316dc63ba9e93abde3d78dfdbcf2" + ], + "markers": "python_version >= '3.10'", + "version": "==3.3" + }, "nodeenv": { "hashes": [ "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", @@ -1884,11 +1891,11 @@ }, "numpy-groupies": { "hashes": [ - "sha256:24a574ecdd58c0d669749b67ec31dab971d27e04037b402bbc4f6bedaa2623bc", - "sha256:f920c4ded899f5975d94fc63d634e7c89622056bbab8cc98a44d4320a0ae8a12" + "sha256:b0e9cf7a4d015beca969f1e90463fa90972df8380a722eb96d679f8838d2f6fe", + "sha256:c9f2471b0ee96e202fb0a591a551192c19fa3bdddad33df8665a7accbaf3263e" ], "markers": "python_version >= '3.9'", - "version": "==0.10.2" + "version": "==0.11.1" }, "odc-geo": { "hashes": [ @@ -1906,6 +1913,14 @@ "index": "pypi", "version": "==3.1.2" }, + "osmnx": { + "hashes": [ + "sha256:59d21756ebdb4a4d211fb1373a3dca170832eec5f25ef94f5500bd79d32c169a", + "sha256:9ea17500b45aa8e4740490d649c7f7747fa4f2e3f9747294837fa2c80aabd05f" + ], + "index": "pypi", + "version": "==1.9.2" + }, "overrides": { "hashes": [ "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", @@ -2086,19 +2101,19 @@ }, "platformdirs": { "hashes": [ - "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", - "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", + "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" ], "markers": "python_version >= '3.8'", - "version": "==4.2.0" + "version": "==4.2.1" }, "pluggy": { "hashes": [ - "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", - "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.5.0" }, "pre-commit": { "hashes": [ @@ -2980,11 +2995,11 @@ }, "referencing": { "hashes": [ - "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844", - "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4" + "sha256:191e936b0c696d0af17ad7430a3dc68e88bc11be6514f4757dc890f04ab05889", + "sha256:8080727b30e364e5783152903672df9b6b091c926a146a759080b62ca3126cd6" ], "markers": "python_version >= '3.8'", - "version": "==0.34.0" + "version": "==0.35.0" }, "requests": { "hashes": [ @@ -3039,11 +3054,11 @@ }, "rioxarray": { "hashes": [ - "sha256:9dc57a66b3551644322bba6c4d5d4c4647b0e41c481c9f03b287c1d9e16407b6", - "sha256:d12441e696dbc8a6113658e75326009ef6fddd3f865f4bcdd659d7fcfe4d8c7f" + "sha256:433b169cd10346ed5fe0123e61fafca4dcaf5ce1b6e2f6cc1a9c0e0bf7d7c1d4", + "sha256:849979c3542cefb5ac452af474a0b50ff08b7435c6db1ad615ddb65b1da4bbf3" ], "markers": "python_version >= '3.10'", - "version": "==0.15.3" + "version": "==0.15.5" }, "rpds-py": { "hashes": [ @@ -3254,11 +3269,11 @@ }, "setuptools": { "hashes": [ - "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e", - "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c" + "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", + "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" ], "markers": "python_version >= '3.8'", - "version": "==69.2.0" + "version": "==69.5.1" }, "shapely": { "hashes": [ @@ -3486,11 +3501,11 @@ }, "tinycss2": { "hashes": [ - "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847", - "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627" + "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d", + "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7" ], - "markers": "python_version >= '3.7'", - "version": "==1.2.1" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "tomli": { "hashes": [ @@ -3535,11 +3550,11 @@ }, "traitlets": { "hashes": [ - "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", - "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" + "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" ], "markers": "python_version >= '3.8'", - "version": "==5.14.2" + "version": "==5.14.3" }, "typeguard": { "hashes": [ @@ -3597,11 +3612,11 @@ }, "virtualenv": { "hashes": [ - "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a", - "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197" + "sha256:0846377ea76e818daaa3e00a4365c018bc3ac9760cbb3544de542885aad61fb3", + "sha256:ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210" ], "markers": "python_version >= '3.7'", - "version": "==20.25.1" + "version": "==20.26.0" }, "wcwidth": { "hashes": [ @@ -3626,11 +3641,11 @@ }, "websocket-client": { "hashes": [ - "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6", - "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588" + "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", + "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da" ], "markers": "python_version >= '3.8'", - "version": "==1.7.0" + "version": "==1.8.0" }, "whitebox": { "hashes": [ @@ -3893,11 +3908,11 @@ }, "matplotlib-inline": { "hashes": [ - "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", - "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" ], - "markers": "python_version >= '3.5'", - "version": "==0.1.6" + "markers": "python_version >= '3.8'", + "version": "==0.1.7" }, "parso": { "hashes": [ @@ -3970,11 +3985,11 @@ }, "traitlets": { "hashes": [ - "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", - "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" + "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" ], "markers": "python_version >= '3.8'", - "version": "==5.14.2" + "version": "==5.14.3" }, "wcwidth": { "hashes": [ diff --git a/data/bridges/pull_osm_bridges.py b/data/bridges/pull_osm_bridges.py new file mode 100644 index 000000000..7c7bf6183 --- /dev/null +++ b/data/bridges/pull_osm_bridges.py @@ -0,0 +1,311 @@ +import argparse +import datetime as dt +import logging +import os +import traceback +from concurrent.futures import ProcessPoolExecutor, as_completed +from pathlib import Path + +import geopandas as gpd +import osmnx as ox +import pandas as pd +import pyproj +from shapely.geometry import shape + + +CRS = "epsg:5070" + + +# Save all OSM bridge features by HUC8 to a specified folder location. +# Bridges will have point geometry converted to linestrings if needed +# +def pull_osm_features_by_huc(huc_bridge_file, huc_num, huc_geom): + """ + Returns: The huc number but only if it failed, so we can make a master list of failed HUCs. + The errors will be logged as it goes. + """ + tags = {"bridge": True} + try: + + if os.path.exists(huc_bridge_file): + logging.info(f" **{huc_bridge_file} already exists.. skipped") + # return huc_bridge_file + return "" + + logging.info(f" ** Creating gkpg for {huc_num}") + + gdf = ox.features_from_polygon(shape(huc_geom), tags) + + if gdf is None or len(gdf) == 0: + logging.info(f"osmnx pull for {huc_num} came back with no records") + return huc_num + + cols_to_drop = [] + for col in gdf.columns: + if any(isinstance(val, list) for val in gdf[col]): + cols_to_drop.append(col) + + # This a common and know duplicate column name (and others) + bad_column_names = ["atv", "fixme", "FIXME"] + for bad_cn in bad_column_names: + if bad_cn in gdf.columns: + cols_to_drop.append(bad_cn) + + if len(cols_to_drop) > 0: + gdf = gdf.drop(columns=cols_to_drop, axis=1) + + gdf1 = gdf[gdf.geometry.apply(lambda x: x.geom_type == 'LineString')] + + gdf1 = gdf1.to_crs(CRS) + gdf1.to_file(huc_bridge_file, driver="GPKG") + + # returns the HUC but only if it failed so we can keep a list of failed HUCs + return "" + + except Exception: + logging.info(f"\t--- Couldn't write {huc_num}") + logging.info(traceback.format_exc()) + + try: + # rename and we can filter it out later. Even it fails sometimes + if os.path.exists(huc_bridge_file): + os.remove(huc_bridge_file) + except Exception as ex: + print(f"Unable to delete {huc_bridge_file} for huc {huc_num} to add 'bad_' in front") + print(ex) + + return huc_num + # Continue on + + +# +# Combine all HUC-based OSM bridges from specified folder +# +def combine_huc_features(output_dir): + + bridge_file_names = Path(output_dir).glob("huc_*_osm_bridges.gpkg") + + osm_bridge_file = os.path.join(output_dir, "osm_all_bridges.gpkg") + osm_bridge_midpoints_file = os.path.join(output_dir, "osm_all_bridges_midpoints.gpkg") + + all_bridges_gdf_raw = pd.concat([gpd.read_file(gpkg) for gpkg in bridge_file_names], ignore_index=True) + + # only save out a subset of columns, because many hucs have different column names + # and data, so you could end up with thousands of columns if you keep them all! + logging.info(f"Writing bridge lines {osm_bridge_file}") + section_time = dt.datetime.now(dt.timezone.utc) + logging.info(f" .. started: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") + + all_bridges_gdf = all_bridges_gdf_raw[['osmid', 'name', 'geometry']] + all_bridges_gdf.to_file(osm_bridge_file, driver="GPKG") + + # save out midpoints (centroids) of bridge lines + logging.info(f"Writing centroids {osm_bridge_file}") + section_time = dt.datetime.now(dt.timezone.utc) + logging.info(f" .. started: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") + all_bridges_gdf['geometry'] = all_bridges_gdf.centroid + all_bridges_gdf.to_file(osm_bridge_midpoints_file, driver="GPKG") + + return + + +def process_osm_bridges(wbd_file, output_folder, number_of_jobs): + start_time = dt.datetime.now(dt.timezone.utc) + __setup_logger(output_folder) + + print("==================================") + logging.info("Starting load of OSM bridge data") + logging.info(f"Start time: {start_time.strftime('%m/%d/%Y %H:%M:%S')}") + logging.info("") + + # -------------------------- + # Validation + if os.path.exists(wbd_file) is False: + raise Exception(f"The wbd file of {wbd_file} does not exist") + + split_wbd_file_name = os.path.splitext(wbd_file) + if len(split_wbd_file_name) != 2: + raise Exception(f"The wbd file of {wbd_file} does not appear to valid file name") + + if str(split_wbd_file_name[1]).lower() != ".gpkg": + raise Exception(f"The wbd file of {wbd_file} does not appear to valid a gpkg") + + # ------------------- + # Validation + total_cpus_available = os.cpu_count() - 2 + if number_of_jobs > total_cpus_available: + raise ValueError( + f'The number of jobs provided: {number_of_jobs} ,' + ' exceeds your machine\'s available CPU count minus two.' + ' Please lower the number of jobs value accordingly.' + ) + + # -------------------------- + if not os.path.exists(output_folder): + os.mkdir(output_folder) + + logging.info("*** Reading in and reprojecting the WBD HUC8 file") + logging.info("*** Depending on WBD size, this can take a bit. 5 to 40 mins is not uncommon.") + + huc8s = gpd.read_file(wbd_file) + + if len(huc8s) == 0: + raise Exception("wbd_file has no records") + + logging.info(f"wbd rec count is {len(huc8s)}") + section_time = dt.datetime.now(dt.timezone.utc) + logging.info(f"WBD Loaded: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") + + # osm seems to like 4326 + logging.info("") + logging.info("Reprojecting to 4326 (osm seems to like that one)") + huc8s = huc8s.to_crs(pyproj.CRS.from_string("epsg:4326")) + section_time = dt.datetime.now(dt.timezone.utc) + logging.info(f"Reprojection done: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") + + failed_HUCs_list = [] + with ProcessPoolExecutor(max_workers=number_of_jobs) as executor: + futures = {} + for row in huc8s.iterrows(): + huc = row[1] + huc_bridge_file = os.path.join(output_folder, f"huc_{huc['HUC8']}_osm_bridges.gpkg") + args = {"huc_num": huc['HUC8'], "huc_bridge_file": huc_bridge_file, "huc_geom": huc['geometry']} + future = executor.submit(pull_osm_features_by_huc, **args) + futures[future] = future + + for future in as_completed(futures): + if future is not None: + if not future.exception(): + failed_huc = future.result() + if failed_huc != "": + failed_HUCs_list.append(failed_huc) + else: + raise future.exception() + + logging.info("") + logging.info("Pulling hucs now complete") + + logging.info("") + + section_time = dt.datetime.now(dt.timezone.utc) + logging.info(f"Combining feature files started: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") + + # all huc8 processing must be completed before this function call + combine_huc_features(output_folder) + + if len(failed_HUCs_list) > 0: + logging.info("\n+++++++++++++++++++") + logging.info("HUCs that failed to download from OSM correctly are:") + huc_error_msg = " -- " + for huc in failed_HUCs_list: + huc_error_msg += f", {huc} " + logging.info(huc_error_msg) + logging.info(" See logs for more details on each HUC fail") + logging.info("+++++++++++++++++++") + + # Get time metrics + end_time = dt.datetime.now(dt.timezone.utc) + logging.info("") + logging.info("==================================") + logging.info("OSM bridge data load complete") + logging.info(f" End time: {end_time.strftime('%m/%d/%Y %H:%M:%S')}") + + time_delta = end_time - start_time + total_seconds = int(time_delta.total_seconds()) + + ___, rem_seconds = divmod(total_seconds, 60 * 60 * 24) + total_hours, rem_seconds = divmod(rem_seconds, 60 * 60) + total_mins, seconds = divmod(rem_seconds, 60) + + time_fmt = f"{total_hours:02d} hours {total_mins:02d} mins {seconds:02d} secs" + + logging.info(f"Duration: {time_fmt}") + print() + return + + +def __setup_logger(outputs_dir): + ''' + Set up logging to file. Since log file includes the date, it will be overwritten if this + script is run more than once on the same day. + ''' + start_time = dt.datetime.now(dt.timezone.utc) + file_dt_string = start_time.strftime("%y%m%d-%H%M") + + script_file_name = os.path.basename(__file__).split('.')[0] + file_name = f"{script_file_name}-{file_dt_string}.log" + + log_file_path = os.path.join(outputs_dir, file_name) + + if not os.path.exists(outputs_dir): + os.mkdir(outputs_dir) + + # set up logging to file + logging.basicConfig( + filename=log_file_path, level=logging.INFO, format='[%(asctime)s] %(message)s', datefmt='%H:%M:%S' + ) + + # set up logging to console + console = logging.StreamHandler() + console.setLevel(logging.DEBUG) + # set a format which is simpler for console use + # add the handler to the root logger + logging.getLogger('').addHandler(console) + + # logger = logging.getLogger(__name__) + + +if __name__ == "__main__": + ''' + Sample usage (min params): + python3 data/bridges/pull_osm_bridges.py + -w /data/inputs/wbd/WBD_National_HUC8.gpkg + -p /data/inputs/osm/bridges/ + -j 6 + Notes: + - This tool is meant to pull down all the Open Street Map bridge data for CONUS as a + precursor to the bridge healing pre-processing (so, a pre-pre-processing step). + It should be run only as often as the user thinks OSM has had any important updates. + - As written, the code will skip any HUC that there's already a file for. + - Each HUC8's worth of OSM bridge features is saved out individually, then merged together + into one. The HUC8 files can be deleted if desired, as an added final cleanup step. + ''' + + parser = argparse.ArgumentParser(description='Acquires and saves Open Street Map bridge features') + + parser.add_argument( + '-w', + '--wbd_file', + help='REQUIRED: location the gpkg file that will' + ' contain all the HUC8 clip regions in one layer. Must contain field \'HUC8\'.', + required=True, + ) + + parser.add_argument( + '-p', + '--output_folder', + help='REQUIRED: folder path location where individual HUC8 geopackages' + ' will be saved to after being downloaded from OSM.' + ' File names are hardcoded to format hucxxxxxxxx_osm_bridges.gpkg,' + ' with xxxxxxxx as the HUC8 value', + required=True, + ) + + parser.add_argument( + '-j', + '--number_of_jobs', + help='OPTIONAL: Number of (jobs) cores/processes to used.', + required=False, + default=1, + type=int, + ) + + args = vars(parser.parse_args()) + + try: + process_osm_bridges(**args) + + except Exception: + logging.info(traceback.format_exc()) + end_time = dt.datetime.now(dt.timezone.utc) + logging.info(f" End time: {end_time.strftime('%m/%d/%Y %H:%M:%S')}") diff --git a/data/wbd/clip_vectors_to_wbd.py b/data/wbd/clip_vectors_to_wbd.py index 5d4b1ebbe..048539781 100755 --- a/data/wbd/clip_vectors_to_wbd.py +++ b/data/wbd/clip_vectors_to_wbd.py @@ -35,8 +35,6 @@ def extend_outlet_streams(streams, wbd_buffered, wbd): levelpath_outlets['nearest_point'] = None levelpath_outlets['last'] = None - # print(list(levelpath_outlets.columns)) - levelpath_outlets = levelpath_outlets.explode(index_parts=False) for index, row in levelpath_outlets.iterrows(): @@ -57,19 +55,10 @@ def extend_outlet_streams(streams, wbd_buffered, wbd): if isinstance(levelpath_outlets_nearest_points, pd.Series): levelpath_outlets_nearest_points = levelpath_outlets_nearest_points.iloc[-1] - # tlist = list([levelpath_outlets.at[index, 'nearest_point'].coords[0]]) - # tlist = list([levelpath_outlets.at[index, 'nearest_point'].row.geometry.get_coordinates().oords[0]]) - levelpath_outlets.at[index, 'geometry'] = LineString( list(row['geometry'].coords) + list([levelpath_outlets_nearest_points.coords[0]]) ) - # levelpath_outlets.at[index, 'geometry'] = LineString( - # list(row.geometry.get_coordinates()) + list([levelpath_outlets.at[index, 'nearest_point'].coords[0]]) - # ) - - # geometry.get_coordinates() - levelpath_outlets = gpd.GeoDataFrame(data=levelpath_outlets, geometry='geometry') levelpath_outlets = levelpath_outlets.drop(columns=['last', 'nearest_point']) @@ -104,6 +93,9 @@ def subset_vector_layers( wbd_buffer_distance, levee_protected_areas, subset_levee_protected_areas, + osm_bridges, + subset_osm_bridges, + is_alaska, huc_CRS, ): @@ -249,12 +241,35 @@ def subset_vector_layers( engine="fiona", ) else: - print("No NWM catchments within HUC " + str(hucCode) + " boundaries.") logging.info("No NWM catchments within HUC " + str(hucCode) + " boundaries.") sys.exit(0) del nwm_catchments + # Subset OSM (Open Street Map) bridges + if osm_bridges != "": + logging.info(f"Subsetting OSM Bridges for {hucCode}") + + subset_osm_bridges_gdb = gpd.read_file(osm_bridges, mask=wbd_buffer, engine="fiona") + if subset_osm_bridges_gdb.empty: + print("-- No applicable bridges for this HUC") + logging.info("-- No applicable bridges for this HUC") + else: + logging.info(f"Create subset of osm bridges gpkg for {hucCode}") + if is_alaska is True: + # we need to reproject + subset_osm_bridges_gdb = subset_osm_bridges_gdb.to_crs(huc_CRS) + + subset_osm_bridges_gdb.to_file( + subset_osm_bridges, + driver=getDriver(subset_osm_bridges), + index=False, + crs=huc_CRS, + engine="fiona", + ) + + del subset_osm_bridges_gdb + # Subset nwm streams logging.info(f"Subsetting NWM Streams for {hucCode}") nwm_streams = gpd.read_file(nwm_streams, mask=wbd_buffer, engine="fiona") @@ -340,7 +355,7 @@ def subset_vector_layers( parser.add_argument( '-lps', '--subset-levee-protected-areas', help='Levee-protected areas subset', required=True ) - + parser.add_argument('-osm', '--osm-bridges', help='Open Street Maps gkpg', required=True) parser.add_argument('-crs', '--huc-CRS', help='HUC crs', required=True) args = vars(parser.parse_args()) diff --git a/data/wbd/generate_pre_clip_fim_huc8.py b/data/wbd/generate_pre_clip_fim_huc8.py index 6bf2ea581..8a34e6837 100755 --- a/data/wbd/generate_pre_clip_fim_huc8.py +++ b/data/wbd/generate_pre_clip_fim_huc8.py @@ -83,6 +83,8 @@ input_nld_levee_protected_areas = os.getenv('input_nld_levee_protected_areas') input_nld_levee_protected_areas_Alaska = os.getenv('input_nld_levee_protected_areas_Alaska') +input_osm_bridges = os.getenv('osm_bridges') + # Variables from config/params_template.env wbd_buffer = os.getenv('wbd_buffer') wbd_buffer_int = int(wbd_buffer) @@ -94,7 +96,7 @@ def __setup_logger(outputs_dir, huc=None): script is run more than once on the same day. ''' datetime_now = dt.datetime.now(dt.timezone.utc) - curr_date = datetime_now.strftime("%m_%d_%Y") + curr_date = datetime_now.strftime("%y%my%d") if huc is None: log_file_name = f"generate_pre_clip_fim_huc8_{curr_date}.log" @@ -132,14 +134,32 @@ def __merge_mp_logs(outputs_dir): log_mp_rollup_file = os.path.join(outputs_dir, "mp_merged_logs.log") + error_huc_found = False + with open(log_mp_rollup_file, 'a') as main_log: # Iterate through list for temp_log_file in log_file_list: # Open each file in read mode with open(temp_log_file) as infile: - main_log.write(infile.read()) + contents = infile.read() + temp_upper_contents = contents.upper() + if "ERROR" in temp_upper_contents: + print( + f"\nAn error exist in file {temp_log_file}." + " Check the merge logs for that huc number" + ) + error_huc_found = True + main_log.write(contents) os.remove(temp_log_file) + if error_huc_found: + print( + "\n\nOften you can just create a new huc list with the fails, re-run to a" + " 1temp directory and recheck if errors still exists. Sometimes multi-prod can create" + " contention errors.\nFor each HUC that is sucessful, you can just copy it back" + " into the original full pre-clip folder.\n" + ) + def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): ''' @@ -175,10 +195,6 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): ) number_of_jobs = total_cpus_available - 2 - # Set up logging and set start_time - __setup_logger(outputs_dir) - start_time = dt.datetime.now(dt.timezone.utc) - # Read in huc_list file and turn into a list data structure if os.path.exists(huc_list): hucs_to_pre_clip_list = open(huc_list).read().splitlines() @@ -192,6 +208,10 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): " is to re-generate all of the data. " ) + # Set up logging and set start_time + __setup_logger(outputs_dir) + start_time = dt.datetime.now(dt.timezone.utc) + # Iterate over the huc_list argument and create a directory for each huc. for huc in hucs_to_pre_clip_list: if os.path.isdir(os.path.join(outputs_dir, huc)): @@ -223,6 +243,11 @@ def pre_clip_hucs_from_wbd(outputs_dir, huc_list, number_of_jobs, overwrite): # with Pool(processes=number_of_jobs) as pool: # pool.map(huc_level_clip_vectors_to_wbd, procs_list) + # TODO: Mar 5, 2024: Python native logging does not work well with Multi-proc. We will + # likely eventually drop in ras2fim's logging system. + # The log files for each multi proc has tons and tons of duplicate lines crossing mp log + # processes, but does always log correctly back to the parent log + with ProcessPoolExecutor(max_workers=number_of_jobs) as executor: futures = {} for huc in hucs_to_pre_clip_list: @@ -381,6 +406,9 @@ def huc_level_clip_vectors_to_wbd(huc, outputs_dir): wbd_buffer_distance=wbd_buffer_int, levee_protected_areas=input_nld_levee_protected_areas_Alaska, subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + osm_bridges=input_osm_bridges, + subset_osm_bridges=f"{huc_directory}/osm_bridges_subset.gpkg", + is_alaska=True, huc_CRS=huc_CRS, # TODO: simplify ) @@ -410,6 +438,9 @@ def huc_level_clip_vectors_to_wbd(huc, outputs_dir): wbd_buffer_distance=wbd_buffer_int, levee_protected_areas=input_nld_levee_protected_areas, subset_levee_protected_areas=f"{huc_directory}/LeveeProtectedAreas_subset.gpkg", + osm_bridges=input_osm_bridges, + subset_osm_bridges=f"{huc_directory}/osm_bridges_subset.gpkg", + is_alaska=False, huc_CRS=huc_CRS, # TODO: simplify ) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 64be87feb..754885541 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,30 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.0.0 - 2024-05-06 - [PR#1122](https://github.com/NOAA-OWP/inundation-mapping/pull/1122) + +This PR includes 2 scripts to add Open Street Map bridge data into the HAND process: a script that pulls data from OSM and a script that heals those bridges in the HAND grids. Both scripts should be run as part of a pre-processing step for FIM runs. They only need to be run if we think OSM data has changed a lot or for any new FIM versions. + +A new docker image is also required for `pull_osm_bridges.py` (acquire and preprocess) script. + +### Additions +- `data/bridges/pull_osm_bridges.py`: First pre-processing script that pulls OSM data and saves bridge lines out as separate shapefiles by HUC8 to a specified location +- `src/heal_bridges_osm.py`: Second pre-processing script that uses the pre-saved OSM bridge lines and heals max HAND values across those bridge lines. Healed HAND grids are saved to a specified location. + +### Changes +- `Pipfile`, `Pipfile.lock`: Adjusted files to add new python package to docker image. +- `data` + - `clip_vectors_to_wdbd.py`: Updated to pre-clip new bridge data. Logging upgraded. + - `generate_pre_clip_fim_huc8.py`: Updated to pre-clip new bridge data. Logging added and a system for multi-process logging. +- `src` + - `delineate_hydros_and_produce_HAND.sh`: add python call to run `heal_bridges_osm.py` after hydraulic properties are calculated. + - `bash_variables.env`: Added new variable for OSM bridges and adjusted pre-clip output date + - `utils` + - `shared_functions.py`: removed function no longer in use. + - `shared_variables.py`: removed variables no longer in use. + +

+ ## v4.4.16.0 - 2024-05-06 - [PR#1121](https://github.com/NOAA-OWP/inundation-mapping/pull/1121) Some NWM streams, particularly in coastal areas, fail to reach the edge of the DEM resulting in reverse flow. This issue was resolved by clipping the ocean mask from the buffered WBD and DEM, and any remaining streams that didn't have outlets reaching the edge of the buffered WBD boundary were extended by snapping the end to the nearest point on the buffered WBD. diff --git a/src/bash_variables.env b/src/bash_variables.env index 0fc032483..ff242a9cc 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -25,8 +25,9 @@ export input_nwm_lakes_Alaska=${inputsDir}/nwm_hydrofabric/nwm_ export input_WBD_gdb=${inputsDir}/wbd/WBD_National_EPSG_5070_WBDHU8_clip_dem_domain.gpkg export input_WBD_gdb_Alaska=${inputsDir}/wbd/WBD_National_South_Alaska.gpkg export input_calib_points_dir=${inputsDir}/rating_curve/water_edge_database/calibration_points/ -export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/24_4_3 # was 23_10_17 +export pre_clip_huc_dir=${inputsDir}/pre_clip_huc8/240502 export bathymetry_file=${inputsDir}/bathymetry/bathymetry_adjustment_data.gpkg +export osm_bridges=${inputsDir}/osm/bridges/240426/osm_all_bridges.gpkg # input file location with nwm feature_id and recurrence flow values export bankfull_flows_file=${inputsDir}/rating_curve/bankfull_flows/nwm_high_water_threshold_cms.csv diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 527ae54d2..05667dd90 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -218,6 +218,7 @@ if [ -f $tempCurrentBranchDataDir/LandSea_subset_$current_branch_id.tif ]; then --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" fi + ## HYDRAULIC PROPERTIES ## echo -e $startDiv"Sample reach averaged parameters $hucNumber $current_branch_id" $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ @@ -227,6 +228,24 @@ $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$curr -h $tempCurrentBranchDataDir/stage_$current_branch_id.txt \ -table $tempCurrentBranchDataDir/src_base_$current_branch_id.csv + + +## HEAL HAND BRIDGES (note resolution is set to 10m) +# May or may not be a bridge file, depends if the HUC has an applicble one. +# Writing back over the rem_zeroed_masked branch tif +if [ -f $tempHucDataDir/osm_bridges_subset.gpkg ]; then + echo -e $startDiv"Burn in bridges $hucNumber $current_branch_id" + python3 $srcDir/heal_bridges_osm.py \ + -g $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ + -s $tempHucDataDir/osm_bridges_subset.gpkg \ + -p $tempCurrentBranchDataDir/bridge_lines_raster_$current_branch_id.tif \ + -t $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ + -r 10 +else + -e $startDiv"No applicable bridge data for $hucNumber" +fi + + ## FINALIZE CATCHMENTS AND MODEL STREAMS ## echo -e $startDiv"Finalize catchments and model streams $hucNumber $current_branch_id" python3 $srcDir/add_crosswalk.py \ diff --git a/src/heal_bridges_osm.py b/src/heal_bridges_osm.py new file mode 100644 index 000000000..bd72a481d --- /dev/null +++ b/src/heal_bridges_osm.py @@ -0,0 +1,146 @@ +import argparse +import os + +import geopandas as gpd +import numpy as np +import rasterio +from rasterio import features, transform +from rasterstats import zonal_stats + + +def process_bridges_in_huc( + source_hand_raster, bridge_vector_file, bridge_raster, output_bridge_lines_raster_file, resolution +): + """ + Process: + - Use the osm_file, likely already pre-clipped to a huc, and create a raster from it. + - using the incomeing source_raster, likely a rem at this point, find the max point value for intersecting from the + line string. Fundemtally create a z value for the line string based on the touch point of the linestring on both + banks. TODO: how does it handle higher elevation on one bank? Might already be in this logic.. not sure. + - That value will be assigned to each cell that covers the bridge in the output raster. + - We do create a temp raster which we can removed in the "deny" list system. We can use it to show the point values + assigned to each cell of the bridge. + """ + + if not os.path.exists(source_hand_raster): + print(f"-- no hand grid, {source_hand_raster}") + return + + if os.path.exists(bridge_vector_file): + osm_gdf = gpd.read_file(bridge_vector_file) + else: + # skip this huc because it didn't pull in the initial OSM script + # and could have errors in the data or geometry + print(f"-- no OSM file, {bridge_vector_file}") + return + + hand_grid = rasterio.open(source_hand_raster) + + ####################################################################### + + ############# get max hand values for each bridge ######### + # find max hand value from raster each linestring intersects + osm_gdf['max_hand'] = zonal_stats( + osm_gdf['geometry'], hand_grid.read(1), affine=hand_grid.transform, stats="max" + ) + # pull the values out of the geopandas columns so we can use them as floats + osm_gdf['max_hand'] = [x.get('max') for x in osm_gdf.max_hand] + # sort in case of overlaps; display max hand value at any given location + osm_gdf = osm_gdf.sort_values(by="max_hand", ascending=False) + ####################################################### + + ########### setup new raster to save bridge max hand values ############# + bbox = hand_grid.bounds + xmin, ymin, xmax, ymax = bbox + w = (xmax - xmin) // resolution + h = (ymax - ymin) // resolution + + out_meta = { + "driver": "GTiff", + "dtype": "float32", + "height": h, + "width": w, + "count": 1, + "crs": hand_grid.crs, + "nodata": -999999, + "transform": transform.from_bounds(xmin, ymin, xmax, ymax, w, h), + "compress": 'lzw', + } + + ################# rasterize the incoming bridge vectors #################### + with rasterio.open(bridge_raster, 'w+', **out_meta) as out: + out_arr = out.read(1) + # this is where we create a generator of geom, value pairs to use in rasterizing + shapes = ((geom, value) for geom, value in zip(osm_gdf.geometry, osm_gdf.max_hand)) + # burn in values to any pixel that's touched by polygon and add nodata fill value + burned = features.rasterize( + shapes=shapes, fill=-999999, out=out_arr, transform=out.transform, all_touched=True + ) + out.write_band(1, burned) + + #################### heal / update hand grid ########################## + with rasterio.open(bridge_raster) as in_data: + new_hand_values = in_data.read(1) + + hand_grid_vals = hand_grid.read(1) + # replace values at all locations where there are healed values available + combined_hand_values = np.where(new_hand_values == -999999, hand_grid_vals, new_hand_values) + + with rasterio.open(output_bridge_lines_raster_file, 'w+', **out_meta) as out: + out.write(combined_hand_values, 1) + + return + + +if __name__ == "__main__": + ''' + Sample usage (min params): + python3 src/heal_bridges_osm.py + -u 12090301 + -g /outputs/fim_4_4_15_0/1209301/branches/3763000013/rem_zeroed_masked_3763000013.tif + -s /outputs/fim_4_4_15_0/1209301/osm_bridges_subset.gpkg + -p /outputs/fim_4_4_15_0/1209301/1209301/branches/3763000013/bridge_lines_raster_3763000013.tif + -t /outputs/fim_4_4_15_0/1209301/branches/3763000013/rem_zeroed_masked_3763000013.tif + -r 10 + + ''' + + parser = argparse.ArgumentParser(description='Rasterizes max HAND values under OSM lines and heals HAND') + + parser.add_argument( + '-g', + '--source_hand_raster', + help='REQUIRED: Path and file name of source output raster', + required=True, + ) + + parser.add_argument( + '-s', '--bridge_vector_file', help='REQUIRED: A gpkg that contains the bridges vectors', required=True + ) + + parser.add_argument( + '-p', + '--bridge_raster', + help='REQUIRED: Path and file name of the temp raster created by the bridge vectors', + required=True, + ) + + parser.add_argument( + '-t', + '--output_bridge_lines_raster_file', + help='REQUIRED: Path and file name of the new raster with the bridge burned in', + required=True, + ) + + parser.add_argument( + '-r', + '--resolution', + help='OPTIONAL: Resolution of HAND grid. Default value is 10m', + required=False, + default=10, + type=int, + ) + + args = vars(parser.parse_args()) + + process_bridges_in_huc(**args) diff --git a/src/utils/shared_functions.py b/src/utils/shared_functions.py index 45e078b12..b30f515e3 100644 --- a/src/utils/shared_functions.py +++ b/src/utils/shared_functions.py @@ -73,37 +73,6 @@ def run_system_command(args): os.system(command) -def subset_wbd_gpkg(wbd_gpkg, multilayer_wbd_geopackage): - print("Subsetting " + wbd_gpkg + "...") - # Read geopackage into dataframe. - wbd = gp.read_file(wbd_gpkg) - gdf = gp.GeoDataFrame(wbd) - - for index, row in gdf.iterrows(): - state = row["STATES"] - if state is not None: # Some polygons are empty in the STATES field. - keep_flag = False # Default to Fault, i.e. to delete the polygon. - if state in sv.CONUS_STATE_LIST: - keep_flag = True - # Only split if multiple states present. More efficient this way. - elif len(state) > 2: - for wbd_state in state.split( - "," - ): # Some polygons have multiple states, separated by a comma. - if ( - wbd_state in sv.CONUS_STATE_LIST - ): # Check each polygon to make sure it's state abbrev name is allowed. - keep_flag = True - break - if not keep_flag: - gdf = gdf.drop(index) # Delete from dataframe. - - # Overwrite geopackage. - layer_name = os.path.split(wbd_gpkg)[1].strip('.gpkg') - gdf.crs = sv.PREP_PROJECTION - gdf.to_file(multilayer_wbd_geopackage, layer=layer_name, driver='GPKG', index=False) - - def get_fossid_from_huc8( huc8_id, foss_id_attribute='fossid', diff --git a/src/utils/shared_variables.py b/src/utils/shared_variables.py index 99951e1d7..72a28a66b 100644 --- a/src/utils/shared_variables.py +++ b/src/utils/shared_variables.py @@ -99,65 +99,6 @@ } -# -- Other -- # -CONUS_STATE_LIST = { - "AL", - "AZ", - "AR", - "CA", - "CO", - "CT", - "DC", - "DE", - "FL", - "GA", - "HI", - "ID", - "IL", - "IN", - "IA", - "KS", - "KY", - "LA", - "ME", - "MD", - "MA", - "MI", - "MN", - "MS", - "MO", - "MT", - "NE", - "NV", - "NH", - "NJ", - "NM", - "NY", - "NC", - "ND", - "OH", - "OK", - "OR", - "PA", - "PR", - "RI", - "SC", - "SD", - "TN", - "TX", - "UT", - "VT", - "VA", - "WA", - "WV", - "WI", - "WY", -} - -OVERWRITE_WBD = 'OVERWRITE_WBD' -OVERWRITE_NHD = 'OVERWRITE_NHD' -OVERWRITE_ALL = 'OVERWRITE_ALL' - # Rating Curve Adjustment (local calibration) variables USGS_CALB_TRACE_DIST = 8.0 # distance in km to walk the network and perform USGS rating calibation for SRCs DOWNSTREAM_THRESHOLD = 8.0 # distance in km to propogate new roughness values downstream (group mean) From 0170870e0e8cae1ca28f4ff1afe6eb1e551f3851 Mon Sep 17 00:00:00 2001 From: Rob Hanna - NOAA <90854818+RobHanna-NOAA@users.noreply.github.com> Date: Mon, 6 May 2024 21:00:09 +0000 Subject: [PATCH 42/51] Add pre-commit and deploy notes (#1144) --- .github/PULL_REQUEST_TEMPLATE.md | 10 +++++++++ CONTRIBUTING.md | 35 +++++++++++++++++++++++--------- 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4cb221383..f9265baef 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -8,6 +8,16 @@ ### Testing +### Deployment Plan (For developer use) + +_How does the changes affect the product?_ +- [ ] Code only? +- [ ] Require new or adjusted data inputs. Does it have start, end and duration code (in UTC)? +- [ ] If new or updated data updates, has FIM related code been updated and tested? +- [ ] Require new pre-clip set? +- [ ] Has new or updated python packages? +- [ ] If applicable, is the deployment plan be calculated and work with Deployment person/team? + ### Issuer Checklist (For developer use) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a66e1971f..3e114abed 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,7 +45,13 @@ If you would like to contribute, please follow these steps: ``` git checkout -b ``` -4. Pre-commit installation: + +4. Build the Docker container (if not already done in the [README.md](./README.md) page.): + ``` + Docker build -f Dockerfile -t : + ``` + +5. Pre-commit installation: [pre-commit](https://pre-commit.com/) is used to run auto-formatting and enforce styling rules. It is a critical part of development and is enforced at the 'git commit' step. Key tools are included **inside the docker container** if you want to execute the correctly configured linting and formatting command line executables there. If you intend to execute `flake8`, `black` or `isort` from the command line **outside of the docker container**, additional configuration and installation is required, which will not be described here. @@ -75,7 +81,7 @@ If you would like to contribute, please follow these steps: It should respond with the phrase *pre-commit 3.6.0* (version may not be exact). -5. pre-commit configuration: +6. pre-commit configuration: Now, you need to configure your local clone of the repo to honor the pre-commit hooks. The `pre-commit` package is used to pick up the pre-commit hooks which verify your staged changes adhere to the project's style and format requirements (configuration defined in [pyproject.toml](/pyproject.toml)). @@ -85,24 +91,33 @@ If you would like to contribute, please follow these steps: $ pre-commit install ``` -6. At this point, you should be set up with `pre-commit`. When a commit is made it will run the pre-commit hooks defined in [`.pre-commit-config.yaml`](.pre-commit-config.yaml). For reference, you may run any of the pre-commit hooks manually before issuing the `git commit` command (see below). Some tools used by the pre commit git hook (`isort`, `flake8`, & `black`) are also available as command line executables **within the Docker container***, however, it is recommended to run them through `pre-commit` **outside of the container**, as it picks up the correct configuration. +7. At this point, you should be set up with `pre-commit`. When a commit is made it will run the pre-commit hooks defined in [`.pre-commit-config.yaml`](.pre-commit-config.yaml). For reference, you may run any of the pre-commit hooks manually before issuing the `git commit` command (see below). Some tools used by the pre commit git hook (`isort`, `flake8`, & `black`) are also available as command line executables **within the Docker container***, however, it is recommended to run them through `pre-commit` **outside of the container**, as it picks up the correct configuration. ``` + There are multiple ways to run pre-commit tests. Here are three: + # Check only the staged changes pre-commit run # Check all files in the repo pre-commit run -a - # Run only the flake8, isort, or black. - pre-commit run -a flake8 + # Run only the isort, black, flake8 (in order). pre-commit run -a isort - pre-commit run -a black + pre-commit run -a black (If it fails the first time, run it again and now apply a fix if required) + pre-commit run -a flake8 ``` -7. Build the Docker container: - ``` - Docker build -f Dockerfile -t : - ``` + **Note: The pre-commit system can be a bit tricky. If you have trouble with pre-commit steps above, you have another option.** Some environments may require add the word **sudo** in front commands . + ``` + # Open up a docker container + cd /foss_fim + isort . + black . + flake8 . + + # optionally close the container + # Back on your terminal console (outside the container), use the typical git add, git commit, git push + 8. [Within the container](README.md#startrun-the-docker-container), ensure sure unit tests pass ([instructions here](/unit_tests/README.md)). ``` From 45a04303f2bf0098915a6bd05e34acb9f94c4f4b Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Thu, 9 May 2024 10:46:25 -0600 Subject: [PATCH 43/51] v4.5.0.1 Bug fixes for v4.5.0.0 (#1150) --- .github/PULL_REQUEST_TEMPLATE.md | 6 +++--- docs/CHANGELOG.md | 17 ++++++++++++++++ src/add_crosswalk.py | 26 +++++++++++++++++++++--- src/bash_variables.env | 5 ++++- src/delineate_hydros_and_produce_HAND.sh | 4 ++-- src/heal_bridges_osm.py | 8 ++++---- src/run_unit_wb.sh | 5 ++--- 7 files changed, 55 insertions(+), 16 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f9265baef..3bcbdf0fa 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -12,11 +12,11 @@ _How does the changes affect the product?_ - [ ] Code only? -- [ ] Require new or adjusted data inputs. Does it have start, end and duration code (in UTC)? -- [ ] If new or updated data updates, has FIM related code been updated and tested? +- [ ] Require new or adjusted data inputs? Does it have start, end and duration code (in UTC)? +- [ ] If new or updated data sets, has the FIM code been updated and tested with the new/adjusted data (subset is fine, but must be a subset of the new data)? - [ ] Require new pre-clip set? - [ ] Has new or updated python packages? -- [ ] If applicable, is the deployment plan be calculated and work with Deployment person/team? +- [ ] If applicable, has a deployment plan be created with the deployment person/team? ### Issuer Checklist (For developer use) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 754885541..c904fef02 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,23 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.0.1 - 2024-05-09 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) + +Fixes two bugs discovered in v4.5.0.0: +1. `echo` missing in bash command +2. raster resolution of `dem_meters.tif` has now been explicitly set in `gdalwarp`. + +### Changes + +- `src/` + - `add_crosswalk.py`: fixed stream order if max > `max_order` + - `bash_variables.env`: added `res` environment variable for default raster cell size + - `delineate_hydros_and_produce_HAND.sh`: added missing `echo` + - `heal_bridges_osm.py`: fixed raster resolution and number of rows/columns + - `run_unit_wb.sh`: added `-tr` to gdalwarp when generating `dem_meters.tif`; removed extraneous `Tcount` + +

+ ## v4.5.0.0 - 2024-05-06 - [PR#1122](https://github.com/NOAA-OWP/inundation-mapping/pull/1122) This PR includes 2 scripts to add Open Street Map bridge data into the HAND process: a script that pulls data from OSM and a script that heals those bridges in the HAND grids. Both scripts should be run as part of a pre-processing step for FIM runs. They only need to be run if we think OSM data has changed a lot or for any new FIM versions. diff --git a/src/add_crosswalk.py b/src/add_crosswalk.py index 2331e4c65..ddc9444df 100755 --- a/src/add_crosswalk.py +++ b/src/add_crosswalk.py @@ -244,12 +244,32 @@ def add_crosswalk( (output_flows.From_Node == to_node) & (output_flows['order_'] == max_order) ]['HydroID'].item() + # output_flows has a higher order than the max_order + elif output_flows.loc[(output_flows.From_Node == to_node), 'order_'].max() > max_order: + update_id = output_flows.loc[ + (output_flows.From_Node == to_node) + & ( + output_flows['order_'] + == output_flows.loc[(output_flows.From_Node == to_node), 'order_'].max() + ) + ]['HydroID'].values[0] + # Get the first one # Same stream order, without drainage area info it is hard to know which is the main channel. else: - update_id = output_flows.loc[ - (output_flows.From_Node == to_node) & (output_flows['order_'] == max_order) - ]['HydroID'].values[0] + if max_order in output_flows.loc[output_flows.From_Node == to_node, 'order_'].values: + update_id = output_flows.loc[ + (output_flows.From_Node == to_node) & (output_flows['order_'] == max_order) + ]['HydroID'].values[0] + + else: + update_id = output_flows.loc[ + (output_flows.From_Node == to_node) + & ( + output_flows['order_'] + == output_flows.loc[output_flows.From_Node == to_node, 'order_'].max() + ) + ]['HydroID'].values[0] # no upstream segments; single downstream segment elif len(output_flows.loc[output_flows.From_Node == to_node]['HydroID']) == 1: diff --git a/src/bash_variables.env b/src/bash_variables.env index ff242a9cc..42513fad8 100644 --- a/src/bash_variables.env +++ b/src/bash_variables.env @@ -1,8 +1,11 @@ ## Define inputs -# NOTE: $inputsDir is defined in Dockerfile +export res=10 # Default raster cell size in meters + export DEFAULT_FIM_PROJECTION_CRS=EPSG:5070 export ALASKA_CRS=EPSG:3338 + +# NOTE: $inputsDir is defined in Dockerfile export input_DEM=${inputsDir}/3dep_dems/10m_5070/fim_seamless_3dep_dem_10m_5070.vrt export input_DEM_Alaska=${inputsDir}/3dep_dems/10m_South_Alaska/23_11_07/FIM_3dep_dem_South_Alask_10m.vrt export input_DEM_domain=${inputsDir}/3dep_dems/10m_5070/HUC6_dem_domain.gpkg diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 05667dd90..379761f1a 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -240,9 +240,9 @@ if [ -f $tempHucDataDir/osm_bridges_subset.gpkg ]; then -s $tempHucDataDir/osm_bridges_subset.gpkg \ -p $tempCurrentBranchDataDir/bridge_lines_raster_$current_branch_id.tif \ -t $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ - -r 10 + -r $res else - -e $startDiv"No applicable bridge data for $hucNumber" + echo -e $startDiv"No applicable bridge data for $hucNumber" fi diff --git a/src/heal_bridges_osm.py b/src/heal_bridges_osm.py index bd72a481d..288572fc5 100644 --- a/src/heal_bridges_osm.py +++ b/src/heal_bridges_osm.py @@ -52,8 +52,8 @@ def process_bridges_in_huc( ########### setup new raster to save bridge max hand values ############# bbox = hand_grid.bounds xmin, ymin, xmax, ymax = bbox - w = (xmax - xmin) // resolution - h = (ymax - ymin) // resolution + w = hand_grid.shape[1] + h = hand_grid.shape[0] out_meta = { "driver": "GTiff", @@ -74,7 +74,7 @@ def process_bridges_in_huc( shapes = ((geom, value) for geom, value in zip(osm_gdf.geometry, osm_gdf.max_hand)) # burn in values to any pixel that's touched by polygon and add nodata fill value burned = features.rasterize( - shapes=shapes, fill=-999999, out=out_arr, transform=out.transform, all_touched=True + shapes=shapes, fill=-999999, out=out_arr, transform=hand_grid.transform, all_touched=True ) out.write_band(1, burned) @@ -138,7 +138,7 @@ def process_bridges_in_huc( help='OPTIONAL: Resolution of HAND grid. Default value is 10m', required=False, default=10, - type=int, + type=float, ) args = vars(parser.parse_args()) diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 03129bfa3..348b5518e 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -119,13 +119,12 @@ echo -e $startDiv"Clipping rasters to branches $hucNumber $branch_zero_id" [ ! -f $tempCurrentBranchDataDir/dem_meters.tif ] && \ gdalwarp -cutline $tempHucDataDir/wbd_buffered.gpkg -crop_to_cutline -ot Float32 -r bilinear -of "GTiff" \ -overwrite -co "BLOCKXSIZE=512" -co "BLOCKYSIZE=512" -co "TILED=YES" -co "COMPRESS=LZW" \ - -co "BIGTIFF=YES" -t_srs $huc_CRS $input_DEM $tempHucDataDir/dem_meters.tif + -co "BIGTIFF=YES" -t_srs $huc_CRS -tr $res $res $input_DEM $tempHucDataDir/dem_meters.tif -Tcount ## GET RASTER METADATA echo -e $startDiv"Get DEM Metadata $hucNumber $branch_zero_id" -read fsize ncols nrows ndv xmin ymin xmax ymax cellsize_resx cellsize_resy\ +read fsize ncols nrows ndv xmin ymin xmax ymax cellsize_resx cellsize_resy \ <<<$($srcDir/getRasterInfoNative.py $tempHucDataDir/dem_meters.tif) ## RASTERIZE NLD MULTILINES ## From a488fe2a75107b9b9b3eb99e7560be069839a07f Mon Sep 17 00:00:00 2001 From: AliForghani-NOAA <124194814+AliForghani-NOAA@users.noreply.github.com> Date: Fri, 17 May 2024 16:04:16 -0400 Subject: [PATCH 44/51] v4.5.0.2 Update nws_lid dataset with Alaska sites (#1159) --- docs/CHANGELOG.md | 22 +++++++++++ tools/generate_nws_lid.py | 83 +++------------------------------------ 2 files changed, 27 insertions(+), 78 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c904fef02..7ee764749 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,28 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.0.2 - 2024-05-17 - [PR#1159](https://github.com/NOAA-OWP/inundation-mapping/pull/1159) + +This PR addresses issue #1132 and include the following changes on `tools/generate_nws_lid.py` for updating `nws_lid.gpkg` dataset. + +In this revised version, stations only from these two groups are retrieved: +- lid stations with `rfc_forecast_point= True` +- lid stations in `/data/inputs/ahp_sites/evaluated_ahps_sites.csv` + +The lid stations in AK (Alaska), HI, and PR, with above two criteria have also been selected, as shown in the map below. In the previous version of the code, **all of lid stations** in PR and HI (regardless of meeting above two criteria), were also being retrieved. I have updated this version to exclude such stations. + +Also, In this revised version, I've eliminated the code sections that previously generated the "is_headwater" and "is_colocated" columns, which are not needed in FIM4. Therefore, in this updated version, these columns are no longer present. + +Similar to 'usgs_gages.gpkg' dataset, all lid stations, including those in Alaska, are stored in a single gpkg file (`nws_lid.gpkg`) with EPSG=5070. The Alaska stations can be identified using their HUC8 numbers (beginning with '19'). + + +### Changes +- tools/generate_nws_lid.py + +

+ + + ## v4.5.0.1 - 2024-05-09 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) Fixes two bugs discovered in v4.5.0.0: diff --git a/tools/generate_nws_lid.py b/tools/generate_nws_lid.py index ac769134b..b91e0fe94 100644 --- a/tools/generate_nws_lid.py +++ b/tools/generate_nws_lid.py @@ -22,14 +22,11 @@ API_BASE_URL = os.getenv("API_BASE_URL") EVALUATED_SITES_CSV = os.getenv("EVALUATED_SITES_CSV") WBD_LAYER = os.getenv("WBD_LAYER") -# Define path to NWM stream layer -NWM_FILE = '/data/inputs/nwm_hydrofabric/nwm_flows.gpkg' def generate_nws_lid(workspace): ''' - Generate the nws_lid layer containing all nws_lid points attributed - whether site is mainstems and co-located + Generate the nws_lid layer containing all nws_lid points Parameters ---------- @@ -79,22 +76,8 @@ def generate_nws_lid(workspace): downstream_trace_distance=downstream_trace_distance, ) - # Trace downstream from all sites in HI/PR. - select_by = 'state' - selector = ['HI', 'PR'] - must_include = None - downstream_trace_distance = 'all' - islands_list, islands_dataframe = get_metadata( - metadata_url=metadata_url, - select_by=select_by, - selector=selector, - must_include=must_include, - upstream_trace_distance=None, - downstream_trace_distance=downstream_trace_distance, - ) - # Append all lists - all_lists = fcst_list + eval_list + islands_list + all_lists = fcst_list + eval_list # Compile NWM segments from all_lists @@ -129,73 +112,17 @@ def generate_nws_lid(workspace): # Dictionary with key of 2nd to last downstream segment and value of site nwm segment downstream[int(key)].append(int(value)) - # Walk downstream the network and identify headwater points - print('Traversing network..') - - # Import NWM file and create dictionary of network and create the NWM network dictionary. - nwm_gdf = gpd.read_file(NWM_FILE) - network = nwm_gdf.groupby('ID')['to'].apply(list).to_dict() - - # Walk through network and find headwater points - all_dicts = {} - for tree, targets in downstream.items(): - # All targets are assigned headwaters - sub_dict = {i: 'is_headwater' for i in targets} - # Walk downstream of each target - for i in targets: - # Check to see element is not a headwater - if sub_dict[i] == 'not_headwater': - continue - # Get from_node and to_node. - from_node = i - [to_node] = network[from_node] - # Walk downstream from target - while to_node > 0: - # Check if to_node is in targets list - if to_node in targets: - sub_dict[to_node] = 'not_headwater' - # Assign downstream ID as to_node - [to_node] = network[to_node] - - # Append status to master dictionary - all_dicts.update(sub_dict) - - # Create dictionaries of nws_lid (key) and headwater status (value) and nws_lid (key) and - # co-located with same feature_id(value) - final_dict = {} - duplicate_dict = {} - for key, status in all_dicts.items(): - site_list = target[key] - for site in site_list: - final_dict[site] = status - if len(site_list) > 1: - duplicate_dict[site] = 'is_colocated' - else: - duplicate_dict[site] = 'not_colocated' - # Get Spatial data and populate headwater/duplicate attributes print('Attributing nws_lid layer..') # Geodataframe from all_lists, reproject, and reset index. - trash, nws_lid_gdf = aggregate_wbd_hucs(all_lists, WBD_LAYER, retain_attributes=False) + _, nws_lid_gdf = aggregate_wbd_hucs(all_lists, WBD_LAYER, retain_attributes=False) nws_lid_gdf.columns = [name.replace('identifiers_', '') for name in nws_lid_gdf.columns] nws_lid_gdf.to_crs(PREP_PROJECTION, inplace=True) nws_lid_gdf.reset_index(drop=True) - - # Create DataFrames of headwater and duplicates and join. - final_dict_pd = pd.DataFrame(list(final_dict.items()), columns=['nws_lid', 'is_headwater']) - duplicate_dict_pd = pd.DataFrame(list(duplicate_dict.items()), columns=['nws_lid', 'is_colocated']) - attributes = final_dict_pd.merge(duplicate_dict_pd, on='nws_lid') - attributes.replace( - {'is_headwater': True, 'is_colocated': True, 'not_headwater': False, 'not_colocated': False}, - inplace=True, - ) - - # Join attributes, remove sites with no assigned nwm_feature_id and write to file - joined = nws_lid_gdf.merge(attributes, on='nws_lid', how='left') - joined.dropna(subset=['nwm_feature_id'], inplace=True) Path(workspace).mkdir(parents=True, exist_ok=True) - joined.to_file(Path(workspace) / 'nws_lid.gpkg', driver='GPKG') + nws_lid_gdf.dropna(subset=['nwm_feature_id'], inplace=True) + nws_lid_gdf.to_file(Path(workspace) / 'nws_lid.gpkg', driver='GPKG') if __name__ == '__main__': From eaeb4c857b698f4439467aa75520bc178f979195 Mon Sep 17 00:00:00 2001 From: HeidiSafa-NOAA Date: Fri, 17 May 2024 20:10:46 +0000 Subject: [PATCH 45/51] v4.5.1.0 Healed hand removing hydro-conditioning artifacts and testing (#1156) --- config/params_template.env | 4 + docs/CHANGELOG.md | 14 ++ src/delineate_hydros_and_produce_HAND.sh | 11 ++ tools/analyze_for_missing_FIM_cells.py | 187 +++++++++++++++++++++++ 4 files changed, 216 insertions(+) create mode 100644 tools/analyze_for_missing_FIM_cells.py diff --git a/config/params_template.env b/config/params_template.env index ab761336c..8312bea92 100644 --- a/config/params_template.env +++ b/config/params_template.env @@ -31,6 +31,10 @@ export branch_zero_id="0" export mask_leveed_area_toggle=True # Toggle to mask levee-protected areas from DEM export levee_id_attribute=SYSTEM_ID +#### Healed HAND #### +# Removes Hydro-conditioning Artifacts (true=on; false=off) +export healed_hand_hydrocondition=true + #### apply bathymetry adjustment to rating curve #### export bathymetry_adjust=True diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7ee764749..c4b27d9fb 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.1.0 - 2024-05-17 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) + +This focuses on removing hydro-conditioning artifacts by subtracting the thalweg DEM from HAND REM and adding back the original DEM. Also, a new tool was created to test this feature over multiple HUCs + +### Additions +- `tools/analyze_for_missing_FIM_cells.py`: A new script `analyze_for_missing_FIM_cells.py` was added to test and analyze healed HAND for hydro-conditioning artifacts FIM. + +### Changes +- `src/delineate_hydros_and_produce_HAND.sh`: Removing hydro-conditioning artifacts from HAND REM. +- `config/params_template.env`: Creating an option to include/exclude healed HAND from FIM pipeline. + + +

+ ## v4.5.0.2 - 2024-05-17 - [PR#1159](https://github.com/NOAA-OWP/inundation-mapping/pull/1159) This PR addresses issue #1132 and include the following changes on `tools/generate_nws_lid.py` for updating `nws_lid.gpkg` dataset. diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index 379761f1a..efe6e5f55 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -229,6 +229,17 @@ $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$curr -table $tempCurrentBranchDataDir/src_base_$current_branch_id.csv +## HEAL HAND -- REMOVES HYDROCONDITIONING ARTIFACTS ## +if [ "$healed_hand_hydrocondition" = true ]; then + echo -e $startDiv"Healed HAND to Remove Hydro-conditioning Artifacts $hucNumber $current_branch_id" + gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ + -R $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ + -D $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ + -T $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ + --calc="R+(D-T)" --NoDataValue=$ndv \ + --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" +fi + ## HEAL HAND BRIDGES (note resolution is set to 10m) # May or may not be a bridge file, depends if the HUC has an applicble one. diff --git a/tools/analyze_for_missing_FIM_cells.py b/tools/analyze_for_missing_FIM_cells.py new file mode 100644 index 000000000..bbb23b7cd --- /dev/null +++ b/tools/analyze_for_missing_FIM_cells.py @@ -0,0 +1,187 @@ +""" + +This tool analyzes the missing FIM cells after removing hydro-conditioning artifacts (thalweg rem). +It calculates the number of FIM celles in each HUC that will not be inundated after removing thalweg rem. +It also calculates the number of catchments that never shows any inundation because of the thalwag notch +issues, called notched streams. Then it creates a bar chart depicting the percentage of notched streams in +across all processed HUCs grouped by stream orders. + +You may find more detailes in PR #1156 (https://github.com/NOAA-OWP/inundation-mapping/pull/1156) + +""" + +import argparse +import os +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import rasterio + + +# from rasterio import plot as rioplot + + +# This will make jupyter display all columns of the hydroTable +pd.options.display.max_columns = None + + +# ------------------------------------------------------ +def find_missing_fim_cells_for1huc(fim_dir, huc8_num): + + fim_dir = Path(fim_dir) + branch0_dir = Path(fim_dir, huc8_num, "branches", "0") + hydroTable_csv = Path(branch0_dir, "hydroTable_0.csv") + hydroTable = pd.read_csv(hydroTable_csv) + + rem_tif = Path(branch0_dir, "rem_zeroed_masked_0.tif") + catchments_tif = Path(branch0_dir, "gw_catchments_reaches_filtered_addedAttributes_0.tif") + + with rasterio.open(catchments_tif) as catchments: + catchments = catchments.read(1) + + stream_orders = list(hydroTable["order_"].drop_duplicates(keep='first')) + stream_orders = sorted(stream_orders) + + analysis_data_ordr = [] + for ordr in stream_orders: + + branch0_streams = hydroTable[(hydroTable["order_"] == ordr)] + num_streams_order = len(branch0_streams) + branch0_hydroids = list(branch0_streams['HydroID'].drop_duplicates(keep='first')) + + with rasterio.open(rem_tif) as rem: + rem = rem.read(1) + + # Filter the REM to the catchments of interest + rem = np.where(~np.isin(catchments, branch0_hydroids), np.nan, rem) + + # Filter the REM again to only the 0 values + rem_zeros = rem.copy() + rem_zeros[np.where(rem_zeros != 0)] = np.nan + + cells_remaining = np.count_nonzero(~np.isnan(rem_zeros)) + print("") + print(f"Analyzing Branch0, {ordr}-order streams FIM in HUC8 {huc8_num}") + print("") + print(f"Actual count of cells remaining: {cells_remaining}") + + non_zero_count = (catchments != 0).sum() + percentage_b0_rem0 = round(100 * (cells_remaining / non_zero_count), 4) + print("") + print( + f"Actual percentage of branch0, {ordr}-order stream cells that have not been inundated: {percentage_b0_rem0}%" + ) + + # Finding branch0 hydroIDs that do not have zero rem (never inundate, notches) + target_hydroids = [] + for hydroid in branch0_hydroids: + + rem_hydroid = rem.copy() + hydroid_ls = [hydroid] + rem_hydroid = np.where(~np.isin(catchments, hydroid_ls), np.nan, rem_hydroid) + + rem_hydroid_nonnan = rem_hydroid[~np.isnan(rem_hydroid)] + cond = min(rem_hydroid_nonnan) + + if cond > 0: + target_hydroids.append(hydroid) + + print("") + print( + f"{len(target_hydroids)} streams between {ordr}-order streams are thalwag notch, including hydroIDs {target_hydroids}" + ) + + analysis = [ordr, target_hydroids, num_streams_order, cells_remaining, percentage_b0_rem0] + + analysis_data_ordr.append(analysis) + + return analysis_data_ordr + + +# ------------------------------------------------------ +def analysis_missing_fim_cells(huc8_dir): + + list_subdir = os.listdir(huc8_dir) + dir_path_ls = [os.path.join(huc8_dir, subdir) for subdir in list_subdir] + + missing_fim_data = [] + for path1 in dir_path_ls: + + list_subdir = os.listdir(path1) + huc8 = [stg for stg in list_subdir if stg.isdigit()][0] + missing_fim = find_missing_fim_cells_for1huc(path1, huc8) + + missing_fim_data.append([huc8, missing_fim]) + + # Number of thalwag_notch_streams grouped by stream orders + thalwag_notch_ord = [] + for ord1 in range(6): + thalwag_notch = [] + for subls in missing_fim_data: + if len(subls[1]) >= (ord1 + 1): + if subls[1][ord1][0] == ord1 + 1: + thalwag_notch.append(len(subls[1][ord1][1])) + thalwag_notch_ord.append(sum(thalwag_notch)) + + # Number of streams grouped by stream orders + streams_ord = [] + for ord1 in range(6): + streams = [] + for subls in missing_fim_data: + if len(subls[1]) >= (ord1 + 1): + if subls[1][ord1][0] == ord1 + 1: + streams.append(subls[1][ord1][2]) + streams_ord.append(sum(streams)) + + return thalwag_notch_ord, streams_ord + + +if __name__ == "__main__": + + # Parse arguments. + parser = argparse.ArgumentParser(description="Analysis for missing FIM cells.") + parser.add_argument( + "-r", + dest="huc8s_dir", + help="Path to directory storing FIM outputs. Type = string", + required=True, + type=str, + ) + parser.add_argument( + "-o", dest="path2savefig", help="Path to save bar chart. Type = string", required=True, type=str + ) + + # Assign variables from arguments. + args = vars(parser.parse_args()) + + huc8s_dir = args["huc8s_dir"] + path2savefig = args["path2savefig"] + + if not os.path.exists(huc8s_dir): + print("FIM directory: " + huc8s_dir + " does not exist.") + quit + + if not os.path.exists(path2savefig): + os.mkdir(path2savefig) + + thalwag_notch_ord, streams_ord = analysis_missing_fim_cells(huc8s_dir) + + stream_orders = ["1st order", "2nd order", "3rd order", "4th order", "5th order", "6th order"] + percentage_notches = [ + round(100 * (thalwag_notch_ord[i] / streams_ord[i]), 4) for i in range(len(streams_ord)) + ] + + path2savefig1 = os.path.join(path2savefig, "Thalwag_Notch_Streams_perc.png") + + # creating the bar plot + fig = plt.figure(figsize=(20, 10)) + plt.bar(stream_orders, percentage_notches) + + plt.xlabel("Stream Orders", fontsize=20) + plt.xticks(fontsize=20) + plt.ylabel("Percentage of Thalwag Notch Streams (%)", fontsize=20) + plt.yticks(fontsize=20) + plt.title("Percentage of catchments that will not been iundated", fontsize=24) + plt.savefig(path2savefig1) From ed703a284c61f79dcfedea9b8b5df3456e3da495 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 17 May 2024 20:14:41 +0000 Subject: [PATCH 46/51] v4.5.1.1 Update benchmark flows in AHPS domain (#1094) --- data/update_benchmark_flows.py | 200 ++++++++++++++++++++++++++++++++ docs/CHANGELOG.md | 14 +++ tools/tools_shared_variables.py | 14 +-- 3 files changed, 215 insertions(+), 13 deletions(-) create mode 100755 data/update_benchmark_flows.py diff --git a/data/update_benchmark_flows.py b/data/update_benchmark_flows.py new file mode 100755 index 000000000..b29b0f957 --- /dev/null +++ b/data/update_benchmark_flows.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python3 + +import argparse +import os +import shutil + +import geopandas as gpd +import pandas as pd + + +gpd.options.io_engine = "pyogrio" + + +def update_benchmark_flows(fim_dir: str, output_dir_base: str, verbose: bool = False): + """ + Update benchmark flows of the levelpath in the domain for stream segments missing from the flow file + + Parameters + ---------- + fim_dir : str + Location of FIM files (e.g., "/outputs/dev-4.4.11.0") + output_dir_base : str + Output directory (e.g., "/outputs/temp"). If None, the output files will be saved in the input directory (the original files will be saved with a ".bak" extension appended to the original filename). + """ + + def iterate_over_sites( + levelpaths: gpd.GeoDataFrame, levelpaths_domain: gpd.GeoDataFrame, flows: pd.DataFrame + ) -> pd.DataFrame: + """ + Update benchmark flows of stream segments missing from the flow file + + Parameters + ---------- + levelpaths : gpd.GeoDataFrame + Level paths of the HUC + levelpaths_domain : gpd.GeoDataFrame + Levelpaths in the domain + flows : pd.DataFrame + Benchmark flows + + Returns + ------- + pd.DataFrame + Flows with updated benchmark flows + """ + + if levelpaths_domain.empty: + return flows + + # Find the levelpaths with the highest order (to exclude tributaries) + levelpaths_domain = levelpaths_domain[ + levelpaths_domain['order_'] == levelpaths_domain['order_'].max() + ] + + # Find the levelpath that has flows in the flow file + if levelpaths_domain['levpa_id'].nunique() > 1: + # If there are multiple levelpaths with the highest order, take the longest one (intersect levelpaths_domain with the domain to get the length of the levelpath) + levelpaths_domain_intersect = gpd.overlay(levelpaths, domain, how='intersection') + levelpaths_domain_intersect['length'] = levelpaths_domain_intersect['geometry'].length + + # Get the total length of all the segments in the levelpath + levelpaths_domain_intersect_length = ( + levelpaths_domain_intersect.groupby('levpa_id').agg({'length': 'sum'}).reset_index() + ) + + # Get the longest levelpath + levelpath = levelpaths_domain_intersect_length.loc[ + levelpaths_domain_intersect_length['length'].idxmax(), 'levpa_id' + ] + + else: + levelpath = levelpaths_domain['levpa_id'].iloc[0] + + # Get IDs of all features in the levelpath + IDs_to_keep = levelpaths[levelpaths['levpa_id'] == levelpath]['ID'] + + # Get IDs of all features in the levelpath in the domain + IDs = levelpaths_domain.loc[levelpaths_domain['levpa_id'] == levelpath, 'ID'] + + # Keep the flows that are in the levelpath (remove tributaries) + flows = flows.iloc[flows.loc[flows['feature_id'].isin(IDs_to_keep)].index] + + if flows.empty: + return flows + + # Find IDs not in the flow file + add_IDs = ~IDs.isin(flows['feature_id']) + + # Exit if no IDs to add + if not any(add_IDs): + return flows + + IDs_to_add = levelpaths_domain.loc[add_IDs.index, 'ID'] + + # Add the missing IDs with flows to the flow file + if not IDs_to_add.empty: + flows_out = pd.concat( + [flows, pd.DataFrame({'feature_id': IDs_to_add, 'discharge': flows['discharge'].iloc[0]})], + ignore_index=True, + ) + else: + flows_out = flows + + return flows_out + + for org in ['nws', 'usgs']: + if verbose: + print('Processing', org) + + count_total = 0 + count_updated = 0 + + base_dir = f'/data/test_cases/{org}_test_cases/validation_data_{org}' + + huc8s = next(os.walk(base_dir))[1] + + for huc8 in huc8s: + if verbose: + print(f'\t{huc8}') + + lids = next(os.walk(f'{base_dir}/{huc8}'))[1] + + for lid in lids: + if verbose: + print(f'\t\t{lid}') + + # Read the input files + levelpath_file = f'{fim_dir}/{huc8}/nwm_subset_streams_levelPaths.gpkg' + if not os.path.exists(levelpath_file): + continue + + levelpaths = gpd.read_file(levelpath_file) + + validation_path = f'{base_dir}/{huc8}/{lid}' + + domain_file = f'{validation_path}/{lid}_domain.shp' + if not os.path.exists(domain_file): + continue + + domain = gpd.read_file(domain_file) + + # Intersect levelpaths with the domain to get feature_ids + levelpaths_domain = gpd.sjoin(levelpaths, domain, how="inner", predicate="intersects") + + magnitudes = next(os.walk(validation_path))[1] + + for magnitude in magnitudes: + input_dir = f'{validation_path}/{magnitude}' + + if output_dir_base is None: + output_dir = input_dir + else: + output_dir = os.path.join(output_dir_base, org) + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + flow_file_in = f'{input_dir}/ahps_{lid}_huc_{huc8}_flows_{magnitude}.csv' + flow_file_out = f'{output_dir}/ahps_{lid}_huc_{huc8}_flows_{magnitude}.csv' + + # Skip if flow file doesn't exist + if not os.path.exists(flow_file_in): + continue + + # Backup original flow file + backup_flow_file = flow_file_out + '.bak' + if not os.path.exists(backup_flow_file): + shutil.copy2(flow_file_in, backup_flow_file) + + flows = pd.read_csv(backup_flow_file) + + flows_new = iterate_over_sites(levelpaths, levelpaths_domain, flows) + + if not flows_new.equals(flows): + count_updated += 1 + count_total += 1 + else: + count_total += 1 + + flows_new.to_csv(flow_file_out, index=False) + + print(f'\tUpdated {count_updated} out of {count_total} flow files for {org}') + + +if __name__ == "__main__": + example_text = '''example: + + %(prog)s -f /outputs/dev-4.4.11.0 -o /outputs/temp + \n''' + + parser = argparse.ArgumentParser( + epilog=example_text, formatter_class=argparse.RawDescriptionHelpFormatter + ) + parser.add_argument('-f', '--fim_dir', help='Location of FIM files', type=str, required=True) + parser.add_argument('-o', '--output_dir-base', help='Output directory', type=str, default=None) + parser.add_argument('-v', '--verbose', help='Verbose output', action='store_true') + + args = vars(parser.parse_args()) + + update_benchmark_flows(**args) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c4b27d9fb..4f66a6088 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.1.1 - 2024-05-17 - [PR#1094](https://github.com/NOAA-OWP/inundation-mapping/pull/1094) + +Extends flows (i.e., discharge) to stream segments missing from NWS and USGS validation flow files. The levelpath associated with existing flows in the AHPS domain is identified, and any stream segments of the levelpath in the domain missing from the flow file are added to the flow file by assigning the existing flow (this is a constant value regardless of other tributaries including other levelpaths in the domain). Stream segments not on the levelpath are dropped from the flow file, including tributary flows. The original flow file is saved along with the output with an appended `.bak`. + +### Additions + +- `data/extend_benchmark_flows.py`: Adds missing flows to NWS or USGS benchmark flow files and removes flows from tributaries. The original flow file is saved with an appended `.bak`. + +### Changes + +- `tools/tools_shared_variables.py`: Removed corrected flow files from `BAD_SITES` list. + +

+ ## v4.5.1.0 - 2024-05-17 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) This focuses on removing hydro-conditioning artifacts by subtracting the thalweg DEM from HAND REM and adding back the original DEM. Also, a new tool was created to test this feature over multiple HUCs diff --git a/tools/tools_shared_variables.py b/tools/tools_shared_variables.py index fac649f70..47b625a8b 100755 --- a/tools/tools_shared_variables.py +++ b/tools/tools_shared_variables.py @@ -42,34 +42,22 @@ # Variables for eval_plots.py BAD_SITES = [ "baki3", # USGS: ratio of evaluated vs domain is very low - "cpei3", # USGS: mainstems does not extend sufficiently upstream (~35%), significant masking upstream + "cart2", # NWS: added by request "eagi1", # NWS: ratio of evaluated vs domain is very low "efdn7", # NWS: mainstems does not extend sufficiently upstream (~30%) "erwn6", # NWS: ratio of evaluated vs domain is very low "grfi2", # USGS: incorrect location - "hohn4", # Both: no mainstems in vicinity "kcdm7", # USGS: incorrect location - "kilo1", # Both: mainstems does not extend sufficiently upstream (~20%) "ksdm7", # USGS: masked "levk1", # NWS: Incorrect feature_id assigned from WRDS, this has been corrected "lkcm7", # NWS: masked "loun7", # NWS: benchmark is not consistent between thresholds "lrlm7", # NWS: masked "mcri2", # USGS: incorrect location - "monv1", # NWS: mainstems does not extend sufficiently upstream (~30%) "mtao1", # USGS: ratio of evaluated vs domain is very low - "nhso1", # USGS: mainstems does not extend sufficiently upstream (45%) - "nmso1", # Both: mainstems does not extend sufficiently upstream - "pori3", # USGS: mainstems does not extend sufficiently upstream - "ptvn6", # Both: mainstems does not extend sufficiently upstream (50%) "roun6", # USGS: ratio of evaluated vs domain is very low "rwdn4", # Both: no mainstems in vicinity - "selt2", # NWS: mainstems does not extend sufficiently upstream (~30%) - "sweg1", # Both: mainstems does not extend sufficiently upstream (~30%) "vcni3", # USGS: ratio of evaluated vs domain is very low - "watw3", # NWS: mainstems does not extend sufficiently upstream (~30%) - "weat2", # NWS: mainstems does not extend sufficiently upstream (~50%) - "wkew3", # NWS: mainstems does not extend sufficiently upstream (~45%) ] DISCARD_AHPS_QUERY = "not flow.isnull() & masked_perc<97 & not nws_lid in @BAD_SITES" From b1a145f2ff7c532cb30553adb69d83928636a430 Mon Sep 17 00:00:00 2001 From: EmilyDeardorff-NOAA <60829052+EmilyDeardorff@users.noreply.github.com> Date: Fri, 17 May 2024 13:18:31 -0700 Subject: [PATCH 47/51] v4.5.1.2 Add CRS handling to USGS gage processing (#1135) --- docs/CHANGELOG.md | 12 ++++++++++++ src/run_by_branch.sh | 3 ++- src/run_unit_wb.sh | 7 +++++-- src/usgs_gage_crosswalk.py | 28 ++++++++++++++++++++++++---- src/usgs_gage_unit_setup.py | 22 +++++++++++++++++----- 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4f66a6088..7c9a2d721 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,18 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.1.2 - 2024-05-17 - [PR#1135](https://github.com/NOAA-OWP/inundation-mapping/pull/1135) + +Updates USGS gage processing to use the correct projection (determined by whether the HUC is in Alaska or not). + +### Changes +- `src/run_by_branch.sh`: Added `huc_CRS` as an input argument for `usgs_gage_crosswalk.py` +- `src/run_unit_wb.sh`: Added `huc_CRS` as an input argument for `usgs_gage_unit_setup.py` and `usgs_gage_crosswalk.py` +- `src/usgs_gage_crosswalk.py`: Added `huc_CRS` as an input argument for the `run_crosswalk()` function and added re-projection steps wherever new data is being read in so that the files are able to be properly merged. +- `src/usgs_gage_unit_setup.py`: Added `huc_CRS` as an input argument for the `Gage2Branch()` crosswalking class. + +

+ ## v4.5.1.1 - 2024-05-17 - [PR#1094](https://github.com/NOAA-OWP/inundation-mapping/pull/1094) Extends flows (i.e., discharge) to stream segments missing from NWS and USGS validation flow files. The levelpath associated with existing flows in the AHPS domain is identified, and any stream segments of the levelpath in the domain missing from the flow file are added to the flow file by assigning the existing flow (this is a constant value regardless of other tributaries including other levelpaths in the domain). Stream segments not on the levelpath are dropped from the flow file, including tributary flows. The original flow file is saved along with the output with an appended `.bak`. diff --git a/src/run_by_branch.sh b/src/run_by_branch.sh index f052571b3..69151a74c 100755 --- a/src/run_by_branch.sh +++ b/src/run_by_branch.sh @@ -116,7 +116,8 @@ if [ -f $tempHucDataDir/usgs_subset_gages.gpkg ]; then -dem $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ -dem_adj $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ -out $tempCurrentBranchDataDir \ - -b $current_branch_id + -b $current_branch_id \ + -huc_CRS $huc_CRS fi ## REMOVE FILES FROM DENY LIST ## diff --git a/src/run_unit_wb.sh b/src/run_unit_wb.sh index 348b5518e..3c7a1b460 100755 --- a/src/run_unit_wb.sh +++ b/src/run_unit_wb.sh @@ -250,9 +250,11 @@ if [ -f $tempHucDataDir/nwm_subset_streams_levelPaths.gpkg ]; then -o $tempHucDataDir/usgs_subset_gages.gpkg \ -huc $hucNumber \ -ahps $tempHucDataDir/nws_lid.gpkg \ - -bzero_id $branch_zero_id + -bzero_id $branch_zero_id \ + -huc_CRS $huc_CRS fi + ## USGS CROSSWALK ## if [ -f $tempHucDataDir/usgs_subset_gages_$branch_zero_id.gpkg ]; then echo -e $startDiv"USGS Crosswalk $hucNumber $branch_zero_id" @@ -262,7 +264,8 @@ if [ -f $tempHucDataDir/usgs_subset_gages_$branch_zero_id.gpkg ]; then -cat $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_crosswalked_$branch_zero_id.gpkg \ -dem $tempCurrentBranchDataDir/dem_meters_$branch_zero_id.tif \ -dem_adj $tempCurrentBranchDataDir/dem_thalwegCond_$branch_zero_id.tif \ - -out $tempCurrentBranchDataDir -b $branch_zero_id + -out $tempCurrentBranchDataDir -b $branch_zero_id \ + -huc_CRS $huc_CRS fi ## CLEANUP BRANCH ZERO OUTPUTS ## diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index 4a477692c..98263c602 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -33,6 +33,8 @@ Directory to create output table. i.e. '/data/path/' branch_id: str ID of the current branch i.e. '3246000257' + huc_CRS: str + Projection to be used for the HUC ''' @@ -42,7 +44,13 @@ def __init__(self, usgs_subset_gages_filename, branch_id): self.gages = self._load_gages(usgs_subset_gages_filename) def run_crosswalk( - self, input_catchment_filename, input_flows_filename, dem_filename, dem_adj_filename, output_directory + self, + input_catchment_filename, + input_flows_filename, + dem_filename, + dem_adj_filename, + output_directory, + huc_CRS, ): '''Run the gage crosswalk steps: 1) spatial join to branch catchments layer 2) snap sites to the dem-derived flows 3) sample both dems at the snapped points 4) write the crosswalked points @@ -52,16 +60,18 @@ def run_crosswalk( print(f'There are no gages for branch {branch_id}') os._exit(0) # Spatial join to fim catchments - self.catchment_sjoin(input_catchment_filename) + self.catchment_sjoin(input_catchment_filename, huc_CRS) if self.gages.empty: print(f'There are no gages for branch {branch_id}') os._exit(0) # Snap to dem derived flow lines self.snap_to_dem_derived_flows(input_flows_filename) + # Sample DEM and thalweg adjusted DEM self.sample_dem(dem_filename, 'dem_elevation') self.sample_dem(dem_adj_filename, 'dem_adj_elevation') + # Write to csv num_gages = len(self.gages) print(f"{num_gages} gage{'' if num_gages == 1 else 's'} in branch {self.branch_id}") @@ -71,12 +81,15 @@ def _load_gages(self, gages_filename): '''Reads gage geopackage from huc level and filters based on current branch id''' usgs_gages = gpd.read_file(gages_filename) + # TODO: Do we need project this usgs gages to huc_CRS as well? + # usgs_gages.to_crs(huc_CRS, inplace=True) return usgs_gages[(usgs_gages.levpa_id == self.branch_id)] - def catchment_sjoin(self, input_catchment_filename): + def catchment_sjoin(self, input_catchment_filename, huc_CRS): '''Spatial joins gages to FIM catchments''' input_catchments = gpd.read_file(input_catchment_filename, dtype={'HydroID': int}) + input_catchments.to_crs(huc_CRS, inplace=True) self.gages = gpd.sjoin(self.gages, input_catchments[['HydroID', 'LakeID', 'geometry']], how='inner') def snap_to_dem_derived_flows(self, input_flows_filename): @@ -171,6 +184,7 @@ def snap_to_line(row): parser.add_argument( '-b', '--branch-id', help='Branch ID used to filter the gages', type=str, required=True ) + parser.add_argument('-huc_CRS', help='Projection to be used for the HUC.', type=str, required=True) args = vars(parser.parse_args()) @@ -181,13 +195,19 @@ def snap_to_line(row): dem_adj_filename = args['dem_adj_filename'] output_directory = args['output_directory'] branch_id = args['branch_id'] + huc_CRS = args['huc_CRS'] assert os.path.isfile(usgs_gages_filename), f"The input file {usgs_gages_filename} does not exist." # Instantiate class gage_crosswalk = GageCrosswalk(usgs_gages_filename, branch_id) gage_crosswalk.run_crosswalk( - input_catchment_filename, input_flows_filename, dem_filename, dem_adj_filename, output_directory + input_catchment_filename, + input_flows_filename, + dem_filename, + dem_adj_filename, + output_directory, + huc_CRS, ) """ diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index a4f014fd5..b2622f4ab 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -19,17 +19,18 @@ class Gage2Branch(object): - def __init__(self, usgs_gage_filename, ras_locs_filename, ahps_filename, huc8): + def __init__(self, usgs_gage_filename, ras_locs_filename, ahps_filename, huc8, huc_CRS): self.usgs_gage_filename = usgs_gage_filename self.ras_locs_filename = ras_locs_filename self.ahps_filename = ahps_filename self.huc8 = str(huc8) - self.load_gages() + self.load_gages(huc_CRS) - def load_gages(self): + def load_gages(self, huc_CRS): # Read USGS gage file a usgs_gages = gpd.read_file(self.usgs_gage_filename, dtype={'location_id': object}) usgs_gages['source'] = 'usgs_gage' + usgs_gages.to_crs(huc_CRS, inplace=True) # Read RAS2FIM point locations file # !!! Geopandas is not honoring the dtype arg with this read_file below (huc8 being read as int64). @@ -39,7 +40,7 @@ def load_gages(self): ras_locs['location_id'] = ras_locs['fid_xs'] # Convert ras locs crs to match usgs gage crs - ras_locs.to_crs(usgs_gages.crs, inplace=True) + ras_locs.to_crs(huc_CRS, inplace=True) ras_locs = ras_locs.rename(columns={'huc8': 'HUC8'}) # Convert Multipoint geometry to Point geometry @@ -66,6 +67,7 @@ def load_gages(self): ahps_sites = ahps_sites.rename( columns={'nwm_feature_id': 'feature_id', 'usgs_site_code': 'location_id'} ) + ahps_sites.to_crs(huc_CRS, inplace=True) ahps_sites = ahps_sites[ ahps_sites.location_id.isna() ] # Filter sites that are already in the USGS dataset @@ -163,6 +165,13 @@ def filter_gage_branches(fim_inputs_filename): help='WARNING: only run this parameter if you know exactly what you are doing', required=False, ) + parser.add_argument( + '-huc_CRS', + '--huc_CRS', + help='Projection to use (based on whether the HUC is in Alaska or CONUS).', + type=str, + required=True, + ) args = vars(parser.parse_args()) @@ -174,9 +183,12 @@ def filter_gage_branches(fim_inputs_filename): huc8 = args['huc8_id'] bzero_id = args['branch_zero_id'] filter_fim_inputs = args['filter_fim_inputs'] + huc_CRS = args['huc_CRS'] if not filter_fim_inputs: - usgs_gage_subset = Gage2Branch(usgs_gages_filename, ras_locs_filename, nws_lid_filename, huc8) + usgs_gage_subset = Gage2Branch( + usgs_gages_filename, ras_locs_filename, nws_lid_filename, huc8, huc_CRS + ) if usgs_gage_subset.gages.empty: print(f'There are no gages identified for {huc8}') os._exit(0) From 39504f350d4e051e501b1ab4abbfb433d7704715 Mon Sep 17 00:00:00 2001 From: AliForghani-NOAA <124194814+AliForghani-NOAA@users.noreply.github.com> Date: Fri, 17 May 2024 16:24:22 -0400 Subject: [PATCH 48/51] v4.5.1.3 Hotfix for pyogrio arrow (#1170) --- docs/CHANGELOG.md | 14 +++++++++++++- src/usgs_gage_crosswalk.py | 7 ++++--- src/usgs_gage_unit_setup.py | 4 ++-- tools/rating_curve_comparison.py | 2 +- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7c9a2d721..a483e4544 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,19 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.1.3 - 2024-05-17 - [PR#1170](https://github.com/NOAA-OWP/inundation-mapping/pull/1170) + +This hotfix addresses the issue #1162 by explicitly using 'fiona' engine for reading gpkg files with Boolean dtype. This is applicable only for `usgs_gages.gpkg` and `usgs_subset_gages.gpkg` files. + + +### Changes +- `src/usgs_gage_unit_setup.py` ... changed only two lines for fiona engine +- `src/usgs_gage_crosswalk.py` ... changed only one line for fiona engine + two small changes to use `self.branch_id` for the correct log report +- `tools/rating_curve_comparison.py`... changed only one line for fiona engine + +

+ + ## v4.5.1.2 - 2024-05-17 - [PR#1135](https://github.com/NOAA-OWP/inundation-mapping/pull/1135) Updates USGS gage processing to use the correct projection (determined by whether the HUC is in Alaska or not). @@ -62,7 +75,6 @@ Similar to 'usgs_gages.gpkg' dataset, all lid stations, including those in Alask

- ## v4.5.0.1 - 2024-05-09 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) Fixes two bugs discovered in v4.5.0.0: diff --git a/src/usgs_gage_crosswalk.py b/src/usgs_gage_crosswalk.py index 98263c602..5019e09a3 100755 --- a/src/usgs_gage_crosswalk.py +++ b/src/usgs_gage_crosswalk.py @@ -57,12 +57,12 @@ def run_crosswalk( to usgs_elev_table.csv ''' if self.gages.empty: - print(f'There are no gages for branch {branch_id}') + print(f'There are no gages for branch {self.branch_id}') os._exit(0) # Spatial join to fim catchments self.catchment_sjoin(input_catchment_filename, huc_CRS) if self.gages.empty: - print(f'There are no gages for branch {branch_id}') + print(f'There are no gages for branch {self.branch_id}') os._exit(0) # Snap to dem derived flow lines @@ -80,7 +80,8 @@ def run_crosswalk( def _load_gages(self, gages_filename): '''Reads gage geopackage from huc level and filters based on current branch id''' - usgs_gages = gpd.read_file(gages_filename) + usgs_gages = gpd.read_file(gages_filename, engine='fiona') + # TODO: Do we need project this usgs gages to huc_CRS as well? # usgs_gages.to_crs(huc_CRS, inplace=True) return usgs_gages[(usgs_gages.levpa_id == self.branch_id)] diff --git a/src/usgs_gage_unit_setup.py b/src/usgs_gage_unit_setup.py index b2622f4ab..308952b3a 100755 --- a/src/usgs_gage_unit_setup.py +++ b/src/usgs_gage_unit_setup.py @@ -28,7 +28,7 @@ def __init__(self, usgs_gage_filename, ras_locs_filename, ahps_filename, huc8, h def load_gages(self, huc_CRS): # Read USGS gage file a - usgs_gages = gpd.read_file(self.usgs_gage_filename, dtype={'location_id': object}) + usgs_gages = gpd.read_file(self.usgs_gage_filename, dtype={'location_id': object}, engine='fiona') usgs_gages['source'] = 'usgs_gage' usgs_gages.to_crs(huc_CRS, inplace=True) @@ -137,7 +137,7 @@ def filter_gage_branches(fim_inputs_filename): fim_inputs = fim_inputs.drop(fim_inputs.loc[fim_inputs.huc == huc_dir].index) continue - gages = gpd.read_file(gage_file) + gages = gpd.read_file(gage_file, engine='fiona') level_paths = gages.levpa_id fim_inputs = fim_inputs.drop( fim_inputs.loc[(fim_inputs.huc == huc_dir) & (~fim_inputs.levpa_id.isin(level_paths))].index diff --git a/tools/rating_curve_comparison.py b/tools/rating_curve_comparison.py index 5b5369316..ef8e2417f 100755 --- a/tools/rating_curve_comparison.py +++ b/tools/rating_curve_comparison.py @@ -1070,7 +1070,7 @@ def create_static_gpkg(output_dir, output_gpkg, agg_recurr_stats_table, gages_gp Merges the output dataframe from aggregate_metrics() with the usgs gages GIS data ''' # Load in the usgs_gages geopackage - usgs_gages = gpd.read_file(gages_gpkg_filepath) + usgs_gages = gpd.read_file(gages_gpkg_filepath, engine='fiona') # Merge the stats for all of the recurrance intervals/thresholds usgs_gages = usgs_gages.merge(agg_recurr_stats_table, on='location_id') # Load in the rating curves file From 7bdf60e15eebdcab5b6dbfdf8d3039a16b6aa610 Mon Sep 17 00:00:00 2001 From: Carson Pruitt <90792257+CarsonPruitt-NOAA@users.noreply.github.com> Date: Mon, 20 May 2024 15:40:59 -0500 Subject: [PATCH 49/51] v4.5.2.0 Bridge inundation points (#1166) --- config/deny_branch_zero.lst | 1 + config/deny_branches.lst | 1 + data/bridges/pull_osm_bridges.py | 8 -- docs/CHANGELOG.md | 17 +++ fim_post_processing.sh | 1 + src/aggregate_by_huc.py | 99 ++++++++++++++- src/delineate_hydros_and_produce_HAND.sh | 53 ++++---- src/heal_bridges_osm.py | 148 ++++++++++++----------- 8 files changed, 214 insertions(+), 114 deletions(-) diff --git a/config/deny_branch_zero.lst b/config/deny_branch_zero.lst index 3d7a8cd9c..f4bf2cba9 100644 --- a/config/deny_branch_zero.lst +++ b/config/deny_branch_zero.lst @@ -49,6 +49,7 @@ nld_rasterized_elev_{}.tif nwm_catchments_proj_subset_levelPaths_{}.gpkg nwm_subset_streams_levelPaths_{}.gpkg nwm_subset_streams_levelPaths_dissolved_headwaters_{}.gpkg +#osm_bridge_centroids_{}.gpkg rem_{}.tif #rem_zeroed_masked_{}.tif slopes_d8_dem_meters_{}.tif diff --git a/config/deny_branches.lst b/config/deny_branches.lst index 8cce17df4..07ef1f7f4 100644 --- a/config/deny_branches.lst +++ b/config/deny_branches.lst @@ -50,6 +50,7 @@ nld_rasterized_elev_{}.tif nwm_catchments_proj_subset_levelPaths_{}.gpkg nwm_subset_streams_levelPaths_{}.gpkg nwm_subset_streams_levelPaths_dissolved_headwaters_{}.gpkg +#osm_bridge_centroids_{}.gpkg #ras_elev_table.csv rem_{}.tif # rem_zeroed_masked_{}.tif diff --git a/data/bridges/pull_osm_bridges.py b/data/bridges/pull_osm_bridges.py index 7c7bf6183..1f73ad196 100644 --- a/data/bridges/pull_osm_bridges.py +++ b/data/bridges/pull_osm_bridges.py @@ -86,7 +86,6 @@ def combine_huc_features(output_dir): bridge_file_names = Path(output_dir).glob("huc_*_osm_bridges.gpkg") osm_bridge_file = os.path.join(output_dir, "osm_all_bridges.gpkg") - osm_bridge_midpoints_file = os.path.join(output_dir, "osm_all_bridges_midpoints.gpkg") all_bridges_gdf_raw = pd.concat([gpd.read_file(gpkg) for gpkg in bridge_file_names], ignore_index=True) @@ -99,13 +98,6 @@ def combine_huc_features(output_dir): all_bridges_gdf = all_bridges_gdf_raw[['osmid', 'name', 'geometry']] all_bridges_gdf.to_file(osm_bridge_file, driver="GPKG") - # save out midpoints (centroids) of bridge lines - logging.info(f"Writing centroids {osm_bridge_file}") - section_time = dt.datetime.now(dt.timezone.utc) - logging.info(f" .. started: {section_time.strftime('%m/%d/%Y %H:%M:%S')}") - all_bridges_gdf['geometry'] = all_bridges_gdf.centroid - all_bridges_gdf.to_file(osm_bridge_midpoints_file, driver="GPKG") - return diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a483e4544..3d15f1533 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,23 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.2.0 - 2024-05-20 - [PR#1166](https://github.com/NOAA-OWP/inundation-mapping/pull/1166) + +The main goal of this PR is to create bridge point data that be used as a service in HydroVIS. Since every branch processes bridges separately, it's possible to inundate a bridge from more than just the feature_id it crosses. To reflect this, the `osm_bridge_centroids.gpkg` now found in HUC directories will have coincident points - one that is inundated from the reach it crosses and the other a backwater-influenced point indicated by the `is_backwater` field. + +### Changes + +- ` src/` + - `aggregate_by_huc.py`: Added the aggregation steps for bridge centroids; aggregation includes using SRCs to lookup flow values for each bridge, filtering out coincident points that have the same assigned feature_ids and higher overtopping flow, and assigning select points as backwater-influenced. + - ` delineate_hydros_and_produce_HAND.sh`: Moved the bridge healing to after the crosswalk so that the centroids can use the crosswalked catchments for feature_id and flow lookups. + - `heal_bridges_osm.py`: Optimized the bridge healing so that it doesn't have to write out an intermediate raster; exports bridge centroids and spatial joins them to catchments; added functions for SRC flow lookups used in `aggregate_by_huc.py`. +- ` fim_post_processing.sh`: Added a bridge flag input for `aggregate_by_huc.py`. +- `data/bridges/pull_osm_bridges.py`: Removed the saving of a midpoint geopackage. +- `config/deny_branch_zero.lst` & `deny_branches.lst`: Added `#osm_bridge_centroids_{}.gpkg` to the deny lists. + +

+ + ## v4.5.1.3 - 2024-05-17 - [PR#1170](https://github.com/NOAA-OWP/inundation-mapping/pull/1170) This hotfix addresses the issue #1162 by explicitly using 'fiona' engine for reading gpkg files with Boolean dtype. This is applicable only for `usgs_gages.gpkg` and `usgs_subset_gages.gpkg` files. diff --git a/fim_post_processing.sh b/fim_post_processing.sh index 49ac3c29f..fb9c10f82 100755 --- a/fim_post_processing.sh +++ b/fim_post_processing.sh @@ -191,6 +191,7 @@ python3 $srcDir/aggregate_by_huc.py \ -fim $outputDestDir \ -i $fim_inputs \ -htable \ + -bridge \ -j $jobLimit Tcount date -u diff --git a/src/aggregate_by_huc.py b/src/aggregate_by_huc.py index 5a6912543..e3d8db6e9 100644 --- a/src/aggregate_by_huc.py +++ b/src/aggregate_by_huc.py @@ -9,8 +9,10 @@ from datetime import datetime from os.path import join +import geopandas as gpd import pandas as pd +from heal_bridges_osm import flows_from_hydrotable from utils.shared_functions import progress_bar_handler @@ -140,6 +142,20 @@ def __init__(self, fim_directory, huc_id, limit_branches=[]): } self.agg_ras_elev_table = pd.DataFrame(columns=list(self.ras_dtypes.keys())) + self.bridge_dtypes = { + 'osmid': int, + 'name': str, + 'max_hand': float, + 'max_hand_75': float, + 'feature_id': int, + 'HydroID': int, + 'order_': str, + 'branch': str, + 'mainstem': int, + 'geometry': object, + } + self.agg_bridge_pnts = gpd.GeoDataFrame(columns=list(self.bridge_dtypes.keys())) + def iter_branches(self): if self.limit_branches: for branch in self.limit_branches: @@ -184,7 +200,23 @@ def ras_elev_table(self, branch_path): ras_elev_table = pd.read_csv(ras_elev_filename, dtype=self.ras_dtypes) self.agg_ras_elev_table = pd.concat([self.agg_ras_elev_table, ras_elev_table]) - def agg_function(self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_elev_flag, huc_id): + def aggregate_bridge_pnts(self, branch_path, branch_id): + bridge_filename = join(branch_path, f'osm_bridge_centroids_{branch_id}.gpkg') + if not os.path.isfile(bridge_filename): + return + + bridge_pnts = gpd.read_file(bridge_filename) + if bridge_pnts.empty: + return + hydrotable_filename = join(branch_path, f'hydroTable_{branch_id}.csv') + hydrotable = pd.read_csv(hydrotable_filename, dtype=self.hydrotable_dtypes) + # Get the flows for each stage + bridge_pnts = flows_from_hydrotable(bridge_pnts, hydrotable) + self.agg_bridge_pnts = pd.concat([self.agg_bridge_pnts, bridge_pnts]) + + def agg_function( + self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_elev_flag, bridge_flag, huc_id + ): try: # try catch and its own log file output in error only. for branch_id, branch_path in self.iter_branches(): @@ -198,6 +230,8 @@ def agg_function(self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_ele self.aggregate_hydrotables(branch_path, branch_id) if src_cross_flag: self.aggregate_src_full_crosswalk(branch_path, branch_id) + if bridge_flag: + self.aggregate_bridge_pnts(branch_path, branch_id) ## After all of the branches are visited, the code below will write the aggregates if usgs_elev_flag: @@ -232,6 +266,30 @@ def agg_function(self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_ele if not self.agg_ras_elev_table.empty: self.agg_ras_elev_table.to_csv(ras_elev_table_file, index=False) + if bridge_flag: + bridge_pnts_file = join(self.huc_dir_path, 'osm_bridge_centroids.gpkg') + if os.path.isfile(bridge_pnts_file): + os.remove(bridge_pnts_file) + + if not self.agg_bridge_pnts.empty: + # Just making things shorter so they are easier to read + bridge_pnts = self.agg_bridge_pnts + # Use branch 0 to get the feature_id each bridge crosses + b0 = bridge_pnts.loc[bridge_pnts.branch == '0', ['osmid', 'feature_id']] + b0 = b0.rename(columns={'feature_id': 'crossing_feature_id'}) + bridge_pnts = bridge_pnts.merge(b0, on='osmid', how='left') + # Remove bridge points that have the same osmid and feature_id + g = bridge_pnts.groupby(['osmid', 'feature_id'])['max_discharge'].transform('min') + bridge_pnts = bridge_pnts.copy()[(bridge_pnts['max_discharge'] == g)] + # Set backwater bridge sites + bridge_pnts['is_backwater'] = 0 + c = bridge_pnts.groupby(['osmid'])['feature_id'].transform('count') + bridge_pnts.loc[ + (c > 1) & (bridge_pnts.feature_id != bridge_pnts.crossing_feature_id), 'is_backwater' + ] = 1 + # Write file + bridge_pnts.to_file(bridge_pnts_file, index=False) + # print(f"agg_by_huc for huc id {huc_id} is done") except Exception: @@ -247,6 +305,7 @@ def agg_function(self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_ele hydro_table_flag, src_cross_flag, ras_elev_flag, + bridge_flag, huc_id, errMsg, ) @@ -255,7 +314,16 @@ def agg_function(self, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_ele # ============================== # This is done independantly in each worker and does not attempt to write to a shared file # as those can collide with multi proc -def log_error(fim_directory, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_elev_flag, huc_id, errMsg): +def log_error( + fim_directory, + usgs_elev_flag, + hydro_table_flag, + src_cross_flag, + ras_elev_flag, + bridge_flag, + huc_id, + errMsg, +): file_name = f"agg_by_huc_{huc_id}" if usgs_elev_flag: file_name += "_elev" @@ -265,6 +333,8 @@ def log_error(fim_directory, usgs_elev_flag, hydro_table_flag, src_cross_flag, r file_name += "_src_cross" if ras_elev_flag: file_name += "_ras" + if bridge_flag: + file_name += "_bridge" file_name += "_error.log" log_path = os.path.join(fim_directory, "logs", "agg_by_huc_errors") @@ -282,6 +352,7 @@ def aggregate_by_huc( hydro_table_flag, src_cross_flag, ras_elev_flag, + bridge_flag, num_job_workers, ): assert os.path.isdir(fim_directory), f'{fim_directory} is not a valid directory' @@ -315,6 +386,8 @@ def aggregate_by_huc( agg_type += "_src_cross" if ras_elev_flag: agg_type += "_ras" + if bridge_flag: + agg_type += "_bridge" filelist = glob.glob(os.path.join(log_folder, f"*{agg_type}*")) for f in filelist: os.remove(f) @@ -345,6 +418,7 @@ def aggregate_by_huc( 'hydro_table_flag': hydro_table_flag, 'src_cross_flag': src_cross_flag, 'ras_elev_flag': ras_elev_flag, + 'bridge_flag': bridge_flag, 'huc_id': huc_id, } @@ -368,6 +442,7 @@ def aggregate_by_huc( 'hydro_table_flag': hydro_table_flag, 'src_cross_flag': src_cross_flag, 'ras_elev_flag': ras_elev_flag, + 'bridge_flag': bridge_flag, 'huc_id': huc_id, } future = executor.submit(huc_dir.agg_function, **args_agg) @@ -381,16 +456,20 @@ def aggregate_by_huc( errMsg = errMsg + traceback.format_exc() print(errMsg, flush=True) log_error( - fim_directory, usgs_elev_flag, hydro_table_flag, src_cross_flag, ras_elev_flag, huc_id, errMsg + fim_directory, + usgs_elev_flag, + hydro_table_flag, + src_cross_flag, + ras_elev_flag, + bridge_flag, + huc_id, + errMsg, ) # sys.exit(1) # Send the executor to the progress bar and wait for all MS tasks to finish progress_bar_handler(executor_dict, f"Running aggregate_by_huc with {num_job_workers} workers") - # Send the executor to the progress bar and wait for all MS tasks to finish - progress_bar_handler(executor_dict, f"Running aggregate_by_huc with {num_job_workers} workers") - end_time = datetime.now() dt_string = datetime.now().strftime("%m/%d/%Y %H:%M:%S") print(f"ended: {dt_string}") @@ -441,6 +520,14 @@ def aggregate_by_huc( default=False, action='store_true', ) + parser.add_argument( + '-bridge', + '--bridge_flag', + help='Perform aggregate on branch bridge centroid files', + required=False, + default=False, + action='store_true', + ) parser.add_argument( '-j', '--num_job_workers', help='Number of processes to use', required=False, default=1, type=int ) diff --git a/src/delineate_hydros_and_produce_HAND.sh b/src/delineate_hydros_and_produce_HAND.sh index efe6e5f55..77b64b7f5 100755 --- a/src/delineate_hydros_and_produce_HAND.sh +++ b/src/delineate_hydros_and_produce_HAND.sh @@ -218,7 +218,6 @@ if [ -f $tempCurrentBranchDataDir/LandSea_subset_$current_branch_id.tif ]; then --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" fi - ## HYDRAULIC PROPERTIES ## echo -e $startDiv"Sample reach averaged parameters $hucNumber $current_branch_id" $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ @@ -229,34 +228,6 @@ $taudemDir/catchhydrogeo -hand $tempCurrentBranchDataDir/rem_zeroed_masked_$curr -table $tempCurrentBranchDataDir/src_base_$current_branch_id.csv -## HEAL HAND -- REMOVES HYDROCONDITIONING ARTIFACTS ## -if [ "$healed_hand_hydrocondition" = true ]; then - echo -e $startDiv"Healed HAND to Remove Hydro-conditioning Artifacts $hucNumber $current_branch_id" - gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ - -R $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ - -D $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ - -T $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ - --calc="R+(D-T)" --NoDataValue=$ndv \ - --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" -fi - - -## HEAL HAND BRIDGES (note resolution is set to 10m) -# May or may not be a bridge file, depends if the HUC has an applicble one. -# Writing back over the rem_zeroed_masked branch tif -if [ -f $tempHucDataDir/osm_bridges_subset.gpkg ]; then - echo -e $startDiv"Burn in bridges $hucNumber $current_branch_id" - python3 $srcDir/heal_bridges_osm.py \ - -g $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ - -s $tempHucDataDir/osm_bridges_subset.gpkg \ - -p $tempCurrentBranchDataDir/bridge_lines_raster_$current_branch_id.tif \ - -t $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ - -r $res -else - echo -e $startDiv"No applicable bridge data for $hucNumber" -fi - - ## FINALIZE CATCHMENTS AND MODEL STREAMS ## echo -e $startDiv"Finalize catchments and model streams $hucNumber $current_branch_id" python3 $srcDir/add_crosswalk.py \ @@ -278,6 +249,30 @@ python3 $srcDir/add_crosswalk.py \ -e $min_catchment_area \ -g $min_stream_length +## HEAL HAND -- REMOVES HYDROCONDITIONING ARTIFACTS ## +if [ "$healed_hand_hydrocondition" = true ]; then + echo -e $startDiv"Healed HAND to Remove Hydro-conditioning Artifacts $hucNumber $current_branch_id" + gdal_calc.py --quiet --type=Float32 --overwrite --co "COMPRESS=LZW" --co "BIGTIFF=YES" --co "TILED=YES" \ + -R $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ + -D $tempCurrentBranchDataDir/dem_meters_$current_branch_id.tif \ + -T $tempCurrentBranchDataDir/dem_thalwegCond_$current_branch_id.tif \ + --calc="R+(D-T)" --NoDataValue=$ndv \ + --outfile=$tempCurrentBranchDataDir/"rem_zeroed_masked_$current_branch_id.tif" +fi + +## HEAL HAND BRIDGES ## +if [ -f $tempHucDataDir/osm_bridges_subset.gpkg ]; then + echo -e $startDiv"Burn in bridges $hucNumber $current_branch_id" + python3 $srcDir/heal_bridges_osm.py \ + -g $tempCurrentBranchDataDir/rem_zeroed_masked_$current_branch_id.tif \ + -s $tempHucDataDir/osm_bridges_subset.gpkg \ + -p $tempCurrentBranchDataDir/gw_catchments_reaches_filtered_addedAttributes_crosswalked_$current_branch_id.gpkg \ + -c $tempCurrentBranchDataDir/osm_bridge_centroids_$current_branch_id.gpkg \ + -b 10 \ + -r $res +else + echo -e $startDiv"No applicable bridge data for $hucNumber" +fi ## EVALUATE CROSSWALK ## if [ "$current_branch_id" = "$branch_zero_id" ] && [ "$evaluateCrosswalk" = "1" ] ; then diff --git a/src/heal_bridges_osm.py b/src/heal_bridges_osm.py index 288572fc5..19ade89cf 100644 --- a/src/heal_bridges_osm.py +++ b/src/heal_bridges_osm.py @@ -1,106 +1,107 @@ import argparse import os +import re import geopandas as gpd import numpy as np import rasterio -from rasterio import features, transform +from rasterio import features from rasterstats import zonal_stats +threatened_percent = 0.75 + + def process_bridges_in_huc( - source_hand_raster, bridge_vector_file, bridge_raster, output_bridge_lines_raster_file, resolution + source_hand_raster, bridge_vector_file, catchments, bridge_centroids, buffer_width, resolution ): - """ - Process: - - Use the osm_file, likely already pre-clipped to a huc, and create a raster from it. - - using the incomeing source_raster, likely a rem at this point, find the max point value for intersecting from the - line string. Fundemtally create a z value for the line string based on the touch point of the linestring on both - banks. TODO: how does it handle higher elevation on one bank? Might already be in this logic.. not sure. - - That value will be assigned to each cell that covers the bridge in the output raster. - - We do create a temp raster which we can removed in the "deny" list system. We can use it to show the point values - assigned to each cell of the bridge. - """ if not os.path.exists(source_hand_raster): print(f"-- no hand grid, {source_hand_raster}") return if os.path.exists(bridge_vector_file): + # Read the bridge lines file and buffer it by half of the input width osm_gdf = gpd.read_file(bridge_vector_file) + osm_gdf['centroid_geometry'] = osm_gdf.centroid + osm_gdf['geometry'] = osm_gdf.geometry.buffer(buffer_width, resolution=resolution) else: # skip this huc because it didn't pull in the initial OSM script # and could have errors in the data or geometry print(f"-- no OSM file, {bridge_vector_file}") return - hand_grid = rasterio.open(source_hand_raster) + with rasterio.open(source_hand_raster, 'r') as hand_grid: + profile = hand_grid.profile + hand_grid_array = hand_grid.read(1) - ####################################################################### + # Get max hand values for each bridge + osm_gdf['max_hand'] = zonal_stats( + osm_gdf['geometry'], hand_grid_array, affine=hand_grid.transform, stats="max" + ) + # pull the values out of the geopandas columns so we can use them as floats + osm_gdf['max_hand'] = [x.get('max') for x in osm_gdf.max_hand] + # sort in case of overlaps; display max hand value at any given location + osm_gdf = osm_gdf.sort_values(by="max_hand", ascending=False) - ############# get max hand values for each bridge ######### - # find max hand value from raster each linestring intersects - osm_gdf['max_hand'] = zonal_stats( - osm_gdf['geometry'], hand_grid.read(1), affine=hand_grid.transform, stats="max" - ) - # pull the values out of the geopandas columns so we can use them as floats - osm_gdf['max_hand'] = [x.get('max') for x in osm_gdf.max_hand] - # sort in case of overlaps; display max hand value at any given location - osm_gdf = osm_gdf.sort_values(by="max_hand", ascending=False) - ####################################################### - - ########### setup new raster to save bridge max hand values ############# - bbox = hand_grid.bounds - xmin, ymin, xmax, ymax = bbox - w = hand_grid.shape[1] - h = hand_grid.shape[0] - - out_meta = { - "driver": "GTiff", - "dtype": "float32", - "height": h, - "width": w, - "count": 1, - "crs": hand_grid.crs, - "nodata": -999999, - "transform": transform.from_bounds(xmin, ymin, xmax, ymax, w, h), - "compress": 'lzw', - } - - ################# rasterize the incoming bridge vectors #################### - with rasterio.open(bridge_raster, 'w+', **out_meta) as out: - out_arr = out.read(1) - # this is where we create a generator of geom, value pairs to use in rasterizing + # Burn the bridges into the HAND grid shapes = ((geom, value) for geom, value in zip(osm_gdf.geometry, osm_gdf.max_hand)) - # burn in values to any pixel that's touched by polygon and add nodata fill value - burned = features.rasterize( - shapes=shapes, fill=-999999, out=out_arr, transform=hand_grid.transform, all_touched=True + features.rasterize( + shapes=shapes, out=hand_grid_array, transform=hand_grid.transform, all_touched=False ) - out.write_band(1, burned) - #################### heal / update hand grid ########################## - with rasterio.open(bridge_raster) as in_data: - new_hand_values = in_data.read(1) + # Write the new HAND grid + with rasterio.open(source_hand_raster, 'w', **profile) as new_hand_grid: + new_hand_grid.write(hand_grid_array, 1) + + # Switch the geometry over to the centroid points + osm_gdf['geometry'] = osm_gdf['centroid_geometry'] + osm_gdf = osm_gdf.drop(columns='centroid_geometry') + + # Join the bridge points to the HAND catchments to get the HydroID and feature_id + osm_gdf = osm_gdf.loc[osm_gdf.max_hand >= 0] + catchments_df = gpd.read_file(catchments) + osm_gdf = gpd.sjoin(osm_gdf, catchments_df[['HydroID', 'feature_id', 'order_', 'geometry']], how='inner') + osm_gdf = osm_gdf.drop(columns='index_right') + # Calculate threatened stage + osm_gdf['max_hand_75'] = osm_gdf.max_hand * threatened_percent + # Add the branch id to the catchments + branch_dir = re.search(r'branches/(\d{10}|0)/', catchments).group() + branch_id = re.search(r'(\d{10}|0)', branch_dir).group() + osm_gdf['branch'] = branch_id + osm_gdf['mainstem'] = 0 if branch_id == '0' else 1 + + # Write the bridge points to a geopackage + osm_gdf.to_file(bridge_centroids, index=False) - hand_grid_vals = hand_grid.read(1) - # replace values at all locations where there are healed values available - combined_hand_values = np.where(new_hand_values == -999999, hand_grid_vals, new_hand_values) + return - with rasterio.open(output_bridge_lines_raster_file, 'w+', **out_meta) as out: - out.write(combined_hand_values, 1) - return +def flow_lookup(stages, hydroid, hydroTable): + single_hydroTable = hydroTable.loc[hydroTable.HydroID == hydroid] + return_flows = np.interp( + stages, single_hydroTable.loc[:, 'stage'], single_hydroTable.loc[:, 'discharge_cms'] + ) + return return_flows + + +def flows_from_hydrotable(bridge_pnts, hydroTable): + bridge_pnts[['max_discharge', 'max_discharge75']] = bridge_pnts.apply( + lambda row: flow_lookup((row.max_hand, row.max_hand_75), row.HydroID, hydroTable), + axis=1, + result_type='expand', + ) + return bridge_pnts if __name__ == "__main__": ''' Sample usage (min params): python3 src/heal_bridges_osm.py - -u 12090301 -g /outputs/fim_4_4_15_0/1209301/branches/3763000013/rem_zeroed_masked_3763000013.tif -s /outputs/fim_4_4_15_0/1209301/osm_bridges_subset.gpkg - -p /outputs/fim_4_4_15_0/1209301/1209301/branches/3763000013/bridge_lines_raster_3763000013.tif - -t /outputs/fim_4_4_15_0/1209301/branches/3763000013/rem_zeroed_masked_3763000013.tif + -c /outputs/fim_4_4_15_0/1209301/1209301/branches/3763000013/osm_bridge_centroids_3763000013.tif + -b 10 -r 10 ''' @@ -119,26 +120,31 @@ def process_bridges_in_huc( ) parser.add_argument( - '-p', - '--bridge_raster', - help='REQUIRED: Path and file name of the temp raster created by the bridge vectors', - required=True, + '-p', '--catchments', help='REQUIRED: Path and file name of the catchments geopackage', required=True ) parser.add_argument( - '-t', - '--output_bridge_lines_raster_file', - help='REQUIRED: Path and file name of the new raster with the bridge burned in', + '-c', + '--bridge_centroids', + help='REQUIRED: Path and file name of the output bridge centroid geopackage', required=True, ) + parser.add_argument( + '-b', + '--buffer_width', + help='OPTIONAL: Buffer to apply to OSM bridges. Default value is 10m (on each side)', + required=False, + default=10, + type=float, + ) parser.add_argument( '-r', '--resolution', help='OPTIONAL: Resolution of HAND grid. Default value is 10m', required=False, default=10, - type=float, + type=int, ) args = vars(parser.parse_args()) From 3092e979f91c287235b7ebf5fed0d727466c7f7c Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Tue, 21 May 2024 15:23:36 +0000 Subject: [PATCH 50/51] v4.5.2.1 Remove loading of apache-arrow repository (#1172) --- Dockerfile | 8 +- Pipfile | 12 +- Pipfile.lock | 946 ++++++++++++++++++++++++++++++++++------------ docs/CHANGELOG.md | 33 +- 4 files changed, 726 insertions(+), 273 deletions(-) diff --git a/Dockerfile b/Dockerfile index 68be823cf..96f6b2d3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,6 +9,9 @@ ARG taudemVersion2=81f7a07cdd3721617a30ee4e087804fddbcffa88 ENV taudemDir=$depDir/taudem/bin ENV taudemDir2=$depDir/taudem_accelerated_flowDirections/taudem/build/bin +# remove reference to missing repo +RUN rm /etc/apt/sources.list.d/apache-arrow.sources + RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* RUN git clone https://github.com/dtarb/taudem.git @@ -66,6 +69,9 @@ RUN mkdir -p $workDir RUN mkdir -p $depDir COPY --from=builder $depDir $depDir +# remove reference to missing repo +RUN rm /etc/apt/sources.list.d/apache-arrow.sources + RUN apt-get update --fix-missing && apt-get install -y openjdk-19-jdk && rm -rf /var/lib/apt/lists/* RUN apt update --fix-missing @@ -91,7 +97,7 @@ ENV PYTHONPATH=${PYTHONPATH}:$srcDir:$projectDir/unit_tests:$projectDir/tools COPY Pipfile . COPY Pipfile.lock . -RUN pip3 install pipenv==2022.4.8 && PIP_NO_CACHE_DIR=off pipenv install --system --deploy --ignore-pipfile +RUN pip3 install pipenv==2023.12.1 && PIP_NO_CACHE_DIR=off pipenv install --system --deploy --ignore-pipfile # ---------------------------------- # Mar 2023 diff --git a/Pipfile b/Pipfile index 16e8eed68..b4e5981b2 100644 --- a/Pipfile +++ b/Pipfile @@ -4,7 +4,7 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] -ipython = "==8.12.0" +ipython = "==8.24.0" [packages] certifi = "==2023.7.22" @@ -16,7 +16,7 @@ pandas = "==2.0.2" rasterio = "==1.3.6" rasterstats = "==0.18.0" richdem = "==0.3.4" -tqdm = "==4.65.0" +tqdm = "==4.66.3" seaborn = "==0.12.2" python-dotenv = "==1.0.0" natsort = "==8.3.1" @@ -46,8 +46,12 @@ urllib3 = "==1.26.18" pyflwdir = "==0.5.8" pillow = "==10.3.0" pyogrio = "==0.7.2" -openpyxl = "*" -osmnx = "*" +openpyxl = "==3.1.2" +osmnx = "==1.9.3" +lmoments3 = "==1.0.6" +zarr = "==2.18.0" +requests = "==2.31.0" +aiohttp = "==3.9.5" [requires] python_version = "3.10" diff --git a/Pipfile.lock b/Pipfile.lock index 4162d23ab..c3758ef76 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a7f3b5a12b051d29d0dee120d17361cca1ce11c412d15be4c207f6ca43e615b9" + "sha256": "b1097cae3089688432b1d87cf34f1f1877327168066113e534a986fd0a9fa6fa" }, "pipfile-spec": 6, "requires": { @@ -29,9 +29,99 @@ "sha256:1142fa8e80dbae46bb6339573ad4c8c0841358f79c6eb50a493dceca14621bad", "sha256:9107f1ca0b2a5553987a94a3c9959fe5b491fdf731389aa5b7b1bd0733e32de6" ], - "markers": "python_version >= '3.7' and python_version < '4'", + "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==22.1.0" }, + "aiohttp": { + "hashes": [ + "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8", + "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c", + "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475", + "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed", + "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf", + "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372", + "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81", + "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f", + "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1", + "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd", + "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a", + "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb", + "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46", + "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de", + "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78", + "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c", + "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771", + "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb", + "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430", + "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233", + "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156", + "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9", + "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59", + "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888", + "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c", + "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c", + "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da", + "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424", + "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2", + "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb", + "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8", + "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a", + "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10", + "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0", + "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09", + "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031", + "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4", + "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3", + "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa", + "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a", + "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe", + "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a", + "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2", + "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1", + "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323", + "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b", + "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b", + "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106", + "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac", + "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6", + "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832", + "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75", + "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6", + "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d", + "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72", + "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db", + "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a", + "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da", + "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678", + "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b", + "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24", + "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed", + "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f", + "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e", + "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58", + "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a", + "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342", + "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558", + "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2", + "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551", + "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595", + "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee", + "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11", + "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d", + "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7", + "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" + ], + "index": "pypi", + "version": "==3.9.5" + }, + "aiosignal": { + "hashes": [ + "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", + "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, "aiosqlite": { "hashes": [ "sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6", @@ -98,6 +188,12 @@ "markers": "python_version >= '3.8'", "version": "==1.3.0" }, + "asciitree": { + "hashes": [ + "sha256:4aa4b9b649f85e3fcb343363d97564aa1fb62e249677f2e18a96765145cc0f6e" + ], + "version": "==0.3.3" + }, "asttokens": { "hashes": [ "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", @@ -105,6 +201,14 @@ ], "version": "==2.4.1" }, + "async-timeout": { + "hashes": [ + "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", + "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" + ], + "markers": "python_version < '3.11'", + "version": "==4.0.3" + }, "attrs": { "hashes": [ "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", @@ -115,11 +219,11 @@ }, "babel": { "hashes": [ - "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363", - "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287" + "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", + "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" ], - "markers": "python_version >= '3.7'", - "version": "==2.14.0" + "markers": "python_version >= '3.8'", + "version": "==2.15.0" }, "beautifulsoup4": { "hashes": [ @@ -189,7 +293,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4'", + "markers": "python_version >= '3.8' and python_version < '4.0'", "version": "==2.0.0" }, "boto3": { @@ -522,7 +626,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", "version": "==0.7.2" }, "cloudpickle": { @@ -778,6 +882,14 @@ "markers": "python_version >= '3.5'", "version": "==2.0.1" }, + "fasteners": { + "hashes": [ + "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", + "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" + ], + "markers": "sys_platform != 'emscripten'", + "version": "==0.19" + }, "fastjsonschema": { "hashes": [ "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0", @@ -787,11 +899,11 @@ }, "filelock": { "hashes": [ - "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f", - "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4" + "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f", + "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a" ], "markers": "python_version >= '3.8'", - "version": "==3.13.4" + "version": "==3.14.0" }, "fiona": { "hashes": [ @@ -896,6 +1008,89 @@ ], "version": "==1.5.1" }, + "frozenlist": { + "hashes": [ + "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7", + "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98", + "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad", + "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5", + "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae", + "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e", + "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a", + "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701", + "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d", + "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6", + "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6", + "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106", + "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75", + "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868", + "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a", + "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0", + "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1", + "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826", + "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec", + "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6", + "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950", + "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19", + "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0", + "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8", + "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a", + "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09", + "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86", + "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c", + "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5", + "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b", + "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b", + "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d", + "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0", + "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea", + "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776", + "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a", + "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897", + "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7", + "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09", + "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9", + "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe", + "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd", + "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742", + "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09", + "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0", + "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932", + "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1", + "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a", + "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49", + "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d", + "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7", + "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480", + "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89", + "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e", + "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b", + "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82", + "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb", + "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068", + "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8", + "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b", + "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb", + "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2", + "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11", + "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b", + "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc", + "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0", + "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497", + "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17", + "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0", + "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2", + "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439", + "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5", + "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac", + "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825", + "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887", + "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced", + "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.1" + }, "fsspec": { "hashes": [ "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", @@ -1053,11 +1248,11 @@ }, "ipython": { "hashes": [ - "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1", - "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" + "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501", + "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3" ], "markers": "python_version >= '3.10'", - "version": "==8.23.0" + "version": "==8.24.0" }, "ipython-genutils": { "hashes": [ @@ -1099,11 +1294,11 @@ }, "jinja2": { "hashes": [ - "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", - "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" ], "markers": "python_version >= '3.7'", - "version": "==3.1.3" + "version": "==3.1.4" }, "jmespath": { "hashes": [ @@ -1115,11 +1310,11 @@ }, "joblib": { "hashes": [ - "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c", - "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7" + "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", + "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e" ], "markers": "python_version >= '3.8'", - "version": "==1.4.0" + "version": "==1.4.2" }, "json5": { "hashes": [ @@ -1141,11 +1336,11 @@ "format-nongpl" ], "hashes": [ - "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f", - "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5" + "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7", + "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802" ], "markers": "python_version >= '3.8'", - "version": "==4.21.1" + "version": "==4.22.0" }, "jsonschema-specifications": { "hashes": [ @@ -1412,6 +1607,14 @@ "markers": "python_version >= '3.7'", "version": "==0.39.1" }, + "lmoments3": { + "hashes": [ + "sha256:404a589335c16549f5ff519d3fafab247203ef78801296447db939b0c58f824b", + "sha256:80e1397f1e3e5d1aa471ba67e49e557e7b3a67c7f7b5086c5fc8febcca6969f7" + ], + "index": "pypi", + "version": "==1.0.6" + }, "locket": { "hashes": [ "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", @@ -1634,6 +1837,102 @@ "markers": "python_version >= '3.8'", "version": "==1.0.8" }, + "multidict": { + "hashes": [ + "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", + "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c", + "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29", + "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b", + "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8", + "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7", + "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd", + "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40", + "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6", + "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3", + "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c", + "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9", + "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5", + "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae", + "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442", + "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9", + "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc", + "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c", + "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea", + "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5", + "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50", + "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182", + "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453", + "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e", + "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600", + "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733", + "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda", + "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241", + "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461", + "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e", + "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e", + "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b", + "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e", + "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7", + "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386", + "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd", + "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9", + "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf", + "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee", + "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5", + "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a", + "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271", + "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54", + "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4", + "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496", + "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb", + "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319", + "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3", + "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f", + "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527", + "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed", + "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604", + "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef", + "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8", + "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5", + "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5", + "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626", + "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c", + "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d", + "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c", + "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc", + "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc", + "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b", + "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38", + "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450", + "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1", + "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f", + "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3", + "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755", + "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226", + "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a", + "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046", + "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf", + "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479", + "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e", + "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1", + "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a", + "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83", + "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929", + "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93", + "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a", + "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c", + "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44", + "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89", + "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba", + "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e", + "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da", + "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24", + "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423", + "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef" + ], + "markers": "python_version >= '3.7'", + "version": "==6.0.5" + }, "multimethod": { "hashes": [ "sha256:7f2a4863967142e6db68632fef9cd79053c09670ba0c5f113301e245140bba5c", @@ -1699,11 +1998,11 @@ }, "nbconvert": { "hashes": [ - "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142", - "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b" + "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3", + "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4" ], "markers": "python_version >= '3.8'", - "version": "==7.16.3" + "version": "==7.16.4" }, "nbformat": { "hashes": [ @@ -1772,11 +2071,11 @@ }, "notebook": { "hashes": [ - "sha256:b4625a4b7a597839dd3156b140d5ba2c7123761f98245a3290f67a8b8ee048d9", - "sha256:c1e2eb2e3b6079a0552a04974883a48d04c3c05792170d64a4b23d707d453181" + "sha256:04eb9011dfac634fbd4442adaf0a8c27cd26beef831fe1d19faf930c327768e4", + "sha256:a6afa9a4ff4d149a0771ff8b8c881a7a73b3835f9add0606696d6e9d98ac1cd0" ], "markers": "python_version >= '3.7'", - "version": "==6.5.6" + "version": "==6.5.7" }, "notebook-shim": { "hashes": [ @@ -1820,6 +2119,33 @@ "index": "pypi", "version": "==0.56.4" }, + "numcodecs": { + "hashes": [ + "sha256:05d91a433733e7eef268d7e80ec226a0232da244289614a8f3826901aec1098e", + "sha256:0e79bf9d1d37199ac00a60ff3adb64757523291d19d03116832e600cac391c51", + "sha256:135b2d47563f7b9dc5ee6ce3d1b81b0f1397f69309e909f1a35bb0f7c553d45e", + "sha256:21d8267bd4313f4d16f5b6287731d4c8ebdab236038f29ad1b0e93c9b2ca64ee", + "sha256:29dfb195f835a55c4d490fb097aac8c1bcb96c54cf1b037d9218492c95e9d8c5", + "sha256:2f1ba2f4af3fd3ba65b1bcffb717fe65efe101a50a91c368f79f3101dbb1e243", + "sha256:2f84df6b8693206365a5b37c005bfa9d1be486122bde683a7b6446af4b75d862", + "sha256:2fbb12a6a1abe95926f25c65e283762d63a9bf9e43c0de2c6a1a798347dfcb40", + "sha256:760627780a8b6afdb7f942f2a0ddaf4e31d3d7eea1d8498cf0fd3204a33c4618", + "sha256:82d7107f80f9307235cb7e74719292d101c7ea1e393fe628817f0d635b7384f5", + "sha256:941b7446b68cf79f089bcfe92edaa3b154533dcbcd82474f994b28f2eedb1c60", + "sha256:a191a8e347ecd016e5c357f2bf41fbcb026f6ffe78fff50c77ab12e96701d155", + "sha256:abff3554a6892a89aacf7b642a044e4535499edf07aeae2f2e6e8fc08c9ba07f", + "sha256:c17687b1fd1fef68af616bc83f896035d24e40e04e91e7e6dae56379eb59fe33", + "sha256:c258bd1d3dfa75a9b708540d23b2da43d63607f9df76dfa0309a7597d1de3b73", + "sha256:caf1a1e6678aab9c1e29d2109b299f7a467bd4d4c34235b1f0e082167846b88f", + "sha256:d37f628fe92b3699e65831d5733feca74d2e33b50ef29118ffd41c13c677210e", + "sha256:e04649ea504aff858dbe294631f098fbfd671baf58bfc04fc48d746554c05d67", + "sha256:eeaf42768910f1c6eebf6c1bb00160728e62c9343df9e2e315dc9fe12e3f6071", + "sha256:ef964d4860d3e6b38df0633caf3e51dc850a6293fd8e93240473642681d95136", + "sha256:f2207871868b2464dc11c513965fd99b958a9d7cde2629be7b2dc84fdaab013b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, "numexpr": { "hashes": [ "sha256:03d0ba492e484a5a1aeb24b300c4213ed168f2c246177be5733abb4e18cbb043", @@ -1915,11 +2241,11 @@ }, "osmnx": { "hashes": [ - "sha256:59d21756ebdb4a4d211fb1373a3dca170832eec5f25ef94f5500bd79d32c169a", - "sha256:9ea17500b45aa8e4740490d649c7f7747fa4f2e3f9747294837fa2c80aabd05f" + "sha256:22548d86d68d36edff3cf9ab76c45745cda86a4ea0b28442e107d6b42992a426", + "sha256:ac67bea77b521941af648ef641ae1d006101948d1112475c256ea23ef31b426a" ], "index": "pypi", - "version": "==1.9.2" + "version": "==1.9.3" }, "overrides": { "hashes": [ @@ -2002,11 +2328,11 @@ }, "partd": { "hashes": [ - "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6", - "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67" + "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", + "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" ], - "markers": "python_version >= '3.7'", - "version": "==1.4.1" + "markers": "python_version >= '3.9'", + "version": "==1.4.2" }, "pathspec": { "hashes": [ @@ -2470,11 +2796,11 @@ }, "pygments": { "hashes": [ - "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", - "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" ], - "markers": "python_version >= '3.7'", - "version": "==2.17.2" + "markers": "python_version >= '3.8'", + "version": "==2.18.0" }, "pyogrio": { "hashes": [ @@ -2738,83 +3064,97 @@ }, "pyzmq": { "hashes": [ - "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107", - "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7", - "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d", - "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc", - "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c", - "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4", - "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8", - "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8", - "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287", - "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b", - "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f", - "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77", - "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066", - "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209", - "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd", - "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a", - "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4", - "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc", - "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58", - "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246", - "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62", - "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227", - "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b", - "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944", - "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2", - "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804", - "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8", - "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066", - "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1", - "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33", - "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639", - "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef", - "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a", - "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace", - "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00", - "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5", - "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b", - "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879", - "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340", - "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4", - "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4", - "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6", - "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3", - "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f", - "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3", - "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409", - "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913", - "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1", - "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43", - "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333", - "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75", - "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff", - "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e", - "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2", - "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef", - "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1", - "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330", - "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d", - "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0", - "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6", - "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea", - "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f", - "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff", - "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99", - "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b", - "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d", - "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be", - "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58", - "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc", - "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83", - "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d", - "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc", - "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66", - "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e" + "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", + "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", + "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", + "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", + "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", + "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", + "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", + "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", + "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", + "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", + "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", + "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", + "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", + "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", + "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", + "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", + "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", + "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", + "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", + "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", + "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", + "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", + "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", + "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", + "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", + "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", + "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", + "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", + "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", + "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", + "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", + "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", + "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", + "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", + "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", + "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", + "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", + "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", + "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", + "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", + "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", + "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", + "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", + "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", + "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", + "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", + "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", + "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", + "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", + "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", + "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", + "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", + "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", + "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", + "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", + "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", + "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", + "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", + "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", + "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", + "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", + "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", + "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", + "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", + "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", + "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", + "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", + "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", + "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", + "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", + "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", + "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", + "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", + "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", + "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", + "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", + "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", + "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", + "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", + "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", + "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", + "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", + "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", + "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", + "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", + "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", + "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", + "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" ], - "markers": "python_version >= '3.6'", - "version": "==24.0.1" + "markers": "python_version >= '3.7'", + "version": "==26.0.3" }, "pyzstd": { "hashes": [ @@ -2948,11 +3288,11 @@ }, "qtconsole": { "hashes": [ - "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b", - "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc" + "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", + "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" ], "markers": "python_version >= '3.8'", - "version": "==5.5.1" + "version": "==5.5.2" }, "qtpy": { "hashes": [ @@ -2995,18 +3335,18 @@ }, "referencing": { "hashes": [ - "sha256:191e936b0c696d0af17ad7430a3dc68e88bc11be6514f4757dc890f04ab05889", - "sha256:8080727b30e364e5783152903672df9b6b091c926a146a759080b62ca3126cd6" + "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", + "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de" ], "markers": "python_version >= '3.8'", - "version": "==0.35.0" + "version": "==0.35.1" }, "requests": { "hashes": [ "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], - "markers": "python_version >= '3.7'", + "index": "pypi", "version": "==2.31.0" }, "rfc3339-validator": { @@ -3062,108 +3402,108 @@ }, "rpds-py": { "hashes": [ - "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f", - "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c", - "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76", - "sha256:08f9ad53c3f31dfb4baa00da22f1e862900f45908383c062c27628754af2e88e", - "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157", - "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f", - "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5", - "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05", - "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24", - "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1", - "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8", - "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b", - "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb", - "sha256:2644e47de560eb7bd55c20fc59f6daa04682655c58d08185a9b95c1970fa1e07", - "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1", - "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6", - "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e", - "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e", - "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1", - "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab", - "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4", - "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17", - "sha256:41ef53e7c58aa4ef281da975f62c258950f54b76ec8e45941e93a3d1d8580594", - "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d", - "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d", - "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3", - "sha256:465a3eb5659338cf2a9243e50ad9b2296fa15061736d6e26240e713522b6235c", - "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66", - "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f", - "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80", - "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33", - "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f", - "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c", - "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022", - "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e", - "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f", - "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da", - "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1", - "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688", - "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795", - "sha256:67071a6171e92b6da534b8ae326505f7c18022c6f19072a81dcf40db2638767c", - "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98", - "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1", - "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20", - "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307", - "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4", - "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18", - "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294", - "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66", - "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467", - "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948", - "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e", - "sha256:7cd863afe7336c62ec78d7d1349a2f34c007a3cc6c2369d667c65aeec412a5b1", - "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0", - "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7", - "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd", - "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641", - "sha256:8e8916ae4c720529e18afa0b879473049e95949bf97042e938530e072fde061d", - "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9", - "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1", - "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da", - "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3", - "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa", - "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7", - "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40", - "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496", - "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124", - "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836", - "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434", - "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984", - "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f", - "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6", - "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e", - "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461", - "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c", - "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432", - "sha256:bed88b9a458e354014d662d47e7a5baafd7ff81c780fd91584a10d6ec842cb73", - "sha256:c0013fe6b46aa496a6749c77e00a3eb07952832ad6166bd481c74bda0dcb6d58", - "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88", - "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337", - "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7", - "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863", - "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475", - "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3", - "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51", - "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf", - "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024", - "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40", - "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9", - "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec", - "sha256:e32a92116d4f2a80b629778280103d2a510a5b3f6314ceccd6e38006b5e92dcb", - "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7", - "sha256:e541ec6f2ec456934fd279a3120f856cd0aedd209fc3852eca563f81738f6861", - "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880", - "sha256:ea7d4a99f3b38c37eac212dbd6ec42b7a5ec51e2c74b5d3223e43c811609e65f", - "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd", - "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca", - "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58", - "sha256:fdea4952db2793c4ad0bdccd27c1d8fdd1423a92f04598bc39425bcc2b8ee46e" + "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee", + "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc", + "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc", + "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944", + "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20", + "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7", + "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4", + "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6", + "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6", + "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93", + "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633", + "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0", + "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360", + "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8", + "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139", + "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7", + "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a", + "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9", + "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26", + "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724", + "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72", + "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b", + "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09", + "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100", + "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3", + "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261", + "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3", + "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9", + "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b", + "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3", + "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de", + "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d", + "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e", + "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8", + "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff", + "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5", + "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c", + "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e", + "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e", + "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4", + "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8", + "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922", + "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338", + "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d", + "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8", + "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2", + "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72", + "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80", + "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644", + "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae", + "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163", + "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104", + "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d", + "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60", + "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a", + "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d", + "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07", + "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49", + "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10", + "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f", + "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2", + "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8", + "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7", + "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88", + "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65", + "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0", + "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909", + "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8", + "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c", + "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184", + "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397", + "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a", + "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346", + "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590", + "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333", + "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb", + "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74", + "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e", + "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d", + "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa", + "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f", + "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53", + "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1", + "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac", + "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0", + "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd", + "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611", + "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f", + "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c", + "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5", + "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab", + "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc", + "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43", + "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da", + "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac", + "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843", + "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e", + "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89", + "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64" ], "markers": "python_version >= '3.8'", - "version": "==0.18.0" + "version": "==0.18.1" }, "rtree": { "hashes": [ @@ -3542,11 +3882,11 @@ }, "tqdm": { "hashes": [ - "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5", - "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671" + "sha256:23097a41eba115ba99ecae40d06444c15d1c0c698d527a01c6c8bd1c5d0647e5", + "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53" ], "index": "pypi", - "version": "==4.65.0" + "version": "==4.66.3" }, "traitlets": { "hashes": [ @@ -3612,11 +3952,11 @@ }, "virtualenv": { "hashes": [ - "sha256:0846377ea76e818daaa3e00a4365c018bc3ac9760cbb3544de542885aad61fb3", - "sha256:ec25a9671a5102c8d2657f62792a27b48f016664c6873f6beed3800008577210" + "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b", + "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75" ], "markers": "python_version >= '3.7'", - "version": "==20.26.0" + "version": "==20.26.1" }, "wcwidth": { "hashes": [ @@ -3842,6 +4182,102 @@ ], "version": "==0.6.2" }, + "yarl": { + "hashes": [ + "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51", + "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce", + "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559", + "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0", + "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81", + "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc", + "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4", + "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c", + "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130", + "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136", + "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e", + "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec", + "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7", + "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1", + "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455", + "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099", + "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129", + "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10", + "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142", + "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98", + "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa", + "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7", + "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525", + "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c", + "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9", + "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c", + "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8", + "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b", + "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf", + "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23", + "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd", + "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27", + "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f", + "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece", + "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434", + "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec", + "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff", + "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78", + "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d", + "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863", + "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53", + "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31", + "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15", + "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5", + "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b", + "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57", + "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3", + "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1", + "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f", + "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad", + "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c", + "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7", + "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2", + "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b", + "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2", + "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b", + "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9", + "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be", + "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e", + "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984", + "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4", + "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074", + "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2", + "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392", + "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91", + "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541", + "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf", + "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572", + "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66", + "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575", + "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14", + "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5", + "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1", + "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e", + "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551", + "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17", + "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead", + "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0", + "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe", + "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234", + "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0", + "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7", + "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34", + "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42", + "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385", + "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78", + "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be", + "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958", + "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749", + "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec" + ], + "markers": "python_version >= '3.7'", + "version": "==1.9.4" + }, "ypy-websocket": { "hashes": [ "sha256:43a001473f5c8abcf182f603049cf305cbc855ad8deaa9dfa0f3b5a7cea9d0ff", @@ -3850,6 +4286,14 @@ "markers": "python_version >= '3.7'", "version": "==0.8.4" }, + "zarr": { + "hashes": [ + "sha256:7f8532b6a3f50f22e809e130e09353637ec8b5bb5e95a5a0bfaae91f63978b5d", + "sha256:c3b7d2c85b8a42b0ad0ad268a36fb6886ca852098358c125c6b126a417e0a598" + ], + "index": "pypi", + "version": "==2.18.0" + }, "zipp": { "hashes": [ "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", @@ -3867,13 +4311,6 @@ ], "version": "==2.4.1" }, - "backcall": { - "hashes": [ - "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", - "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" - ], - "version": "==0.2.0" - }, "decorator": { "hashes": [ "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", @@ -3882,6 +4319,14 @@ "markers": "python_version >= '3.5'", "version": "==5.1.1" }, + "exceptiongroup": { + "hashes": [ + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.1" + }, "executing": { "hashes": [ "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", @@ -3892,11 +4337,11 @@ }, "ipython": { "hashes": [ - "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1", - "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" + "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501", + "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3" ], "markers": "python_version >= '3.10'", - "version": "==8.23.0" + "version": "==8.24.0" }, "jedi": { "hashes": [ @@ -3930,13 +4375,6 @@ "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", "version": "==4.9.0" }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" - }, "prompt-toolkit": { "hashes": [ "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", @@ -3962,11 +4400,11 @@ }, "pygments": { "hashes": [ - "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", - "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" ], - "markers": "python_version >= '3.7'", - "version": "==2.17.2" + "markers": "python_version >= '3.8'", + "version": "==2.18.0" }, "six": { "hashes": [ @@ -3991,6 +4429,14 @@ "markers": "python_version >= '3.8'", "version": "==5.14.3" }, + "typing-extensions": { + "hashes": [ + "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", + "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + ], + "markers": "python_version < '3.11'", + "version": "==4.11.0" + }, "wcwidth": { "hashes": [ "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3d15f1533..1b4c56608 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,6 +1,20 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. + +## v4.5.2.1 - 2024-05-21 - [PR#1172](https://github.com/NOAA-OWP/inundation-mapping/pull/1172) + +Removes loading of `apache-arrow` repository from the Dockerfile where it was causing a GPG key error during `docker build`. + +A number of python packages were updated in this PR. You will need to build a new Docker image for this release. + +### Changes + +- Dockerfile: Adds a line remove the loading of apache-arrow during `apt-get update`. + +

+ + ## v4.5.2.0 - 2024-05-20 - [PR#1166](https://github.com/NOAA-OWP/inundation-mapping/pull/1166) The main goal of this PR is to create bridge point data that be used as a service in HydroVIS. Since every branch processes bridges separately, it's possible to inundate a bridge from more than just the feature_id it crosses. To reflect this, the `osm_bridge_centroids.gpkg` now found in HUC directories will have coincident points - one that is inundated from the reach it crosses and the other a backwater-influenced point indicated by the `is_backwater` field. @@ -22,7 +36,6 @@ The main goal of this PR is to create bridge point data that be used as a servic This hotfix addresses the issue #1162 by explicitly using 'fiona' engine for reading gpkg files with Boolean dtype. This is applicable only for `usgs_gages.gpkg` and `usgs_subset_gages.gpkg` files. - ### Changes - `src/usgs_gage_unit_setup.py` ... changed only two lines for fiona engine - `src/usgs_gage_crosswalk.py` ... changed only one line for fiona engine + two small changes to use `self.branch_id` for the correct log report @@ -30,7 +43,6 @@ This hotfix addresses the issue #1162 by explicitly using 'fiona' engine for rea

- ## v4.5.1.2 - 2024-05-17 - [PR#1135](https://github.com/NOAA-OWP/inundation-mapping/pull/1135) Updates USGS gage processing to use the correct projection (determined by whether the HUC is in Alaska or not). @@ -57,7 +69,7 @@ Extends flows (i.e., discharge) to stream segments missing from NWS and USGS val

-## v4.5.1.0 - 2024-05-17 - [PR#1150](https://github.com/NOAA-OWP/inundation-mapping/pull/1150) +## v4.5.1.0 - 2024-05-17 - [PR#1156](https://github.com/NOAA-OWP/inundation-mapping/pull/1156) This focuses on removing hydro-conditioning artifacts by subtracting the thalweg DEM from HAND REM and adding back the original DEM. Also, a new tool was created to test this feature over multiple HUCs @@ -68,7 +80,6 @@ This focuses on removing hydro-conditioning artifacts by subtracting the thalweg - `src/delineate_hydros_and_produce_HAND.sh`: Removing hydro-conditioning artifacts from HAND REM. - `config/params_template.env`: Creating an option to include/exclude healed HAND from FIM pipeline. -

## v4.5.0.2 - 2024-05-17 - [PR#1159](https://github.com/NOAA-OWP/inundation-mapping/pull/1159) @@ -85,7 +96,6 @@ Also, In this revised version, I've eliminated the code sections that previously Similar to 'usgs_gages.gpkg' dataset, all lid stations, including those in Alaska, are stored in a single gpkg file (`nws_lid.gpkg`) with EPSG=5070. The Alaska stations can be identified using their HUC8 numbers (beginning with '19'). - ### Changes - tools/generate_nws_lid.py @@ -144,7 +154,6 @@ Some NWM streams, particularly in coastal areas, fail to reach the edge of the D

- ## v4.4.15.4 - 2024-05-06 - [PR#1115](https://github.com/NOAA-OWP/inundation-mapping/pull/1115) This PR addresses issue #1040 and includes the following updates: @@ -172,10 +181,8 @@ Fixes a KeyError in `src/mitigate_branch_outlet_backpool.py`. `src/mitigate_branch_outlet_backpool.py`: Addresses case where `catchments_df['outlier']` are all False. -

- ## v4.4.15.2 - 2024-05-06 - [PR#1133](https://github.com/NOAA-OWP/inundation-mapping/pull/1133) Bug fix for error when reading the subfolders of a directory using `listdir()` where files exist that start with an 8-digit number that are later interpreted as directories. @@ -230,7 +237,6 @@ Adds checks for intermediate files produced by Whitebox in the AGREE process (`s

- ## v4.4.14.0 - 2024-04-17 - [PR#1106](https://github.com/NOAA-OWP/inundation-mapping/pull/10106) Updates the FIM pipeline so it can process HUCs in southern Alaska. Running FIM in southern Alaska requires that a different CRS and a few different files be used. Additionally, some of the Alaska HUCs displayed an issue where the input stream density was too high, so this update introduces some logic to adjust the threshold of stream orders to exclude based on whether an Alaska HUC is listed as high or medium-high stream density. This update intriduces new Alaska-specific inputs, which are listed in the PR. @@ -269,7 +275,6 @@ A small update to the README.md was also updated for an unrelated topic (about A

- ## v4.4.13.2 - 2024-04-04 - [PR#1110](https://github.com/NOAA-OWP/inundation-mapping/pull/1110) This PR reflects upgrades for openJDK from 17.0.8 to something higher, minimum of 17.0.9. After some research, we can not upgrade all the way to the latest openJDK but can jump up to 19.0. This limitation is related to version of our base docker image. openJDK was identified as requiring an upgrade by a system wide security scan. @@ -286,7 +291,6 @@ The "black" packages is also be upgraded from 23.7.0 to 24.3.

- ## v4.4.13.1 - 2024-03-11 - [PR#1086](https://github.com/NOAA-OWP/inundation-mapping/pull/1086) Fixes bug where levee-protected areas were not being masked from branch 0 DEMs. @@ -318,7 +322,6 @@ If both criteria are met for a branch, then the issue is mitigated by trimming t

- ## v4.4.12.0 - 2024-03-11 - [PR#1078](https://github.com/NOAA-OWP/inundation-mapping/pull/1078) Resolves issue #1033 by adding Alaska-specific data to the FIM input folders and updating the pre-clip vector process to use the proper data and CRS when an Alaska HUC is detected. The `-wbd` flag was removed from the optional arguments of `generate_pre_clip_fim_huc8`. The WBD file path will now only be sourced from the `bash_variables.env` file. The `bash_variables.env` file has been updated to include the new Alaska-specific FIM input files. @@ -338,7 +341,6 @@ Resolves issue #1033 by adding Alaska-specific data to the FIM input folders and

- ## v4.4.11.1 - 2024-03-08 - [PR#1080](https://github.com/NOAA-OWP/inundation-mapping/pull/1080) Fixes bug in bathymetric adjustment where `mask` is used with `geopandas.read_file`. The solution is to force `read_file` to use `fiona` instead of `pyogrio`. @@ -383,7 +385,6 @@ Tested that the a non zero return exit from pre-processing shuts down the AWS st

- ## v4.4.10.0 - 2024-02-02 - [PR#1054](https://github.com/NOAA-OWP/inundation-mapping/pull/1054) Recent testing exposed a bug with the `acquire_and_preprocess_3dep_dems.py` script. It lost the ability to be re-run and look for files that were unsuccessful earlier attempts and try them again. It may have been lost due to confusion of the word "retry". Now "retry" means restart the entire run. A new flag called "repair" has been added meaning fix what failed earlier. This is a key feature it is common for communication failures when calling USGS to download DEMs. And with some runs taking many hours, this feature becomes important. @@ -396,7 +397,6 @@ Also used the opportunity to fix a couple of other minor issues: ### Changes - - `data\usgs\` - `acquire_and_preprocess_3dep_dems.py`: Re-add a feature which allowed for restarting and redo missing outputs or partial outputs. System now named as a "repair" system. - `fim_pipeline.sh`: remove the parallel `--eta` flag to reduce logging. It was not needed, also removed "isaws" flag. @@ -623,7 +623,6 @@ This issue closes [1028](https://github.com/NOAA-OWP/inundation-mapping/issues/1

- ## v4.4.5.0 - 2023-10-26 - [PR#1018](https://github.com/NOAA-OWP/inundation-mapping/pull/1018) During a recent BED attempt which added the new pre-clip system, it was erroring out on a number of hucs. It was issuing an error in the add_crosswalk.py script. While a minor bug does exist there, after a wide number of tests, the true culprit is the memory profile system embedded throughout FIM. This system has been around for at least a few years but not in use. It is not 100% clear why it became a problem with the addition of pre-clip, but that changes how records are loaded which likely affected memory at random times. @@ -1172,10 +1171,8 @@ Fixes a bug in CatFIM script where a bracket was missing on a pandas `concat` st ### Changes - `/tools/generate_categorical_fim.py`: fixes `concat` statement where bracket was missing. -

- ## v4.3.11.2 - 2023-05-19 - [PR#918](https://github.com/NOAA-OWP/inundation-mapping/pull/918) This fix addresses a bug that was preventing `burn_in_levees.py` from running. The if statement in run_unit_wb.sh preceeding `burn_in_levees.py` was checking for the existence of a filepath that doesn't exist. From 5b9a8ce465218099ef46199401de6b8d88639219 Mon Sep 17 00:00:00 2001 From: MattLuck-NOAA Date: Fri, 14 Jun 2024 15:20:36 -0400 Subject: [PATCH 51/51] v4.5.2.2 Upgrade whitebox to v2.3.4 (#1183) --- Dockerfile | 10 +- Pipfile | 4 +- Pipfile.lock | 604 ++++++++++++++++++++++++---------------------- docs/CHANGELOG.md | 11 + 4 files changed, 327 insertions(+), 302 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96f6b2d3d..db1ecf72b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -110,11 +110,11 @@ RUN pip3 install pipenv==2023.12.1 && PIP_NO_CACHE_DIR=off pipenv install --syst # We download and unzip it to the same file folder that pip deployed the whitebox library. # Whitebox also attempts to always download a folder called testdata regardless of use. # We added an empty folder to fake out whitebox_tools.py so it doesn't try to download the folder -RUN wbox_path=/usr/local/lib/python3.10/dist-packages/whitebox/ && \ - wget -P $wbox_path https://www.whiteboxgeo.com/WBT_Linux/WhiteboxTools_linux_musl.zip && \ - unzip -o $wbox_path/WhiteboxTools_linux_musl.zip -d $wbox_path && \ - cp $wbox_path/WBT/whitebox_tools $wbox_path && \ - mkdir $wbox_path/testdata +# RUN wbox_path=/usr/local/lib/python3.10/dist-packages/whitebox/WBT && \ +# wget -P $wbox_path https://www.whiteboxgeo.com/WBT_Linux/WhiteboxTools_linux_musl.zip && \ +# unzip -o $wbox_path/WhiteboxTools_linux_musl.zip -d $wbox_path && \ +# cp $wbox_path/whitebox_tools $wbox_path && \ +# mkdir $wbox_path/testdata # ---------------------------------- ## RUN UMASK TO CHANGE DEFAULT PERMISSIONS ## diff --git a/Pipfile b/Pipfile index b4e5981b2..6ba0dc993 100644 --- a/Pipfile +++ b/Pipfile @@ -30,7 +30,7 @@ jupyter = "==1.0.0" jupyterlab = "==3.6.7" ipympl = "==0.9.3" pytest = "==7.3.0" -whitebox = "==2.3.1" +whitebox = "2.3.4" shapely = "==2.0.1" pyarrow = "==14.0.1" rtree = "==1.0.1" @@ -50,7 +50,7 @@ openpyxl = "==3.1.2" osmnx = "==1.9.3" lmoments3 = "==1.0.6" zarr = "==2.18.0" -requests = "==2.31.0" +requests = "==2.32.3" aiohttp = "==3.9.5" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index c3758ef76..3c1bc0455 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "b1097cae3089688432b1d87cf34f1f1877327168066113e534a986fd0a9fa6fa" + "sha256": "898973145b92f3e3eb9afcaf3cee8bd5da693fbd8ae06046e66d3a73022c27a5" }, "pipfile-spec": 6, "requires": { @@ -112,6 +112,7 @@ "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.9.5" }, "aiosignal": { @@ -132,11 +133,11 @@ }, "anyio": { "hashes": [ - "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8", - "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6" + "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94", + "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7" ], "markers": "python_version >= '3.8'", - "version": "==4.3.0" + "version": "==4.4.0" }, "appdirs": { "hashes": [ @@ -230,7 +231,7 @@ "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, "black": { @@ -259,6 +260,7 @@ "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==24.3.0" }, "bleach": { @@ -293,7 +295,7 @@ "sha256:f206e6a01a8167b441bf886ff022eb20e0f085b09300f49f3018f566c14d918a", "sha256:f465b8ab54ecde6b8654672a50a4c3699aafd8e2de0dfcd84ed53f8a34c1734a" ], - "markers": "python_version >= '3.8' and python_version < '4.0'", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==2.0.0" }, "boto3": { @@ -302,6 +304,7 @@ "sha256:d388cb7f54f1a3056f91ffcfb5cf18b226454204e5df7a5c10774718c3fbb166" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.26.109" }, "botocore": { @@ -415,6 +418,7 @@ "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2023.7.22" }, "cffi": { @@ -485,30 +489,39 @@ }, "cftime": { "hashes": [ - "sha256:022dabf1610cdd04a693e730fa8f71d307059717f29dba921e7486e553412bb4", - "sha256:0a38eb9f5c733a23e1714bd3ef2762ed5acee34f127670f8fb4ad6464946f6b3", - "sha256:2d113a01ab924445e61d65c26bbd95bc08e4a22878d3b947064bba056c884c4a", - "sha256:3b86be8c2f254147be4ba88f12099466dde457a4a3a21de6c69d52a7224c13ae", - "sha256:3cf6e216a4c06f9a628cdf8e9c9d5e8097fb3eb02dd087dd14ab3b18478a7271", - "sha256:4d6fbd5f41b322cfa7b0ac3aaadeceb4450100a164b5bccbbb9e7c5048489a88", - "sha256:523b9a6bf03f5e36407979e248381d0fcab2d225b915bbde77d00c6dde192b90", - "sha256:5f11685663a6af97418908060492a07663c16d42519c139ca03c2ffb1377fd25", - "sha256:80eb1170ce1639016f55760847f4aadd04b0312496c5bac2797e930914bba48d", - "sha256:8a14d2c7d22fd2a6dfa6ad563283b6d6679f1df95e0ed8d14b8f284dad402887", - "sha256:8d2c01456d9d7b46aa710a41d1c711a50d5ea259aff4a987d0e973d1093bc922", - "sha256:9eb177a02db7cd84aa6962278e4bd2d3106a545de82e6aacd9404f1e153661db", - "sha256:a98abb1d46d118e52b0611ce668a0b714b407be26177ef0581ecf5e95f894725", - "sha256:b62d42546fa5c914dfea5b15a9aaed2087ea1211cc36d08c374502ef95892038", - "sha256:bbf782ab4ac0605bdec2b941952c897595613203942b7f8c2fccd17efa5147df", - "sha256:bedb577bc8b8f3f10f5336c0792e5dae88605781890f50f36b45bb46907968e8", - "sha256:d0a6b29f72a13f08e008b9becff247cc75c84acb213332ede18879c5b6aa4dfd", - "sha256:d87dadd0824262bdd7493babd2a44447da0a22175ded8ae9e060a3aebec7c5d7", - "sha256:d9b00c2844c7a1701d8ede5336b6321dfee256ceab81a34a1aff0483d56891a6", - "sha256:eb6dd70b2ccabfe1a14b7fbb0bbdce0418e71697094373c0d573c880790fa291", - "sha256:f9878bfd8c1c3f24184ecbd528f739ba46ebaceaf1c8a24d348d7befb117a285" + "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", + "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", + "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", + "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", + "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", + "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", + "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", + "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", + "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", + "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", + "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", + "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", + "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", + "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", + "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", + "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", + "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", + "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", + "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", + "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", + "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", + "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", + "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", + "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", + "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", + "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", + "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", + "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", + "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", + "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" ], "markers": "python_version >= '3.8'", - "version": "==1.6.3" + "version": "==1.6.4" }, "charset-normalizer": { "hashes": [ @@ -603,7 +616,7 @@ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.3.2" }, "click": { @@ -626,7 +639,7 @@ "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27", "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4.0'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3' and python_version < '4'", "version": "==0.7.2" }, "cloudpickle": { @@ -793,11 +806,11 @@ }, "datashader": { "hashes": [ - "sha256:317c16a32a7d1c5208444a83fd6d2cb68d9bfb81802c323489bd24f6b7cf5c5f", - "sha256:5b2f1dd448defce206ecc16e9960fe9378f32307ea1fcb0c298c22c14f58c881" + "sha256:7899979b4c1adba6b4fd2e86caa3f5ef94c4e6ab234cbb7306ca6bfe243fc4df", + "sha256:c12ce9c71983a3f74ccba9d9416c270d1ed0a4e6c7bdcc6b63a2121ada0e00cd" ], "markers": "python_version >= '3.9'", - "version": "==0.16.1" + "version": "==0.16.2" }, "debugpy": { "hashes": [ @@ -899,11 +912,11 @@ }, "filelock": { "hashes": [ - "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f", - "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a" + "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8", + "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac" ], "markers": "python_version >= '3.8'", - "version": "==3.14.0" + "version": "==3.15.1" }, "fiona": { "hashes": [ @@ -936,6 +949,7 @@ "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" ], "index": "pypi", + "markers": "python_full_version >= '3.8.1'", "version": "==6.0.0" }, "flake8-pyproject": { @@ -943,6 +957,7 @@ "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==1.2.3" }, "flox": { @@ -955,51 +970,51 @@ }, "fonttools": { "hashes": [ - "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636", - "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce", - "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f", - "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1", - "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc", - "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f", - "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e", - "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716", - "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15", - "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77", - "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034", - "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba", - "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7", - "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55", - "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a", - "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0", - "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b", - "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671", - "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a", - "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039", - "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74", - "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836", - "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2", - "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308", - "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2", - "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5", - "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1", - "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438", - "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74", - "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f", - "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097", - "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e", - "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037", - "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1", - "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051", - "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b", - "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed", - "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68", - "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14", - "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5", - "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e", - "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936" + "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d", + "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64", + "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2", + "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4", + "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6", + "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b", + "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f", + "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380", + "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e", + "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749", + "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20", + "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0", + "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4", + "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5", + "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206", + "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9", + "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac", + "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1", + "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce", + "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4", + "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12", + "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca", + "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d", + "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068", + "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796", + "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec", + "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea", + "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f", + "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005", + "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2", + "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06", + "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109", + "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002", + "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9", + "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a", + "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68", + "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6", + "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161", + "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd", + "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d", + "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee", + "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af" ], "markers": "python_version >= '3.8'", - "version": "==4.51.0" + "version": "==4.53.0" }, "fqdn": { "hashes": [ @@ -1093,11 +1108,11 @@ }, "fsspec": { "hashes": [ - "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", - "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9" + "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee", + "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2" ], "markers": "python_version >= '3.8'", - "version": "==2024.3.1" + "version": "==2024.6.0" }, "geocube": { "hashes": [ @@ -1121,6 +1136,7 @@ "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==0.14.3" }, "geopy": { @@ -1137,6 +1153,7 @@ "sha256:d9f26aa88f164b77a47cb7d7eafc1641e48abe4152501657cb173c44dc84a8fd" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==0.2.3" }, "identify": { @@ -1248,11 +1265,11 @@ }, "ipython": { "hashes": [ - "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501", - "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3" + "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab", + "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716" ], "markers": "python_version >= '3.10'", - "version": "==8.24.0" + "version": "==8.25.0" }, "ipython-genutils": { "hashes": [ @@ -1263,11 +1280,11 @@ }, "ipywidgets": { "hashes": [ - "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60", - "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9" + "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2", + "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c" ], "markers": "python_version >= '3.7'", - "version": "==8.1.2" + "version": "==8.1.3" }, "isoduration": { "hashes": [ @@ -1282,6 +1299,7 @@ "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" ], "index": "pypi", + "markers": "python_full_version >= '3.8.0'", "version": "==5.12.0" }, "jedi": { @@ -1326,10 +1344,10 @@ }, "jsonpointer": { "hashes": [ - "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a", - "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88" + "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", + "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef" ], - "version": "==2.4" + "version": "==3.0.0" }, "jsonschema": { "extras": [ @@ -1393,11 +1411,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:659154cea512083434fd7c93b7fe0897af7a2fd0b9dd4749282b42eaac4ae677", - "sha256:fb6be52c713e80e004fac34b35a0990d6d36ba06fd0a2b2ed82b899143a64210" + "sha256:12558d158ec7a0653bf96cc272bc7ad79e0127d503b982ed144399346694f726", + "sha256:16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5" ], "markers": "python_version >= '3.8'", - "version": "==2.14.0" + "version": "==2.14.1" }, "jupyter-server-fileid": { "hashes": [ @@ -1437,6 +1455,7 @@ "sha256:d92d57d402f53922bca5090654843aa08e511290dff29fdb0809eafbbeb6df98" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==3.6.7" }, "jupyterlab-pygments": { @@ -1449,19 +1468,19 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:097b5ac709b676c7284ac9c5e373f11930a561f52cd5a86e4fc7e5a9c8a8631d", - "sha256:f5e26156e5258b24d532c84e7c74cc212e203bff93eb856f81c24c16daeecc75" + "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27", + "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43" ], "markers": "python_version >= '3.8'", - "version": "==2.27.1" + "version": "==2.27.2" }, "jupyterlab-widgets": { "hashes": [ - "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0", - "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64" + "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0", + "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27" ], "markers": "python_version >= '3.7'", - "version": "==3.0.10" + "version": "==3.0.11" }, "kiwisolver": { "hashes": [ @@ -1613,6 +1632,7 @@ "sha256:80e1397f1e3e5d1aa471ba67e49e557e7b3a67c7f7b5086c5fc8febcca6969f7" ], "index": "pypi", + "markers": "python_full_version >= '3.8.0'", "version": "==1.0.6" }, "locket": { @@ -1978,22 +1998,23 @@ "sha256:d583bc9050dd10538de36297c960b93f873f0cd01671a3c50df5bd86dd391dcb" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==8.3.1" }, "nbclassic": { "hashes": [ - "sha256:0ae11eb2319455d805596bf320336cda9554b41d99ab9a3c31bf8180bffa30e3", - "sha256:f99e4769b4750076cd4235c044b61232110733322384a94a63791d2e7beacc66" + "sha256:77b77ba85f9e988f9bad85df345b514e9e64c7f0e822992ab1df4a78ac64fc1e", + "sha256:8c0fd6e36e320a18657ff44ed96c3a400f17a903a3744fc322303a515778f2ba" ], "markers": "python_version >= '3.7'", - "version": "==1.0.0" + "version": "==1.1.0" }, "nbclient": { "hashes": [ "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09", "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f" ], - "markers": "python_version >= '3.8'", + "markers": "python_full_version >= '3.8.0'", "version": "==0.10.0" }, "nbconvert": { @@ -2051,6 +2072,7 @@ "sha256:f94a89db78f34fdf68342840efb064fe1474310e8359dffce42e90a9ddf88f2f" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.6.3" }, "networkx": { @@ -2063,11 +2085,11 @@ }, "nodeenv": { "hashes": [ - "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2", - "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec" + "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", + "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.8.0" + "version": "==1.9.1" }, "notebook": { "hashes": [ @@ -2117,6 +2139,7 @@ "sha256:fcdf84ba3ed8124eb7234adfbb8792f311991cbf8aed1cad4b1b1a7ee08380c1" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.56.4" }, "numcodecs": { @@ -2213,6 +2236,7 @@ "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.23.5" }, "numpy-groupies": { @@ -2237,6 +2261,7 @@ "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==3.1.2" }, "osmnx": { @@ -2245,6 +2270,7 @@ "sha256:ac67bea77b521941af648ef641ae1d006101948d1112475c256ea23ef31b426a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.9.3" }, "overrides": { @@ -2257,11 +2283,11 @@ }, "packaging": { "hashes": [ - "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", - "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" ], - "markers": "python_version >= '3.7'", - "version": "==24.0" + "markers": "python_version >= '3.8'", + "version": "==24.1" }, "pandas": { "hashes": [ @@ -2292,6 +2318,7 @@ "sha256:f908a77cbeef9bbd646bd4b81214cbef9ac3dda4181d5092a4aa9797d1bc7774" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2.0.2" }, "pandera": { @@ -2423,15 +2450,16 @@ "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==10.3.0" }, "platformdirs": { "hashes": [ - "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf", - "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1" + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" ], "markers": "python_version >= '3.8'", - "version": "==4.2.1" + "version": "==4.2.2" }, "pluggy": { "hashes": [ @@ -2447,6 +2475,7 @@ "sha256:a2256f489cd913d575c145132ae196fe335da32d91a8294b7afe6622335dd023" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.3.3" }, "prometheus-client": { @@ -2459,11 +2488,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", - "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" + "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" ], - "markers": "python_version >= '3.7'", - "version": "==3.0.43" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.47" }, "psutil": { "hashes": [ @@ -2553,6 +2582,7 @@ "sha256:ffe9dc0a884a8848075e576c1de0290d85a533a9f6e9c4e564f19adf8f6e54a7" ], "index": "pypi", + "markers": "python_version >= '3.6'", "version": "==2.9.6" }, "ptyprocess": { @@ -2583,6 +2613,7 @@ "sha256:94d0c24217f6582741813ee94490a4ca82bd5f9bf35e4f8610cb588cf7445764" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.20.4" }, "pyarrow": { @@ -2625,6 +2656,7 @@ "sha256:fada8396bc739d958d0b81d291cfd201126ed5e7913cb73de6bc606befc30226" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==14.0.1" }, "pybcj": { @@ -2792,6 +2824,7 @@ "sha256:be059dcade8bde51102e7e832903e76bec391b8bb460ca571895f511f4c18e4d" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==0.5.8" }, "pygments": { @@ -2831,6 +2864,7 @@ "sha256:f2ff58184020da39540a2f5d4a5412005a01b0c4cd03c7b8294bc670d1f3fe50" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==0.7.2" }, "pyparsing": { @@ -2964,6 +2998,7 @@ "sha256:fde5ece4d2436b5a57c8f5f97b49b5de06a856d03959f836c957d3e609f2de7e" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.5.0" }, "pytest": { @@ -2972,6 +3007,7 @@ "sha256:933051fa1bfbd38a21e73c3960cebdad4cf59483ddba7696c48509727e17f201" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==7.3.0" }, "python-dateutil": { @@ -2988,6 +3024,7 @@ "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.0" }, "python-json-logger": { @@ -3158,133 +3195,98 @@ }, "pyzstd": { "hashes": [ - "sha256:013b206c22b85512d59dd05f6684c02bf9db45e93f637facb5ce165c2447fbc4", - "sha256:015a6794196fcb75ddaaae8186f0dbdcbda4e84451361a808b3e96c8c8a63296", - "sha256:0561710b88d4895a7bb202335e802125da6a71c556b1292fd620224b2652f496", - "sha256:0691e54fb29a4d1f4f2a0064afaf5d1525824bf139d83f403e5ba5ee630ac4f5", - "sha256:0779ccd652113d75cd461fa6581149550b0da55e72b1a6e28e6f49e9978c2d41", - "sha256:13515a6abca6751482396b656e5b72279bd405fd6c71b5bc899fcb526d40e564", - "sha256:150a7c7004b9df00f7cbb6dad0bdbab5d77c8c54b0857b8b3e50beae2810a041", - "sha256:18167c8a16709631eaa2f4fd27e2a7570b4c37ec460b65ff098e948af2d37f33", - "sha256:1c3d0e784ea9b66b06c7b76895aa4c1a90975980b1ae136fa8bbd8fb2b93e9b3", - "sha256:1e045dc688bb618cf2a2e33cb487c0d8af5e31a4eaec18c9399b34e2aed58777", - "sha256:24d061047634971801649ff9aced68bb8403c6220b07c82aa2c0e90d8a61acd0", - "sha256:2e6fd189c85f2efe94d3945dfbb85cdbc4e213757be75aa9a45e186625498ddf", - "sha256:330062103d25e0d67681fcf5ef8692c71cd979dc17ed98f6cee3b3ba8bd86622", - "sha256:330d54a0e5886fa5ca21e3960b9352a7b21f8dd85f98d4b7c4e8a7d48ade6998", - "sha256:3443df2dcdfe6e57c2600617e8f377772703b7f907fe065b49948c05ace80fd7", - "sha256:357e6545203754e83a0431663aa86cae873abe160923bdf3db07e88f03100b05", - "sha256:39a912430c73aa585ede2dc7c9f09c5334862953f26a9a86ac048c3805ed6bb1", - "sha256:3aa0ad903da666cf88d8a993e5fe9b1bfa0e5792a53212335af0a89baa268911", - "sha256:3b9105a4977247ea8664b113345e66bf4b3ffd321a07797efc6b020ff363b39e", - "sha256:3f174c47c370641c5dba74d4fd99374ca0eadd47e43e7f76ee8b76dacdfa2406", - "sha256:4094ea7b80081bb024eb887c80eeb6bd8ae24dc2862cc61ae9eadb5bca11dcd6", - "sha256:41e0da402bf0d68067be2f16f65b9d1d7d7e6d726f27762226cba7a8badd618a", - "sha256:455d2258f247968d18a9eaeb11e214e048acc976a61f72a0282d4c40051458b8", - "sha256:468f12eb61cbef394ff412c86d8bc85b90f24dff19f675c864df88a1a398a3a3", - "sha256:49c99120f9ea0c512019948e55ba17e60dadb1d3578890d53b2a09858da4e1dd", - "sha256:4a5b54ebec1e606821192c86a3b85c05c3f789d33bf44f383fd245f148f8f93b", - "sha256:4cd0bd21e0c7721e9f4ea54d533d9196771ab1d6ae0a83a96564dc46147a26eb", - "sha256:4dfd0d97ac231c08551543d61d123cf44bdd2fc20ba5ebce1fb0c466036be15a", - "sha256:4ea6a794b8a4e0590bea1599e724d4877d34640058caf5c0b3f916ded06fc3a1", - "sha256:4ff57d2a67aaff47eb60c37c5476af2a5056319aa2a5cab4b276f78b764be785", - "sha256:50079bcfd087c8a8822c9fe940c887244cf2276ca0a4f0b55bec006b564b9541", - "sha256:50186fa41c72929d21727dcc6cb87bef0adf09df9e982325a0ae5bfd20a9456b", - "sha256:502ec85cb2c0a35350a196e25d5e1350d400102706eba05d7926eadb64ffa976", - "sha256:51c644157319e2ca87521bd9694df7f651aac3273e015f35cdfb47cb8597ce37", - "sha256:527bfd3e01b8dafa1c24cba1a0455a85bbcdb41a3eefe59e2849634f9206d4f0", - "sha256:53172f0781b3db9321a1286bb274121668c3fe560d3bddfa82f585475f7145fa", - "sha256:5494515f3d0df1eb54c9f4ce7b9ea0b285bc1ba87eba295604da5f8de711bdea", - "sha256:5942e8b7ad869ea5f44d928053d3eda16e877b5fed5326786388f6a377545ab3", - "sha256:5ae5f8ab4accc980fa8e6696a402176e20a717ab2b296cd8d62b6a86cafc5f9c", - "sha256:6023de5cc800c073cbf6a10a7aad0cbae0c1849c759bb5263a78d9ac774b167b", - "sha256:609cc4bed06942e51ebdfa9cc74629e1d19de2339161b65d555d01b9820aec46", - "sha256:6217f30c4341619c6066a044ca118f53a3121b5813a56257b1f9818e24450584", - "sha256:62a1614558478f7d1014eec94a9ae3bf21c95766ecbe0a4a1ab16d2f1e4a6b67", - "sha256:62b8c3801d739a9592c0503dd294fab7f8cd2b1d637429babe13671bedf7d6f7", - "sha256:63a90494aeea75d3298941b0b8ddd505cbb54d6b915e579368db21d93454e41d", - "sha256:656107ef6ff0966df2a58828f165a17b0b40977358512ade259c52c18bff0a13", - "sha256:65e99e57f5fb42ed391fc2f7ffa4b8cce5a32dfd74f52e03bd36bb2ac3b56536", - "sha256:6aed97ef51e20ea4fd7e12c4b9e3199cd8e4664054f5d84c3d83e6f4d3144055", - "sha256:6bfb81f36fd56664dbbd64a0af241797424c76861faa2682aca89de110fce5d4", - "sha256:6d6f7fcfef9166670df4b6710d1105b891efba68ec523f56c64cc8c7aa6c8e88", - "sha256:6e742a691f4fa73cadbe7f866b33e33161ede5bc777eee443a62504adcadd65f", - "sha256:6ed32af20eeeb7f8307b091fdd0ee8f5f8733dde7e8f560a3115c98a6ac33a61", - "sha256:6fa6495ec52ff29b097e6d1b619588ab61e998b198882ec622d947856d4a85b4", - "sha256:793077870191d54889cc472eda3bfd84c8cae5ed61c9fa9fb2ce29c31e23f812", - "sha256:7b2ac847e8d2ca55be038d29d20d6bfe86c03e66ac2d9741701e4f9eef2abda9", - "sha256:7bb791f16c810c98865c373202a44b7b313d01a2a7a6186c9dcc0ac1a0d156dc", - "sha256:801ab496766a858cc54b37a66f9d0169d590628e69bde2166f76c35dfc20f64f", - "sha256:80ca483ee2084d36dc570004b6793f99c58d2df201c630f60518bca3518faa5d", - "sha256:81154db47a9aa901d09a8cebcd1f6559dbbd02a93a16bc203dc3f94c06bea25a", - "sha256:8195b3fe2ed91db03f969c3c5cf6a9bcb3a961749caec94479e9e7a96d7af14f", - "sha256:83603a97fdbcf2139f475c940789f09e32703f931f29f4a8ddf3551e6700108b", - "sha256:846050f1d7520350d26076df12b8a78b540780d7d3478845be79d57e2e6d3612", - "sha256:85582502d3df1db8077475d88d0bf5f35b8ddb8abf9badd8625781024da5f346", - "sha256:8575d340ffcd89e4558448eec23c252da584f0de4528a73ed45a01f12d6700fd", - "sha256:88e8cbd8fdd2af2f94615c32ab113c5cff4dbd188454394c4cac9941d2f72204", - "sha256:8e3dff90b6abc56331a886b5067c3b6bc3fad1b6df5766247197b699afd013b7", - "sha256:8e4123de14a8dd7bccb1faed374c1f6c87111766279bbba5d6c4c52e39c383d9", - "sha256:8f356263a898b2c9961a2661ebb975f2fd20868d2c4fc4a165226fa7d36e1c76", - "sha256:91da52897e5219dc440d3b9d290fdee66fb70c65ae594555c8d2c887df77f2de", - "sha256:91e8a0852784c758b8de4179c61e80abae997155aa2b324cbee28dcaf9084b6f", - "sha256:92abe38cdd7ea3f98a0f1a4521e9e7e70aa001713bff62a5b97fae41b0a39d0d", - "sha256:94973e29acf813a572adf3ed2342a0998a41331781d7be82a0a1b02646181e34", - "sha256:94d970caaaf3f59d6c7aa0aaf38e755641351f99452c400fc06b7e365ab1620c", - "sha256:957751dd7bba26e651c689fc5f41bb269712efcbf19a97ad4f912f0f792e6e95", - "sha256:9593a76f516312ec59dbeb73a9f1915d1f67610c054a7b488912b972cbfbcb7e", - "sha256:965e04aeb83f594577ea4e8c975765d0953a75c8d6e3cd193ae25ef574bd83ee", - "sha256:99902df14861e4f40ed1eb403a17356188428d12bb10d53de10d1ea24996b838", - "sha256:9dca0cde0f02e08e11431fff0e5408ac46420912165d828bc148a3c8cedc8852", - "sha256:9fa20eb8f710a9d36801451d1cbcfc83d1dd9e400527ad9aba7e7cc635c2729b", - "sha256:a07742d42409c3ce98c58f2b155e2d8acdcd8ff49955062f5155dae94b24060a", - "sha256:a15a3ef14cb929b07e0a98639f2ebcd69a0038d6e31367157018ec841a54d8fa", - "sha256:a22c4b26fb6134ece45e875515961bc9c1777df775f3488800bea55a381df91e", - "sha256:a62e98375385ade756d1ea4975f79ec103c515b412884d146c98295c5300fb4a", - "sha256:a900a3dcda64b289cf35acfb6c90246b5ae9f2dd4bc05da8dcb8fbd04c91e37b", - "sha256:ad30429f499c30e8e19ed389b8e25116d43c63cafdb97d4f5617e94e671209c5", - "sha256:adb895a0081a932132aa3a233cfeba682a07ac0dc36b062152f240406eecfba1", - "sha256:b1752344c77dbb137244e6ab5af5a7576b8e8b8e5d440c58d935e69f83606e0d", - "sha256:b19cdecdc19ad863673709d27ddb0adc104b9ad341f2785ab23c51c9ab39cf3f", - "sha256:b62c408ddac3ae113b9dc4867fd2bb32a2ef669c68f256eb5486c02b31603afa", - "sha256:b856928e99a1d3080929b0f194c7922c7a7979b0eb21ad9d057f000dcf1a6ac7", - "sha256:ba0f1c0201845b769c92b2b3e7666010abe14d6e9dbf4214d04cdf23cbdcd1ae", - "sha256:bafef40c8b521ef9df81a118e278d5759c0127395883dcc10bf80ee32a46da39", - "sha256:be591f405d82f40acbe2a081f1dee5478a3cf1b694013cc5712e84159311e36a", - "sha256:c20a4ee0706db5c9f403e4c459fc81145f48cb20fccc1a64acfb6143f1a7b1fb", - "sha256:c2d2a7324fbd118dc951b63b1fc553aec0fc0c430474a6ab7b33608b9606658a", - "sha256:c309d50ee6a41053ad4c284295e5c5eedfd084ff94a5ee1148cf0dc64e3223fb", - "sha256:c6f67ac9d3ff65ca466821d573b3cb2fb01f0cd9eb082e92f49dfd88fa828a77", - "sha256:c7f7a398bcb0f4cfbaf0ddb3e831c43857701c63c66f48eb30011326ed03b0fa", - "sha256:c867d446b22a7288229a812da6f211d86934beb47edf8098e2e0dbe9e2529f86", - "sha256:ca3df18c269f9c11b40dde85336d3fc4a879867b05c74efdd4d5f8e64ac7e179", - "sha256:ca80bb0b8400888e16e8eaa01b506de7d1bbdc8cc78c9ff75272526fd36fcb8a", - "sha256:cccfb03f829ecde3ee126befb4fe827e2228a50e8d9eaa0275c4dd21a0e59765", - "sha256:ce8e8a4aa8246c615693b9d0504e1df98157ae48907a044baa80f80abecc44ad", - "sha256:cfa03e12c0c1bd357a0e1f20adae9c32bc166dcc6ed3be65885134830899b6ba", - "sha256:d077f76179de41cdd5ae39b0a6f16f033b077f27fa54a9e038d03e3f5ddeff23", - "sha256:d2cc02e94ff4df6a4a871bbd69149ba5fbc5150108a208c6cdd9bc728000995b", - "sha256:d55d9e1e22ebfa9cde606a7967eb21fbc65d0d3be600e550c38a1c05094c8015", - "sha256:d62a54dd438b51dd9f94bd88dd2f7c9d4093aadc44892143182d51f8488ab5f6", - "sha256:d62f357845f90d5327bdd3286ebd79c40b23b8e7c36772fc2949ef54a92bc6de", - "sha256:db3d4e991ee727f6c0a54fe975ebe169be3a463ce810cfd8e6edbe8a90ddeb8f", - "sha256:dc917e488a9bdc681cb4a9b0ed3d0c8b81816bc1a6b1f85ec4050c827ffa9e76", - "sha256:deb41298fb0c916875413373e5eba162e39309d8730be736b3a206d9b73afebf", - "sha256:dec319cdbba5ed3dfb2a8798364a8899751e732127c6ae74bc41276899e0311a", - "sha256:e0262bba03bb4d38b697c2039a8e48a9e889fb9ae9b727903e8d9c49d32883a4", - "sha256:e0f1f590a66769caea6cf47c3c5d06d004f01659449595d4bc737a42d4670bf0", - "sha256:e21208605759dc2eeebf607a002e1ddc09548c12f25886d2a2dd8efdf35535a3", - "sha256:e2dbb36017e5c7d7499dfc05f8d6ed781fce9fbfa45cc7bd888ec5f871aba3d3", - "sha256:e69d3d5257607a3b29f12192ad7bc9fdbdc8aa5f7e11c6f536cb61ee02dcd698", - "sha256:e71bb03c754934d7792aa0559b16f9effe1d4196f5834715c115363809f00c37", - "sha256:e7c4530ec6bf3a27c3cba229026fa3669e6e1832fdc37cf74c73b113f884cb2d", - "sha256:e9d44c5cfe2516a652131ddd91c3a48924e34f4a7b85640cda44694afbeee6cb", - "sha256:ea1fe83079c67c3f1549a735f11060350c87453bd86a8442bccb1f9b14c26aef", - "sha256:eb4d96fe5d6d8bf5c8c64d8a37edff55e6d9abbf84d9b8fd0fe8e0db1a557625", - "sha256:f0822c9f4852f9f6b1458f8fbf011bb887cefba792b0c7c10659e2c9c997d1c9" + "sha256:00954290d6d46ab13535becbbc1327c56f0a9c5d7b7cf967e6587c1395cade42", + "sha256:06b9dfd615fb5635c05153431e520954a0e81683c5a6e3ed1134f60cc45b80f1", + "sha256:094cec5425097ae1f9a40bb02de917d2274bfa872665fe2e5b4101ee94d8b31d", + "sha256:0eadba403ec861fa4c600ad43dbd8ac17b7c22a796d3bd9d92918f4e8a15a6e8", + "sha256:10143cad228ebeb9eda7793995b2d0b3fef0685258d9b794f6320824302c47d7", + "sha256:19deddb2975af861320fd7b68196fbb2a4a8500897354919baf693702786e349", + "sha256:1b8db95f23d928ba87297afe6d4fff21bbb1af343147ff50c174674312afc29d", + "sha256:1c0bbdb3ae1c300941c1f89219a8d09d142ddb7bfc78e61da80c8bdc03c05be8", + "sha256:1c4cdb0e407bec2f3ece10275449822575f6634727ee1a18e87c5e5a7b565bb1", + "sha256:20259fa302f1050bd02d78d93db78870bed385c6d3d299990fe806095426869f", + "sha256:26e42ccb76a53c1b943021eeb0eb4d78f46093c16e4e658a7204c838d5b36df0", + "sha256:2820b607be0346b3e24b097d759393bd4bcccc0620e8e825591061a2c3a0add5", + "sha256:29ca6db3fb72d17bcec091b9ba485c715f63ca00bfcd993f92cb20037ae98b25", + "sha256:33bc6f6048f7f7fc506e6ad03fb822a78c2b8209e73b2eddc69d3d6767d0385c", + "sha256:33efaf2cc4efd2b100699d953cd70b5a54c3ca912297211fda01875f4636f655", + "sha256:349d643aeb8d7d9e0a407cef29d6210afbe646cc19b4e237456e585591eda223", + "sha256:35962bc10480aebd5b32fa344430bddd19ef384286501c1c8092b6a9a1ee6a99", + "sha256:35ba0ee9d6d502da2bc01d78d22f51a1812ff8d55fb444447f7782f5ce8c1e35", + "sha256:363c11a4d60fa0e2e7437f7494291c24eaf2752c8d8e3adf8f92cb0168073464", + "sha256:3a57f2a0531ad2cd33bb78d8555e85a250877e555a68c0add6308ceeca8d84f1", + "sha256:3c3181a462cdb55df5ddeffe3cf5223cda36c81feceeb231688af08d30f11022", + "sha256:3c5f28a145677431347772b43a9604b67691b16e233ec7a92fc77fc5fb670608", + "sha256:3dd4592c2fca923041c57aa2bfe428de14cc45f3a00ab825b353160994bc15e7", + "sha256:3f661848fa1984f3b17da676c88ccd08d8c3fab5501a1d1c8ac5abece48566f2", + "sha256:44f818ea8c191285365a0add6fc03f88225f1fdcff570dc78e9f548444042441", + "sha256:48037009be790fca505a62705a7997eef0cd384c3ef6c10a769734660245ee73", + "sha256:48ff680078aec3b9515f149010981c7feeef6c2706987ac7bdc7cc1ea05f8f7d", + "sha256:493edd702bc16dae1f4d76461688714c488af1b33f5b3a77c1a86d5c81240f9e", + "sha256:4a765c5fc05fe1c843863cc3723e39e8207c28d9a7152ee6d621fa3908ef4880", + "sha256:4d5c98986d774e9321fb1d4fe0362658560e14c1d7afbe2d298b89a24c2f7b4f", + "sha256:586538aa2a992a55c10d88c58166e6023968a9825719bce5a09397b73eea658f", + "sha256:5c43e2222bbbe660dea8fe335f5c633b3c9ed10628a4b53a160ddd54d15cffc2", + "sha256:5d0db66651ed5a866a1452e7a450e41a5ec743abbeea1f1bc85ef7c64f5f6b8f", + "sha256:65a55aac43a685b7d2b9e7c4f9f3768ad6e0d5f9ad7698b8bf9124fbeb814d43", + "sha256:691cadd48f225097a2588e7db492ac88c669c061208749bc0200ee39e4425e32", + "sha256:6aa796663db6d1d01ebdcd80022de840005ae173e01a7b03b3934811b7ae39bc", + "sha256:708c442f8f6540ffad24a894bdea3c019250e02dcdbd0fbd27fc977b1a88b4f2", + "sha256:74521d819ceea90794aded974cc3024c65c094050e6c4a6f4b7478af3461e3ad", + "sha256:75f4363157777cbcbbd14ff823388fddfca597d44c77c27473c4c4000d7a5c99", + "sha256:75f5e862e1646f1688e97f4aa69988d6589a1e036f081e98a3f202fa4647e69b", + "sha256:76697baa4d9fd621bd5b99719d3b55fadeb665af9a49523debfc9ae5fbefef13", + "sha256:784f7f87ae2e25459ef78282fbe9f0d2fec9ced84e4acb5d28621a0db274a13b", + "sha256:78f5e65eb15d93f687715be9241c8b55d838fba9b7045d83530f8831544f1413", + "sha256:796a29cbb6414b6cb84d8e7448262ba286847b946de9a149dec97469a4789552", + "sha256:79f4c9f1d7906eb890dafae4820f69bd24658297e9ebcdd74867330e8e7bf9b0", + "sha256:7a82cd4e772e5d1400502d68da7ecd71a6f1ff37243017f284bee3d2106a2496", + "sha256:80741b9f18149264acb639287347cfc6eecff109b5c6d95dbf7222756b107b57", + "sha256:80962ff81a3389b5579d1206bea1bb48da38991407442d2a9287f6da1ccb2c80", + "sha256:84135917c99476c6abeee420ffd005a856d8fde0e5f585b0c484d5923392035b", + "sha256:8436ce4fa7e7ddaa8d29717fd73e0699883ef6e78ef4d785c244779a7ad1942b", + "sha256:89187af1ca5a9b65c477817e0fe7e411f4edd99e5575aaaef6a9e5ff62028854", + "sha256:8a2d5a8b74db3df772bb4f230319241e73629b04cb777b22f9dcd2084d92977a", + "sha256:8e4cf6d11427d43734e8cb246ecfb7af169983ef796b415379602ea0605f5116", + "sha256:8e51d69446d96f5767e0f1b0676341d5d576c151dfe3dd14aff7a163db1b4d7c", + "sha256:8ef9fa7fe28dd6b7d09b8be89aea4e8f2d18b23a89294f51aa48dbc6c306a039", + "sha256:94fe8c5f1f11397b5db8b1850168e5bed13b3f3e1bc36e4292819d85be51a63c", + "sha256:983ea93ed937d329c88ef15d5e3b09e32372590c1a80586b2013f17aed436cb8", + "sha256:994a21a75d7b2602a78c2f88f809427ce1051e43af7aad6cda524ccdc859354e", + "sha256:9c68761529a43358151ac507aeb9c6b7c1a990235ce7b7d41f8ea62c62d4679e", + "sha256:a4cf0fed2d5c9de3da211dceff3ed9a09b8f998f7df57da847145863a786454b", + "sha256:a4e12b6702481ace7071357c1b81b9faf6f660da55ff9ccd6383fed474348cc6", + "sha256:acfe529ff44d379ee889f03c2d353f94b1f16c83a92852061f9672982a3ef32d", + "sha256:b0fa1ef68839d99b0c0d66fe060303f7f2916f021289a7e04a818ef9461bbbe1", + "sha256:b3cc09eecd318310cfd6e7f245248cf16ca014ea5903580d72231d93330952de", + "sha256:b5d8a3263b7e23a3593eb4fcc5cc77e053c7d15c874db16ce6ee8b4d94f8d825", + "sha256:bbeaa0af865427405a1c0e8c65841a23de66af8ca5d796522f7b105386cd8522", + "sha256:bc5e630db572362aef4d8a78f82a40e2b9756de7622feb07031bd400a696ad78", + "sha256:bd27ab78269148c65d988a6b26471d621d4cc6eed6b92462b7f8850162e5c4f2", + "sha256:c34c06a6496b4aacdab03133671dd5638417bda09a1f186ba1a39c1dbd1add24", + "sha256:c48b4368b832233205a74e9f1dfe2647d9bc49ea8357b09963fd5f15062bdd0a", + "sha256:c8c675edd26cd2531163e51dcb3c7c73145e2fa3b77a1ff59ce9ed963ff56017", + "sha256:c9c1ede5c4e35b059e8734dfa8d23a59b8fcfe3e0ece4f7d226bc5e1816512c9", + "sha256:ca9f1f6bd487c9b990e509c17e0a701f554db9e77bd5121c27f1db4594ac4c0a", + "sha256:d14862ce066da0494e0f9466afc3b8fcd6c03f7250323cf8ef62c67158c77e57", + "sha256:d1e6ae36c717abd32b55a275d7fbf9041b6de3a103639739ec3e8c8283773fb3", + "sha256:d7d5888e206190d36fbffed6d7e9cacd79e64fd34e9a07359e16862973d90b33", + "sha256:d897ec18822e348f8ef9a17e421716ed224a3726fde806aae04469fec8f0ac9d", + "sha256:e0f5a1865a00798a74d50fcc9956a3d7fa7413cbc1c6d6d04833d89f36e35226", + "sha256:e31e0d2023b693ca530d95df7cff8d736f66b755018398bc518160f91e80bd0a", + "sha256:e8eae552db2aa587c986f460915786bf9058a88d831d562cadba01f3069736a9", + "sha256:e9f22fb00bfcca4b2e0b36afd4f3a3194c1bc93b2a76e51932ccfd3b6aa62501", + "sha256:ef883837c16c076f11da37323f589779806073eeacaef3912f2da0359cb8c2cf", + "sha256:f47aada7fdc6bcad8ec4ee4ff00a8d2d9a0e05b5516df3f304afbf527b026221", + "sha256:f4f27e083a63b9463fd2640065af1b924f05831839f23d936a97c4f510a54f6b", + "sha256:f560d24557bbc54eb1aa01ee6e587d4d199b785593462567ddf752de3c1c4974", + "sha256:fa219d5d6124f1623b39f296a1fcc4cac1d8c82f137516bd362a38c16adcd92b", + "sha256:fb70083bf00426194a85d69939c52b1759462873bf6e4d62f481e2bc3e642ea1", + "sha256:fd43a0ae38ae15223fb1057729001829c3336e90f4acf04cf12ebdec33346658", + "sha256:ff99a11dd76aec5a5234c1158d6b8dacb61b208f3f30a2bf7ae3b23243190581" ], "markers": "python_version >= '3.5'", - "version": "==0.15.10" + "version": "==0.16.0" }, "qtconsole": { "hashes": [ @@ -3323,6 +3325,7 @@ "sha256:eaaeb2e661d1ffc07a7ae4fd997bb326d3561f641178126102842d608a010cc3" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.3.6" }, "rasterstats": { @@ -3331,6 +3334,7 @@ "sha256:29389bfcbeac1a4206aba6e1d795058ec8a64d560efad48156c27fad97c2e09a" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.18.0" }, "referencing": { @@ -3343,11 +3347,12 @@ }, "requests": { "hashes": [ - "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", - "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "version": "==2.31.0" + "markers": "python_version >= '3.8'", + "version": "==2.32.3" }, "rfc3339-validator": { "hashes": [ @@ -3554,6 +3559,7 @@ "sha256:f5120da3a1b96f3a7a17dd6af0afdd4e6f3cc9baa87e9ee0a272882f01f980bb" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==1.0.1" }, "s3transfer": { @@ -3589,6 +3595,7 @@ "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1" ], "index": "pypi", + "markers": "python_version < '3.12' and python_version >= '3.8'", "version": "==1.10.1" }, "seaborn": { @@ -3597,6 +3604,7 @@ "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.12.2" }, "send2trash": { @@ -3609,11 +3617,11 @@ }, "setuptools": { "hashes": [ - "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987", - "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], "markers": "python_version >= '3.8'", - "version": "==69.5.1" + "version": "==70.0.0" }, "shapely": { "hashes": [ @@ -3657,6 +3665,7 @@ "sha256:f470a130d6ddb05b810fc1776d918659407f8d025b7f56d2742a596b6dffa6c7" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==2.0.1" }, "simplejson": { @@ -3822,6 +3831,7 @@ "sha256:f0821007048f2af8c1a21eb3d832072046c5df366e39587a7c7e4afad14e73fc" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==3.8.0" }, "terminado": { @@ -3865,20 +3875,20 @@ }, "tornado": { "hashes": [ - "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0", - "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63", - "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263", - "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052", - "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f", - "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee", - "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78", - "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579", - "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212", - "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e", - "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2" + "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", + "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", + "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", + "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", + "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", + "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", + "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", + "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", + "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", + "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", + "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" ], "markers": "python_version >= '3.8'", - "version": "==6.4" + "version": "==6.4.1" }, "tqdm": { "hashes": [ @@ -3886,6 +3896,7 @@ "sha256:4f41d54107ff9a223dca80b53efe4fb654c67efaba7f47bada3ee9d50e05bd53" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==4.66.3" }, "traitlets": { @@ -3898,11 +3909,11 @@ }, "typeguard": { "hashes": [ - "sha256:7da3bd46e61f03e0852f8d251dcbdc2a336aa495d7daff01e092b55327796eb8", - "sha256:c556a1b95948230510070ca53fa0341fb0964611bd05d598d87fb52115d65fee" + "sha256:4d24c5b39a117f8a895b9da7a9b3114f04eb63bade45a4492de49b175b6f7dfa", + "sha256:92ee6a0aec9135181eae6067ebd617fd9de8d75d714fb548728a4933b1dea651" ], "markers": "python_version >= '3.8'", - "version": "==4.2.1" + "version": "==4.3.0" }, "types-python-dateutil": { "hashes": [ @@ -3914,11 +3925,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], "markers": "python_version < '3.11'", - "version": "==4.11.0" + "version": "==4.12.2" }, "typing-inspect": { "hashes": [ @@ -3948,15 +3959,16 @@ "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0" ], "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.26.18" }, "virtualenv": { "hashes": [ - "sha256:604bfdceaeece392802e6ae48e69cec49168b9c5f4a44e483963f9242eb0e78b", - "sha256:7aa9982a728ae5892558bff6a2839c00b9ed145523ece2274fad6f414690ae75" + "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c", + "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b" ], "markers": "python_version >= '3.7'", - "version": "==20.26.1" + "version": "==20.26.2" }, "wcwidth": { "hashes": [ @@ -3967,10 +3979,10 @@ }, "webcolors": { "hashes": [ - "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf", - "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a" + "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b", + "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1" ], - "version": "==1.13" + "version": "==24.6.0" }, "webencodings": { "hashes": [ @@ -3989,19 +4001,19 @@ }, "whitebox": { "hashes": [ - "sha256:38becfa894091c0adcebb162ffe7eb8b735e9a52f91376d36cb1a554bd10544d", - "sha256:6b4080bc8181f0876cda6c9093bcb463faa4ab8a8c2c631c06b579d3ec1131ba" + "sha256:3479c8127b1928dd0457b6680b9ee4469d0735b2bb220178c678af303d868ef0", + "sha256:4322c5a3b42f1f04a3c80640253b672242e0aefb6b6dea70752f00a220f6d7ed" ], "index": "pypi", - "version": "==2.3.1" + "version": "==2.3.4" }, "widgetsnbextension": { "hashes": [ - "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f", - "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc" + "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36", + "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474" ], "markers": "python_version >= '3.7'", - "version": "==4.0.10" + "version": "==4.0.11" }, "wrapt": { "hashes": [ @@ -4085,6 +4097,7 @@ "sha256:7e530b1deafdd43e5c2b577d0944e6b528fbe88045fd849e49a8d11871ecd522" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==2023.1.0" }, "xarray-spatial": { @@ -4097,11 +4110,11 @@ }, "xyzservices": { "hashes": [ - "sha256:6a04f11487a6fb77d92a98984cd107fbd9157fd5e65f929add9c3d6e604ee88c", - "sha256:b83e48c5b776c9969fffcfff57b03d02b1b1cd6607a9d9c4e7f568b01ef47f4c" + "sha256:58c1bdab4257d2551b9ef91cd48571f77b7c4d2bc45bf5e3c05ac97b3a4d7282", + "sha256:fecb2508f0f2b71c819aecf5df2c03cef001c56a4b49302e640f3b34710d25e4" ], "markers": "python_version >= '3.8'", - "version": "==2024.4.0" + "version": "==2024.6.0" }, "y-py": { "hashes": [ @@ -4292,15 +4305,16 @@ "sha256:c3b7d2c85b8a42b0ad0ad268a36fb6886ca852098358c125c6b126a417e0a598" ], "index": "pypi", + "markers": "python_version >= '3.9'", "version": "==2.18.0" }, "zipp": { "hashes": [ - "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", - "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" + "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" ], "markers": "python_version >= '3.8'", - "version": "==3.18.1" + "version": "==3.19.2" } }, "develop": { @@ -4337,11 +4351,11 @@ }, "ipython": { "hashes": [ - "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501", - "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3" + "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab", + "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716" ], "markers": "python_version >= '3.10'", - "version": "==8.24.0" + "version": "==8.25.0" }, "jedi": { "hashes": [ @@ -4377,11 +4391,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", - "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" + "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" ], - "markers": "python_version >= '3.7'", - "version": "==3.0.43" + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.47" }, "ptyprocess": { "hashes": [ @@ -4431,11 +4445,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0", - "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a" + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], "markers": "python_version < '3.11'", - "version": "==4.11.0" + "version": "==4.12.2" }, "wcwidth": { "hashes": [ diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1b4c56608..6fe9d3838 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,17 @@ All notable changes to this project will be documented in this file. We follow the [Semantic Versioning 2.0.0](http://semver.org/) format. +## v4.5.2.2 - 2024-05-29 - [PR#1183](https://github.com/NOAA-OWP/inundation-mapping/pull/1183) + +Upgrades whitebox from v2.3.1 to 2.3.4. Whitebox was upgraded by `pip install -U whitebox` and then `pipenv lock` to update the `Pipfile`. + +### Changes + +- `Dockerfile`: Removed whitebox hack +- `Pipfile` and `Pipfile.lock`: Upgraded whitebox to v2.3.4. + +

+ ## v4.5.2.1 - 2024-05-21 - [PR#1172](https://github.com/NOAA-OWP/inundation-mapping/pull/1172) Removes loading of `apache-arrow` repository from the Dockerfile where it was causing a GPG key error during `docker build`.