TCJ21 commited on
Commit
e108169
·
1 Parent(s): 7a0ed7e

changes to be MVP ready

Browse files
app/pages/0_AOIs.py ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import os
3
+ from pathlib import Path
4
+
5
+ import folium
6
+ import requests
7
+ import streamlit as st
8
+ from folium.plugins import Draw
9
+ from src.config_parameters import params
10
+ from src.gfm import download_gfm_geojson, get_existing_flood_geojson, sync_cached_data
11
+ from src.utils import (
12
+ add_about,
13
+ set_tool_page_style,
14
+ toggle_menu_button,
15
+ )
16
+ from streamlit_folium import st_folium
17
+
18
+ # Page configuration
19
+ st.set_page_config(layout="wide", page_title=params["browser_title"])
20
+
21
+ # If app is deployed hide menu button
22
+ toggle_menu_button()
23
+
24
+ # Create sidebar
25
+ add_about()
26
+
27
+ # Page title
28
+ st.markdown("# Flood extent analysis")
29
+
30
+ # Set page style
31
+ set_tool_page_style()
32
+
33
+ # Create two rows: top and bottom panel
34
+ row1 = st.container()
35
+ save_area = False
36
+
37
+ with row1:
38
+ action_type = st.radio(
39
+ label="Action Type",
40
+ options=["See Areas", "Create New Area", "Delete Area"],
41
+ label_visibility="hidden",
42
+ )
43
+
44
+ # call to render Folium map in Streamlit
45
+ folium_map = folium.Map([39, 0], zoom_start=8)
46
+ feat_group_selected_area = folium.FeatureGroup(name="selected_area")
47
+
48
+ if action_type == "See Areas":
49
+ with open("./bboxes/bboxes.json", "r") as f:
50
+ bboxes = json.load(f)
51
+ for area_name in bboxes.keys():
52
+ bbox = bboxes[area_name]["bounding_box"]
53
+ feat_group_selected_area.add_child(folium.GeoJson(bbox))
54
+
55
+ folium_map.fit_bounds(feat_group_selected_area.get_bounds())
56
+
57
+ elif action_type == "Create New Area":
58
+ Draw(
59
+ export=False,
60
+ draw_options={
61
+ "circle": False,
62
+ "polyline": False,
63
+ "polygon": False,
64
+ "rectangle": True,
65
+ "marker": False,
66
+ "circlemarker": False,
67
+ },
68
+ ).add_to(folium_map)
69
+
70
+ new_area_name = st.text_input("Area name")
71
+ save_area = st.button("Save Area")
72
+
73
+ elif action_type == "Delete Area":
74
+ # Load existing bboxes
75
+ with open("./bboxes/bboxes.json", "r") as f:
76
+ bboxes = json.load(f)
77
+ existing_areas = bboxes.keys()
78
+
79
+ area_to_delete = st.selectbox("Choose area to delete", options=existing_areas)
80
+ bbox = bboxes[area_to_delete]["bounding_box"]
81
+ feat_group_selected_area.add_child(folium.GeoJson(bbox))
82
+ folium_map.fit_bounds(feat_group_selected_area.get_bounds())
83
+
84
+ delete_area = st.button("Delete")
85
+
86
+ if delete_area:
87
+ with open("./bboxes/bboxes.json", "r") as f:
88
+ bboxes = json.load(f)
89
+ bboxes.pop(area_to_delete, None)
90
+ with open("./bboxes/bboxes.json", "w") as f:
91
+ json.dump(bboxes, f)
92
+ st.toast("Area successfully deleted")
93
+
94
+ with open("./bboxes/bboxes.json", "r") as f:
95
+ bboxes = json.load(f)
96
+
97
+ # geojson_catania = get_existing_flood_geojson("Catania")
98
+ # print(geojson_catania)
99
+ # geojson_selected_area = folium.GeoJson(geojson_catania)
100
+
101
+ # feat_group_selected_area.add_child(geojson_selected_area)
102
+ m = st_folium(
103
+ folium_map,
104
+ width=800,
105
+ height=450,
106
+ feature_group_to_add=feat_group_selected_area,
107
+ )
108
+
109
+ if save_area:
110
+ check_drawing = m["all_drawings"] != [] and m["all_drawings"] is not None
111
+ if not check_drawing:
112
+ st.error("Please create a region using the rectangle tool on the map.")
113
+ elif new_area_name == "":
114
+ st.error("Please provide a name for the new area")
115
+ else:
116
+ # Get the drawn area
117
+ selected_area_geojson = m["all_drawings"][-1]
118
+
119
+ print("starting to post new area name to gfm api")
120
+ coordinates = selected_area_geojson["geometry"]["coordinates"]
121
+
122
+ username = os.environ["gfm_username"]
123
+ password = os.environ["gfm_password"]
124
+ base_url = "https://api.gfm.eodc.eu/v1"
125
+
126
+ # Get token, setup header
127
+ token_url = f"{base_url}/auth/login"
128
+
129
+ payload = {"email": username, "password": password}
130
+
131
+ response = requests.post(token_url, json=payload)
132
+ user_id = response.json()["client_id"]
133
+ access_token = response.json()["access_token"]
134
+ header = {"Authorization": f"bearer {access_token}"}
135
+
136
+ print("authenticated to API")
137
+ # Create area of impact
138
+ create_aoi_url = f"{base_url}/aoi/create"
139
+
140
+ payload = {
141
+ "aoi_name": new_area_name,
142
+ "description": new_area_name,
143
+ "user_id": user_id,
144
+ "geoJSON": {"type": "Polygon", "coordinates": coordinates},
145
+ }
146
+
147
+ r = requests.post(url=create_aoi_url, json=payload, headers=header)
148
+ print(r.json())
149
+ print("Posted new AOI")
150
+
151
+ print("Writing new area to bbox json")
152
+ # Load existing bboxes
153
+ with open("./bboxes/bboxes.json", "r") as f:
154
+ bboxes = json.load(f)
155
+
156
+ # If the area doesn't exist, create it
157
+ if new_area_name not in bboxes:
158
+ bboxes[new_area_name] = {}
159
+
160
+ # Save the new bounding box under the date range key
161
+ bboxes[new_area_name] = {
162
+ "bounding_box": selected_area_geojson,
163
+ "date_ranges": [], # Will be populated when files are downloaded
164
+ }
165
+ # Write the updated data back to file
166
+ with open("./bboxes/bboxes.json", "w") as f:
167
+ json.dump(bboxes, f, indent=4)
168
+
169
+ st.toast("Area successfully created")
app/pages/1_🌍_Flood_extent_analysis.py CHANGED
@@ -38,39 +38,40 @@ row1 = st.container()
38
  col1, col2 = row1.columns([2, 1])
39
  feat_group_selected_area = folium.FeatureGroup(name="selected_area")
40
  with col1:
41
- area_type = st.radio(
42
- label="Area Type",
43
- options=["Existing area", "New area"],
44
- label_visibility="hidden",
45
- )
46
- if area_type == "Existing area":
47
- with open("./bboxes/bboxes.json", "r") as f:
48
- bboxes = json.load(f)
49
- selected_area = st.selectbox("Select saved area", options=bboxes.keys())
50
-
51
- # retrieve and select available dates
52
- if selected_area:
53
- available_date_ranges = list(
54
- bboxes[selected_area].keys()
55
- ) # will be used again below
56
- selected_date_range = st.selectbox(
57
- "Select available date range", options=available_date_ranges
58
  )
 
 
59
 
60
- # display the bounding box
61
- bounding_box = bboxes[selected_area][selected_date_range]["bounding_box"]
62
- geojson_selected_area = folium.GeoJson(bounding_box)
63
- feat_group_selected_area.add_child(geojson_selected_area)
64
 
65
- # geojson_selected_area = folium.GeoJson(bboxes[selected_area])
66
- # feat_group_selected_area.add_child(geojson_selected_area)
 
67
  geojson_flood_area = get_existing_flood_geojson(
68
- selected_area, selected_date_range
69
  )
70
  feat_group_selected_area.add_child(geojson_flood_area)
71
 
72
- elif area_type == "New area":
73
- new_area_name = st.text_input("Area name")
74
  # Add collapsable container for input map
75
  with st.expander("Input map", expanded=True):
76
  # Create folium map
@@ -85,20 +86,6 @@ with col1:
85
  # this is necessary to start up the page
86
  folium_map = folium.Map(location=[39, 0], zoom_start=8)
87
 
88
- # Add drawing tools to map
89
- if area_type == "New area":
90
- Draw(
91
- export=False,
92
- draw_options={
93
- "circle": False,
94
- "polyline": False,
95
- "polygon": False,
96
- "rectangle": True,
97
- "marker": False,
98
- "circlemarker": False,
99
- },
100
- ).add_to(folium_map)
101
-
102
  m = st_folium(
103
  folium_map,
104
  width=800,
@@ -107,7 +94,7 @@ with col1:
107
  )
108
  with col2:
109
  # Add collapsable container for image dates
110
- with st.expander("Choose Image Dates"):
111
  start_date = st.date_input("Start date")
112
  end_date = st.date_input("End date")
113
  # Add collapsable container for parameters
@@ -115,12 +102,7 @@ with col2:
115
  # Add slider for threshold
116
  st.text("Add relevant (API) parameters here")
117
 
118
- # Button to trigger GFM data retrieval
119
- if area_type == "New area":
120
- button_text = "Get new flood extent"
121
- else:
122
- button_text = "Update flood extent"
123
- submitted = st.button(button_text)
124
 
125
 
126
  # If the button is clicked do the following
@@ -129,72 +111,20 @@ if submitted:
129
  # Some basic validation on dates and that there's an area if relevant
130
  get_gfm = True
131
  check_dates = start_date <= end_date
132
- if area_type == "New area":
133
- check_drawing = m["all_drawings"] != [] and m["all_drawings"] is not None
134
 
135
  # Output error if dates are not valid
136
  if not check_dates:
137
  st.error("Make sure that the dates were inserted correctly")
138
  get_gfm = False
139
- # Output error if no polygons were drawn
140
- if area_type == "New area":
141
- if not check_drawing:
142
- st.error("Please create a region using the rectangle tool on the map.")
143
- get_gfm = False
144
- elif new_area_name == "":
145
- st.error("Please provide a name for the new area")
146
- get_gfm = False
147
 
148
  # Only if checks pass go and get the GFM data
149
  if get_gfm:
150
- if area_type == "Existing area":
151
- area_name = selected_area
152
- elif area_type == "New area":
153
- area_name = new_area_name
154
-
155
  # Show loader because it will take a while
156
  with st.spinner("Getting GFM files... Please wait..."):
157
- if area_type == "New area":
158
- # Convert date input into a string format for JSON storage
159
- date_range_str = f"{start_date}_to_{end_date}"
160
-
161
- # Load existing bboxes
162
- with open("./bboxes/bboxes.json", "r") as f:
163
- bboxes = json.load(f)
164
-
165
- # Get the drawn area
166
- selected_area_geojson = m["all_drawings"][-1]
167
-
168
- # If the area doesn't exist, create it
169
- if new_area_name not in bboxes:
170
- bboxes[new_area_name] = {}
171
-
172
- # Save the new bounding box under the date range key
173
- bboxes[new_area_name][date_range_str] = {
174
- "bounding_box": selected_area_geojson,
175
- "flood_files": [], # Will be populated when files are downloaded
176
- }
177
-
178
- # Write the updated data back to file
179
- with open("./bboxes/bboxes.json", "w") as f:
180
- json.dump(bboxes, f, indent=4)
181
-
182
- # Download files, also getting coordinates for GFM
183
- coords = selected_area_geojson["geometry"]["coordinates"][0]
184
- # download_gfm_geojson(area_name, new_coordinates=coords)
185
- download_gfm_geojson(
186
- area_name,
187
- bbox=bboxes[new_area_name][date_range_str]["bounding_box"],
188
- new_coordinates=coords,
189
- )
190
-
191
- # For an existing area just get the latest update from GFM
192
- if area_type == "Existing area":
193
- # download_gfm_geojson(area_name)
194
- download_gfm_geojson(
195
- selected_area,
196
- bbox=bboxes[selected_area][selected_date_range]["bounding_box"],
197
- )
198
 
199
  # Display that getting the files is finished
200
  st.markdown("Getting GFM files finished")
 
38
  col1, col2 = row1.columns([2, 1])
39
  feat_group_selected_area = folium.FeatureGroup(name="selected_area")
40
  with col1:
41
+ with open("./bboxes/bboxes.json", "r") as f:
42
+ bboxes = json.load(f)
43
+ selected_area = st.selectbox("Select saved area", options=bboxes.keys())
44
+
45
+ # retrieve and select available dates
46
+ if selected_area:
47
+ area_folder = Path(f"./output/{selected_area}")
48
+ if area_folder.exists():
49
+ available_product_times = [
50
+ str(f.name) for f in area_folder.iterdir() if f.is_dir()
51
+ ]
52
+
53
+ available_product_times = [
54
+ prod_time.replace("_", ":") for prod_time in available_product_times
55
+ ]
56
+ selected_product_time = st.selectbox(
57
+ "Select available date range", options=available_product_times
58
  )
59
+ else:
60
+ selected_product_time = None
61
 
62
+ # display the bounding box
63
+ bounding_box = bboxes[selected_area]["bounding_box"]
64
+ geojson_selected_area = folium.GeoJson(bounding_box)
65
+ feat_group_selected_area.add_child(geojson_selected_area)
66
 
67
+ # geojson_selected_area = folium.GeoJson(bboxes[selected_area])
68
+ # feat_group_selected_area.add_child(geojson_selected_area)
69
+ if selected_product_time:
70
  geojson_flood_area = get_existing_flood_geojson(
71
+ selected_area, selected_product_time
72
  )
73
  feat_group_selected_area.add_child(geojson_flood_area)
74
 
 
 
75
  # Add collapsable container for input map
76
  with st.expander("Input map", expanded=True):
77
  # Create folium map
 
86
  # this is necessary to start up the page
87
  folium_map = folium.Map(location=[39, 0], zoom_start=8)
88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
89
  m = st_folium(
90
  folium_map,
91
  width=800,
 
94
  )
95
  with col2:
96
  # Add collapsable container for image dates
97
+ with st.expander("Choose Dates", expanded=True):
98
  start_date = st.date_input("Start date")
99
  end_date = st.date_input("End date")
100
  # Add collapsable container for parameters
 
102
  # Add slider for threshold
103
  st.text("Add relevant (API) parameters here")
104
 
105
+ submitted = st.button("Update flood extent")
 
 
 
 
 
106
 
107
 
108
  # If the button is clicked do the following
 
111
  # Some basic validation on dates and that there's an area if relevant
112
  get_gfm = True
113
  check_dates = start_date <= end_date
 
 
114
 
115
  # Output error if dates are not valid
116
  if not check_dates:
117
  st.error("Make sure that the dates were inserted correctly")
118
  get_gfm = False
 
 
 
 
 
 
 
 
119
 
120
  # Only if checks pass go and get the GFM data
121
  if get_gfm:
 
 
 
 
 
122
  # Show loader because it will take a while
123
  with st.spinner("Getting GFM files... Please wait..."):
124
+ # download_gfm_geojson(area_name)
125
+ download_gfm_geojson(
126
+ selected_area, from_date=start_date, to_date=end_date
127
+ )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
129
  # Display that getting the files is finished
130
  st.markdown("Getting GFM files finished")
app/src/gfm.py CHANGED
@@ -51,7 +51,9 @@ def sync_cached_data(bboxes_path="./bboxes/bboxes.json", output_dir="./output"):
51
  print(f"Error: {bboxes_path} is not a valid JSON file.")
52
 
53
 
54
- def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path=None):
 
 
55
  """
56
  Should provide an existing area name or a new area name with new_coordinates
57
  """
@@ -70,21 +72,6 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
70
  header = {"Authorization": f"bearer {access_token}"}
71
  print("logged in")
72
 
73
- # Only if new coordinates are provided create the AOI in GFM
74
- if new_coordinates:
75
- # Create area of impact
76
- create_aoi_url = f"{base_url}/aoi/create"
77
-
78
- payload = {
79
- "aoi_name": area_name,
80
- "description": area_name,
81
- "user_id": user_id,
82
- "geoJSON": {"type": "Polygon", "coordinates": [new_coordinates]},
83
- }
84
-
85
- r = requests.post(url=create_aoi_url, json=payload, headers=header)
86
- print("Posted new AOI")
87
-
88
  # Get Area of Impact
89
  aoi_url = f"{base_url}/aoi/user/{user_id}"
90
  response = requests.get(aoi_url, headers=header)
@@ -96,24 +83,30 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
96
  break
97
 
98
  # Get all product IDs
 
 
 
 
 
99
  prod_url = f"{base_url}/aoi/{aoi_id}/products"
100
- response = requests.get(prod_url, headers=header)
101
  products = response.json()["products"]
102
  print(f"Found {len(products)} products for {area_name}")
103
 
104
- # Set output path
105
  if not output_file_path:
106
- output_file_path = f"./output/{area_name}"
107
-
108
- Path(output_file_path).mkdir(parents=True, exist_ok=True)
109
-
110
- # Remove existing flood files before downloading
111
- for f in Path(output_file_path).glob("*FLOOD*.geojson"):
112
- f.unlink()
113
 
114
  # Download all available flood products
115
  for product in products:
116
  product_id = product["product_id"]
 
 
 
 
 
 
 
 
117
  print(f"Downloading product: {product_id}")
118
 
119
  download_url = f"{base_url}/download/product/{product_id}"
@@ -129,20 +122,16 @@ def download_gfm_geojson(area_name, bbox, new_coordinates=None, output_file_path
129
  print("Done!")
130
 
131
 
132
- def get_existing_flood_geojson(area_name, date_range, output_file_path=None):
133
  """
134
  Getting a saved GFM flood geojson in an output folder of GFM files. Merge in one feature group if multiple.
135
  """
136
-
137
  if not output_file_path:
138
- output_file_path = f"./output/{area_name}/{date_range}"
139
-
140
- # Ensure the output directory exists
141
- # if not Path(output_file_path).exists():
142
- # raise FloodGeoJsonError(f"Error: Output folder '{output_file_path}' does not exist.")
143
 
144
  # Combine multiple flood files into a FeatureGroup
145
- flood_geojson_group = folium.FeatureGroup(name=f"{area_name} Floods {date_range}")
146
 
147
  for flood_file in Path(output_file_path).glob("*FLOOD*.geojson"):
148
  with open(flood_file, "r") as f:
@@ -153,9 +142,3 @@ def get_existing_flood_geojson(area_name, date_range, output_file_path=None):
153
  # TODO: consider merging multiple flood layers into one, to avoid overlap
154
 
155
  return flood_geojson_group
156
-
157
-
158
- if __name__ == "__main__":
159
- # download_gfm_geojson('Catania')
160
- gj = get_existing_flood_geojson("Albufera Floods")
161
- print(type(gj))
 
51
  print(f"Error: {bboxes_path} is not a valid JSON file.")
52
 
53
 
54
+ def download_gfm_geojson(
55
+ area_name, from_date=None, to_date=None, output_file_path=None
56
+ ):
57
  """
58
  Should provide an existing area name or a new area name with new_coordinates
59
  """
 
72
  header = {"Authorization": f"bearer {access_token}"}
73
  print("logged in")
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  # Get Area of Impact
76
  aoi_url = f"{base_url}/aoi/user/{user_id}"
77
  response = requests.get(aoi_url, headers=header)
 
83
  break
84
 
85
  # Get all product IDs
86
+ params = {
87
+ "time": "range",
88
+ "from": f"{from_date}T00:00:00",
89
+ "to": f"{to_date}T00:00:00",
90
+ }
91
  prod_url = f"{base_url}/aoi/{aoi_id}/products"
92
+ response = requests.get(prod_url, headers=header, params=params)
93
  products = response.json()["products"]
94
  print(f"Found {len(products)} products for {area_name}")
95
 
 
96
  if not output_file_path:
97
+ base_file_path = "./output"
 
 
 
 
 
 
98
 
99
  # Download all available flood products
100
  for product in products:
101
  product_id = product["product_id"]
102
+
103
+ # Converts product_time from e.g. "2025-01-05T06:10:37" to ""2025-01-05 06h
104
+ # Reason for bucketing per hour is that products are often seconds or minutes apart and should be grouped
105
+ product_time = product["product_time"]
106
+ product_time = product_time.split(":")[0].replace("T", " ") + "h"
107
+ output_file_path = f"{base_file_path}/{area_name}/{product_time}"
108
+ Path(output_file_path).mkdir(parents=True, exist_ok=True)
109
+
110
  print(f"Downloading product: {product_id}")
111
 
112
  download_url = f"{base_url}/download/product/{product_id}"
 
122
  print("Done!")
123
 
124
 
125
+ def get_existing_flood_geojson(area_name, product_time, output_file_path=None):
126
  """
127
  Getting a saved GFM flood geojson in an output folder of GFM files. Merge in one feature group if multiple.
128
  """
129
+ product_time = product_time.replace(":", "_")
130
  if not output_file_path:
131
+ output_file_path = f"./output/{area_name}/{product_time}"
 
 
 
 
132
 
133
  # Combine multiple flood files into a FeatureGroup
134
+ flood_geojson_group = folium.FeatureGroup(name=f"{area_name} Floods {product_time}")
135
 
136
  for flood_file in Path(output_file_path).glob("*FLOOD*.geojson"):
137
  with open(flood_file, "r") as f:
 
142
  # TODO: consider merging multiple flood layers into one, to avoid overlap
143
 
144
  return flood_geojson_group
 
 
 
 
 
 
bboxes/bboxes.json CHANGED
@@ -1 +1,167 @@
1
- {"Denia": {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[-0.387268, 38.786204], [-0.387268, 38.967951], [0.222473, 38.967951], [0.222473, 38.786204], [-0.387268, 38.786204]]]}}, "Test": {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[-1.779785, 39.656456], [-1.779785, 39.888665], [-0.977783, 39.888665], [-0.977783, 39.656456], [-1.779785, 39.656456]]]}}, "Gambia": {"type": "Feature", "properties": {}, "geometry": {"type": "Polygon", "coordinates": [[[-16.864014, 12.972442], [-16.864014, 13.83808], [-13.370361, 13.83808], [-13.370361, 12.972442], [-16.864014, 12.972442]]]}}}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "Valencia": {
3
+ "bounding_box": {
4
+ "type": "Feature",
5
+ "properties": {},
6
+ "geometry": {
7
+ "type": "Polygon",
8
+ "coordinates": [
9
+ [
10
+ [
11
+ -1.098633,
12
+ 39.227998
13
+ ],
14
+ [
15
+ -1.098633,
16
+ 39.639538
17
+ ],
18
+ [
19
+ 0.439453,
20
+ 39.639538
21
+ ],
22
+ [
23
+ 0.439453,
24
+ 39.227998
25
+ ],
26
+ [
27
+ -1.098633,
28
+ 39.227998
29
+ ]
30
+ ]
31
+ ]
32
+ }
33
+ }
34
+ },
35
+ "Tsjad": {
36
+ "bounding_box": {
37
+ "type": "Feature",
38
+ "properties": {},
39
+ "geometry": {
40
+ "type": "Polygon",
41
+ "coordinates": [
42
+ [
43
+ [
44
+ 17.050781,
45
+ 9.178025
46
+ ],
47
+ [
48
+ 17.050781,
49
+ 11.18918
50
+ ],
51
+ [
52
+ 20.313721,
53
+ 11.18918
54
+ ],
55
+ [
56
+ 20.313721,
57
+ 9.178025
58
+ ],
59
+ [
60
+ 17.050781,
61
+ 9.178025
62
+ ]
63
+ ]
64
+ ]
65
+ }
66
+ }
67
+ },
68
+ "Uganda": {
69
+ "bounding_box": {
70
+ "type": "Feature",
71
+ "properties": {},
72
+ "geometry": {
73
+ "type": "Polygon",
74
+ "coordinates": [
75
+ [
76
+ [
77
+ 32.519531,
78
+ 0.966751
79
+ ],
80
+ [
81
+ 32.519531,
82
+ 2.921097
83
+ ],
84
+ [
85
+ 34.145508,
86
+ 2.921097
87
+ ],
88
+ [
89
+ 34.145508,
90
+ 0.966751
91
+ ],
92
+ [
93
+ 32.519531,
94
+ 0.966751
95
+ ]
96
+ ]
97
+ ]
98
+ }
99
+ }
100
+ },
101
+ "Pego": {
102
+ "bounding_box": {
103
+ "type": "Feature",
104
+ "properties": {},
105
+ "geometry": {
106
+ "type": "Polygon",
107
+ "coordinates": [
108
+ [
109
+ [
110
+ -0.085831,
111
+ 38.867781
112
+ ],
113
+ [
114
+ -0.085831,
115
+ 38.884085
116
+ ],
117
+ [
118
+ -0.058966,
119
+ 38.884085
120
+ ],
121
+ [
122
+ -0.058966,
123
+ 38.867781
124
+ ],
125
+ [
126
+ -0.085831,
127
+ 38.867781
128
+ ]
129
+ ]
130
+ ]
131
+ }
132
+ }
133
+ },
134
+ "Albufera": {
135
+ "bounding_box": {
136
+ "type": "Feature",
137
+ "properties": {},
138
+ "geometry": {
139
+ "type": "Polygon",
140
+ "coordinates": [
141
+ [
142
+ [
143
+ -0.410614,
144
+ 39.2615
145
+ ],
146
+ [
147
+ -0.410614,
148
+ 39.373057
149
+ ],
150
+ [
151
+ -0.263672,
152
+ 39.373057
153
+ ],
154
+ [
155
+ -0.263672,
156
+ 39.2615
157
+ ],
158
+ [
159
+ -0.410614,
160
+ 39.2615
161
+ ]
162
+ ]
163
+ ]
164
+ }
165
+ }
166
+ }
167
+ }
pyproject.toml CHANGED
@@ -11,4 +11,5 @@ dependencies = [
11
  "python-dotenv==1.0.1",
12
  "streamlit>=1.41.1",
13
  "streamlit-folium>=0.24.0",
14
- ]
 
 
11
  "python-dotenv==1.0.1",
12
  "streamlit>=1.41.1",
13
  "streamlit-folium>=0.24.0",
14
+ "ipykernel>=6.29.5",
15
+ ]
uv.lock CHANGED
@@ -17,6 +17,24 @@ wheels = [
17
  { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 },
18
  ]
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  [[package]]
21
  name = "attrs"
22
  version = "25.1.0"
@@ -65,6 +83,39 @@ wheels = [
65
  { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
66
  ]
67
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  [[package]]
69
  name = "charset-normalizer"
70
  version = "3.4.1"
@@ -121,6 +172,53 @@ wheels = [
121
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
122
  ]
123
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  [[package]]
125
  name = "flood-mapping-gfm"
126
  version = "0.1.0"
@@ -128,6 +226,7 @@ source = { virtual = "." }
128
  dependencies = [
129
  { name = "folium" },
130
  { name = "geopandas" },
 
131
  { name = "python-dotenv" },
132
  { name = "requests" },
133
  { name = "streamlit" },
@@ -138,6 +237,7 @@ dependencies = [
138
  requires-dist = [
139
  { name = "folium", specifier = ">=0.19.4" },
140
  { name = "geopandas", specifier = ">=1.0.1" },
 
141
  { name = "python-dotenv", specifier = "==1.0.1" },
142
  { name = "requests", specifier = ">=2.32.3" },
143
  { name = "streamlit", specifier = ">=1.41.1" },
@@ -210,6 +310,62 @@ wheels = [
210
  { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
211
  ]
212
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
213
  [[package]]
214
  name = "jinja2"
215
  version = "3.1.5"
@@ -249,6 +405,36 @@ wheels = [
249
  { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
250
  ]
251
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
252
  [[package]]
253
  name = "markdown-it-py"
254
  version = "3.0.0"
@@ -299,6 +485,18 @@ wheels = [
299
  { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
300
  ]
301
 
 
 
 
 
 
 
 
 
 
 
 
 
302
  [[package]]
303
  name = "mdurl"
304
  version = "0.1.2"
@@ -317,6 +515,15 @@ wheels = [
317
  { url = "https://files.pythonhosted.org/packages/8a/19/cb00eca0ce44c5a197b1a084d66f3fb41c07625efdd69b22bfd9bf8b0e3e/narwhals-1.24.0-py3-none-any.whl", hash = "sha256:73ff60578641059221de2e4f337bfdf0260378fb1553f787d27411602cfc5e72", size = 308077 },
318
  ]
319
 
 
 
 
 
 
 
 
 
 
320
  [[package]]
321
  name = "numpy"
322
  version = "2.2.2"
@@ -398,6 +605,27 @@ wheels = [
398
  { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
399
  ]
400
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  [[package]]
402
  name = "pillow"
403
  version = "11.1.0"
@@ -436,6 +664,27 @@ wheels = [
436
  { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
437
  ]
438
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
439
  [[package]]
440
  name = "protobuf"
441
  version = "5.29.3"
@@ -450,6 +699,39 @@ wheels = [
450
  { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
451
  ]
452
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
453
  [[package]]
454
  name = "pyarrow"
455
  version = "19.0.0"
@@ -478,6 +760,15 @@ wheels = [
478
  { url = "https://files.pythonhosted.org/packages/36/ef/1d7975053af9d106da973bac142d0d4da71b7550a3576cc3e0b3f444d21a/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89", size = 42077618 },
479
  ]
480
 
 
 
 
 
 
 
 
 
 
481
  [[package]]
482
  name = "pydeck"
483
  version = "0.9.1"
@@ -578,6 +869,63 @@ wheels = [
578
  { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
579
  ]
580
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  [[package]]
582
  name = "referencing"
583
  version = "0.36.2"
@@ -708,6 +1056,20 @@ wheels = [
708
  { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
709
  ]
710
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
711
  [[package]]
712
  name = "streamlit"
713
  version = "1.41.1"
@@ -789,6 +1151,15 @@ wheels = [
789
  { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
790
  ]
791
 
 
 
 
 
 
 
 
 
 
792
  [[package]]
793
  name = "typing-extensions"
794
  version = "4.12.2"
@@ -834,6 +1205,15 @@ wheels = [
834
  { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
835
  ]
836
 
 
 
 
 
 
 
 
 
 
837
  [[package]]
838
  name = "xyzservices"
839
  version = "2025.1.0"
 
17
  { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 },
18
  ]
19
 
20
+ [[package]]
21
+ name = "appnope"
22
+ version = "0.1.4"
23
+ source = { registry = "https://pypi.org/simple" }
24
+ sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 }
25
+ wheels = [
26
+ { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 },
27
+ ]
28
+
29
+ [[package]]
30
+ name = "asttokens"
31
+ version = "3.0.0"
32
+ source = { registry = "https://pypi.org/simple" }
33
+ sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 }
34
+ wheels = [
35
+ { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 },
36
+ ]
37
+
38
  [[package]]
39
  name = "attrs"
40
  version = "25.1.0"
 
83
  { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 },
84
  ]
85
 
86
+ [[package]]
87
+ name = "cffi"
88
+ version = "1.17.1"
89
+ source = { registry = "https://pypi.org/simple" }
90
+ dependencies = [
91
+ { name = "pycparser" },
92
+ ]
93
+ sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 }
94
+ wheels = [
95
+ { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 },
96
+ { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 },
97
+ { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 },
98
+ { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 },
99
+ { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 },
100
+ { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 },
101
+ { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 },
102
+ { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 },
103
+ { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 },
104
+ { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 },
105
+ { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 },
106
+ { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 },
107
+ { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 },
108
+ { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 },
109
+ { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 },
110
+ { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 },
111
+ { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 },
112
+ { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 },
113
+ { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 },
114
+ { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 },
115
+ { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 },
116
+ { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 },
117
+ ]
118
+
119
  [[package]]
120
  name = "charset-normalizer"
121
  version = "3.4.1"
 
172
  { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 },
173
  ]
174
 
175
+ [[package]]
176
+ name = "comm"
177
+ version = "0.2.2"
178
+ source = { registry = "https://pypi.org/simple" }
179
+ dependencies = [
180
+ { name = "traitlets" },
181
+ ]
182
+ sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 }
183
+ wheels = [
184
+ { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 },
185
+ ]
186
+
187
+ [[package]]
188
+ name = "debugpy"
189
+ version = "1.8.12"
190
+ source = { registry = "https://pypi.org/simple" }
191
+ sdist = { url = "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz", hash = "sha256:646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", size = 1641122 }
192
+ wheels = [
193
+ { url = "https://files.pythonhosted.org/packages/ba/e6/0f876ecfe5831ebe4762b19214364753c8bc2b357d28c5d739a1e88325c7/debugpy-1.8.12-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:7e94b643b19e8feb5215fa508aee531387494bf668b2eca27fa769ea11d9f498", size = 2500846 },
194
+ { url = "https://files.pythonhosted.org/packages/19/64/33f41653a701f3cd2cbff8b41ebaad59885b3428b5afd0d93d16012ecf17/debugpy-1.8.12-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:086b32e233e89a2740c1615c2f775c34ae951508b28b308681dbbb87bba97d06", size = 4222181 },
195
+ { url = "https://files.pythonhosted.org/packages/32/a6/02646cfe50bfacc9b71321c47dc19a46e35f4e0aceea227b6d205e900e34/debugpy-1.8.12-cp312-cp312-win32.whl", hash = "sha256:2ae5df899732a6051b49ea2632a9ea67f929604fd2b036613a9f12bc3163b92d", size = 5227017 },
196
+ { url = "https://files.pythonhosted.org/packages/da/a6/10056431b5c47103474312cf4a2ec1001f73e0b63b1216706d5fef2531eb/debugpy-1.8.12-cp312-cp312-win_amd64.whl", hash = "sha256:39dfbb6fa09f12fae32639e3286112fc35ae976114f1f3d37375f3130a820969", size = 5267555 },
197
+ { url = "https://files.pythonhosted.org/packages/cf/4d/7c3896619a8791effd5d8c31f0834471fc8f8fb3047ec4f5fc69dd1393dd/debugpy-1.8.12-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:696d8ae4dff4cbd06bf6b10d671e088b66669f110c7c4e18a44c43cf75ce966f", size = 2485246 },
198
+ { url = "https://files.pythonhosted.org/packages/99/46/bc6dcfd7eb8cc969a5716d858e32485eb40c72c6a8dc88d1e3a4d5e95813/debugpy-1.8.12-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:898fba72b81a654e74412a67c7e0a81e89723cfe2a3ea6fcd3feaa3395138ca9", size = 4218616 },
199
+ { url = "https://files.pythonhosted.org/packages/03/dd/d7fcdf0381a9b8094da1f6a1c9f19fed493a4f8576a2682349b3a8b20ec7/debugpy-1.8.12-cp313-cp313-win32.whl", hash = "sha256:22a11c493c70413a01ed03f01c3c3a2fc4478fc6ee186e340487b2edcd6f4180", size = 5226540 },
200
+ { url = "https://files.pythonhosted.org/packages/25/bd/ecb98f5b5fc7ea0bfbb3c355bc1dd57c198a28780beadd1e19915bf7b4d9/debugpy-1.8.12-cp313-cp313-win_amd64.whl", hash = "sha256:fdb3c6d342825ea10b90e43d7f20f01535a72b3a1997850c0c3cefa5c27a4a2c", size = 5267134 },
201
+ { url = "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl", hash = "sha256:274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", size = 5229490 },
202
+ ]
203
+
204
+ [[package]]
205
+ name = "decorator"
206
+ version = "5.1.1"
207
+ source = { registry = "https://pypi.org/simple" }
208
+ sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 }
209
+ wheels = [
210
+ { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 },
211
+ ]
212
+
213
+ [[package]]
214
+ name = "executing"
215
+ version = "2.2.0"
216
+ source = { registry = "https://pypi.org/simple" }
217
+ sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 }
218
+ wheels = [
219
+ { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 },
220
+ ]
221
+
222
  [[package]]
223
  name = "flood-mapping-gfm"
224
  version = "0.1.0"
 
226
  dependencies = [
227
  { name = "folium" },
228
  { name = "geopandas" },
229
+ { name = "ipykernel" },
230
  { name = "python-dotenv" },
231
  { name = "requests" },
232
  { name = "streamlit" },
 
237
  requires-dist = [
238
  { name = "folium", specifier = ">=0.19.4" },
239
  { name = "geopandas", specifier = ">=1.0.1" },
240
+ { name = "ipykernel", specifier = ">=6.29.5" },
241
  { name = "python-dotenv", specifier = "==1.0.1" },
242
  { name = "requests", specifier = ">=2.32.3" },
243
  { name = "streamlit", specifier = ">=1.41.1" },
 
310
  { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 },
311
  ]
312
 
313
+ [[package]]
314
+ name = "ipykernel"
315
+ version = "6.29.5"
316
+ source = { registry = "https://pypi.org/simple" }
317
+ dependencies = [
318
+ { name = "appnope", marker = "sys_platform == 'darwin'" },
319
+ { name = "comm" },
320
+ { name = "debugpy" },
321
+ { name = "ipython" },
322
+ { name = "jupyter-client" },
323
+ { name = "jupyter-core" },
324
+ { name = "matplotlib-inline" },
325
+ { name = "nest-asyncio" },
326
+ { name = "packaging" },
327
+ { name = "psutil" },
328
+ { name = "pyzmq" },
329
+ { name = "tornado" },
330
+ { name = "traitlets" },
331
+ ]
332
+ sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 }
333
+ wheels = [
334
+ { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 },
335
+ ]
336
+
337
+ [[package]]
338
+ name = "ipython"
339
+ version = "8.32.0"
340
+ source = { registry = "https://pypi.org/simple" }
341
+ dependencies = [
342
+ { name = "colorama", marker = "sys_platform == 'win32'" },
343
+ { name = "decorator" },
344
+ { name = "jedi" },
345
+ { name = "matplotlib-inline" },
346
+ { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" },
347
+ { name = "prompt-toolkit" },
348
+ { name = "pygments" },
349
+ { name = "stack-data" },
350
+ { name = "traitlets" },
351
+ ]
352
+ sdist = { url = "https://files.pythonhosted.org/packages/36/80/4d2a072e0db7d250f134bc11676517299264ebe16d62a8619d49a78ced73/ipython-8.32.0.tar.gz", hash = "sha256:be2c91895b0b9ea7ba49d33b23e2040c352b33eb6a519cca7ce6e0c743444251", size = 5507441 }
353
+ wheels = [
354
+ { url = "https://files.pythonhosted.org/packages/e7/e1/f4474a7ecdb7745a820f6f6039dc43c66add40f1bcc66485607d93571af6/ipython-8.32.0-py3-none-any.whl", hash = "sha256:cae85b0c61eff1fc48b0a8002de5958b6528fa9c8defb1894da63f42613708aa", size = 825524 },
355
+ ]
356
+
357
+ [[package]]
358
+ name = "jedi"
359
+ version = "0.19.2"
360
+ source = { registry = "https://pypi.org/simple" }
361
+ dependencies = [
362
+ { name = "parso" },
363
+ ]
364
+ sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 }
365
+ wheels = [
366
+ { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 },
367
+ ]
368
+
369
  [[package]]
370
  name = "jinja2"
371
  version = "3.1.5"
 
405
  { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 },
406
  ]
407
 
408
+ [[package]]
409
+ name = "jupyter-client"
410
+ version = "8.6.3"
411
+ source = { registry = "https://pypi.org/simple" }
412
+ dependencies = [
413
+ { name = "jupyter-core" },
414
+ { name = "python-dateutil" },
415
+ { name = "pyzmq" },
416
+ { name = "tornado" },
417
+ { name = "traitlets" },
418
+ ]
419
+ sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 }
420
+ wheels = [
421
+ { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 },
422
+ ]
423
+
424
+ [[package]]
425
+ name = "jupyter-core"
426
+ version = "5.7.2"
427
+ source = { registry = "https://pypi.org/simple" }
428
+ dependencies = [
429
+ { name = "platformdirs" },
430
+ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" },
431
+ { name = "traitlets" },
432
+ ]
433
+ sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 }
434
+ wheels = [
435
+ { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 },
436
+ ]
437
+
438
  [[package]]
439
  name = "markdown-it-py"
440
  version = "3.0.0"
 
485
  { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 },
486
  ]
487
 
488
+ [[package]]
489
+ name = "matplotlib-inline"
490
+ version = "0.1.7"
491
+ source = { registry = "https://pypi.org/simple" }
492
+ dependencies = [
493
+ { name = "traitlets" },
494
+ ]
495
+ sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 }
496
+ wheels = [
497
+ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 },
498
+ ]
499
+
500
  [[package]]
501
  name = "mdurl"
502
  version = "0.1.2"
 
515
  { url = "https://files.pythonhosted.org/packages/8a/19/cb00eca0ce44c5a197b1a084d66f3fb41c07625efdd69b22bfd9bf8b0e3e/narwhals-1.24.0-py3-none-any.whl", hash = "sha256:73ff60578641059221de2e4f337bfdf0260378fb1553f787d27411602cfc5e72", size = 308077 },
516
  ]
517
 
518
+ [[package]]
519
+ name = "nest-asyncio"
520
+ version = "1.6.0"
521
+ source = { registry = "https://pypi.org/simple" }
522
+ sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 }
523
+ wheels = [
524
+ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 },
525
+ ]
526
+
527
  [[package]]
528
  name = "numpy"
529
  version = "2.2.2"
 
605
  { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 },
606
  ]
607
 
608
+ [[package]]
609
+ name = "parso"
610
+ version = "0.8.4"
611
+ source = { registry = "https://pypi.org/simple" }
612
+ sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 }
613
+ wheels = [
614
+ { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 },
615
+ ]
616
+
617
+ [[package]]
618
+ name = "pexpect"
619
+ version = "4.9.0"
620
+ source = { registry = "https://pypi.org/simple" }
621
+ dependencies = [
622
+ { name = "ptyprocess" },
623
+ ]
624
+ sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
625
+ wheels = [
626
+ { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
627
+ ]
628
+
629
  [[package]]
630
  name = "pillow"
631
  version = "11.1.0"
 
664
  { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 },
665
  ]
666
 
667
+ [[package]]
668
+ name = "platformdirs"
669
+ version = "4.3.6"
670
+ source = { registry = "https://pypi.org/simple" }
671
+ sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 }
672
+ wheels = [
673
+ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 },
674
+ ]
675
+
676
+ [[package]]
677
+ name = "prompt-toolkit"
678
+ version = "3.0.50"
679
+ source = { registry = "https://pypi.org/simple" }
680
+ dependencies = [
681
+ { name = "wcwidth" },
682
+ ]
683
+ sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 }
684
+ wheels = [
685
+ { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 },
686
+ ]
687
+
688
  [[package]]
689
  name = "protobuf"
690
  version = "5.29.3"
 
699
  { url = "https://files.pythonhosted.org/packages/fd/b2/ab07b09e0f6d143dfb839693aa05765257bceaa13d03bf1a696b78323e7a/protobuf-5.29.3-py3-none-any.whl", hash = "sha256:0a18ed4a24198528f2333802eb075e59dea9d679ab7a6c5efb017a59004d849f", size = 172550 },
700
  ]
701
 
702
+ [[package]]
703
+ name = "psutil"
704
+ version = "7.0.0"
705
+ source = { registry = "https://pypi.org/simple" }
706
+ sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 }
707
+ wheels = [
708
+ { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 },
709
+ { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 },
710
+ { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 },
711
+ { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 },
712
+ { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 },
713
+ { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 },
714
+ { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 },
715
+ ]
716
+
717
+ [[package]]
718
+ name = "ptyprocess"
719
+ version = "0.7.0"
720
+ source = { registry = "https://pypi.org/simple" }
721
+ sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
722
+ wheels = [
723
+ { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
724
+ ]
725
+
726
+ [[package]]
727
+ name = "pure-eval"
728
+ version = "0.2.3"
729
+ source = { registry = "https://pypi.org/simple" }
730
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 }
731
+ wheels = [
732
+ { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 },
733
+ ]
734
+
735
  [[package]]
736
  name = "pyarrow"
737
  version = "19.0.0"
 
760
  { url = "https://files.pythonhosted.org/packages/36/ef/1d7975053af9d106da973bac142d0d4da71b7550a3576cc3e0b3f444d21a/pyarrow-19.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:29cd86c8001a94f768f79440bf83fee23963af5e7bc68ce3a7e5f120e17edf89", size = 42077618 },
761
  ]
762
 
763
+ [[package]]
764
+ name = "pycparser"
765
+ version = "2.22"
766
+ source = { registry = "https://pypi.org/simple" }
767
+ sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 }
768
+ wheels = [
769
+ { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 },
770
+ ]
771
+
772
  [[package]]
773
  name = "pydeck"
774
  version = "0.9.1"
 
869
  { url = "https://files.pythonhosted.org/packages/11/c3/005fcca25ce078d2cc29fd559379817424e94885510568bc1bc53d7d5846/pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725", size = 508002 },
870
  ]
871
 
872
+ [[package]]
873
+ name = "pywin32"
874
+ version = "308"
875
+ source = { registry = "https://pypi.org/simple" }
876
+ wheels = [
877
+ { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 },
878
+ { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 },
879
+ { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 },
880
+ { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 },
881
+ { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 },
882
+ { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 },
883
+ ]
884
+
885
+ [[package]]
886
+ name = "pyzmq"
887
+ version = "26.2.1"
888
+ source = { registry = "https://pypi.org/simple" }
889
+ dependencies = [
890
+ { name = "cffi", marker = "implementation_name == 'pypy'" },
891
+ ]
892
+ sdist = { url = "https://files.pythonhosted.org/packages/5a/e3/8d0382cb59feb111c252b54e8728257416a38ffcb2243c4e4775a3c990fe/pyzmq-26.2.1.tar.gz", hash = "sha256:17d72a74e5e9ff3829deb72897a175333d3ef5b5413948cae3cf7ebf0b02ecca", size = 278433 }
893
+ wheels = [
894
+ { url = "https://files.pythonhosted.org/packages/9c/b9/260a74786f162c7f521f5f891584a51d5a42fd15f5dcaa5c9226b2865fcc/pyzmq-26.2.1-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:a6549ecb0041dafa55b5932dcbb6c68293e0bd5980b5b99f5ebb05f9a3b8a8f3", size = 1348495 },
895
+ { url = "https://files.pythonhosted.org/packages/bf/73/8a0757e4b68f5a8ccb90ddadbb76c6a5f880266cdb18be38c99bcdc17aaa/pyzmq-26.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0250c94561f388db51fd0213cdccbd0b9ef50fd3c57ce1ac937bf3034d92d72e", size = 945035 },
896
+ { url = "https://files.pythonhosted.org/packages/cf/de/f02ec973cd33155bb772bae33ace774acc7cc71b87b25c4829068bec35de/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ee4297d9e4b34b5dc1dd7ab5d5ea2cbba8511517ef44104d2915a917a56dc8", size = 671213 },
897
+ { url = "https://files.pythonhosted.org/packages/d1/80/8fc583085f85ac91682744efc916888dd9f11f9f75a31aef1b78a5486c6c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2a9cb17fd83b7a3a3009901aca828feaf20aa2451a8a487b035455a86549c09", size = 908750 },
898
+ { url = "https://files.pythonhosted.org/packages/c3/25/0b4824596f261a3cc512ab152448b383047ff5f143a6906a36876415981c/pyzmq-26.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:786dd8a81b969c2081b31b17b326d3a499ddd1856e06d6d79ad41011a25148da", size = 865416 },
899
+ { url = "https://files.pythonhosted.org/packages/a1/d1/6fda77a034d02034367b040973fd3861d945a5347e607bd2e98c99f20599/pyzmq-26.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:2d88ba221a07fc2c5581565f1d0fe8038c15711ae79b80d9462e080a1ac30435", size = 865922 },
900
+ { url = "https://files.pythonhosted.org/packages/ad/81/48f7fd8a71c427412e739ce576fc1ee14f3dc34527ca9b0076e471676183/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1c84c1297ff9f1cd2440da4d57237cb74be21fdfe7d01a10810acba04e79371a", size = 1201526 },
901
+ { url = "https://files.pythonhosted.org/packages/c7/d8/818f15c6ef36b5450e435cbb0d3a51599fc884a5d2b27b46b9c00af68ef1/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:46d4ebafc27081a7f73a0f151d0c38d4291656aa134344ec1f3d0199ebfbb6d4", size = 1512808 },
902
+ { url = "https://files.pythonhosted.org/packages/d9/c4/b3edb7d0ae82ad6fb1a8cdb191a4113c427a01e85139906f3b655b07f4f8/pyzmq-26.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:91e2bfb8e9a29f709d51b208dd5f441dc98eb412c8fe75c24ea464734ccdb48e", size = 1411836 },
903
+ { url = "https://files.pythonhosted.org/packages/69/1c/151e3d42048f02cc5cd6dfc241d9d36b38375b4dee2e728acb5c353a6d52/pyzmq-26.2.1-cp312-cp312-win32.whl", hash = "sha256:4a98898fdce380c51cc3e38ebc9aa33ae1e078193f4dc641c047f88b8c690c9a", size = 581378 },
904
+ { url = "https://files.pythonhosted.org/packages/b6/b9/d59a7462848aaab7277fddb253ae134a570520115d80afa85e952287e6bc/pyzmq-26.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:a0741edbd0adfe5f30bba6c5223b78c131b5aa4a00a223d631e5ef36e26e6d13", size = 643737 },
905
+ { url = "https://files.pythonhosted.org/packages/55/09/f37e707937cce328944c1d57e5e50ab905011d35252a0745c4f7e5822a76/pyzmq-26.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:e5e33b1491555843ba98d5209439500556ef55b6ab635f3a01148545498355e5", size = 558303 },
906
+ { url = "https://files.pythonhosted.org/packages/4f/2e/fa7a91ce349975971d6aa925b4c7e1a05abaae99b97ade5ace758160c43d/pyzmq-26.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:099b56ef464bc355b14381f13355542e452619abb4c1e57a534b15a106bf8e23", size = 942331 },
907
+ { url = "https://files.pythonhosted.org/packages/64/2b/1f10b34b6dc7ff4b40f668ea25ba9b8093ce61d874c784b90229b367707b/pyzmq-26.2.1-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:651726f37fcbce9f8dd2a6dab0f024807929780621890a4dc0c75432636871be", size = 1345831 },
908
+ { url = "https://files.pythonhosted.org/packages/4c/8d/34884cbd4a8ec050841b5fb58d37af136766a9f95b0b2634c2971deb09da/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57dd4d91b38fa4348e237a9388b4423b24ce9c1695bbd4ba5a3eada491e09399", size = 670773 },
909
+ { url = "https://files.pythonhosted.org/packages/0f/f4/d4becfcf9e416ad2564f18a6653f7c6aa917da08df5c3760edb0baa1c863/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d51a7bfe01a48e1064131f3416a5439872c533d756396be2b39e3977b41430f9", size = 908836 },
910
+ { url = "https://files.pythonhosted.org/packages/07/fa/ab105f1b86b85cb2e821239f1d0900fccd66192a91d97ee04661b5436b4d/pyzmq-26.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7154d228502e18f30f150b7ce94f0789d6b689f75261b623f0fdc1eec642aab", size = 865369 },
911
+ { url = "https://files.pythonhosted.org/packages/c9/48/15d5f415504572dd4b92b52db5de7a5befc76bb75340ba9f36f71306a66d/pyzmq-26.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:f1f31661a80cc46aba381bed475a9135b213ba23ca7ff6797251af31510920ce", size = 865676 },
912
+ { url = "https://files.pythonhosted.org/packages/7e/35/2d91bcc7ccbb56043dd4d2c1763f24a8de5f05e06a134f767a7fb38e149c/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:290c96f479504439b6129a94cefd67a174b68ace8a8e3f551b2239a64cfa131a", size = 1201457 },
913
+ { url = "https://files.pythonhosted.org/packages/6d/bb/aa7c5119307a5762b8dca6c9db73e3ab4bccf32b15d7c4f376271ff72b2b/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f2c307fbe86e18ab3c885b7e01de942145f539165c3360e2af0f094dd440acd9", size = 1513035 },
914
+ { url = "https://files.pythonhosted.org/packages/4f/4c/527e6650c2fccec7750b783301329c8a8716d59423818afb67282304ce5a/pyzmq-26.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b314268e716487bfb86fcd6f84ebbe3e5bec5fac75fdf42bc7d90fdb33f618ad", size = 1411881 },
915
+ { url = "https://files.pythonhosted.org/packages/89/9f/e4412ea1b3e220acc21777a5edba8885856403d29c6999aaf00a9459eb03/pyzmq-26.2.1-cp313-cp313-win32.whl", hash = "sha256:edb550616f567cd5603b53bb52a5f842c0171b78852e6fc7e392b02c2a1504bb", size = 581354 },
916
+ { url = "https://files.pythonhosted.org/packages/55/cd/f89dd3e9fc2da0d1619a82c4afb600c86b52bc72d7584953d460bc8d5027/pyzmq-26.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:100a826a029c8ef3d77a1d4c97cbd6e867057b5806a7276f2bac1179f893d3bf", size = 643560 },
917
+ { url = "https://files.pythonhosted.org/packages/a7/99/5de4f8912860013f1116f818a0047659bc20d71d1bc1d48f874bdc2d7b9c/pyzmq-26.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:6991ee6c43e0480deb1b45d0c7c2bac124a6540cba7db4c36345e8e092da47ce", size = 558037 },
918
+ { url = "https://files.pythonhosted.org/packages/06/0b/63b6d7a2f07a77dbc9768c6302ae2d7518bed0c6cee515669ca0d8ec743e/pyzmq-26.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:25e720dba5b3a3bb2ad0ad5d33440babd1b03438a7a5220511d0c8fa677e102e", size = 938580 },
919
+ { url = "https://files.pythonhosted.org/packages/85/38/e5e2c3ffa23ea5f95f1c904014385a55902a11a67cd43c10edf61a653467/pyzmq-26.2.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:9ec6abfb701437142ce9544bd6a236addaf803a32628d2260eb3dbd9a60e2891", size = 1339670 },
920
+ { url = "https://files.pythonhosted.org/packages/d2/87/da5519ed7f8b31e4beee8f57311ec02926822fe23a95120877354cd80144/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e1eb9d2bfdf5b4e21165b553a81b2c3bd5be06eeddcc4e08e9692156d21f1f6", size = 660983 },
921
+ { url = "https://files.pythonhosted.org/packages/f6/e8/1ca6a2d59562e04d326a026c9e3f791a6f1a276ebde29da478843a566fdb/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:90dc731d8e3e91bcd456aa7407d2eba7ac6f7860e89f3766baabb521f2c1de4a", size = 896509 },
922
+ { url = "https://files.pythonhosted.org/packages/5c/e5/0b4688f7c74bea7e4f1e920da973fcd7d20175f4f1181cb9b692429c6bb9/pyzmq-26.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6a93d684278ad865fc0b9e89fe33f6ea72d36da0e842143891278ff7fd89c3", size = 853196 },
923
+ { url = "https://files.pythonhosted.org/packages/8f/35/c17241da01195001828319e98517683dad0ac4df6fcba68763d61b630390/pyzmq-26.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c1bb37849e2294d519117dd99b613c5177934e5c04a5bb05dd573fa42026567e", size = 855133 },
924
+ { url = "https://files.pythonhosted.org/packages/d2/14/268ee49bbecc3f72e225addeac7f0e2bd5808747b78c7bf7f87ed9f9d5a8/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:632a09c6d8af17b678d84df442e9c3ad8e4949c109e48a72f805b22506c4afa7", size = 1191612 },
925
+ { url = "https://files.pythonhosted.org/packages/5e/02/6394498620b1b4349b95c534f3ebc3aef95f39afbdced5ed7ee315c49c14/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:fc409c18884eaf9ddde516d53af4f2db64a8bc7d81b1a0c274b8aa4e929958e8", size = 1500824 },
926
+ { url = "https://files.pythonhosted.org/packages/17/fc/b79f0b72891cbb9917698add0fede71dfb64e83fa3481a02ed0e78c34be7/pyzmq-26.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:17f88622b848805d3f6427ce1ad5a2aa3cf61f12a97e684dab2979802024d460", size = 1399943 },
927
+ ]
928
+
929
  [[package]]
930
  name = "referencing"
931
  version = "0.36.2"
 
1056
  { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 },
1057
  ]
1058
 
1059
+ [[package]]
1060
+ name = "stack-data"
1061
+ version = "0.6.3"
1062
+ source = { registry = "https://pypi.org/simple" }
1063
+ dependencies = [
1064
+ { name = "asttokens" },
1065
+ { name = "executing" },
1066
+ { name = "pure-eval" },
1067
+ ]
1068
+ sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 }
1069
+ wheels = [
1070
+ { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 },
1071
+ ]
1072
+
1073
  [[package]]
1074
  name = "streamlit"
1075
  version = "1.41.1"
 
1151
  { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 },
1152
  ]
1153
 
1154
+ [[package]]
1155
+ name = "traitlets"
1156
+ version = "5.14.3"
1157
+ source = { registry = "https://pypi.org/simple" }
1158
+ sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 }
1159
+ wheels = [
1160
+ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 },
1161
+ ]
1162
+
1163
  [[package]]
1164
  name = "typing-extensions"
1165
  version = "4.12.2"
 
1205
  { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 },
1206
  ]
1207
 
1208
+ [[package]]
1209
+ name = "wcwidth"
1210
+ version = "0.2.13"
1211
+ source = { registry = "https://pypi.org/simple" }
1212
+ sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
1213
+ wheels = [
1214
+ { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
1215
+ ]
1216
+
1217
  [[package]]
1218
  name = "xyzservices"
1219
  version = "2025.1.0"