From d220dfd1e71f51ece5860163dec17bf9acc62182 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 11:58:14 -0600 Subject: [PATCH 01/71] Define barrier array type --- crates/revrt/src/cost.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index d5c1cc1d..059faae1 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -11,6 +11,7 @@ use crate::error::Result; /// A multi-dimensional array representing cost data type CostArray = ndarray::Array>; +type BarrierArray = ndarray::Array>; /// Large friction value to use for invalid costs that can be routed through const HIGH_FRICTION_INVALID_COST: f32 = 1e10; From c6fb8ebd74e290de875d2983af957f6aa4bcc394 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 11:58:28 -0600 Subject: [PATCH 02/71] Allow barrier inputs in cost function --- crates/revrt/src/cost.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 059faae1..f6bd35a9 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -25,6 +25,7 @@ fn true_option() -> bool { /// /// `cost_layers`: A collection of cost layers with equal weight. /// `friction_layers`: A collection of friction layers that scale the cost layer. +/// `barrier_layers`: A collection of layers that create impassable cells. /// `ignore_invalid_costs`: If true, cells with <=0 or NaN costs are skipped completely. /// /// This was based on the original transmission router and is composed of @@ -32,6 +33,7 @@ fn true_option() -> bool { pub(crate) struct CostFunction { cost_layers: Vec, friction_layers: Option>, + barrier_layers: Option>, /// Option to completely ignore <=0 cost cells #[serde(default = "true_option")] pub(crate) ignore_invalid_costs: bool, From 593bb1fa5ab165723a80160e7c3f43b41b6223af Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 11:58:50 -0600 Subject: [PATCH 03/71] Add `BarrierOperator` enum --- crates/revrt/src/cost.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index f6bd35a9..50534557 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -39,6 +39,20 @@ pub(crate) struct CostFunction { pub(crate) ignore_invalid_costs: bool, } +#[derive(Clone, Copy, Debug, serde::Deserialize)] +pub(crate) enum BarrierOperator { + #[serde(rename = "gt")] + GreaterThan, + #[serde(rename = "ge")] + GreaterThanOrEqual, + #[serde(rename = "lt")] + LessThan, + #[serde(rename = "le")] + LessThanOrEqual, + #[serde(rename = "eq")] + Equal, +} + #[derive(Builder, Clone, Debug, serde::Deserialize)] /// A cost layer /// From 5d560287ec12bc2d3a995fffa7ff9b4e7ca76778 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 11:59:11 -0600 Subject: [PATCH 04/71] Add `BarrierLayer` struct --- crates/revrt/src/cost.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 50534557..fc54296e 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -94,6 +94,25 @@ struct FrictionLayer { multiplier_scalar: Option, } +#[derive(Clone, Debug, serde::Deserialize)] +pub(crate) struct BarrierLayer { + layer_name: String, + barrier_operator: BarrierOperator, + barrier_threshold: f32, + #[serde(rename = "barrier_importance")] + _barrier_importance: Option, +} + +impl BarrierLayer { + pub(crate) fn layer_name(&self) -> &str { + &self.layer_name + } + + pub(crate) fn importance(&self) -> Option { + self._barrier_importance + } +} + impl CostFunction { /// Create a new cost function from a JSON string (reVX format) /// From 8c6873f6dfc9322024fd2a3d9d76f4a9b5731707 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:01:16 -0600 Subject: [PATCH 05/71] Rename field --- crates/revrt/src/cost.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index fc54296e..1107194a 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -99,8 +99,7 @@ pub(crate) struct BarrierLayer { layer_name: String, barrier_operator: BarrierOperator, barrier_threshold: f32, - #[serde(rename = "barrier_importance")] - _barrier_importance: Option, + barrier_importance: Option, } impl BarrierLayer { @@ -109,7 +108,7 @@ impl BarrierLayer { } pub(crate) fn importance(&self) -> Option { - self._barrier_importance + self.barrier_importance } } From 0861c66012f3832ada9a2c94043b8fceef1cf3c8 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:01:41 -0600 Subject: [PATCH 06/71] New methods --- crates/revrt/src/cost.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 1107194a..44d3fb64 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -135,6 +135,33 @@ impl CostFunction { Ok(cost) } + pub(crate) fn without_barriers(&self) -> Self { + let mut cost_function = self.clone(); + cost_function.barrier_layers = None; + cost_function + } + + pub(crate) fn hard_barrier_layers(&self) -> Vec { + self.barrier_layers + .clone() + .unwrap_or_default() + .into_iter() + .filter(|layer| layer.importance().is_none()) + .collect() + } + + pub(crate) fn soft_barrier_groups(&self) -> Vec<(u32, Vec)> { + let mut groups = std::collections::BTreeMap::>::new(); + + for layer in self.barrier_layers.clone().unwrap_or_default() { + if let Some(importance) = layer.importance() { + groups.entry(importance).or_default().push(layer); + } + } + + groups.into_iter().collect() + } + /// Calculate the cost from a given collection of input features /// /// Applies the cost function to a collection of input features, which From a51f869f6d8ea4cae2cc54d99531dee7feebae40 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:01:51 -0600 Subject: [PATCH 07/71] Update docstring --- crates/revrt/src/cost.rs | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 44d3fb64..a8ae71b3 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -124,10 +124,23 @@ impl CostFunction { /// /// The JSON pattern used by reVX was the following: /// ```json - /// {"cost_layers": [ - /// {"layer_name": "A"}, - /// {"layer_name": "A", "multiplier_scalar": 2, "multiplier_layer": "B"} - /// ]} + /// { + /// "cost_layers": [ + /// {"layer_name": "A"}, + /// { + /// "layer_name": "A", + /// "multiplier_scalar": 2, + /// "multiplier_layer": "B" + /// } + /// ], + /// "barrier_layers": [ + /// { + /// "layer_name": "barrier_mask", + /// "barrier_operator": "eq", + /// "barrier_threshold": 1.0 + /// } + /// ] + /// } /// ``` pub(super) fn from_json(json: &str) -> Result { trace!("Parsing cost definition from json: {}", json); From 4d3dd8e97314abf4fd1a110f0c807bb23d2fe53e Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:02:57 -0600 Subject: [PATCH 08/71] Add `build_single_barrier_layer` --- crates/revrt/src/cost.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index a8ae71b3..8d99056c 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -313,6 +313,25 @@ fn build_single_friction_layer(layer: &FrictionLayer, features: &mut LazySubset< friction } +pub(crate) fn build_single_barrier_layer( + layer: &BarrierLayer, + features: &mut LazySubset, +) -> BarrierArray { + trace!("Building barrier layer: {:?}", layer); + + let barrier_values = features + .get(&layer.layer_name) + .expect("Barrier layer not found in features"); + + barrier_values.mapv(|value| match layer.barrier_operator { + BarrierOperator::GreaterThan => value > layer.barrier_threshold, + BarrierOperator::GreaterThanOrEqual => value >= layer.barrier_threshold, + BarrierOperator::LessThan => value < layer.barrier_threshold, + BarrierOperator::LessThanOrEqual => value <= layer.barrier_threshold, + BarrierOperator::Equal => value == layer.barrier_threshold, + }) +} + fn reduce_layers(data: Vec) -> CostArray { let views: Vec<_> = data.iter().map(|a| a.view()).collect(); let stack = stack(Axis(0), &views).unwrap(); From fd930604d517a58992186f08410e0583aa750db5 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:03:02 -0600 Subject: [PATCH 09/71] Docs --- crates/revrt/src/cost.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 8d99056c..38b4deb7 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -148,12 +148,17 @@ impl CostFunction { Ok(cost) } + /// Return a copy of this cost function with all barrier layers removed. pub(crate) fn without_barriers(&self) -> Self { let mut cost_function = self.clone(); cost_function.barrier_layers = None; cost_function } + /// Collect all barrier layers that act as hard barriers. + /// + /// Hard barriers are layers with no assigned importance, so they are + /// always treated as impassable. pub(crate) fn hard_barrier_layers(&self) -> Vec { self.barrier_layers .clone() @@ -163,6 +168,10 @@ impl CostFunction { .collect() } + /// Group soft barrier layers by their importance. + /// + /// Only layers with an assigned importance are included in the output, + /// and the returned groups are ordered by importance. pub(crate) fn soft_barrier_groups(&self) -> Vec<(u32, Vec)> { let mut groups = std::collections::BTreeMap::>::new(); From 3189d80e40baf0b1a3c31d0d69a30ffad7566647 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:03:32 -0600 Subject: [PATCH 10/71] Add `dropped_barrier_layers` as a field in solution --- crates/revrt/src/solution.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/crates/revrt/src/solution.rs b/crates/revrt/src/solution.rs index 2feffca4..d4b0cddf 100644 --- a/crates/revrt/src/solution.rs +++ b/crates/revrt/src/solution.rs @@ -7,12 +7,17 @@ pub struct Solution { pub(crate) route: Vec, pub(crate) total_cost: C, + pub(crate) dropped_barrier_layers: Vec, } impl Solution { - #[allow(dead_code, missing_docs)] + #[allow(missing_docs)] pub(crate) fn new(route: Vec, total_cost: C) -> Self { - Self { route, total_cost } + Self { + route, + total_cost, + dropped_barrier_layers: Vec::new(), + } } #[allow(dead_code, missing_docs)] From 441dde3872bcd497b722abac7c7adbf565142e22 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:03:43 -0600 Subject: [PATCH 11/71] Add func to record dropped barriers --- crates/revrt/src/solution.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/revrt/src/solution.rs b/crates/revrt/src/solution.rs index d4b0cddf..de86fb14 100644 --- a/crates/revrt/src/solution.rs +++ b/crates/revrt/src/solution.rs @@ -20,7 +20,14 @@ impl Solution { } } - #[allow(dead_code, missing_docs)] + #[allow(missing_docs)] + pub(crate) fn record_dropped_barriers(mut self, dropped_barrier_layers: Vec) -> Self { + self.dropped_barrier_layers = dropped_barrier_layers; + self + } + + #[cfg(any(test, feature = "test-integration"))] + #[allow(missing_docs)] pub fn route(&self) -> &Vec { &self.route } From 3480711a9a8cd759927cbbbf35a457065f391d8b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:03:52 -0600 Subject: [PATCH 12/71] Add helper methods for tests --- crates/revrt/Cargo.toml | 4 ++++ crates/revrt/src/solution.rs | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/crates/revrt/Cargo.toml b/crates/revrt/Cargo.toml index 252d60a9..f78bacea 100644 --- a/crates/revrt/Cargo.toml +++ b/crates/revrt/Cargo.toml @@ -48,6 +48,10 @@ harness = false [lints] workspace = true +[features] +test-integration = [] + [[test]] name = "revrt-integration-tests" path = "../../tests/rust/integration_tests.rs" +required-features = ["test-integration"] diff --git a/crates/revrt/src/solution.rs b/crates/revrt/src/solution.rs index de86fb14..ff0e535d 100644 --- a/crates/revrt/src/solution.rs +++ b/crates/revrt/src/solution.rs @@ -32,10 +32,17 @@ impl Solution { &self.route } - #[allow(dead_code, missing_docs)] + #[cfg(any(test, feature = "test-integration"))] + #[allow(missing_docs)] pub fn total_cost(&self) -> &C { &self.total_cost } + + #[cfg(any(test, feature = "test-integration"))] + #[allow(missing_docs)] + pub fn dropped_barrier_layers(&self) -> &Vec { + &self.dropped_barrier_layers + } } pub type RevrtRoutingSolutions = Vec>; From d926f8e16b6175778ec5f8edd69ab7dcebcd4a7d Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:05:42 -0600 Subject: [PATCH 13/71] Docs --- crates/revrt/src/solution.rs | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/crates/revrt/src/solution.rs b/crates/revrt/src/solution.rs index ff0e535d..282dde93 100644 --- a/crates/revrt/src/solution.rs +++ b/crates/revrt/src/solution.rs @@ -1,17 +1,24 @@ //! Routing solution representation -#[allow(missing_docs, dead_code)] #[derive(Debug)] -/// Solution for one single routing case +/// Routing result for a single solved case /// +/// Stores the ordered route indices, the aggregate route cost, and any +/// barrier layers that had to be dropped before a valid path could be found. +/// The generic type `I` represents the index type used for route entries, +/// while `C` represents the accumulated cost type. pub struct Solution { + /// Route indices for the solved path. pub(crate) route: Vec, + /// Aggregate cost of the solved path. pub(crate) total_cost: C, + /// Barrier layers dropped to obtain a valid route. + /// Will be empty if no barriers were dropped, or if the scenario had no barriers. pub(crate) dropped_barrier_layers: Vec, } impl Solution { - #[allow(missing_docs)] + /// Create a solution from a route and its total cost. pub(crate) fn new(route: Vec, total_cost: C) -> Self { Self { route, @@ -20,29 +27,30 @@ impl Solution { } } - #[allow(missing_docs)] + /// Record the barrier layers that were dropped for this solution. pub(crate) fn record_dropped_barriers(mut self, dropped_barrier_layers: Vec) -> Self { self.dropped_barrier_layers = dropped_barrier_layers; self } #[cfg(any(test, feature = "test-integration"))] - #[allow(missing_docs)] + /// Borrow the route indices for this solution. pub fn route(&self) -> &Vec { &self.route } #[cfg(any(test, feature = "test-integration"))] - #[allow(missing_docs)] + /// Borrow the total cost for this solution. pub fn total_cost(&self) -> &C { &self.total_cost } #[cfg(any(test, feature = "test-integration"))] - #[allow(missing_docs)] + /// Borrow the names of dropped barrier layers for this solution. pub fn dropped_barrier_layers(&self) -> &Vec { &self.dropped_barrier_layers } } +/// Collection of routing solutions returned by reVRt. pub type RevrtRoutingSolutions = Vec>; From e22b68dcad5f0861f313bc7e9a0a3e490f2ba53a Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:06:21 -0600 Subject: [PATCH 14/71] Add test --- crates/revrt/src/lib.rs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/crates/revrt/src/lib.rs b/crates/revrt/src/lib.rs index e03e31eb..12da491b 100644 --- a/crates/revrt/src/lib.rs +++ b/crates/revrt/src/lib.rs @@ -225,6 +225,43 @@ mod tests { assert_eq!((ei, ej), expected_endpoint); } + #[test] + fn explicit_barrier_layers_block_routing() { + let store = dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(dataset::samples::LayerConfig::new( + "barrier", + dataset::samples::FillStrategy::Values(vec![ + 1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0, + ]), + )) + .build() + .unwrap(); + let store_path = store.path(); + + let cost_function = CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [{ + "layer_name": "barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let mut simulation = Routing::new(store_path, cost_function, 1_000, "dijkstra").unwrap(); + let start = vec![ArrayIndex { i: 1, j: 1 }]; + let end = vec![ArrayIndex { i: 0, j: 0 }]; + + let solutions = simulation.compute(&start, end).collect::>(); + + assert!(solutions.is_empty()); + } + #[test_case((1, 1), vec![(1, 3), (3, 1)], 1., "astar"; "horizontal and vertical astar")] #[test_case((3, 3), vec![(3, 5), (1, 1), (3, 1)], 1., "astar"; "horizontal astar")] #[test_case((3, 3), vec![(5, 3), (5, 5), (1, 3)], 1., "astar"; "vertical astar")] From 4d4454169bc45aedc063ab66e5204a813d7b7cdc Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:19:03 -0600 Subject: [PATCH 15/71] Update initializer --- crates/revrt/src/dataset/mod.rs | 61 +++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 43e3cc8e..4eeccda3 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -34,6 +34,13 @@ use crate::cost::CostFunction; use crate::error::{Error, Result}; pub(crate) use lazy_subset::LazySubset; +#[derive(Debug, Clone, Copy)] +struct CacheBudgets { + per_cost_cache: u64, + hard_barrier_cache: u64, + per_soft_barrier_cache: u64, +} + /// Manages the features datasets and calculated total cost pub(super) struct Dataset { /// A Zarr storages with the features @@ -52,12 +59,20 @@ pub(super) struct Dataset { swap: ReadableWritableListableStorage, /// Index of cost chunks already calculated cost_chunk_idx: RwLock>, + /// Explicit barriers that are always active for this dataset + hard_barrier_layers: Vec, + /// Soft barriers grouped by importance and ordered for retry states + soft_barrier_groups: Vec<(u32, Vec)>, /// Custom cost function definition cost_function: CostFunction, /// Cache for decoded cost chunks shared across calls cost_cache: ChunkCacheDecodedLruSizeLimit, /// Cache for decoded invariant cost chunks shared across calls cost_invariant_cache: ChunkCacheDecodedLruSizeLimit, + /// Cache for decoded hard barrier chunks shared across calls + hard_barrier_cache: ChunkCacheDecodedLruSizeLimit, + /// Caches for decoded cumulative soft barrier chunks per retry state + cumulative_soft_barrier_caches: Vec, /// Number of rows in the routing grid grid_nrows: u64, /// Number of columns in the routing grid @@ -95,6 +110,9 @@ impl Dataset { swap_fp: PathBuf, ) -> Result { debug!("Opening dataset: {:?}", path.as_ref()); + let hard_barrier_layers = cost_function.hard_barrier_layers(); + let soft_barrier_groups = cost_function.soft_barrier_groups(); + let cost_function = cost_function.without_barriers(); let filesystem = zarrs::filesystem::FilesystemStore::new(path).expect("could not open filesystem store"); let source = std::sync::Arc::new(filesystem); @@ -159,6 +177,14 @@ impl Dataset { add_layer_to_data("cost_invariant", chunk_grid, &swap)?; add_layer_to_data("cost", chunk_grid, &swap)?; + add_bool_layer_to_data("hard_barrier_mask", chunk_grid, &swap)?; + for retry_state in 0..=soft_barrier_groups.len() { + add_bool_layer_to_data( + &cumulative_soft_barrier_mask_name(retry_state), + chunk_grid, + &swap, + )?; + } let cost_chunk_idx = ndarray::Array2::from_elem( ( @@ -172,19 +198,44 @@ impl Dataset { if cache_size < 1_000_000 { warn!("Cache size smaller than 1MB"); } - debug!("Creating cache with size {}MB", cache_size / 1_000_000); + debug!( + "Creating caches with total size {}MB", + cache_size / 1_000_000 + ); // TODO: tune cache_size against typical chunk sizes // (e.g. chunk_bytes * hot_chunks * safety_factor) let cost_array_readable = Arc::new(zarrs::array::Array::open(swap.clone(), "/cost")?.readable()); let cost_invariant_array_readable = Arc::new(zarrs::array::Array::open(swap.clone(), "/cost_invariant")?.readable()); + let hard_barrier_array_readable = + Arc::new(zarrs::array::Array::open(swap.clone(), "/hard_barrier_mask")?.readable()); + let cumulative_soft_barrier_arrays = (0..=soft_barrier_groups.len()) + .map(|retry_state| { + let path = format!("/{}", cumulative_soft_barrier_mask_name(retry_state)); + zarrs::array::Array::open(swap.clone(), &path) + .map_err(|err| Error::IO(std::io::Error::other(err.to_string()))) + .map(|array| Arc::new(array.readable())) + }) + .collect::>>()?; + + let budgets = distribute_cache_budgets(cache_size, cumulative_soft_barrier_arrays.len()); + debug!("Cache budgets: {:?}", budgets); + let cost_cache = - ChunkCacheDecodedLruSizeLimit::new(cost_array_readable.clone(), cache_size / 2); + ChunkCacheDecodedLruSizeLimit::new(cost_array_readable.clone(), budgets.per_cost_cache); let cost_invariant_cache = ChunkCacheDecodedLruSizeLimit::new( cost_invariant_array_readable.clone(), - cache_size / 2, + budgets.per_cost_cache, + ); + let hard_barrier_cache = ChunkCacheDecodedLruSizeLimit::new( + hard_barrier_array_readable.clone(), + budgets.hard_barrier_cache, ); + let cumulative_soft_barrier_caches = cumulative_soft_barrier_arrays + .into_iter() + .map(|array| ChunkCacheDecodedLruSizeLimit::new(array, budgets.per_soft_barrier_cache)) + .collect(); trace!("Dataset opened successfully"); Ok(Self { @@ -192,9 +243,13 @@ impl Dataset { cost_path: None, swap, cost_chunk_idx, + hard_barrier_layers, + soft_barrier_groups, cost_function, cost_cache, cost_invariant_cache, + hard_barrier_cache, + cumulative_soft_barrier_caches, grid_nrows, grid_ncols, }) From 4c9ade5179af605f20181c26a10ba9ea4f404bd4 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:19:18 -0600 Subject: [PATCH 16/71] Add funcs to compute barrier layers from cost function --- crates/revrt/src/dataset/mod.rs | 89 +++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 4eeccda3..4477d611 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -302,6 +302,95 @@ impl Dataset { cost.store_chunks_ndarray(chunk_subset, output).unwrap(); } + fn calculate_chunk_hard_barrier_mask(&self, ci: u64, cj: u64) { + trace!("Calculating hard barrier mask for chunk ({}, {})", ci, cj); + + let variable = zarrs::array::Array::open(self.swap.clone(), "/hard_barrier_mask").unwrap(); + let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); + let chunk_subset = + &zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); + + let output = if self.hard_barrier_layers.is_empty() { + ndarray::ArrayD::::from_elem( + ndarray::IxDyn( + &subset + .shape() + .iter() + .map(|&dim| { + usize::try_from(dim).expect("subset dimension exceeds usize range") + }) + .collect::>(), + ), + false, + ) + } else { + let mut data = LazySubset::::new(self.source.clone(), subset); + let barrier_masks = self + .hard_barrier_layers + .iter() + .map(|layer| crate::cost::build_single_barrier_layer(layer, &mut data)) + .collect::>(); + + let mut output = + ndarray::ArrayD::::from_elem(ndarray::IxDyn(barrier_masks[0].shape()), false); + for mask in barrier_masks { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + output + }; + + variable.store_metadata().unwrap(); + variable.store_chunks_ndarray(chunk_subset, output).unwrap(); + } + + fn calculate_chunk_cumulative_soft_barrier_masks(&self, ci: u64, cj: u64) { + trace!( + "Calculating cumulative soft barrier masks for chunk ({}, {})", + ci, cj + ); + + let variable = zarrs::array::Array::open( + self.swap.clone(), + &format!("/{}", cumulative_soft_barrier_mask_name(0)), + ) + .unwrap(); + let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); + + let mut features = LazySubset::::new(self.source.clone(), subset.clone()); + let empty_mask = empty_bool_mask(&subset); + let group_masks = self + .soft_barrier_groups + .iter() + .map(|(_, layers)| { + combine_barrier_layers_for_subset(layers, &mut features, &subset) + .unwrap_or_else(|| empty_mask.clone()) + }) + .collect::>(); + + for retry_state in 0..=self.soft_barrier_groups.len() { + let layer_name = cumulative_soft_barrier_mask_name(retry_state); + let target = + zarrs::array::Array::open(self.swap.clone(), &format!("/{layer_name}")).unwrap(); + let chunk_subset = &zarrs::array_subset::ArraySubset::new_with_ranges(&[ + 0..1, + ci..(ci + 1), + cj..(cj + 1), + ]); + + let mut output = empty_mask.clone(); + for mask in group_masks.iter().skip(retry_state) { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + + target.store_metadata().unwrap(); + target.store_chunks_ndarray(chunk_subset, output).unwrap(); + } + } + pub(super) fn get_3x3(&self, index: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { let &ArrayIndex { i, j } = index; From 5cc03058714e3ff861e368082bcaf7c8fc5843e4 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:21:19 -0600 Subject: [PATCH 17/71] Add `add_bool_layer_to_data` func --- crates/revrt/src/dataset/mod.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 4477d611..98bf70e4 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -614,6 +614,36 @@ fn add_layer_to_data( Ok(()) } +fn add_bool_layer_to_data( + layer_name: &str, + chunk_shape: &ChunkGrid, + swap: &ReadableWritableListableStorage, +) -> Result<()> { + trace!("Creating an empty {} array", layer_name); + let dataset_path = format!("/{layer_name}"); + let mut builder = zarrs::array::ArrayBuilder::new_with_chunk_grid( + chunk_shape.clone(), + zarrs::array::DataType::Bool, + zarrs::array::FillValue::from(false), + ); + + let built = builder + .dimension_names(["band", "y", "x"].into()) + .build(swap.clone(), &dataset_path)?; + built.store_metadata()?; + + let array = zarrs::array::Array::open(swap.clone(), &dataset_path)?; + trace!("'{}' shape: {:?}", layer_name, array.shape().to_vec()); + trace!("'{}' chunk shape: {:?}", layer_name, array.chunk_grid()); + + trace!( + "Dataset contents after '{}' creation: {:?}", + layer_name, + swap.list()? + ); + Ok(()) +} + #[cfg(test)] /// Make a LazySubset from a source and array subset to be used in tests /// From 8f211162e140e0f08a4eec1322d4ce7241e4df59 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:22:07 -0600 Subject: [PATCH 18/71] Add tests --- crates/revrt/src/dataset/mod.rs | 234 ++++++++++++++++++++++++++++++++ 1 file changed, 234 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 98bf70e4..d0f2e63c 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -1164,4 +1164,238 @@ mod tests { ); } } + + #[test] + fn test_get_3x3_keeps_explicit_barriers_out_of_cached_costs() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + } + ] + } + "#; + + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::sequential("A", 1)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), + )) + .build() + .expect("Error creating test zarr"); + let cost_function = CostFunction::from_json(json).unwrap(); + let dataset = + Dataset::open(tmp.path(), cost_function, 1_000).expect("Error opening dataset"); + + let results = dataset.get_3x3(&ArrayIndex { i: 1, j: 1 }); + let (i_range, j_range, subset) = dataset.neighborhood_subset(&ArrayIndex { i: 1, j: 1 }); + let raw_costs = dataset.get_neighbor_costs(i_range, j_range, &subset, false); + assert_eq!(raw_costs.len(), 9); + assert_eq!( + results, + vec![ + (ArrayIndex { i: 0, j: 0 }, 3.0 * std::f32::consts::SQRT_2), + (ArrayIndex { i: 0, j: 2 }, 4.0 * std::f32::consts::SQRT_2), + (ArrayIndex { i: 2, j: 0 }, 6.0 * std::f32::consts::SQRT_2), + (ArrayIndex { i: 2, j: 2 }, 7.0 * std::f32::consts::SQRT_2), + ] + ); + } + + #[test] + fn test_explicit_barriers_do_not_modify_cached_costs_when_invalid_costs_are_soft() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + } + ], + "ignore_invalid_costs": false + } + "#; + + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::constant("A", 1.0)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![1.0, 1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0]), + )) + .build() + .expect("Error creating test zarr"); + let cost_function = CostFunction::from_json(json).unwrap(); + let dataset = + Dataset::open(tmp.path(), cost_function, 1_000).expect("Error opening dataset"); + + let results = dataset.get_3x3(&ArrayIndex { i: 1, j: 1 }); + assert_eq!(results.len(), 8); + } + + #[test] + fn test_cumulative_soft_barrier_masks_follow_retry_state() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "C", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2 + } + ] + } + "#; + + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::constant("A", 1.0)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + )) + .layer(samples::LayerConfig::new( + "C", + samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + )) + .build() + .expect("Error creating test zarr"); + let dataset = Dataset::open(tmp.path(), CostFunction::from_json(json).unwrap(), 1_000) + .expect("Error opening dataset"); + + assert_eq!(dataset.soft_barrier_group_count(), 2); + let center = ArrayIndex { i: 1, j: 1 }; + dataset.get_3x3(¢er); + + assert_eq!( + dataset.get_3x3_soft_barrier_cells(¢er, 0), + vec![ArrayIndex { i: 0, j: 1 }, ArrayIndex { i: 1, j: 0 }] + ); + assert_eq!( + dataset.get_3x3_soft_barrier_cells(¢er, 1), + vec![ArrayIndex { i: 0, j: 1 }] + ); + assert!(dataset.get_3x3_soft_barrier_cells(¢er, 2).is_empty()); + assert!(dataset.get_3x3_soft_barrier_cells(¢er, 99).is_empty()); + } + + #[test] + fn test_cumulative_soft_barrier_masks_or_tied_importance_groups() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "C", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + } + ] + } + "#; + + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::constant("A", 1.0)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + )) + .layer(samples::LayerConfig::new( + "C", + samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]), + )) + .build() + .expect("Error creating test zarr"); + let dataset = Dataset::open(tmp.path(), CostFunction::from_json(json).unwrap(), 1_000) + .expect("Error opening dataset"); + + let center = ArrayIndex { i: 1, j: 1 }; + dataset.get_3x3(¢er); + + assert_eq!(dataset.soft_barrier_group_count(), 1); + assert_eq!( + dataset.get_3x3_soft_barrier_cells(¢er, 0), + vec![ArrayIndex { i: 0, j: 1 }, ArrayIndex { i: 1, j: 0 }] + ); + assert!(dataset.get_3x3_soft_barrier_cells(¢er, 1).is_empty()); + } + + #[test] + fn test_open_extracts_hard_barriers_while_preserving_barrier_free_costs() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + } + ] + } + "#; + + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::sequential("A", 1)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), + )) + .build() + .expect("Error creating test zarr"); + let cost_function = CostFunction::from_json(json).unwrap(); + let dataset = + Dataset::open(tmp.path(), cost_function, 1_000).expect("Error opening dataset"); + + assert_eq!(dataset.hard_barrier_layers().len(), 1); + + let results = dataset.get_3x3(&ArrayIndex { i: 1, j: 1 }); + let (i_range, j_range, subset) = dataset.neighborhood_subset(&ArrayIndex { i: 1, j: 1 }); + let raw_costs = dataset.get_neighbor_costs(i_range, j_range, &subset, false); + let barrier_cells = dataset + .get_3x3_barrier_cells(&ArrayIndex { i: 1, j: 1 }, dataset.hard_barrier_layers()); + + assert_eq!(raw_costs.len(), 9); + assert_eq!(results.len(), 4); + assert_eq!( + barrier_cells, + vec![ + ArrayIndex { i: 0, j: 1 }, + ArrayIndex { i: 1, j: 0 }, + ArrayIndex { i: 1, j: 2 }, + ArrayIndex { i: 2, j: 1 }, + ] + ); + } } From 7a997b39ce8d4c9a42d71be5039a510ff6b65cc3 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:23:19 -0600 Subject: [PATCH 19/71] Add `neighborhood_subset` function --- crates/revrt/src/dataset/mod.rs | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index d0f2e63c..691323d6 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -541,6 +541,43 @@ impl Dataset { */ } + fn neighborhood_subset( + &self, + index: &ArrayIndex, + ) -> ( + std::ops::Range, + std::ops::Range, + zarrs::array_subset::ArraySubset, + ) { + let &ArrayIndex { i, j } = index; + debug_assert!(self.grid_nrows > 0); + debug_assert!(self.grid_ncols > 0); + + let max_i = self.grid_nrows - 1; + let max_j = self.grid_ncols - 1; + + let i_range = match i { + 0 if max_i == 0 => 0..1, + 0 => 0..2, + _ if i == max_i => i - 1..i + 1, + _ => i - 1..i + 2, + }; + let j_range = match j { + 0 if max_j == 0 => 0..1, + 0 => 0..2, + _ if j == max_j => j - 1..j + 1, + _ => j - 1..j + 2, + }; + + let subset = zarrs::array_subset::ArraySubset::new_with_ranges(&[ + 0..1, + i_range.clone(), + j_range.clone(), + ]); + + (i_range, j_range, subset) + } + fn get_neighbor_costs( &self, i_range: std::ops::Range, From e0cc2ac2eb9e2fd30589d61a9ab4534061e95490 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:23:29 -0600 Subject: [PATCH 20/71] Add functions to get barrier subset --- crates/revrt/src/dataset/mod.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 691323d6..74a4b0e4 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -616,6 +616,39 @@ impl Dataset { neighbor_costs } + fn get_3x3_cached_barrier_cells( + &self, + index: &ArrayIndex, + cache: &ChunkCacheDecodedLruSizeLimit, + ) -> Vec { + let (i_range, j_range, subset) = self.neighborhood_subset(index); + self.ensure_derived_data_for_subset(&cache.array(), &subset); + let barrier_values = cache + .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) + .unwrap(); + let mut barrier_cells = Vec::new(); + + for ((ir, jr), is_barrier) in i_range + .flat_map(|row| iter::repeat(row).zip(j_range.clone())) + .zip(barrier_values) + { + if is_barrier { + barrier_cells.push(ArrayIndex { i: ir, j: jr }); + } + } + + barrier_cells + } + + pub(super) fn get_3x3_soft_barrier_cells( + &self, + index: &ArrayIndex, + dropped_soft_groups: usize, + ) -> Vec { + let retry_state = dropped_soft_groups.min(self.soft_barrier_groups.len()); + self.get_3x3_cached_barrier_cells(index, &self.cumulative_soft_barrier_caches[retry_state]) + } + pub(super) fn grid_shape(&self) -> (u64, u64) { (self.grid_nrows, self.grid_ncols) } From e33f84e9d32a15ba8aab9391f6116a206ca75844 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:23:41 -0600 Subject: [PATCH 21/71] Add more helper methods --- crates/revrt/src/dataset/mod.rs | 162 ++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 74a4b0e4..1470ec76 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -652,6 +652,168 @@ impl Dataset { pub(super) fn grid_shape(&self) -> (u64, u64) { (self.grid_nrows, self.grid_ncols) } + + fn ensure_derived_data_for_subset( + &self, + array: &zarrs::array::Array, + subset: &zarrs::array_subset::ArraySubset, + ) { + let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); + trace!("Derived-data chunks: {:?}", chunks); + trace!( + "Derived-data subset extends to {:?} chunks", + chunks.num_elements_usize() + ); + + for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { + for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { + trace!( + "Checking if derived data for chunk ({}, {}) has been calculated", + ci, cj + ); + if self.cost_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { + trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); + continue; + } + + debug!("Requesting write lock for cost_chunk_idx ({}, {})", ci, cj); + let mut chunk_idx = self + .cost_chunk_idx + .write() + .expect("Failed to acquire write lock"); + debug!("Acquired write lock for cost_chunk_idx ({}, {})", ci, cj); + if chunk_idx[[ci as usize, cj as usize]] { + trace!( + "Derived data for chunk ({}, {}) already calculated while waiting for the lock", + ci, cj + ); + } else { + self.calculate_chunk_cost(ci, cj); + self.calculate_chunk_hard_barrier_mask(ci, cj); + self.calculate_chunk_cumulative_soft_barrier_masks(ci, cj); + chunk_idx[[ci as usize, cj as usize]] = true; + debug!( + "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", + ci, + cj, + chunk_idx.iter().filter(|&&value| value).count() + ); + } + debug!("Released write lock for cost_chunk_idx ({}, {})", ci, cj); + } + } + } + + #[cfg(test)] + pub(super) fn hard_barrier_layers(&self) -> &[crate::cost::BarrierLayer] { + &self.hard_barrier_layers + } + + #[cfg(test)] + pub(super) fn soft_barrier_group_count(&self) -> usize { + self.soft_barrier_groups.len() + } + + #[cfg(test)] + pub(super) fn get_3x3_barrier_cells( + &self, + index: &ArrayIndex, + barrier_layers: &[crate::cost::BarrierLayer], + ) -> Vec { + if barrier_layers.is_empty() { + return Vec::new(); + } + + let (i_range, j_range, subset) = self.neighborhood_subset(index); + let mut features = LazySubset::::new(self.source.clone(), subset); + let barrier_masks = barrier_layers + .iter() + .map(|layer| crate::cost::build_single_barrier_layer(layer, &mut features)) + .collect::>(); + let mut barrier_cells = Vec::new(); + + for (row_offset, ir) in i_range.enumerate() { + for (col_offset, jr) in j_range.clone().enumerate() { + let is_barrier = barrier_masks + .iter() + .any(|mask| mask[[0, row_offset, col_offset]]); + if is_barrier { + barrier_cells.push(ArrayIndex { i: ir, j: jr }); + } + } + } + + barrier_cells + } +} + +/// Split the decoded chunk cache budget across derived dataset layers. +/// +/// One third of the total budget is assigned to the dynamic cost cache and +/// one third to the invariant cost cache. The remaining budget is then split +/// between the hard-barrier cache and the cumulative soft-barrier caches: +/// half goes to the hard-barrier cache and the rest is divided evenly across +/// each soft-barrier retry-state cache. +/// +/// Every allocation is clamped to at least 1 so the cache setup remains +/// valid even when the total cache budget is very small. +fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> CacheBudgets { + let per_cost_cache = (cache_size / 3).max(1); + let remaining_cache = cache_size.saturating_sub(2 * per_cost_cache).max(1); + let hard_barrier_cache = (remaining_cache / 2).max(1); + let soft_cache_budget = remaining_cache.saturating_sub(hard_barrier_cache).max(1); + + let per_soft_barrier_cache = if soft_barrier_cache_count == 0 { + 1 + } else { + (soft_cache_budget / soft_barrier_cache_count as u64).max(1) + }; + + CacheBudgets { + per_cost_cache, + hard_barrier_cache, + per_soft_barrier_cache, + } +} + +fn cumulative_soft_barrier_mask_name(retry_state: usize) -> String { + format!("soft_barrier_mask_retry_{retry_state}") +} + +fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD { + ndarray::ArrayD::::from_elem( + ndarray::IxDyn( + &subset + .shape() + .iter() + .map(|&dim| usize::try_from(dim).expect("subset dimension exceeds usize range")) + .collect::>(), + ), + false, + ) +} + +fn combine_barrier_layers_for_subset( + barrier_layers: &[crate::cost::BarrierLayer], + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, +) -> Option> { + if barrier_layers.is_empty() { + return None; + } + + let barrier_masks = barrier_layers + .iter() + .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) + .collect::>(); + let mut output = empty_bool_mask(subset); + for mask in barrier_masks { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + + Some(output) } fn add_layer_to_data( From 816118a7b9cbe2743894a618b5afe147d7bc6267 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:23:58 -0600 Subject: [PATCH 22/71] Add hard barrier avoidance logic in get 3x3 --- crates/revrt/src/dataset/mod.rs | 117 +++++++++----------------------- 1 file changed, 33 insertions(+), 84 deletions(-) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 1470ec76..ea825de3 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -403,79 +403,40 @@ impl Dataset { let cost_array = self.cost_cache.array(); trace!("Cost dataset with shape: {:?}", cost_array.shape()); - // Cutting off the edges for now. - let shape = cost_array.shape(); - debug_assert!(!shape.contains(&0)); - - let max_i = shape[1] - 1; - let max_j = shape[2] - 1; - - let i_range = match i { - 0 if max_i == 0 => 0..1, - 0 => 0..2, - _ if i == max_i => i - 1..i + 1, - _ => i - 1..i + 2, - }; - let j_range = match j { - 0 if max_j == 0 => 0..1, - 0 => 0..2, - _ if j == max_j => j - 1..j + 1, - _ => j - 1..j + 2, - }; - - // Capture the 3x3 neighborhood - let subset = zarrs::array_subset::ArraySubset::new_with_ranges(&[ - 0..1, - i_range.clone(), - j_range.clone(), - ]); + let (i_range, j_range, subset) = self.neighborhood_subset(index); trace!("Cost subset: {:?}", subset); + self.ensure_derived_data_for_subset(&cost_array, &subset); - // Find the chunks that intersect the subset - let chunks = &cost_array.chunks_in_array_subset(&subset).unwrap().unwrap(); - trace!("Cost chunks: {:?}", chunks); - trace!( - "Cost subset extends to {:?} chunks", - chunks.num_elements_usize() - ); + let neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, false); + let invariant_neighbors = + self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, true); + let hard_barrier_values: Vec = if self.hard_barrier_layers.is_empty() { + std::iter::repeat_n(false, neighbors.len()).collect() + } else { + self.hard_barrier_cache + .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) + .unwrap() + }; - for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { - for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { - trace!( - "Checking if cost for chunk ({}, {}) has been calculated", - ci, cj - ); - if self.cost_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { - trace!("Cost for chunk ({}, {}) already calculated", ci, cj); + // Extract the origin point. + let center = neighbors + .iter() + .zip(hard_barrier_values.iter()) + .find(|(((ir, jr), _), _)| *ir == i && *jr == j) + .map(|(((ir, jr), v), is_barrier)| { + if *is_barrier { + ((ir, jr), &0_f32, true) + } else if v.is_nan() { + ((ir, jr), &0_f32, false) // NaN's don't contribute to cost } else { - debug!("Requesting write lock for cost_chunk_idx ({}, {})", ci, cj); - let mut chunk_idx = self - .cost_chunk_idx - .write() - .expect("Failed to acquire write lock"); - debug!("Acquired write lock for cost_chunk_idx ({}, {})", ci, cj); - if chunk_idx[[ci as usize, cj as usize]] { - trace!( - "Cost for chunk ({}, {}) already calculated while waiting for the lock", - ci, cj - ); - } else { - self.calculate_chunk_cost(ci, cj); - chunk_idx[[ci as usize, cj as usize]] = true; - debug!( - "Recorded chunk ({}, {}) as calculated. Total number of computed chunks: {}", - ci, - cj, - chunk_idx.iter().filter(|&&value| value).count() - ); - } - debug!("Released write lock for cost_chunk_idx ({}, {})", ci, cj); + ((ir, jr), v, false) } - } + }) + .unwrap(); + if center.2 { + return Vec::new(); } - - let neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, false); - let invariant_neighbors = self.get_neighbor_costs(i_range, j_range, &subset, true); + trace!("Center point: {:?}", center); /* * The transition between two gridpoint centers is along half the distance @@ -486,29 +447,17 @@ impl Dataset { * of both values, but we have to scale for the longer distance along the * diagonal, thus a sqrt(2) factor along the diagonals. */ - - // Extract the origin point. - let center = neighbors - .iter() - .find(|((ir, jr), _)| *ir == i && *jr == j) - .map(|((ir, jr), v)| { - if v.is_nan() { - ((ir, jr), &0_f32) // NaN's don't contribute to cost - } else { - ((ir, jr), v) - } - }) - .unwrap(); - trace!("Center point: {:?}", center); - // Calculate the average with center point (half grid + other half grid). // Also, apply the diagonal factor for the extra distance. // Finally, add any invariant costs. let cost_to_neighbors = neighbors .iter() .zip(invariant_neighbors.iter()) - .filter(|(((ir, jr), v), _)| !(v.is_nan() || *ir == i && *jr == j)) // no center point and only valid costs - .map(|(((ir, jr), v), ((inv_ir, inv_jr), inv_cost))| { + .zip(hard_barrier_values.iter()) + .filter(|((((ir, jr), v), _), is_barrier)| { + !(**is_barrier || v.is_nan() || (*ir == i && *jr == j)) + }) + .map(|((((ir, jr), v), ((inv_ir, inv_jr), inv_cost)), _)| { debug_assert_eq!((ir, jr), (inv_ir, inv_jr)); ((ir, jr), 0.5 * (v + center.1), inv_cost) }) From 2ffa9a760edd95c52fbf197cbfa17dc73ffc88cc Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:33:08 -0600 Subject: [PATCH 23/71] Move swap initialization to separate module --- crates/revrt/src/dataset/mod.rs | 154 +--------------- crates/revrt/src/dataset/swap.rs | 303 +++++++++++++++++++++++++++++++ 2 files changed, 313 insertions(+), 144 deletions(-) create mode 100644 crates/revrt/src/dataset/swap.rs diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index ea825de3..281b00e5 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -17,6 +17,7 @@ mod lazy_subset; #[cfg(test)] pub(crate) mod samples; +mod swap; use std::iter; use std::path::PathBuf; @@ -24,7 +25,7 @@ use std::sync::{Arc, RwLock}; use tracing::{debug, info, trace, warn}; use zarrs::array::codec::CodecOptions; -use zarrs::array::{ChunkCache, ChunkCacheDecodedLruSizeLimit, ChunkGrid}; +use zarrs::array::{ChunkCache, ChunkCacheDecodedLruSizeLimit}; use zarrs::storage::{ ListableStorageTraits, ReadableListableStorage, ReadableWritableListableStorage, }; @@ -33,6 +34,7 @@ use crate::ArrayIndex; use crate::cost::CostFunction; use crate::error::{Error, Result}; pub(crate) use lazy_subset::LazySubset; +use swap::{cumulative_soft_barrier_mask_name, initialize_swap, inspect_source_layout}; #[derive(Debug, Clone, Copy)] struct CacheBudgets { @@ -115,85 +117,13 @@ impl Dataset { let cost_function = cost_function.without_barriers(); let filesystem = zarrs::filesystem::FilesystemStore::new(path).expect("could not open filesystem store"); - let source = std::sync::Arc::new(filesystem); - - // ==== Create the swap dataset ==== - let swap: ReadableWritableListableStorage = std::sync::Arc::new( - zarrs::filesystem::FilesystemStore::new(swap_fp) - .expect("could not open filesystem store"), - ); - - trace!("Creating a new group for the cost dataset"); - zarrs::group::GroupBuilder::new() - .build(swap.clone(), "/")? - .store_metadata()?; - - let entries = source - .list() - .expect("failed to list variables in source dataset"); - let first_entry_opt = entries - .into_iter() - .map(|entry| entry.to_string()) - .find(|entry| { - let name = entry.split('/').next().unwrap_or("").to_ascii_lowercase(); - // Skip coordinate axes when selecting a representative variable for cost storage. - const EXCLUDES: [&str; 6] = - ["latitude", "longitude", "band", "x", "y", "spatial_ref"]; - !name.ends_with(".json") && !EXCLUDES.iter().any(|needle| name == *needle) - }); - let first_entry = match first_entry_opt { - Some(e) => e, - None => { - return Err(Error::IO(std::io::Error::other(format!( - "no non-coordinate variables found in source dataset: {:?}", - source.list().ok() - )))); - } - }; - - // Skip coordinate axes when selecting a representative variable for cost storage. - let varname = match first_entry.split('/').next() { - Some(name) => name, - None => { - return Err(Error::IO(std::io::Error::other( - "Could not determine any variable names from source dataset", - ))); - } - }; - debug!("Using '{}' to determine shape of cost data", varname); - let tmp = zarrs::array::Array::open(source.clone(), &format!("/{varname}"))?; - let shape = tmp.shape(); - if shape.len() < 3 { - return Err(Error::InvalidDatasetShape { - variable: varname.to_string(), - min_rank: 3, - shape: shape.to_vec(), - }); - } - let grid_nrows = shape[1]; - let grid_ncols = shape[2]; - let chunk_grid = tmp.chunk_grid(); - debug!("Chunk grid info: {:?}", &chunk_grid); - - add_layer_to_data("cost_invariant", chunk_grid, &swap)?; - add_layer_to_data("cost", chunk_grid, &swap)?; - add_bool_layer_to_data("hard_barrier_mask", chunk_grid, &swap)?; - for retry_state in 0..=soft_barrier_groups.len() { - add_bool_layer_to_data( - &cumulative_soft_barrier_mask_name(retry_state), - chunk_grid, - &swap, - )?; - } - - let cost_chunk_idx = ndarray::Array2::from_elem( - ( - tmp.chunk_grid_shape()[1] as usize, - tmp.chunk_grid_shape()[2] as usize, - ), - false, - ) - .into(); + let source: ReadableListableStorage = std::sync::Arc::new(filesystem); + let source_layout = inspect_source_layout(&source)?; + let initialized_swap = initialize_swap(swap_fp, &source_layout, soft_barrier_groups.len())?; + let swap = initialized_swap.storage; + let cost_chunk_idx = initialized_swap.cost_chunk_idx.into(); + let grid_nrows = source_layout.grid_nrows; + let grid_ncols = source_layout.grid_ncols; if cache_size < 1_000_000 { warn!("Cache size smaller than 1MB"); @@ -725,10 +655,6 @@ fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> } } -fn cumulative_soft_barrier_mask_name(retry_state: usize) -> String { - format!("soft_barrier_mask_retry_{retry_state}") -} - fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD { ndarray::ArrayD::::from_elem( ndarray::IxDyn( @@ -765,66 +691,6 @@ fn combine_barrier_layers_for_subset( Some(output) } -fn add_layer_to_data( - layer_name: &str, - chunk_shape: &ChunkGrid, - swap: &ReadableWritableListableStorage, -) -> Result<()> { - trace!("Creating an empty {} array", layer_name); - let dataset_path = format!("/{layer_name}"); - let mut builder = zarrs::array::ArrayBuilder::new_with_chunk_grid( - chunk_shape.clone(), - zarrs::array::DataType::Float32, - zarrs::array::FillValue::from(zarrs::array::ZARR_NAN_F32), - ); - - let built = builder - .dimension_names(["band", "y", "x"].into()) - .build(swap.clone(), &dataset_path)?; - built.store_metadata()?; - - let array = zarrs::array::Array::open(swap.clone(), &dataset_path)?; - trace!("'{}' shape: {:?}", layer_name, array.shape().to_vec()); - trace!("'{}' chunk shape: {:?}", layer_name, array.chunk_grid()); - - trace!( - "Dataset contents after '{}' creation: {:?}", - layer_name, - swap.list()? - ); - Ok(()) -} - -fn add_bool_layer_to_data( - layer_name: &str, - chunk_shape: &ChunkGrid, - swap: &ReadableWritableListableStorage, -) -> Result<()> { - trace!("Creating an empty {} array", layer_name); - let dataset_path = format!("/{layer_name}"); - let mut builder = zarrs::array::ArrayBuilder::new_with_chunk_grid( - chunk_shape.clone(), - zarrs::array::DataType::Bool, - zarrs::array::FillValue::from(false), - ); - - let built = builder - .dimension_names(["band", "y", "x"].into()) - .build(swap.clone(), &dataset_path)?; - built.store_metadata()?; - - let array = zarrs::array::Array::open(swap.clone(), &dataset_path)?; - trace!("'{}' shape: {:?}", layer_name, array.shape().to_vec()); - trace!("'{}' chunk shape: {:?}", layer_name, array.chunk_grid()); - - trace!( - "Dataset contents after '{}' creation: {:?}", - layer_name, - swap.list()? - ); - Ok(()) -} - #[cfg(test)] /// Make a LazySubset from a source and array subset to be used in tests /// diff --git a/crates/revrt/src/dataset/swap.rs b/crates/revrt/src/dataset/swap.rs new file mode 100644 index 00000000..325396ea --- /dev/null +++ b/crates/revrt/src/dataset/swap.rs @@ -0,0 +1,303 @@ +use std::path::Path; + +use ndarray::Array2; +use tracing::{debug, trace}; +use zarrs::array::ChunkGrid; +use zarrs::storage::{ + ListableStorageTraits, ReadableListableStorage, ReadableWritableListableStorage, +}; + +use crate::error::{Error, Result}; + +pub(super) struct SourceLayout { + pub(super) chunk_grid: ChunkGrid, + pub(super) chunk_grid_rows: usize, + pub(super) chunk_grid_cols: usize, + pub(super) grid_nrows: u64, + pub(super) grid_ncols: u64, +} + +pub(super) struct InitializedSwap { + pub(super) storage: ReadableWritableListableStorage, + pub(super) cost_chunk_idx: Array2, +} + +pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result { + let entries = source + .list() + .expect("failed to list variables in source dataset"); + let first_entry_opt = entries + .into_iter() + .map(|entry| entry.to_string()) + .find(|entry| { + let name = entry.split('/').next().unwrap_or("").to_ascii_lowercase(); + // Skip coordinate axes when selecting a representative variable for cost storage. + const EXCLUDES: [&str; 6] = ["latitude", "longitude", "band", "x", "y", "spatial_ref"]; + !name.ends_with(".json") && !EXCLUDES.iter().any(|needle| name == *needle) + }); + let first_entry = match first_entry_opt { + Some(entry) => entry, + None => { + return Err(Error::IO(std::io::Error::other(format!( + "no non-coordinate variables found in source dataset: {:?}", + source.list().ok() + )))); + } + }; + + let varname = match first_entry.split('/').next() { + Some(name) => name, + None => { + return Err(Error::IO(std::io::Error::other( + "Could not determine any variable names from source dataset", + ))); + } + }; + debug!("Using '{}' to determine shape of cost data", varname); + + let representative = zarrs::array::Array::open(source.clone(), &format!("/{varname}"))?; + let shape = representative.shape(); + if shape.len() < 3 { + return Err(Error::InvalidDatasetShape { + variable: varname.to_string(), + min_rank: 3, + shape: shape.to_vec(), + }); + } + + let chunk_grid_shape = representative.chunk_grid_shape(); + let layout = SourceLayout { + chunk_grid: representative.chunk_grid().clone(), + chunk_grid_rows: chunk_grid_shape[1] as usize, + chunk_grid_cols: chunk_grid_shape[2] as usize, + grid_nrows: shape[1], + grid_ncols: shape[2], + }; + debug!("Chunk grid info: {:?}", &layout.chunk_grid); + + Ok(layout) +} + +pub(super) fn initialize_swap>( + swap_path: P, + layout: &SourceLayout, + soft_barrier_group_count: usize, +) -> Result { + let swap: ReadableWritableListableStorage = std::sync::Arc::new( + zarrs::filesystem::FilesystemStore::new(swap_path) + .expect("could not open filesystem store"), + ); + + trace!("Creating a new group for the cost dataset"); + zarrs::group::GroupBuilder::new() + .build(swap.clone(), "/")? + .store_metadata()?; + + add_layer_to_data("cost_invariant", &layout.chunk_grid, &swap)?; + add_layer_to_data("cost", &layout.chunk_grid, &swap)?; + add_bool_layer_to_data("hard_barrier_mask", &layout.chunk_grid, &swap)?; + for retry_state in 0..=soft_barrier_group_count { + add_bool_layer_to_data( + &cumulative_soft_barrier_mask_name(retry_state), + &layout.chunk_grid, + &swap, + )?; + } + + Ok(InitializedSwap { + storage: swap, + cost_chunk_idx: Array2::from_elem((layout.chunk_grid_rows, layout.chunk_grid_cols), false), + }) +} + +pub(super) fn cumulative_soft_barrier_mask_name(retry_state: usize) -> String { + format!("soft_barrier_mask_retry_{retry_state}") +} + +fn add_layer_to_data( + layer_name: &str, + chunk_shape: &ChunkGrid, + swap: &ReadableWritableListableStorage, +) -> Result<()> { + trace!("Creating an empty {} array", layer_name); + let dataset_path = format!("/{layer_name}"); + let mut builder = zarrs::array::ArrayBuilder::new_with_chunk_grid( + chunk_shape.clone(), + zarrs::array::DataType::Float32, + zarrs::array::FillValue::from(zarrs::array::ZARR_NAN_F32), + ); + + let built = builder + .dimension_names(["band", "y", "x"].into()) + .build(swap.clone(), &dataset_path)?; + built.store_metadata()?; + + let array = zarrs::array::Array::open(swap.clone(), &dataset_path)?; + trace!("'{}' shape: {:?}", layer_name, array.shape().to_vec()); + trace!("'{}' chunk shape: {:?}", layer_name, array.chunk_grid()); + + trace!( + "Dataset contents after '{}' creation: {:?}", + layer_name, + swap.list()? + ); + Ok(()) +} + +fn add_bool_layer_to_data( + layer_name: &str, + chunk_shape: &ChunkGrid, + swap: &ReadableWritableListableStorage, +) -> Result<()> { + trace!("Creating an empty {} array", layer_name); + let dataset_path = format!("/{layer_name}"); + let mut builder = zarrs::array::ArrayBuilder::new_with_chunk_grid( + chunk_shape.clone(), + zarrs::array::DataType::Bool, + zarrs::array::FillValue::from(false), + ); + + let built = builder + .dimension_names(["band", "y", "x"].into()) + .build(swap.clone(), &dataset_path)?; + built.store_metadata()?; + + let array = zarrs::array::Array::open(swap.clone(), &dataset_path)?; + trace!("'{}' shape: {:?}", layer_name, array.shape().to_vec()); + trace!("'{}' chunk shape: {:?}", layer_name, array.chunk_grid()); + + trace!( + "Dataset contents after '{}' creation: {:?}", + layer_name, + swap.list()? + ); + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::sync::Arc; + + use tempfile::TempDir; + use zarrs::array::{ArrayBuilder, DataType, FillValue}; + use zarrs::filesystem::FilesystemStore; + use zarrs::group::GroupBuilder; + + use super::*; + use crate::dataset::samples::{self, LayerConfig, ZarrTestBuilder}; + + #[test] + fn inspect_source_layout_returns_expected_grid_metadata() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A", "B", "cost"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + + assert_eq!(layout.grid_nrows, 8); + assert_eq!(layout.grid_ncols, 8); + assert_eq!(layout.chunk_grid_rows, 2); + assert_eq!(layout.chunk_grid_cols, 2); + } + + #[test] + fn inspect_source_layout_rejects_sources_without_non_coordinate_layers() { + let tmp = ZarrTestBuilder::new() + .dimensions(1, 8, 8) + .chunks(1, 4, 4) + .layer(LayerConfig::ones("latitude")) + .layer(LayerConfig::ones("longitude")) + .layer(LayerConfig::ones("band")) + .build() + .expect("failed to create coordinate-only dataset"); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + + let error = inspect_source_layout(&source) + .err() + .expect("expected coordinate-only dataset to be rejected"); + + assert!(matches!(error, Error::IO(_))); + } + + #[test] + fn inspect_source_layout_rejects_representative_variable_with_too_few_dimensions() { + let tmp = malformed_two_dimensional_dataset(); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + + let error = inspect_source_layout(&source) + .err() + .expect("expected 2D representative variable to be rejected"); + + assert!(matches!( + error, + Error::InvalidDatasetShape { + variable, + min_rank: 3, + shape, + } if variable == "A" && shape == vec![3, 4] + )); + } + + #[test] + fn initialize_swap_creates_expected_layers_and_chunk_index() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A", "cost"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + let swap_dir = TempDir::new().expect("could not create temporary swap directory"); + + let initialized_swap = + initialize_swap(swap_dir.path(), &layout, 2).expect("swap initialization failed"); + + assert_eq!(initialized_swap.cost_chunk_idx.shape(), &[2, 2]); + assert!(initialized_swap.cost_chunk_idx.iter().all(|value| !*value)); + + let expected_layers = [ + ("/cost", DataType::Float32), + ("/cost_invariant", DataType::Float32), + ("/hard_barrier_mask", DataType::Bool), + ("/soft_barrier_mask_retry_0", DataType::Bool), + ("/soft_barrier_mask_retry_1", DataType::Bool), + ("/soft_barrier_mask_retry_2", DataType::Bool), + ]; + + for (layer_name, expected_dtype) in expected_layers { + let array = zarrs::array::Array::open(initialized_swap.storage.clone(), layer_name) + .unwrap_or_else(|_| panic!("expected layer {layer_name} to exist")); + assert_eq!(array.shape(), &[1, 8, 8], "wrong shape for {layer_name}"); + assert_eq!( + array.chunk_grid_shape(), + &[1, 2, 2], + "wrong chunk grid shape for {layer_name}" + ); + assert_eq!(*array.data_type(), expected_dtype); + } + } + + fn malformed_two_dimensional_dataset() -> TempDir { + let tmp = TempDir::new().expect("could not create temporary directory"); + let store: ReadableWritableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + + GroupBuilder::new() + .build(store.clone(), "/") + .expect("could not create root group") + .store_metadata() + .expect("could not store root metadata"); + + ArrayBuilder::new( + vec![3, 4], + vec![3, 4], + DataType::Float32, + FillValue::from(zarrs::array::ZARR_NAN_F32), + ) + .build(store, "/A") + .expect("could not create malformed array") + .store_metadata() + .expect("could not store malformed array metadata"); + + tmp + } +} From 105a7a83cd657989fa182cb00598118c86a8624c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:37:34 -0600 Subject: [PATCH 24/71] MInor refactor --- crates/revrt/src/dataset/mod.rs | 71 +++++++++++++++------------------ 1 file changed, 32 insertions(+), 39 deletions(-) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 281b00e5..3dcd90fd 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -185,38 +185,43 @@ impl Dataset { }) } - fn calculate_chunk_cost(&self, ci: u64, cj: u64) { + fn calculate_chunk_derived_data(&self, ci: u64, cj: u64) { trace!("Creating a LazySubset for ({}, {})", ci, cj); // cost variable is stored in the swap dataset let variable = zarrs::array::Array::open(self.swap.clone(), "/cost").unwrap(); // Get the subset according to cost's chunk let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); - let mut data = LazySubset::::new(self.source.clone(), subset); + let chunk_subset = + zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); + let mut data = LazySubset::::new(self.source.clone(), subset.clone()); - self.calculate_chunk_cost_single_layer(ci, cj, &mut data, true); - self.calculate_chunk_cost_single_layer(ci, cj, &mut data, false); + self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, true); + self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, false); + self.calculate_chunk_hard_barrier_mask(&mut data, &subset, &chunk_subset); + self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); } fn calculate_chunk_cost_single_layer( &self, ci: u64, cj: u64, - subset: &mut LazySubset, + features: &mut LazySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, is_invariant: bool, ) { let output; let layer_name; if is_invariant { trace!("Calculating invariant cost for chunk ({}, {})", ci, cj); - output = self.cost_function.compute(subset, true); + output = self.cost_function.compute(features, true); layer_name = "/cost_invariant"; } else { trace!( "Calculating length-dependent cost for chunk ({}, {})", ci, cj ); - output = self.cost_function.compute(subset, false); + output = self.cost_function.compute(features, false); layer_name = "/cost"; } @@ -226,19 +231,17 @@ impl Dataset { cost.store_metadata().unwrap(); let chunk_indices: Vec = vec![0, ci, cj]; trace!("Storing chunk at {:?}", chunk_indices); - let chunk_subset = - &zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); trace!("Target chunk subset: {:?}", chunk_subset); cost.store_chunks_ndarray(chunk_subset, output).unwrap(); } - fn calculate_chunk_hard_barrier_mask(&self, ci: u64, cj: u64) { - trace!("Calculating hard barrier mask for chunk ({}, {})", ci, cj); - - let variable = zarrs::array::Array::open(self.swap.clone(), "/hard_barrier_mask").unwrap(); - let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); - let chunk_subset = - &zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); + fn calculate_chunk_hard_barrier_mask( + &self, + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, + ) { + trace!("Calculating hard barrier mask for subset {:?}", subset); let output = if self.hard_barrier_layers.is_empty() { ndarray::ArrayD::::from_elem( @@ -254,11 +257,10 @@ impl Dataset { false, ) } else { - let mut data = LazySubset::::new(self.source.clone(), subset); let barrier_masks = self .hard_barrier_layers .iter() - .map(|layer| crate::cost::build_single_barrier_layer(layer, &mut data)) + .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) .collect::>(); let mut output = @@ -271,30 +273,28 @@ impl Dataset { output }; + let variable = zarrs::array::Array::open(self.swap.clone(), "/hard_barrier_mask").unwrap(); variable.store_metadata().unwrap(); variable.store_chunks_ndarray(chunk_subset, output).unwrap(); } - fn calculate_chunk_cumulative_soft_barrier_masks(&self, ci: u64, cj: u64) { + fn calculate_chunk_cumulative_soft_barrier_masks( + &self, + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, + ) { trace!( - "Calculating cumulative soft barrier masks for chunk ({}, {})", - ci, cj + "Calculating cumulative soft barrier masks for subset {:?}", + subset ); - let variable = zarrs::array::Array::open( - self.swap.clone(), - &format!("/{}", cumulative_soft_barrier_mask_name(0)), - ) - .unwrap(); - let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); - - let mut features = LazySubset::::new(self.source.clone(), subset.clone()); - let empty_mask = empty_bool_mask(&subset); + let empty_mask = empty_bool_mask(subset); let group_masks = self .soft_barrier_groups .iter() .map(|(_, layers)| { - combine_barrier_layers_for_subset(layers, &mut features, &subset) + combine_barrier_layers_for_subset(layers, features, subset) .unwrap_or_else(|| empty_mask.clone()) }) .collect::>(); @@ -303,11 +303,6 @@ impl Dataset { let layer_name = cumulative_soft_barrier_mask_name(retry_state); let target = zarrs::array::Array::open(self.swap.clone(), &format!("/{layer_name}")).unwrap(); - let chunk_subset = &zarrs::array_subset::ArraySubset::new_with_ranges(&[ - 0..1, - ci..(ci + 1), - cj..(cj + 1), - ]); let mut output = empty_mask.clone(); for mask in group_masks.iter().skip(retry_state) { @@ -567,9 +562,7 @@ impl Dataset { ci, cj ); } else { - self.calculate_chunk_cost(ci, cj); - self.calculate_chunk_hard_barrier_mask(ci, cj); - self.calculate_chunk_cumulative_soft_barrier_masks(ci, cj); + self.calculate_chunk_derived_data(ci, cj); chunk_idx[[ci as usize, cj as usize]] = true; debug!( "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", From e3999aa4c4ddc728332b6130e27f7d104cec49da Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 12:39:11 -0600 Subject: [PATCH 25/71] Rename field --- crates/revrt/src/dataset/mod.rs | 18 +++++++++--------- crates/revrt/src/dataset/swap.rs | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 3dcd90fd..346ae684 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -59,8 +59,8 @@ pub(super) struct Dataset { // cost_variables: Vec, /// Storage for the calculated cost swap: ReadableWritableListableStorage, - /// Index of cost chunks already calculated - cost_chunk_idx: RwLock>, + /// Index of derived swap chunks already calculated + swap_chunk_idx: RwLock>, /// Explicit barriers that are always active for this dataset hard_barrier_layers: Vec, /// Soft barriers grouped by importance and ordered for retry states @@ -121,7 +121,7 @@ impl Dataset { let source_layout = inspect_source_layout(&source)?; let initialized_swap = initialize_swap(swap_fp, &source_layout, soft_barrier_groups.len())?; let swap = initialized_swap.storage; - let cost_chunk_idx = initialized_swap.cost_chunk_idx.into(); + let swap_chunk_idx = initialized_swap.swap_chunk_idx.into(); let grid_nrows = source_layout.grid_nrows; let grid_ncols = source_layout.grid_ncols; @@ -172,7 +172,7 @@ impl Dataset { source, cost_path: None, swap, - cost_chunk_idx, + swap_chunk_idx, hard_barrier_layers, soft_barrier_groups, cost_function, @@ -545,17 +545,17 @@ impl Dataset { "Checking if derived data for chunk ({}, {}) has been calculated", ci, cj ); - if self.cost_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { + if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); continue; } - debug!("Requesting write lock for cost_chunk_idx ({}, {})", ci, cj); + debug!("Requesting write lock for swap_chunk_idx ({}, {})", ci, cj); let mut chunk_idx = self - .cost_chunk_idx + .swap_chunk_idx .write() .expect("Failed to acquire write lock"); - debug!("Acquired write lock for cost_chunk_idx ({}, {})", ci, cj); + debug!("Acquired write lock for swap_chunk_idx ({}, {})", ci, cj); if chunk_idx[[ci as usize, cj as usize]] { trace!( "Derived data for chunk ({}, {}) already calculated while waiting for the lock", @@ -571,7 +571,7 @@ impl Dataset { chunk_idx.iter().filter(|&&value| value).count() ); } - debug!("Released write lock for cost_chunk_idx ({}, {})", ci, cj); + debug!("Released write lock for swap_chunk_idx ({}, {})", ci, cj); } } } diff --git a/crates/revrt/src/dataset/swap.rs b/crates/revrt/src/dataset/swap.rs index 325396ea..d218a224 100644 --- a/crates/revrt/src/dataset/swap.rs +++ b/crates/revrt/src/dataset/swap.rs @@ -19,7 +19,7 @@ pub(super) struct SourceLayout { pub(super) struct InitializedSwap { pub(super) storage: ReadableWritableListableStorage, - pub(super) cost_chunk_idx: Array2, + pub(super) swap_chunk_idx: Array2, } pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result { @@ -106,7 +106,7 @@ pub(super) fn initialize_swap>( Ok(InitializedSwap { storage: swap, - cost_chunk_idx: Array2::from_elem((layout.chunk_grid_rows, layout.chunk_grid_cols), false), + swap_chunk_idx: Array2::from_elem((layout.chunk_grid_rows, layout.chunk_grid_cols), false), }) } @@ -251,8 +251,8 @@ mod tests { let initialized_swap = initialize_swap(swap_dir.path(), &layout, 2).expect("swap initialization failed"); - assert_eq!(initialized_swap.cost_chunk_idx.shape(), &[2, 2]); - assert!(initialized_swap.cost_chunk_idx.iter().all(|value| !*value)); + assert_eq!(initialized_swap.swap_chunk_idx.shape(), &[2, 2]); + assert!(initialized_swap.swap_chunk_idx.iter().all(|value| !*value)); let expected_layers = [ ("/cost", DataType::Float32), From 10b1c24d83034a9f6cd45bf4135c9dd5c94cda98 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:29:27 -0600 Subject: [PATCH 26/71] Refactor --- crates/revrt/src/dataset/derived.rs | 196 +++++++++ crates/revrt/src/dataset/mod.rs | 611 ++++------------------------ crates/revrt/src/dataset/reader.rs | 302 ++++++++++++++ crates/revrt/src/dataset/state.rs | 75 ++++ crates/revrt/src/dataset/swap.rs | 23 +- 5 files changed, 653 insertions(+), 554 deletions(-) create mode 100644 crates/revrt/src/dataset/derived.rs create mode 100644 crates/revrt/src/dataset/reader.rs create mode 100644 crates/revrt/src/dataset/state.rs diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs new file mode 100644 index 00000000..37de58db --- /dev/null +++ b/crates/revrt/src/dataset/derived.rs @@ -0,0 +1,196 @@ +use tracing::trace; +use zarrs::storage::{ReadableListableStorage, ReadableWritableListableStorage}; + +use super::LazySubset; +use super::swap::cumulative_soft_barrier_mask_name; +use crate::cost::{BarrierLayer, CostFunction}; + +pub(super) struct DerivedDataWriter { + source: ReadableListableStorage, + swap: ReadableWritableListableStorage, + hard_barrier_layers: Vec, + soft_barrier_groups: Vec<(u32, Vec)>, + cost_function: CostFunction, +} + +impl DerivedDataWriter { + pub(super) fn new( + source: ReadableListableStorage, + swap: ReadableWritableListableStorage, + cost_function: CostFunction, + ) -> Self { + let hard_barrier_layers = cost_function.hard_barrier_layers(); + let soft_barrier_groups = cost_function.soft_barrier_groups(); + let cost_function = cost_function.without_barriers(); + + Self { + source, + swap, + hard_barrier_layers, + soft_barrier_groups, + cost_function, + } + } + + pub(super) fn materialize_chunk(&self, ci: u64, cj: u64) { + trace!("Creating a LazySubset for ({}, {})", ci, cj); + + let variable = zarrs::array::Array::open(self.swap.clone(), "/cost").unwrap(); + let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); + let chunk_subset = + zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); + let mut data = LazySubset::::new(self.source.clone(), subset.clone()); + + self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, true); + self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, false); + self.calculate_chunk_hard_barrier_mask(&mut data, &subset, &chunk_subset); + self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); + } + + pub(super) fn hard_barrier_layers(&self) -> &[BarrierLayer] { + &self.hard_barrier_layers + } + + pub(super) fn soft_barrier_group_count(&self) -> usize { + self.soft_barrier_groups.len() + } + + fn calculate_chunk_cost_single_layer( + &self, + ci: u64, + cj: u64, + features: &mut LazySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, + is_invariant: bool, + ) { + let output; + let layer_name; + if is_invariant { + trace!("Calculating invariant cost for chunk ({}, {})", ci, cj); + output = self.cost_function.compute(features, true); + layer_name = "/cost_invariant"; + } else { + trace!( + "Calculating length-dependent cost for chunk ({}, {})", + ci, cj + ); + output = self.cost_function.compute(features, false); + layer_name = "/cost"; + } + + trace!("Cost function: {:?}", self.cost_function); + + let cost = zarrs::array::Array::open(self.swap.clone(), layer_name).unwrap(); + cost.store_metadata().unwrap(); + let chunk_indices: Vec = vec![0, ci, cj]; + trace!("Storing chunk at {:?}", chunk_indices); + trace!("Target chunk subset: {:?}", chunk_subset); + cost.store_chunks_ndarray(chunk_subset, output).unwrap(); + } + + fn calculate_chunk_hard_barrier_mask( + &self, + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, + ) { + trace!("Calculating hard barrier mask for subset {:?}", subset); + + let output = if self.hard_barrier_layers.is_empty() { + empty_bool_mask(subset) + } else { + let barrier_masks = self + .hard_barrier_layers + .iter() + .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) + .collect::>(); + + let mut output = + ndarray::ArrayD::::from_elem(ndarray::IxDyn(barrier_masks[0].shape()), false); + for mask in barrier_masks { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + output + }; + + let variable = zarrs::array::Array::open(self.swap.clone(), "/hard_barrier_mask").unwrap(); + variable.store_metadata().unwrap(); + variable.store_chunks_ndarray(chunk_subset, output).unwrap(); + } + + fn calculate_chunk_cumulative_soft_barrier_masks( + &self, + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, + chunk_subset: &zarrs::array_subset::ArraySubset, + ) { + trace!( + "Calculating cumulative soft barrier masks for subset {:?}", + subset + ); + + let empty_mask = empty_bool_mask(subset); + let group_masks = self + .soft_barrier_groups + .iter() + .map(|(_, layers)| { + combine_barrier_layers_for_subset(layers, features, subset) + .unwrap_or_else(|| empty_mask.clone()) + }) + .collect::>(); + + for retry_state in 0..=self.soft_barrier_groups.len() { + let layer_name = cumulative_soft_barrier_mask_name(retry_state); + let target = + zarrs::array::Array::open(self.swap.clone(), &format!("/{layer_name}")).unwrap(); + + let mut output = empty_mask.clone(); + for mask in group_masks.iter().skip(retry_state) { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + + target.store_metadata().unwrap(); + target.store_chunks_ndarray(chunk_subset, output).unwrap(); + } + } +} + +fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD { + ndarray::ArrayD::::from_elem( + ndarray::IxDyn( + &subset + .shape() + .iter() + .map(|&dim| usize::try_from(dim).expect("subset dimension exceeds usize range")) + .collect::>(), + ), + false, + ) +} + +fn combine_barrier_layers_for_subset( + barrier_layers: &[BarrierLayer], + features: &mut LazySubset, + subset: &zarrs::array_subset::ArraySubset, +) -> Option> { + if barrier_layers.is_empty() { + return None; + } + + let barrier_masks = barrier_layers + .iter() + .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) + .collect::>(); + let mut output = empty_bool_mask(subset); + for mask in barrier_masks { + ndarray::Zip::from(&mut output) + .and(mask.view()) + .for_each(|out, value| *out = *out || *value); + } + + Some(output) +} diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 346ae684..6dbb0b24 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -14,71 +14,46 @@ //! Note: This is currently in a transition state. The initial prototype //! included the cost function, which was removed to the `Scenario` level. +mod derived; mod lazy_subset; +mod reader; #[cfg(test)] pub(crate) mod samples; +mod state; mod swap; -use std::iter; use std::path::PathBuf; -use std::sync::{Arc, RwLock}; -use tracing::{debug, info, trace, warn}; -use zarrs::array::codec::CodecOptions; -use zarrs::array::{ChunkCache, ChunkCacheDecodedLruSizeLimit}; -use zarrs::storage::{ - ListableStorageTraits, ReadableListableStorage, ReadableWritableListableStorage, -}; +use tracing::{debug, info, trace}; +use zarrs::storage::ReadableListableStorage; use crate::ArrayIndex; use crate::cost::CostFunction; -use crate::error::{Error, Result}; +use crate::error::Result; +use derived::DerivedDataWriter; pub(crate) use lazy_subset::LazySubset; -use swap::{cumulative_soft_barrier_mask_name, initialize_swap, inspect_source_layout}; - -#[derive(Debug, Clone, Copy)] -struct CacheBudgets { - per_cost_cache: u64, - hard_barrier_cache: u64, - per_soft_barrier_cache: u64, -} +use reader::NeighborhoodReader; +use state::DerivedChunkState; +use swap::{initialize_swap, inspect_source_layout}; /// Manages the features datasets and calculated total cost pub(super) struct Dataset { /// A Zarr storages with the features + #[allow(dead_code)] source: ReadableListableStorage, // Silly way to keep the tmp path alive #[allow(dead_code)] cost_path: Option, - /// Variables used to define cost - /// Minimalist solution for the cost calculation. In the future - /// it will be modified to include weights and other types of - /// relations such as operations between features. - /// At this point it just allows custom variables names and the - /// cost is calculated from multiple variables. - // cost_variables: Vec, - /// Storage for the calculated cost - swap: ReadableWritableListableStorage, - /// Index of derived swap chunks already calculated - swap_chunk_idx: RwLock>, - /// Explicit barriers that are always active for this dataset - hard_barrier_layers: Vec, - /// Soft barriers grouped by importance and ordered for retry states - soft_barrier_groups: Vec<(u32, Vec)>, - /// Custom cost function definition - cost_function: CostFunction, - /// Cache for decoded cost chunks shared across calls - cost_cache: ChunkCacheDecodedLruSizeLimit, - /// Cache for decoded invariant cost chunks shared across calls - cost_invariant_cache: ChunkCacheDecodedLruSizeLimit, - /// Cache for decoded hard barrier chunks shared across calls - hard_barrier_cache: ChunkCacheDecodedLruSizeLimit, - /// Caches for decoded cumulative soft barrier chunks per retry state - cumulative_soft_barrier_caches: Vec, - /// Number of rows in the routing grid - grid_nrows: u64, - /// Number of columns in the routing grid - grid_ncols: u64, + /// State tracking which swap chunks have already been materialized + /// Internally this is a boolean array of the same shape as the chunk grid, + /// where a true value means the data has been derived + derived_chunk_state: DerivedChunkState, + /// Writer responsible for materializing derived chunk data into swap + derived_data_writer: DerivedDataWriter, + /// Reader responsible for cached neighborhood access to derived data + neighborhood_reader: NeighborhoodReader, + /// Shape of data grid + pub(super) grid_shape: (u64, u64), } impl Dataset { @@ -112,309 +87,81 @@ impl Dataset { swap_fp: PathBuf, ) -> Result { debug!("Opening dataset: {:?}", path.as_ref()); - let hard_barrier_layers = cost_function.hard_barrier_layers(); - let soft_barrier_groups = cost_function.soft_barrier_groups(); - let cost_function = cost_function.without_barriers(); + let soft_barrier_group_count = cost_function.soft_barrier_groups().len(); + let filesystem = zarrs::filesystem::FilesystemStore::new(path).expect("could not open filesystem store"); let source: ReadableListableStorage = std::sync::Arc::new(filesystem); + let source_layout = inspect_source_layout(&source)?; - let initialized_swap = initialize_swap(swap_fp, &source_layout, soft_barrier_groups.len())?; - let swap = initialized_swap.storage; - let swap_chunk_idx = initialized_swap.swap_chunk_idx.into(); - let grid_nrows = source_layout.grid_nrows; - let grid_ncols = source_layout.grid_ncols; - - if cache_size < 1_000_000 { - warn!("Cache size smaller than 1MB"); - } - debug!( - "Creating caches with total size {}MB", - cache_size / 1_000_000 - ); - // TODO: tune cache_size against typical chunk sizes - // (e.g. chunk_bytes * hot_chunks * safety_factor) - let cost_array_readable = - Arc::new(zarrs::array::Array::open(swap.clone(), "/cost")?.readable()); - let cost_invariant_array_readable = - Arc::new(zarrs::array::Array::open(swap.clone(), "/cost_invariant")?.readable()); - let hard_barrier_array_readable = - Arc::new(zarrs::array::Array::open(swap.clone(), "/hard_barrier_mask")?.readable()); - let cumulative_soft_barrier_arrays = (0..=soft_barrier_groups.len()) - .map(|retry_state| { - let path = format!("/{}", cumulative_soft_barrier_mask_name(retry_state)); - zarrs::array::Array::open(swap.clone(), &path) - .map_err(|err| Error::IO(std::io::Error::other(err.to_string()))) - .map(|array| Arc::new(array.readable())) - }) - .collect::>>()?; + let swap = initialize_swap(swap_fp, &source_layout, soft_barrier_group_count)?; - let budgets = distribute_cache_budgets(cache_size, cumulative_soft_barrier_arrays.len()); - debug!("Cache budgets: {:?}", budgets); + let derived_chunk_state = DerivedChunkState::new(&source_layout); + let derived_data_writer = + DerivedDataWriter::new(source.clone(), swap.clone(), cost_function); - let cost_cache = - ChunkCacheDecodedLruSizeLimit::new(cost_array_readable.clone(), budgets.per_cost_cache); - let cost_invariant_cache = ChunkCacheDecodedLruSizeLimit::new( - cost_invariant_array_readable.clone(), - budgets.per_cost_cache, - ); - let hard_barrier_cache = ChunkCacheDecodedLruSizeLimit::new( - hard_barrier_array_readable.clone(), - budgets.hard_barrier_cache, - ); - let cumulative_soft_barrier_caches = cumulative_soft_barrier_arrays - .into_iter() - .map(|array| ChunkCacheDecodedLruSizeLimit::new(array, budgets.per_soft_barrier_cache)) - .collect(); + let neighborhood_reader = NeighborhoodReader::open( + swap.clone(), + cache_size, + soft_barrier_group_count, + source_layout, + )?; + let grid_shape = neighborhood_reader.grid_shape(); trace!("Dataset opened successfully"); Ok(Self { source, cost_path: None, - swap, - swap_chunk_idx, - hard_barrier_layers, - soft_barrier_groups, - cost_function, - cost_cache, - cost_invariant_cache, - hard_barrier_cache, - cumulative_soft_barrier_caches, - grid_nrows, - grid_ncols, + derived_chunk_state, + derived_data_writer, + neighborhood_reader, + grid_shape, }) } - fn calculate_chunk_derived_data(&self, ci: u64, cj: u64) { - trace!("Creating a LazySubset for ({}, {})", ci, cj); - - // cost variable is stored in the swap dataset - let variable = zarrs::array::Array::open(self.swap.clone(), "/cost").unwrap(); - // Get the subset according to cost's chunk - let subset = variable.chunk_subset(&[0, ci, cj]).unwrap(); - let chunk_subset = - zarrs::array_subset::ArraySubset::new_with_ranges(&[0..1, ci..(ci + 1), cj..(cj + 1)]); - let mut data = LazySubset::::new(self.source.clone(), subset.clone()); - - self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, true); - self.calculate_chunk_cost_single_layer(ci, cj, &mut data, &chunk_subset, false); - self.calculate_chunk_hard_barrier_mask(&mut data, &subset, &chunk_subset); - self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); + pub(super) fn get_3x3(&self, index: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { + self.neighborhood_reader.get_3x3( + index, + !self.derived_data_writer.hard_barrier_layers().is_empty(), + |array, subset| self.ensure_derived_data_for_subset(array, subset), + ) } - fn calculate_chunk_cost_single_layer( + pub(super) fn get_3x3_soft_barrier_cells( &self, - ci: u64, - cj: u64, - features: &mut LazySubset, - chunk_subset: &zarrs::array_subset::ArraySubset, - is_invariant: bool, - ) { - let output; - let layer_name; - if is_invariant { - trace!("Calculating invariant cost for chunk ({}, {})", ci, cj); - output = self.cost_function.compute(features, true); - layer_name = "/cost_invariant"; - } else { - trace!( - "Calculating length-dependent cost for chunk ({}, {})", - ci, cj - ); - output = self.cost_function.compute(features, false); - layer_name = "/cost"; - } - - trace!("Cost function: {:?}", self.cost_function); - - let cost = zarrs::array::Array::open(self.swap.clone(), layer_name).unwrap(); - cost.store_metadata().unwrap(); - let chunk_indices: Vec = vec![0, ci, cj]; - trace!("Storing chunk at {:?}", chunk_indices); - trace!("Target chunk subset: {:?}", chunk_subset); - cost.store_chunks_ndarray(chunk_subset, output).unwrap(); + index: &ArrayIndex, + dropped_soft_groups: usize, + ) -> Vec { + let retry_state = + dropped_soft_groups.min(self.derived_data_writer.soft_barrier_group_count()); + self.neighborhood_reader + .get_3x3_soft_barrier_cells(index, retry_state, |array, subset| { + self.ensure_derived_data_for_subset(array, subset) + }) } - fn calculate_chunk_hard_barrier_mask( + fn ensure_derived_data_for_subset( &self, - features: &mut LazySubset, + array: &zarrs::array::Array, subset: &zarrs::array_subset::ArraySubset, - chunk_subset: &zarrs::array_subset::ArraySubset, ) { - trace!("Calculating hard barrier mask for subset {:?}", subset); - - let output = if self.hard_barrier_layers.is_empty() { - ndarray::ArrayD::::from_elem( - ndarray::IxDyn( - &subset - .shape() - .iter() - .map(|&dim| { - usize::try_from(dim).expect("subset dimension exceeds usize range") - }) - .collect::>(), - ), - false, - ) - } else { - let barrier_masks = self - .hard_barrier_layers - .iter() - .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) - .collect::>(); - - let mut output = - ndarray::ArrayD::::from_elem(ndarray::IxDyn(barrier_masks[0].shape()), false); - for mask in barrier_masks { - ndarray::Zip::from(&mut output) - .and(mask.view()) - .for_each(|out, value| *out = *out || *value); - } - output - }; - - let variable = zarrs::array::Array::open(self.swap.clone(), "/hard_barrier_mask").unwrap(); - variable.store_metadata().unwrap(); - variable.store_chunks_ndarray(chunk_subset, output).unwrap(); + self.derived_chunk_state + .ensure_derived_data_for_subset(array, subset, |ci, cj| { + self.derived_data_writer.materialize_chunk(ci, cj) + }); } - fn calculate_chunk_cumulative_soft_barrier_masks( - &self, - features: &mut LazySubset, - subset: &zarrs::array_subset::ArraySubset, - chunk_subset: &zarrs::array_subset::ArraySubset, - ) { - trace!( - "Calculating cumulative soft barrier masks for subset {:?}", - subset - ); - - let empty_mask = empty_bool_mask(subset); - let group_masks = self - .soft_barrier_groups - .iter() - .map(|(_, layers)| { - combine_barrier_layers_for_subset(layers, features, subset) - .unwrap_or_else(|| empty_mask.clone()) - }) - .collect::>(); - - for retry_state in 0..=self.soft_barrier_groups.len() { - let layer_name = cumulative_soft_barrier_mask_name(retry_state); - let target = - zarrs::array::Array::open(self.swap.clone(), &format!("/{layer_name}")).unwrap(); - - let mut output = empty_mask.clone(); - for mask in group_masks.iter().skip(retry_state) { - ndarray::Zip::from(&mut output) - .and(mask.view()) - .for_each(|out, value| *out = *out || *value); - } - - target.store_metadata().unwrap(); - target.store_chunks_ndarray(chunk_subset, output).unwrap(); - } + #[cfg(test)] + pub(super) fn hard_barrier_layers(&self) -> &[crate::cost::BarrierLayer] { + self.derived_data_writer.hard_barrier_layers() } - pub(super) fn get_3x3(&self, index: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { - let &ArrayIndex { i, j } = index; - - trace!("Getting 3x3 neighborhood for (i={}, j={})", i, j); - - trace!("Cost dataset contents: {:?}", self.swap.list().unwrap()); - trace!("Cost dataset size: {:?}", self.swap.size().unwrap()); - - trace!("Opening cost dataset via cache"); - let cost_array = self.cost_cache.array(); - trace!("Cost dataset with shape: {:?}", cost_array.shape()); - - let (i_range, j_range, subset) = self.neighborhood_subset(index); - trace!("Cost subset: {:?}", subset); - self.ensure_derived_data_for_subset(&cost_array, &subset); - - let neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, false); - let invariant_neighbors = - self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, true); - let hard_barrier_values: Vec = if self.hard_barrier_layers.is_empty() { - std::iter::repeat_n(false, neighbors.len()).collect() - } else { - self.hard_barrier_cache - .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) - .unwrap() - }; - - // Extract the origin point. - let center = neighbors - .iter() - .zip(hard_barrier_values.iter()) - .find(|(((ir, jr), _), _)| *ir == i && *jr == j) - .map(|(((ir, jr), v), is_barrier)| { - if *is_barrier { - ((ir, jr), &0_f32, true) - } else if v.is_nan() { - ((ir, jr), &0_f32, false) // NaN's don't contribute to cost - } else { - ((ir, jr), v, false) - } - }) - .unwrap(); - if center.2 { - return Vec::new(); - } - trace!("Center point: {:?}", center); - - /* - * The transition between two gridpoint centers is along half the distance - * on the original gridpoint, plus half the distance to the target gridpoint - * (center). Therefore, the transition cost is the average between the origin - * gridpoint cost and the target gridpoint cost. - * Note that the same principle is valid for diagonals, it is still the average - * of both values, but we have to scale for the longer distance along the - * diagonal, thus a sqrt(2) factor along the diagonals. - */ - // Calculate the average with center point (half grid + other half grid). - // Also, apply the diagonal factor for the extra distance. - // Finally, add any invariant costs. - let cost_to_neighbors = neighbors - .iter() - .zip(invariant_neighbors.iter()) - .zip(hard_barrier_values.iter()) - .filter(|((((ir, jr), v), _), is_barrier)| { - !(**is_barrier || v.is_nan() || (*ir == i && *jr == j)) - }) - .map(|((((ir, jr), v), ((inv_ir, inv_jr), inv_cost)), _)| { - debug_assert_eq!((ir, jr), (inv_ir, inv_jr)); - ((ir, jr), 0.5 * (v + center.1), inv_cost) - }) - .map(|((ir, jr), v, inv_cost)| { - let scaled = if *ir != i && *jr != j { - // Diagonal factor for longer distance (hypotenuse) - v * f32::sqrt(2.0) - } else { - v - }; - (ArrayIndex { i: *ir, j: *jr }, scaled + inv_cost) - }) - .collect::>(); - - trace!("Neighbors {:?}", cost_to_neighbors); - - cost_to_neighbors - - /* - let mut data = array - .load_chunks_ndarray(&zarrs::array_subset::ArraySubset::new_with_ranges(&[0..2, 0..2])) - .unwrap(); - data[[x as usize, y as usize]] = 0.0; - array - .store_chunks_ndarray( - &zarrs::array_subset::ArraySubset::new_with_ranges(&[0..2, 0..2]), - data, - ) - .unwrap(); - */ + #[cfg(test)] + pub(super) fn soft_barrier_group_count(&self) -> usize { + self.derived_data_writer.soft_barrier_group_count() } + #[cfg(test)] fn neighborhood_subset( &self, index: &ArrayIndex, @@ -423,35 +170,10 @@ impl Dataset { std::ops::Range, zarrs::array_subset::ArraySubset, ) { - let &ArrayIndex { i, j } = index; - debug_assert!(self.grid_nrows > 0); - debug_assert!(self.grid_ncols > 0); - - let max_i = self.grid_nrows - 1; - let max_j = self.grid_ncols - 1; - - let i_range = match i { - 0 if max_i == 0 => 0..1, - 0 => 0..2, - _ if i == max_i => i - 1..i + 1, - _ => i - 1..i + 2, - }; - let j_range = match j { - 0 if max_j == 0 => 0..1, - 0 => 0..2, - _ if j == max_j => j - 1..j + 1, - _ => j - 1..j + 2, - }; - - let subset = zarrs::array_subset::ArraySubset::new_with_ranges(&[ - 0..1, - i_range.clone(), - j_range.clone(), - ]); - - (i_range, j_range, subset) + self.neighborhood_reader.neighborhood_subset(index) } + #[cfg(test)] fn get_neighbor_costs( &self, i_range: std::ops::Range, @@ -459,131 +181,8 @@ impl Dataset { subset: &zarrs::array_subset::ArraySubset, is_invariant: bool, ) -> Vec<((u64, u64), f32)> { - trace!("Opening cost dataset (is_invariant={})", is_invariant); - - let cache = if is_invariant { - &self.cost_invariant_cache - } else { - &self.cost_cache - }; - let cost_array = cache.array(); - trace!( - "Cost dataset (is_invariant={}) with shape: {:?}", - is_invariant, - cost_array.shape() - ); - - // Retrieve the 3x3 neighborhood values - let cost_values: Vec = cache - .retrieve_array_subset_elements::(subset, &CodecOptions::default()) - .unwrap(); - - trace!("Read values {:?}", cost_values); - - // Match the indices - let neighbor_costs = i_range - .flat_map(|e| iter::repeat(e).zip(j_range.clone())) - .zip(cost_values) - .collect(); - - trace!("Neighbors {:?}", neighbor_costs); - neighbor_costs - } - - fn get_3x3_cached_barrier_cells( - &self, - index: &ArrayIndex, - cache: &ChunkCacheDecodedLruSizeLimit, - ) -> Vec { - let (i_range, j_range, subset) = self.neighborhood_subset(index); - self.ensure_derived_data_for_subset(&cache.array(), &subset); - let barrier_values = cache - .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) - .unwrap(); - let mut barrier_cells = Vec::new(); - - for ((ir, jr), is_barrier) in i_range - .flat_map(|row| iter::repeat(row).zip(j_range.clone())) - .zip(barrier_values) - { - if is_barrier { - barrier_cells.push(ArrayIndex { i: ir, j: jr }); - } - } - - barrier_cells - } - - pub(super) fn get_3x3_soft_barrier_cells( - &self, - index: &ArrayIndex, - dropped_soft_groups: usize, - ) -> Vec { - let retry_state = dropped_soft_groups.min(self.soft_barrier_groups.len()); - self.get_3x3_cached_barrier_cells(index, &self.cumulative_soft_barrier_caches[retry_state]) - } - - pub(super) fn grid_shape(&self) -> (u64, u64) { - (self.grid_nrows, self.grid_ncols) - } - - fn ensure_derived_data_for_subset( - &self, - array: &zarrs::array::Array, - subset: &zarrs::array_subset::ArraySubset, - ) { - let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); - trace!("Derived-data chunks: {:?}", chunks); - trace!( - "Derived-data subset extends to {:?} chunks", - chunks.num_elements_usize() - ); - - for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { - for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { - trace!( - "Checking if derived data for chunk ({}, {}) has been calculated", - ci, cj - ); - if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { - trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); - continue; - } - - debug!("Requesting write lock for swap_chunk_idx ({}, {})", ci, cj); - let mut chunk_idx = self - .swap_chunk_idx - .write() - .expect("Failed to acquire write lock"); - debug!("Acquired write lock for swap_chunk_idx ({}, {})", ci, cj); - if chunk_idx[[ci as usize, cj as usize]] { - trace!( - "Derived data for chunk ({}, {}) already calculated while waiting for the lock", - ci, cj - ); - } else { - self.calculate_chunk_derived_data(ci, cj); - chunk_idx[[ci as usize, cj as usize]] = true; - debug!( - "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", - ci, - cj, - chunk_idx.iter().filter(|&&value| value).count() - ); - } - debug!("Released write lock for swap_chunk_idx ({}, {})", ci, cj); - } - } - } - - #[cfg(test)] - pub(super) fn hard_barrier_layers(&self) -> &[crate::cost::BarrierLayer] { - &self.hard_barrier_layers - } - - #[cfg(test)] - pub(super) fn soft_barrier_group_count(&self) -> usize { - self.soft_barrier_groups.len() + self.neighborhood_reader + .get_neighbor_costs(i_range, j_range, subset, is_invariant) } #[cfg(test)] @@ -619,71 +218,6 @@ impl Dataset { } } -/// Split the decoded chunk cache budget across derived dataset layers. -/// -/// One third of the total budget is assigned to the dynamic cost cache and -/// one third to the invariant cost cache. The remaining budget is then split -/// between the hard-barrier cache and the cumulative soft-barrier caches: -/// half goes to the hard-barrier cache and the rest is divided evenly across -/// each soft-barrier retry-state cache. -/// -/// Every allocation is clamped to at least 1 so the cache setup remains -/// valid even when the total cache budget is very small. -fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> CacheBudgets { - let per_cost_cache = (cache_size / 3).max(1); - let remaining_cache = cache_size.saturating_sub(2 * per_cost_cache).max(1); - let hard_barrier_cache = (remaining_cache / 2).max(1); - let soft_cache_budget = remaining_cache.saturating_sub(hard_barrier_cache).max(1); - - let per_soft_barrier_cache = if soft_barrier_cache_count == 0 { - 1 - } else { - (soft_cache_budget / soft_barrier_cache_count as u64).max(1) - }; - - CacheBudgets { - per_cost_cache, - hard_barrier_cache, - per_soft_barrier_cache, - } -} - -fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD { - ndarray::ArrayD::::from_elem( - ndarray::IxDyn( - &subset - .shape() - .iter() - .map(|&dim| usize::try_from(dim).expect("subset dimension exceeds usize range")) - .collect::>(), - ), - false, - ) -} - -fn combine_barrier_layers_for_subset( - barrier_layers: &[crate::cost::BarrierLayer], - features: &mut LazySubset, - subset: &zarrs::array_subset::ArraySubset, -) -> Option> { - if barrier_layers.is_empty() { - return None; - } - - let barrier_masks = barrier_layers - .iter() - .map(|layer| crate::cost::build_single_barrier_layer(layer, features)) - .collect::>(); - let mut output = empty_bool_mask(subset); - for mask in barrier_masks { - ndarray::Zip::from(&mut output) - .and(mask.view()) - .for_each(|out, value| *out = *out || *value); - } - - Some(output) -} - #[cfg(test)] /// Make a LazySubset from a source and array subset to be used in tests /// @@ -699,6 +233,7 @@ pub(crate) fn make_lazy_subset_for_tests( #[cfg(test)] mod tests { use super::*; + use crate::error::Error; use std::f32::consts::SQRT_2; use std::sync::Arc; use test_case::test_case; diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs new file mode 100644 index 00000000..ea23736f --- /dev/null +++ b/crates/revrt/src/dataset/reader.rs @@ -0,0 +1,302 @@ +use std::iter; +use std::sync::Arc; + +use tracing::{debug, trace, warn}; +use zarrs::array::codec::CodecOptions; +use zarrs::array::{ChunkCache, ChunkCacheDecodedLruSizeLimit}; +use zarrs::storage::{ReadableStorageTraits, ReadableWritableListableStorage}; + +use super::swap::SourceLayout; +use super::swap::cumulative_soft_barrier_mask_name; +use crate::ArrayIndex; +use crate::error::{Error, Result}; + +#[derive(Debug, Clone, Copy)] +struct CacheBudgets { + per_cost_cache: u64, + hard_barrier_cache: u64, + per_soft_barrier_cache: u64, +} + +pub(super) struct NeighborhoodReader { + cost_cache: ChunkCacheDecodedLruSizeLimit, + cost_invariant_cache: ChunkCacheDecodedLruSizeLimit, + hard_barrier_cache: ChunkCacheDecodedLruSizeLimit, + cumulative_soft_barrier_caches: Vec, + grid_nrows: u64, + grid_ncols: u64, +} + +impl NeighborhoodReader { + pub(super) fn open( + swap: ReadableWritableListableStorage, + cache_size: u64, + soft_barrier_group_count: usize, + layout: SourceLayout, + ) -> Result { + if cache_size < 1_000_000 { + warn!("Cache size smaller than 1MB"); + } + debug!( + "Creating caches with total size {}MB", + cache_size / 1_000_000 + ); + let cost_array_readable = + Arc::new(zarrs::array::Array::open(swap.clone(), "/cost")?.readable()); + let cost_invariant_array_readable = + Arc::new(zarrs::array::Array::open(swap.clone(), "/cost_invariant")?.readable()); + let hard_barrier_array_readable = + Arc::new(zarrs::array::Array::open(swap.clone(), "/hard_barrier_mask")?.readable()); + let cumulative_soft_barrier_arrays = (0..=soft_barrier_group_count) + .map(|retry_state| { + let path = format!("/{}", cumulative_soft_barrier_mask_name(retry_state)); + zarrs::array::Array::open(swap.clone(), &path) + .map_err(|err| Error::IO(std::io::Error::other(err.to_string()))) + .map(|array| Arc::new(array.readable())) + }) + .collect::>>()?; + + let budgets = distribute_cache_budgets(cache_size, cumulative_soft_barrier_arrays.len()); + debug!("Cache budgets: {:?}", budgets); + + let cost_cache = + ChunkCacheDecodedLruSizeLimit::new(cost_array_readable.clone(), budgets.per_cost_cache); + let cost_invariant_cache = ChunkCacheDecodedLruSizeLimit::new( + cost_invariant_array_readable.clone(), + budgets.per_cost_cache, + ); + let hard_barrier_cache = ChunkCacheDecodedLruSizeLimit::new( + hard_barrier_array_readable.clone(), + budgets.hard_barrier_cache, + ); + let cumulative_soft_barrier_caches = cumulative_soft_barrier_arrays + .into_iter() + .map(|array| ChunkCacheDecodedLruSizeLimit::new(array, budgets.per_soft_barrier_cache)) + .collect(); + + Ok(Self { + cost_cache, + cost_invariant_cache, + hard_barrier_cache, + cumulative_soft_barrier_caches, + grid_nrows: layout.grid_nrows, + grid_ncols: layout.grid_ncols, + }) + } + + pub(super) fn get_3x3( + &self, + index: &ArrayIndex, + has_hard_barriers: bool, + ensure_derived_data_for_subset: F, + ) -> Vec<(ArrayIndex, f32)> + where + F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), + { + let &ArrayIndex { i, j } = index; + + trace!("Getting 3x3 neighborhood for (i={}, j={})", i, j); + + trace!("Opening cost dataset via cache"); + let cost_array = self.cost_cache.array(); + trace!("Cost dataset with shape: {:?}", cost_array.shape()); + + let (i_range, j_range, subset) = self.neighborhood_subset(index); + trace!("Cost subset: {:?}", subset); + ensure_derived_data_for_subset(&cost_array, &subset); + + let neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, false); + let invariant_neighbors = + self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, true); + let hard_barrier_values: Vec = if has_hard_barriers { + self.hard_barrier_cache + .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) + .unwrap() + } else { + std::iter::repeat_n(false, neighbors.len()).collect() + }; + + let center = neighbors + .iter() + .zip(hard_barrier_values.iter()) + .find(|(((ir, jr), _), _)| *ir == i && *jr == j) + .map(|(((ir, jr), v), is_barrier)| { + if *is_barrier { + ((ir, jr), &0_f32, true) + } else if v.is_nan() { + ((ir, jr), &0_f32, false) + } else { + ((ir, jr), v, false) + } + }) + .unwrap(); + if center.2 { + return Vec::new(); + } + trace!("Center point: {:?}", center); + + let cost_to_neighbors = neighbors + .iter() + .zip(invariant_neighbors.iter()) + .zip(hard_barrier_values.iter()) + .filter(|((((ir, jr), v), _), is_barrier)| { + !(**is_barrier || v.is_nan() || (*ir == i && *jr == j)) + }) + .map(|((((ir, jr), v), ((inv_ir, inv_jr), inv_cost)), _)| { + debug_assert_eq!((ir, jr), (inv_ir, inv_jr)); + ((ir, jr), 0.5 * (v + center.1), inv_cost) + }) + .map(|((ir, jr), v, inv_cost)| { + let scaled = if *ir != i && *jr != j { + v * f32::sqrt(2.0) + } else { + v + }; + (ArrayIndex { i: *ir, j: *jr }, scaled + inv_cost) + }) + .collect::>(); + + trace!("Neighbors {:?}", cost_to_neighbors); + cost_to_neighbors + } + + pub(super) fn get_3x3_soft_barrier_cells( + &self, + index: &ArrayIndex, + retry_state: usize, + ensure_derived_data_for_subset: F, + ) -> Vec + where + F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), + { + self.get_3x3_cached_barrier_cells( + index, + &self.cumulative_soft_barrier_caches[retry_state], + ensure_derived_data_for_subset, + ) + } + + pub(super) fn grid_shape(&self) -> (u64, u64) { + (self.grid_nrows, self.grid_ncols) + } + + pub(super) fn neighborhood_subset( + &self, + index: &ArrayIndex, + ) -> ( + std::ops::Range, + std::ops::Range, + zarrs::array_subset::ArraySubset, + ) { + let &ArrayIndex { i, j } = index; + debug_assert!(self.grid_nrows > 0); + debug_assert!(self.grid_ncols > 0); + + let max_i = self.grid_nrows - 1; + let max_j = self.grid_ncols - 1; + + let i_range = match i { + 0 if max_i == 0 => 0..1, + 0 => 0..2, + _ if i == max_i => i - 1..i + 1, + _ => i - 1..i + 2, + }; + let j_range = match j { + 0 if max_j == 0 => 0..1, + 0 => 0..2, + _ if j == max_j => j - 1..j + 1, + _ => j - 1..j + 2, + }; + + let subset = zarrs::array_subset::ArraySubset::new_with_ranges(&[ + 0..1, + i_range.clone(), + j_range.clone(), + ]); + + (i_range, j_range, subset) + } + + pub(super) fn get_neighbor_costs( + &self, + i_range: std::ops::Range, + j_range: std::ops::Range, + subset: &zarrs::array_subset::ArraySubset, + is_invariant: bool, + ) -> Vec<((u64, u64), f32)> { + trace!("Opening cost dataset (is_invariant={})", is_invariant); + + let cache = if is_invariant { + &self.cost_invariant_cache + } else { + &self.cost_cache + }; + let cost_array = cache.array(); + trace!( + "Cost dataset (is_invariant={}) with shape: {:?}", + is_invariant, + cost_array.shape() + ); + + let cost_values: Vec = cache + .retrieve_array_subset_elements::(subset, &CodecOptions::default()) + .unwrap(); + + trace!("Read values {:?}", cost_values); + + let neighbor_costs = i_range + .flat_map(|row| iter::repeat(row).zip(j_range.clone())) + .zip(cost_values) + .collect(); + + trace!("Neighbors {:?}", neighbor_costs); + neighbor_costs + } + + fn get_3x3_cached_barrier_cells( + &self, + index: &ArrayIndex, + cache: &ChunkCacheDecodedLruSizeLimit, + ensure_derived_data_for_subset: F, + ) -> Vec + where + F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), + { + let (i_range, j_range, subset) = self.neighborhood_subset(index); + ensure_derived_data_for_subset(&cache.array(), &subset); + let barrier_values = cache + .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) + .unwrap(); + let mut barrier_cells = Vec::new(); + + for ((ir, jr), is_barrier) in i_range + .flat_map(|row| iter::repeat(row).zip(j_range.clone())) + .zip(barrier_values) + { + if is_barrier { + barrier_cells.push(ArrayIndex { i: ir, j: jr }); + } + } + + barrier_cells + } +} + +fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> CacheBudgets { + let per_cost_cache = (cache_size / 3).max(1); + let remaining_cache = cache_size.saturating_sub(2 * per_cost_cache).max(1); + let hard_barrier_cache = (remaining_cache / 2).max(1); + let soft_cache_budget = remaining_cache.saturating_sub(hard_barrier_cache).max(1); + + let per_soft_barrier_cache = if soft_barrier_cache_count == 0 { + 1 + } else { + (soft_cache_budget / soft_barrier_cache_count as u64).max(1) + }; + + CacheBudgets { + per_cost_cache, + hard_barrier_cache, + per_soft_barrier_cache, + } +} diff --git a/crates/revrt/src/dataset/state.rs b/crates/revrt/src/dataset/state.rs new file mode 100644 index 00000000..401c42e0 --- /dev/null +++ b/crates/revrt/src/dataset/state.rs @@ -0,0 +1,75 @@ +use std::sync::RwLock; + +use tracing::{debug, trace}; + +use ndarray::Array2; + +use super::swap::SourceLayout; + +pub(super) struct DerivedChunkState { + swap_chunk_idx: RwLock>, +} + +impl DerivedChunkState { + pub(super) fn new(layout: &SourceLayout) -> Self { + Self { + swap_chunk_idx: Array2::from_elem( + (layout.chunk_grid_rows, layout.chunk_grid_cols), + false, + ) + .into(), + } + } + + pub(super) fn ensure_derived_data_for_subset( + &self, + array: &zarrs::array::Array, + subset: &zarrs::array_subset::ArraySubset, + materialize_chunk: F, + ) where + F: Fn(u64, u64), + { + let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); + trace!("Derived-data chunks: {:?}", chunks); + trace!( + "Derived-data subset extends to {:?} chunks", + chunks.num_elements_usize() + ); + + for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { + for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { + trace!( + "Checking if derived data for chunk ({}, {}) has been calculated", + ci, cj + ); + if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { + trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); + continue; + } + + debug!("Requesting write lock for swap_chunk_idx ({}, {})", ci, cj); + let mut chunk_idx = self + .swap_chunk_idx + .write() + .expect("Failed to acquire write lock"); + debug!("Acquired write lock for swap_chunk_idx ({}, {})", ci, cj); + if chunk_idx[[ci as usize, cj as usize]] { + trace!( + "Derived data for chunk ({}, {}) already calculated while waiting for the lock", + ci, cj + ); + } else { + materialize_chunk(ci, cj); + chunk_idx[[ci as usize, cj as usize]] = true; + debug!( + "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", + ci, + cj, + chunk_idx.iter().filter(|&&value| value).count() + ); + } + debug!("Released write lock for swap_chunk_idx ({}, {})", ci, cj); + } + } + } +} diff --git a/crates/revrt/src/dataset/swap.rs b/crates/revrt/src/dataset/swap.rs index d218a224..92d245ef 100644 --- a/crates/revrt/src/dataset/swap.rs +++ b/crates/revrt/src/dataset/swap.rs @@ -1,6 +1,5 @@ use std::path::Path; -use ndarray::Array2; use tracing::{debug, trace}; use zarrs::array::ChunkGrid; use zarrs::storage::{ @@ -17,11 +16,6 @@ pub(super) struct SourceLayout { pub(super) grid_ncols: u64, } -pub(super) struct InitializedSwap { - pub(super) storage: ReadableWritableListableStorage, - pub(super) swap_chunk_idx: Array2, -} - pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result { let entries = source .list() @@ -82,13 +76,13 @@ pub(super) fn initialize_swap>( swap_path: P, layout: &SourceLayout, soft_barrier_group_count: usize, -) -> Result { +) -> Result { let swap: ReadableWritableListableStorage = std::sync::Arc::new( zarrs::filesystem::FilesystemStore::new(swap_path) .expect("could not open filesystem store"), ); - trace!("Creating a new group for the cost dataset"); + debug!("Creating a new group for the cost dataset"); zarrs::group::GroupBuilder::new() .build(swap.clone(), "/")? .store_metadata()?; @@ -104,10 +98,10 @@ pub(super) fn initialize_swap>( )?; } - Ok(InitializedSwap { - storage: swap, - swap_chunk_idx: Array2::from_elem((layout.chunk_grid_rows, layout.chunk_grid_cols), false), - }) + debug!("Swap dataset contents: {:?}", swap.list().unwrap()); + debug!("Swap dataset size: {:?}", swap.size().unwrap()); + + Ok(swap) } pub(super) fn cumulative_soft_barrier_mask_name(retry_state: usize) -> String { @@ -251,9 +245,6 @@ mod tests { let initialized_swap = initialize_swap(swap_dir.path(), &layout, 2).expect("swap initialization failed"); - assert_eq!(initialized_swap.swap_chunk_idx.shape(), &[2, 2]); - assert!(initialized_swap.swap_chunk_idx.iter().all(|value| !*value)); - let expected_layers = [ ("/cost", DataType::Float32), ("/cost_invariant", DataType::Float32), @@ -264,7 +255,7 @@ mod tests { ]; for (layer_name, expected_dtype) in expected_layers { - let array = zarrs::array::Array::open(initialized_swap.storage.clone(), layer_name) + let array = zarrs::array::Array::open(initialized_swap.clone(), layer_name) .unwrap_or_else(|_| panic!("expected layer {layer_name} to exist")); assert_eq!(array.shape(), &[1, 8, 8], "wrong shape for {layer_name}"); assert_eq!( From d003b32fa8ab42897f0010326ac3794b6bba0354 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:32:24 -0600 Subject: [PATCH 27/71] Docs --- crates/revrt/src/dataset/reader.rs | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index ea23736f..b6d0e57d 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -12,22 +12,34 @@ use crate::ArrayIndex; use crate::error::{Error, Result}; #[derive(Debug, Clone, Copy)] +/// Cache sizes assigned to each neighborhood reader dataset struct CacheBudgets { + /// Cache budget for the primary cost array per_cost_cache: u64, + /// Cache budget for the hard barrier mask hard_barrier_cache: u64, + /// Cache budget for each cumulative soft barrier mask per_soft_barrier_cache: u64, } +/// Cached access to derived 3x3 neighborhoods from the swap dataset pub(super) struct NeighborhoodReader { + /// Decoded chunk cache for the main per-cell routing cost cost_cache: ChunkCacheDecodedLruSizeLimit, + /// Decoded chunk cache for invariant movement costs cost_invariant_cache: ChunkCacheDecodedLruSizeLimit, + /// Decoded chunk cache for the hard barrier mask hard_barrier_cache: ChunkCacheDecodedLruSizeLimit, + /// Decoded chunk caches for cumulative soft barrier masks by retry state cumulative_soft_barrier_caches: Vec, + /// Number of rows in the routing grid grid_nrows: u64, + /// Number of columns in the routing grid grid_ncols: u64, } impl NeighborhoodReader { + /// Open cached readers for the derived swap arrays pub(super) fn open( swap: ReadableWritableListableStorage, cache_size: u64, @@ -84,6 +96,12 @@ impl NeighborhoodReader { }) } + /// Read the valid 3x3 neighborhood movement costs around an index + /// + /// The returned costs combine the directional cost surface, the + /// invariant movement penalty, diagonal scaling, and optional hard + /// barrier filtering. If the center cell is itself a hard barrier, + /// an empty vector is returned. pub(super) fn get_3x3( &self, index: &ArrayIndex, @@ -160,6 +178,7 @@ impl NeighborhoodReader { cost_to_neighbors } + /// Return soft barrier cells in the 3x3 neighborhood for a retry state pub(super) fn get_3x3_soft_barrier_cells( &self, index: &ArrayIndex, @@ -176,10 +195,15 @@ impl NeighborhoodReader { ) } + /// Return the grid shape backing this reader as `(rows, cols)` pub(super) fn grid_shape(&self) -> (u64, u64) { (self.grid_nrows, self.grid_ncols) } + /// Build the row and column ranges for a clipped 3x3 neighborhood + /// + /// The returned subset includes the leading band dimension expected by + /// the derived swap arrays. pub(super) fn neighborhood_subset( &self, index: &ArrayIndex, @@ -217,6 +241,10 @@ impl NeighborhoodReader { (i_range, j_range, subset) } + /// Read cost values for every cell in a neighborhood subset + /// + /// When `is_invariant` is true, values are read from the invariant cost + /// array. Otherwise values are read from the primary cost array. pub(super) fn get_neighbor_costs( &self, i_range: std::ops::Range, @@ -253,6 +281,7 @@ impl NeighborhoodReader { neighbor_costs } + /// Read barrier cells from a cached boolean neighborhood mask fn get_3x3_cached_barrier_cells( &self, index: &ArrayIndex, @@ -282,6 +311,16 @@ impl NeighborhoodReader { } } +/// Split the requested cache size across all neighborhood reader caches +/// +/// One third of `cache_size` is assigned to each of the two cost caches, +/// with a minimum of 1 byte per cache. The remaining budget is then split +/// in half: one half goes to the hard barrier cache and the other half is +/// reserved for all cumulative soft barrier caches. The soft barrier share +/// is divided evenly across `soft_barrier_cache_count`, again with a +/// minimum of 1 byte per cache. Saturating subtraction is used for the +/// remainder calculations so very small cache sizes still produce valid +/// nonzero budgets. fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> CacheBudgets { let per_cost_cache = (cache_size / 3).max(1); let remaining_cache = cache_size.saturating_sub(2 * per_cost_cache).max(1); From 181141a401bd890cddcbe5ac80819c90f10c7a60 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:36:37 -0600 Subject: [PATCH 28/71] Add tests --- crates/revrt/src/dataset/reader.rs | 293 +++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index b6d0e57d..a14602c1 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -339,3 +339,296 @@ fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> per_soft_barrier_cache, } } + +#[cfg(test)] +mod tests { + use std::f32::consts::SQRT_2; + use std::sync::Arc; + + use ndarray::Array3; + use tempfile::TempDir; + use test_case::test_case; + use zarrs::array::Array; + use zarrs::array_subset::ArraySubset; + use zarrs::filesystem::FilesystemStore; + use zarrs::storage::ReadableListableStorage; + + use super::*; + use crate::dataset::samples::{LayerConfig, ZarrTestBuilder}; + use crate::dataset::swap::{initialize_swap, inspect_source_layout}; + + #[test] + fn distribute_cache_budgets_splits_budget_across_cache_types() { + let budgets = distribute_cache_budgets(120, 4); + + assert_eq!(budgets.per_cost_cache, 40); + assert_eq!(budgets.hard_barrier_cache, 20); + assert_eq!(budgets.per_soft_barrier_cache, 5); + } + + #[test] + fn distribute_cache_budgets_keeps_nonzero_budgets_for_tiny_cache_sizes() { + let budgets = distribute_cache_budgets(1, 0); + + assert_eq!(budgets.per_cost_cache, 1); + assert_eq!(budgets.hard_barrier_cache, 1); + assert_eq!(budgets.per_soft_barrier_cache, 1); + } + + #[test_case(3, 3, 1, 1, 0..3, 0..3; "interior point")] + #[test_case(3, 3, 0, 0, 0..2, 0..2; "top left corner")] + #[test_case(3, 3, 2, 2, 1..3, 1..3; "bottom right corner")] + #[test_case(1, 1, 0, 0, 0..1, 0..1; "single cell grid")] + fn neighborhood_subset_clips_ranges_to_grid_bounds( + grid_nrows: u64, + grid_ncols: u64, + i: u64, + j: u64, + expected_i_range: std::ops::Range, + expected_j_range: std::ops::Range, + ) { + let reader = reader_for_grid(grid_nrows, grid_ncols); + + let (i_range, j_range, subset) = reader.neighborhood_subset(&ArrayIndex { i, j }); + + assert_eq!(i_range, expected_i_range.clone()); + assert_eq!(j_range, expected_j_range.clone()); + assert_eq!( + subset.shape(), + vec![ + 1, + expected_i_range.end - expected_i_range.start, + expected_j_range.end - expected_j_range.start, + ] + ); + } + + #[test] + fn get_3x3_combines_costs_invariant_costs_and_hard_barriers() { + let fixture = reader_fixture( + vec![1.0, 2.0, 3.0, 4.0, 5.0, f32::NAN, 7.0, 8.0, 9.0], + vec![1.0; 9], + vec![false, true, false, false, false, false, false, false, false], + vec![false; 9], + vec![true, false, false, false, false, false, false, true, false], + ); + + let neighbors = + fixture + .reader + .get_3x3(&ArrayIndex { i: 1, j: 1 }, true, |_array, _subset| {}); + + let expected = [ + (ArrayIndex { i: 0, j: 0 }, 3.0 * SQRT_2 + 1.0), + (ArrayIndex { i: 0, j: 2 }, 4.0 * SQRT_2 + 1.0), + (ArrayIndex { i: 1, j: 0 }, 5.5), + (ArrayIndex { i: 2, j: 0 }, 6.0 * SQRT_2 + 1.0), + (ArrayIndex { i: 2, j: 1 }, 7.5), + (ArrayIndex { i: 2, j: 2 }, 7.0 * SQRT_2 + 1.0), + ]; + + assert_eq!(neighbors.len(), expected.len()); + for ((index, value), (expected_index, expected_value)) in + neighbors.iter().zip(expected.iter()) + { + assert_eq!(index, expected_index); + assert!((value - expected_value).abs() < 1e-6); + } + } + + #[test] + fn get_3x3_returns_no_neighbors_when_center_cell_is_a_hard_barrier() { + let fixture = reader_fixture( + vec![1.0; 9], + vec![0.0; 9], + vec![false, false, false, false, true, false, false, false, false], + vec![false; 9], + vec![false; 9], + ); + + let neighbors = + fixture + .reader + .get_3x3(&ArrayIndex { i: 1, j: 1 }, true, |_array, _subset| {}); + + assert!(neighbors.is_empty()); + } + + #[test] + fn get_3x3_soft_barrier_cells_reads_retry_state_specific_mask() { + let fixture = reader_fixture( + vec![1.0; 9], + vec![0.0; 9], + vec![false; 9], + vec![false, true, false, false, false, false, true, false, false], + vec![true, false, false, false, false, false, false, true, false], + ); + + let retry_zero = fixture.reader.get_3x3_soft_barrier_cells( + &ArrayIndex { i: 1, j: 1 }, + 0, + |_array, _subset| {}, + ); + let retry_one = fixture.reader.get_3x3_soft_barrier_cells( + &ArrayIndex { i: 1, j: 1 }, + 1, + |_array, _subset| {}, + ); + + assert_eq!( + retry_zero, + vec![ArrayIndex { i: 0, j: 1 }, ArrayIndex { i: 2, j: 0 }] + ); + assert_eq!( + retry_one, + vec![ArrayIndex { i: 0, j: 0 }, ArrayIndex { i: 2, j: 1 }] + ); + } + + fn reader_for_grid(grid_nrows: u64, grid_ncols: u64) -> NeighborhoodReader { + let fixture = reader_fixture_with_shape( + grid_nrows, + grid_ncols, + vec![1.0; (grid_nrows * grid_ncols) as usize], + vec![0.0; (grid_nrows * grid_ncols) as usize], + vec![false; (grid_nrows * grid_ncols) as usize], + vec![false; (grid_nrows * grid_ncols) as usize], + vec![false; (grid_nrows * grid_ncols) as usize], + ); + fixture.reader + } + + fn reader_fixture( + cost_values: Vec, + invariant_values: Vec, + hard_barrier_values: Vec, + soft_retry_zero_values: Vec, + soft_retry_one_values: Vec, + ) -> ReaderFixture { + reader_fixture_with_shape( + 3, + 3, + cost_values, + invariant_values, + hard_barrier_values, + soft_retry_zero_values, + soft_retry_one_values, + ) + } + + fn reader_fixture_with_shape( + grid_nrows: u64, + grid_ncols: u64, + cost_values: Vec, + invariant_values: Vec, + hard_barrier_values: Vec, + soft_retry_zero_values: Vec, + soft_retry_one_values: Vec, + ) -> ReaderFixture { + let source_tmp = ZarrTestBuilder::new() + .dimensions(1, grid_nrows, grid_ncols) + .chunks(1, grid_nrows, grid_ncols) + .layer(LayerConfig::ones("source")) + .build() + .expect("failed to create source test dataset"); + let source: ReadableListableStorage = Arc::new( + FilesystemStore::new(source_tmp.path()).expect("could not open source test store"), + ); + let layout = + inspect_source_layout(&source).expect("source layout inspection should succeed"); + + let swap_tmp = TempDir::new().expect("could not create temporary swap"); + let swap = initialize_swap(swap_tmp.path(), &layout, 1) + .expect("swap initialization should succeed"); + + store_f32_layer(swap.clone(), "/cost", grid_nrows, grid_ncols, cost_values); + store_f32_layer( + swap.clone(), + "/cost_invariant", + grid_nrows, + grid_ncols, + invariant_values, + ); + store_bool_layer( + swap.clone(), + "/hard_barrier_mask", + grid_nrows, + grid_ncols, + hard_barrier_values, + ); + store_bool_layer( + swap.clone(), + "/soft_barrier_mask_retry_0", + grid_nrows, + grid_ncols, + soft_retry_zero_values, + ); + store_bool_layer( + swap.clone(), + "/soft_barrier_mask_retry_1", + grid_nrows, + grid_ncols, + soft_retry_one_values, + ); + + let reader = NeighborhoodReader::open(swap, 90, 1, layout).expect("reader should open"); + + ReaderFixture { + _source_tmp: source_tmp, + _swap_tmp: swap_tmp, + reader, + } + } + + fn store_f32_layer( + swap: ReadableWritableListableStorage, + path: &str, + grid_nrows: u64, + grid_ncols: u64, + values: Vec, + ) { + let data = + Array3::from_shape_vec((1_usize, grid_nrows as usize, grid_ncols as usize), values) + .expect("f32 layer values should match requested shape"); + let array = Array::open(swap, path).expect("expected f32 layer to exist"); + let subset = chunk_subset(&array); + + array + .store_chunks_ndarray(&subset, data) + .expect("could not store f32 layer data"); + } + + fn store_bool_layer( + swap: ReadableWritableListableStorage, + path: &str, + grid_nrows: u64, + grid_ncols: u64, + values: Vec, + ) { + let data = + Array3::from_shape_vec((1_usize, grid_nrows as usize, grid_ncols as usize), values) + .expect("bool layer values should match requested shape"); + let array = Array::open(swap, path).expect("expected bool layer to exist"); + let subset = chunk_subset(&array); + + array + .store_chunks_ndarray(&subset, data) + .expect("could not store bool layer data"); + } + + fn chunk_subset(array: &Array) -> ArraySubset { + let chunk_grid_shape = array.chunk_grid_shape(); + + ArraySubset::new_with_ranges(&[ + 0..chunk_grid_shape[0], + 0..chunk_grid_shape[1], + 0..chunk_grid_shape[2], + ]) + } + + struct ReaderFixture { + _source_tmp: TempDir, + _swap_tmp: TempDir, + reader: NeighborhoodReader, + } +} From 7e6c75bd9a54943545b4257a8388e7f6fa74a21c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:44:16 -0600 Subject: [PATCH 29/71] Docs --- crates/revrt/src/dataset/derived.rs | 108 ++++++++++++++++ crates/revrt/src/dataset/lazy_subset.rs | 81 ++++++++++-- crates/revrt/src/dataset/mod.rs | 162 +++++++++++++++++++++--- crates/revrt/src/dataset/reader.rs | 140 +++++++++++++++++--- crates/revrt/src/dataset/state.rs | 34 +++++ crates/revrt/src/dataset/swap.rs | 78 ++++++++++++ 6 files changed, 552 insertions(+), 51 deletions(-) diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index 37de58db..ddaff221 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -1,3 +1,10 @@ +//! Derived dataset materialization helpers +//! +//! This module is responsible for materializing derived arrays in the swap +//! dataset for a single chunk at a time. It computes invariant and +//! length-dependent cost layers, builds the hard barrier mask, and writes +//! cumulative soft barrier masks that can be reused across retry states. + use tracing::trace; use zarrs::storage::{ReadableListableStorage, ReadableWritableListableStorage}; @@ -5,15 +12,38 @@ use super::LazySubset; use super::swap::cumulative_soft_barrier_mask_name; use crate::cost::{BarrierLayer, CostFunction}; +/// Writes derived chunk-level arrays into the swap dataset. +/// +/// The writer keeps the source feature storage, the writable swap storage, +/// and the barrier groupings needed to derive all secondary arrays for a +/// given chunk. Barrier layers are separated from the cost function during +/// construction so the cost arrays and barrier masks can be derived +/// independently. pub(super) struct DerivedDataWriter { + /// Source storage containing the original feature arrays. source: ReadableListableStorage, + /// Writable swap storage where derived arrays are materialized. swap: ReadableWritableListableStorage, + /// Barrier layers that always behave as hard exclusions. hard_barrier_layers: Vec, + /// Soft barrier layers grouped by importance in ascending retry order. soft_barrier_groups: Vec<(u32, Vec)>, + /// Cost function stripped of barrier layers for numeric cost derivation. cost_function: CostFunction, } impl DerivedDataWriter { + /// Create a writer for materializing derived swap data. + /// + /// # Arguments + /// `source`: Storage containing the original input feature arrays. + /// `swap`: Writable storage that will receive derived arrays. + /// `cost_function`: Full cost function definition, including barrier + /// layers that will be separated into dedicated masks. + /// + /// # Returns + /// A `DerivedDataWriter` configured to compute cost arrays and barrier + /// masks for chunk-sized subsets. pub(super) fn new( source: ReadableListableStorage, swap: ReadableWritableListableStorage, @@ -32,6 +62,15 @@ impl DerivedDataWriter { } } + /// Materialize every derived array for a single chunk. + /// + /// This computes both cost layers and all barrier masks for the chunk + /// identified by the chunk-grid coordinates `ci` and `cj`, then stores + /// the results into the swap dataset. + /// + /// # Arguments + /// `ci`: Chunk row index in the swap dataset. + /// `cj`: Chunk column index in the swap dataset. pub(super) fn materialize_chunk(&self, ci: u64, cj: u64) { trace!("Creating a LazySubset for ({}, {})", ci, cj); @@ -47,14 +86,38 @@ impl DerivedDataWriter { self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); } + /// Return the hard barrier layers tracked by this writer. + /// + /// # Returns + /// A shared slice of barrier layers that should always be treated as + /// impassable. pub(super) fn hard_barrier_layers(&self) -> &[BarrierLayer] { &self.hard_barrier_layers } + /// Return the number of soft barrier importance groups. + /// + /// # Returns + /// The count of retry-state groups that can be progressively dropped + /// during routing retries. pub(super) fn soft_barrier_group_count(&self) -> usize { self.soft_barrier_groups.len() } + /// Compute and store one of the two chunk cost arrays. + /// + /// The cost function is evaluated either for invariant terms or for + /// length-dependent terms, and the result is written to the matching + /// destination array in the swap dataset. + /// + /// # Arguments + /// `ci`: Chunk row index in the swap dataset. + /// `cj`: Chunk column index in the swap dataset. + /// `features`: Lazily loaded source features for the target chunk. + /// `chunk_subset`: Chunk-shaped subset describing the destination region + /// in the swap dataset. + /// `is_invariant`: When true, compute only invariant cost terms; + /// otherwise compute length-dependent terms. fn calculate_chunk_cost_single_layer( &self, ci: u64, @@ -88,6 +151,17 @@ impl DerivedDataWriter { cost.store_chunks_ndarray(chunk_subset, output).unwrap(); } + /// Compute and store the hard barrier mask for a chunk. + /// + /// The output mask is the logical OR of all hard barrier layers. When no + /// hard barrier layers are configured, an all-false mask is stored so the + /// swap dataset maintains a consistent shape. + /// + /// # Arguments + /// `features`: Lazily loaded source features for the target chunk. + /// `subset`: Source-data subset used to evaluate the barrier layers. + /// `chunk_subset`: Chunk-shaped subset describing where the output mask + /// should be written in the swap dataset. fn calculate_chunk_hard_barrier_mask( &self, features: &mut LazySubset, @@ -120,6 +194,18 @@ impl DerivedDataWriter { variable.store_chunks_ndarray(chunk_subset, output).unwrap(); } + /// Compute and store cumulative soft barrier masks for every retry state. + /// + /// Soft barriers are grouped by importance. For each retry state, this + /// method combines the masks for the remaining groups so routing can + /// progressively relax the least important barriers while reusing the same + /// derived dataset. + /// + /// # Arguments + /// `features`: Lazily loaded source features for the target chunk. + /// `subset`: Source-data subset used to evaluate the barrier layers. + /// `chunk_subset`: Chunk-shaped subset describing where each output mask + /// should be written in the swap dataset. fn calculate_chunk_cumulative_soft_barrier_masks( &self, features: &mut LazySubset, @@ -159,6 +245,14 @@ impl DerivedDataWriter { } } +/// Create an all-false boolean mask for a subset shape. +/// +/// # Arguments +/// `subset`: Subset whose shape should be mirrored in the output mask. +/// +/// # Returns +/// A boolean array with the same dimensionality as `subset`, initialized to +/// `false` in every cell. fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD { ndarray::ArrayD::::from_elem( ndarray::IxDyn( @@ -172,6 +266,20 @@ fn empty_bool_mask(subset: &zarrs::array_subset::ArraySubset) -> ndarray::ArrayD ) } +/// Combine multiple barrier layers into a single mask for a subset. +/// +/// The returned mask is the logical OR of every barrier layer evaluated for +/// the provided subset. If `barrier_layers` is empty, the function returns +/// `None` so callers can decide how to handle the absence of barriers. +/// +/// # Arguments +/// `barrier_layers`: Barrier layer definitions to evaluate. +/// `features`: Lazily loaded source features for the target subset. +/// `subset`: Subset whose shape should be used for the output mask. +/// +/// # Returns +/// `Some(mask)` containing the combined barrier mask when at least one layer +/// is provided, or `None` when there is nothing to combine. fn combine_barrier_layers_for_subset( barrier_layers: &[BarrierLayer], features: &mut LazySubset, diff --git a/crates/revrt/src/dataset/lazy_subset.rs b/crates/revrt/src/dataset/lazy_subset.rs index 40903851..5005ea7b 100644 --- a/crates/revrt/src/dataset/lazy_subset.rs +++ b/crates/revrt/src/dataset/lazy_subset.rs @@ -57,7 +57,14 @@ impl fmt::Display for LazySubset { } } impl LazySubset { - /// Create a new LazySubset for a given source and subset. + /// Create a lazy subset for a fixed source and array subset. + /// + /// # Arguments + /// `source`: Source storage containing the variables to load lazily. + /// `subset`: Fixed subset that will be read from each requested variable. + /// + /// # Returns + /// A `LazySubset` with an empty per-variable cache. pub(super) fn new(source: ReadableListableStorage, subset: ArraySubset) -> Self { trace!("Creating LazySubset for subset: {:?}", subset); @@ -68,14 +75,31 @@ impl LazySubset { } } - /// Show the subset used by this LazySubset. + /// Return the fixed subset covered by this lazy view. + /// + /// # Returns + /// A shared reference to the `ArraySubset` used for all variable reads. pub(crate) fn subset(&self) -> &ArraySubset { &self.subset } } impl LazySubset { - /// Get a data for a specific variable. + /// Load or return cached data for a variable as `f32` values. + /// + /// If the variable has already been requested for this subset, the cached + /// ndarray is cloned from the internal map. Otherwise the variable is + /// opened from storage, converted to `f32` if needed, cached, and returned. + /// + /// # Arguments + /// `varname`: Name of the source variable to retrieve. + /// + /// # Returns + /// The requested subset data converted to an `ndarray` of `f32` values. + /// + /// # Errors + /// Returns an error if the layer cannot be opened, read, or converted from + /// an unsupported source data type. pub(crate) fn get( &mut self, varname: &str, @@ -111,6 +135,22 @@ impl LazySubset { Ok(data) } + /// Load a variable subset and normalize it to `f32` values. + /// + /// Supported numeric source types are converted with a simple cast. Any + /// unsupported data type results in an error that names the offending + /// layer. + /// + /// # Arguments + /// `variable`: Open source array to read from. + /// `varname`: Variable name used for error reporting. + /// + /// # Returns + /// The requested subset as an `ndarray` of `f32` values. + /// + /// # Errors + /// Returns an error if the variable data type is unsupported or the subset + /// cannot be read. fn load_as_f32( &self, variable: &Array, @@ -156,6 +196,18 @@ impl LazySubset { } } + /// Retrieve a typed subset and convert it element-wise to `f32`. + /// + /// # Arguments + /// `variable`: Open source array to read from. + /// `varname`: Variable name used for error reporting. + /// `converter`: Conversion applied to each retrieved element. + /// + /// # Returns + /// The requested subset converted to an `ndarray` of `f32` values. + /// + /// # Errors + /// Returns an error if the subset cannot be retrieved from storage. fn retrieve_and_convert( &self, variable: &Array, @@ -215,11 +267,14 @@ mod tests { } #[allow(dead_code)] -/// Trait defining types that can be used as LazySubset element types +/// Trait describing element types supported by `AsyncLazySubset`. +/// +/// Implementors define how values loaded from `f32` or `f64` arrays should be +/// converted into the target cached element type. trait LazySubsetElement: ElementOwned + Clone + Send + Sync { - /// Convert from f32 + /// Convert a `f32` value into the target element type. fn from_f32(value: f32) -> Self; - /// Convert from f64 + /// Convert a `f64` value into the target element type. fn from_f64(value: f64) -> Self; } @@ -250,12 +305,11 @@ impl LazySubsetElement for f64 { /// multiple variables of a Zarr Dataset. // pub struct AsyncLazySubset { struct AsyncLazySubset { - /// Source Zarr storage + /// Async source storage used to open variables on demand. source: AsyncReadableListableStorage, - /// Subset of the source to be lazily loaded + /// Fixed subset to read from each requested variable. subset: ArraySubset, - /// Cached data with RwLock for concurrent access - // Eventually refactor this into a new type: cache + /// Cached subset data guarded by an async read-write lock. #[allow(clippy::type_complexity)] data: Arc< RwLock< @@ -268,12 +322,14 @@ struct AsyncLazySubset { } impl fmt::Display for AsyncLazySubset { + /// Format the async lazy subset for logs and diagnostics. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "AsyncLazySubset {{ subset: {:?}, ... }}", self.subset) } } impl fmt::Debug for AsyncLazySubset { + /// Format the async lazy subset with subset and element-type details. fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("AsyncLazySubset") .field("subset", &self.subset) @@ -302,7 +358,10 @@ impl AsyncLazySubset { } } - /// Get the subset used by this AsyncLazySubset. + /// Return the fixed subset covered by this async lazy view. + /// + /// # Returns + /// A shared reference to the `ArraySubset` used for all variable reads. fn subset(&self) -> &ArraySubset { &self.subset } diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 6dbb0b24..d434e86a 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -1,18 +1,18 @@ //! Source Dataset Access //! -//! This module focus on accessing the input features data that are used by -//! the cost function. +//! This module manages access to the input feature data used during routing. //! -//! We are currently based on Zarr but we might move this to a generalized -//! backend on the future to access different data formats. +//! It is built around Zarr-backed source arrays together with a temporary +//! swap dataset that stores derived cost and barrier layers. The public +//! surface of the module focuses on opening datasets, materializing derived +//! chunks on demand, and returning 3x3 neighborhoods suitable for routing. //! -//! The main benefits of using Zarr in the moment are the natural support -//! to concurrent access to multiple chunks, async support, rich metadata, -//! and up to a 20x factor on size reduction (mostly due to efficient -//! compression and constant values within the same chunk). +//! Zarr is currently a good fit because it supports concurrent chunk access, +//! rich metadata, and efficient compression for large raster-like grids. //! -//! Note: This is currently in a transition state. The initial prototype -//! included the cost function, which was removed to the `Scenario` level. +//! Note: This module is still in a transition state. The initial prototype +//! included the cost function directly here, but cost-function ownership was +//! moved up to the `Scenario` level. mod derived; mod lazy_subset; @@ -36,27 +36,47 @@ use reader::NeighborhoodReader; use state::DerivedChunkState; use swap::{initialize_swap, inspect_source_layout}; -/// Manages the features datasets and calculated total cost +/// Manage source features together with derived swap-backed routing data. +/// +/// A `Dataset` owns access to the original feature store, the temporary swap +/// dataset, the chunk-materialization state, and the cached readers used to +/// serve routing neighborhoods. Derived arrays are created lazily, chunk by +/// chunk, the first time a neighborhood read requires them. pub(super) struct Dataset { - /// A Zarr storages with the features + /// Zarr storage containing the original feature arrays. #[allow(dead_code)] source: ReadableListableStorage, - // Silly way to keep the tmp path alive + /// Temporary directory backing the swap dataset when one is auto-created. + /// + /// This is stored only to keep the directory alive for the lifetime of + /// the dataset handle. #[allow(dead_code)] cost_path: Option, - /// State tracking which swap chunks have already been materialized - /// Internally this is a boolean array of the same shape as the chunk grid, - /// where a true value means the data has been derived + /// State tracking which swap chunks have already been materialized. + /// + /// Internally this mirrors the source chunk grid as a boolean array where + /// `true` means the corresponding derived swap chunk has already been + /// computed. derived_chunk_state: DerivedChunkState, - /// Writer responsible for materializing derived chunk data into swap + /// Writer responsible for materializing derived chunk data into swap. derived_data_writer: DerivedDataWriter, - /// Reader responsible for cached neighborhood access to derived data + /// Reader responsible for cached neighborhood access to derived data. neighborhood_reader: NeighborhoodReader, - /// Shape of data grid + /// Shape of the source routing grid as `(rows, cols)`. pub(super) grid_shape: (u64, u64), } impl Dataset { + /// Open a dataset using an automatically managed temporary swap directory. + /// + /// # Arguments + /// `path`: Filesystem path to the source Zarr dataset. + /// `cost_function`: Cost function definition used to derive cost and + /// barrier arrays. + /// `cache_size`: Total cache budget, in bytes, for neighborhood readers. + /// + /// # Returns + /// A `Dataset` backed by the source store and a new temporary swap store. pub(super) fn open>( path: P, cost_function: CostFunction, @@ -71,6 +91,17 @@ impl Dataset { Ok(dataset) } + /// Open a dataset using an existing or caller-provided swap path. + /// + /// # Arguments + /// `path`: Filesystem path to the source Zarr dataset. + /// `cost_function`: Cost function definition used to derive cost and + /// barrier arrays. + /// `cache_size`: Total cache budget, in bytes, for neighborhood readers. + /// `swap_fp`: Filesystem path where the swap dataset should be created. + /// + /// # Returns + /// A `Dataset` backed by the source store and the specified swap path. pub(super) fn open_with_swap>( path: P, cost_function: CostFunction, @@ -80,6 +111,21 @@ impl Dataset { Self::open_with_path(path, cost_function, cache_size, swap_fp) } + /// Open a dataset using the provided swap path and initialize internals. + /// + /// This helper inspects the source layout, initializes the swap dataset, + /// prepares chunk-derivation tracking, and builds the cached neighborhood + /// readers. + /// + /// # Arguments + /// `path`: Filesystem path to the source Zarr dataset. + /// `cost_function`: Cost function definition used to derive cost and + /// barrier arrays. + /// `cache_size`: Total cache budget, in bytes, for neighborhood readers. + /// `swap_fp`: Filesystem path where the swap dataset should be created. + /// + /// # Returns + /// A fully initialized `Dataset` ready to serve routing neighborhoods. fn open_with_path>( path: P, cost_function: CostFunction, @@ -119,6 +165,17 @@ impl Dataset { }) } + /// Return reachable movement costs in the 3x3 neighborhood of an index. + /// + /// Derived data is materialized on demand for the needed swap chunks + /// before the neighborhood is read. + /// + /// # Arguments + /// `index`: Center cell whose 3x3 neighborhood should be queried. + /// + /// # Returns + /// A vector of neighboring indices paired with movement costs from the + /// center cell. pub(super) fn get_3x3(&self, index: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { self.neighborhood_reader.get_3x3( index, @@ -127,6 +184,19 @@ impl Dataset { ) } + /// Return soft-barrier cells in the 3x3 neighborhood of an index. + /// + /// The number of dropped soft groups is clamped to the available retry + /// states before the matching cumulative soft barrier mask is queried. + /// + /// # Arguments + /// `index`: Center cell whose 3x3 neighborhood should be queried. + /// `dropped_soft_groups`: Number of soft barrier groups that have already + /// been relaxed for the current retry state. + /// + /// # Returns + /// A vector of neighborhood cells that remain soft barriers for the + /// selected retry state. pub(super) fn get_3x3_soft_barrier_cells( &self, index: &ArrayIndex, @@ -140,6 +210,14 @@ impl Dataset { }) } + /// Ensure all derived swap data exists for a requested subset. + /// + /// Any chunk overlapped by `subset` is materialized exactly once through + /// the tracked chunk state before cached neighborhood reads proceed. + /// + /// # Arguments + /// `array`: Swap array whose subset is about to be accessed. + /// `subset`: Requested subset within the swap array. fn ensure_derived_data_for_subset( &self, array: &zarrs::array::Array, @@ -152,16 +230,33 @@ impl Dataset { } #[cfg(test)] + /// Return the extracted hard barrier layers for assertions in tests. + /// + /// # Returns + /// A shared slice of hard barrier layers owned by the derived data writer. pub(super) fn hard_barrier_layers(&self) -> &[crate::cost::BarrierLayer] { self.derived_data_writer.hard_barrier_layers() } #[cfg(test)] + /// Return the number of soft barrier importance groups in tests. + /// + /// # Returns + /// The number of distinct retry states backed by cumulative soft barrier + /// masks, excluding the final fully relaxed state calculation details. pub(super) fn soft_barrier_group_count(&self) -> usize { self.derived_data_writer.soft_barrier_group_count() } #[cfg(test)] + /// Delegate neighborhood-subset construction for test assertions. + /// + /// # Arguments + /// `index`: Center cell whose neighborhood bounds should be computed. + /// + /// # Returns + /// The clipped row range, clipped column range, and matching swap-array + /// subset for the requested neighborhood. fn neighborhood_subset( &self, index: &ArrayIndex, @@ -174,6 +269,16 @@ impl Dataset { } #[cfg(test)] + /// Delegate neighborhood cost reads for test assertions. + /// + /// # Arguments + /// `i_range`: Row range covering the neighborhood. + /// `j_range`: Column range covering the neighborhood. + /// `subset`: Swap-array subset to read. + /// `is_invariant`: Whether to read the invariant cost array. + /// + /// # Returns + /// A vector pairing neighborhood coordinates with their cached cost values. fn get_neighbor_costs( &self, i_range: std::ops::Range, @@ -186,6 +291,17 @@ impl Dataset { } #[cfg(test)] + /// Build explicit barrier cells directly from barrier layers for tests. + /// + /// This bypasses the cached swap masks so tests can compare the direct + /// barrier interpretation of source features against derived swap output. + /// + /// # Arguments + /// `index`: Center cell whose 3x3 neighborhood should be inspected. + /// `barrier_layers`: Barrier layers to evaluate directly from source data. + /// + /// # Returns + /// A vector of neighborhood cells where any provided barrier layer is true. pub(super) fn get_3x3_barrier_cells( &self, index: &ArrayIndex, @@ -219,10 +335,14 @@ impl Dataset { } #[cfg(test)] -/// Make a LazySubset from a source and array subset to be used in tests +/// Construct a `LazySubset` helper for tests. +/// +/// # Arguments +/// `source`: Source dataset storage to read from lazily. +/// `subset`: Array subset that bounds the lazy view. /// /// # Returns -/// An initialized LazySubset instance. +/// An initialized `LazySubset` instance. pub(crate) fn make_lazy_subset_for_tests( source: ReadableListableStorage, subset: zarrs::array_subset::ArraySubset, diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index a14602c1..ee1848e2 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -1,3 +1,9 @@ +//! Cached readers for derived neighborhood data +//! +//! This module provides read access to chunk-cached derived arrays stored in +//! the swap dataset. It focuses on retrieving clipped 3x3 neighborhoods for +//! routing, including cost surfaces, invariant penalties, and barrier masks. + use std::iter; use std::sync::Arc; @@ -12,34 +18,59 @@ use crate::ArrayIndex; use crate::error::{Error, Result}; #[derive(Debug, Clone, Copy)] -/// Cache sizes assigned to each neighborhood reader dataset +/// Cache sizes assigned to each neighborhood reader dataset. +/// +/// The cache budget is split between the two cost arrays, the hard barrier +/// mask, and the family of cumulative soft barrier masks so neighborhood +/// lookups can reuse decoded chunks efficiently. struct CacheBudgets { - /// Cache budget for the primary cost array + /// Cache budget for the primary cost array. per_cost_cache: u64, - /// Cache budget for the hard barrier mask + /// Cache budget for the hard barrier mask. hard_barrier_cache: u64, - /// Cache budget for each cumulative soft barrier mask + /// Cache budget for each cumulative soft barrier mask. per_soft_barrier_cache: u64, } -/// Cached access to derived 3x3 neighborhoods from the swap dataset +/// Cached access to derived 3x3 neighborhoods from the swap dataset. +/// +/// The reader keeps decoded chunk caches for each derived array needed during +/// routing so repeated neighborhood lookups can avoid reopening and decoding +/// the same swap chunks. pub(super) struct NeighborhoodReader { - /// Decoded chunk cache for the main per-cell routing cost + /// Decoded chunk cache for the main per-cell routing cost. cost_cache: ChunkCacheDecodedLruSizeLimit, - /// Decoded chunk cache for invariant movement costs + /// Decoded chunk cache for invariant movement costs. cost_invariant_cache: ChunkCacheDecodedLruSizeLimit, - /// Decoded chunk cache for the hard barrier mask + /// Decoded chunk cache for the hard barrier mask. hard_barrier_cache: ChunkCacheDecodedLruSizeLimit, - /// Decoded chunk caches for cumulative soft barrier masks by retry state + /// Decoded chunk caches for cumulative soft barrier masks by retry state. cumulative_soft_barrier_caches: Vec, - /// Number of rows in the routing grid + /// Number of rows in the routing grid. grid_nrows: u64, - /// Number of columns in the routing grid + /// Number of columns in the routing grid. grid_ncols: u64, } impl NeighborhoodReader { - /// Open cached readers for the derived swap arrays + /// Open cached readers for the derived swap arrays. + /// + /// This initializes one decoded chunk cache per derived array used during + /// routing and records the grid dimensions needed to clip neighborhood + /// lookups at dataset boundaries. + /// + /// # Arguments + /// `swap`: Writable swap storage that already contains the derived arrays. + /// `cache_size`: Total cache budget, in bytes, to distribute across all + /// internal chunk caches. + /// `soft_barrier_group_count`: Number of soft barrier importance groups, + /// used to determine how many cumulative mask + /// caches are required. + /// `layout`: Source grid layout metadata used to record dataset shape. + /// + /// # Returns + /// A `NeighborhoodReader` with initialized chunk caches for every derived + /// neighborhood array. pub(super) fn open( swap: ReadableWritableListableStorage, cache_size: u64, @@ -96,12 +127,24 @@ impl NeighborhoodReader { }) } - /// Read the valid 3x3 neighborhood movement costs around an index + /// Read the valid 3x3 neighborhood movement costs around an index. /// /// The returned costs combine the directional cost surface, the /// invariant movement penalty, diagonal scaling, and optional hard /// barrier filtering. If the center cell is itself a hard barrier, /// an empty vector is returned. + /// + /// # Arguments + /// `index`: Grid index whose neighborhood should be read. + /// `has_hard_barriers`: Whether the hard barrier mask should be consulted + /// while filtering candidate neighbors. + /// `ensure_derived_data_for_subset`: Callback that materializes the + /// required swap chunks before the cached + /// read occurs. + /// + /// # Returns + /// A vector of reachable neighboring indices paired with movement costs + /// from the center cell to each neighbor. pub(super) fn get_3x3( &self, index: &ArrayIndex, @@ -178,7 +221,22 @@ impl NeighborhoodReader { cost_to_neighbors } - /// Return soft barrier cells in the 3x3 neighborhood for a retry state + /// Return soft barrier cells in the 3x3 neighborhood for a retry state. + /// + /// The retry state selects which cumulative soft barrier mask should be + /// consulted. Higher retry states correspond to progressively more relaxed + /// soft barrier constraints. + /// + /// # Arguments + /// `index`: Grid index whose neighborhood should be inspected. + /// `retry_state`: Index into the cumulative soft barrier mask caches. + /// `ensure_derived_data_for_subset`: Callback that materializes the + /// required swap chunks before the cached + /// read occurs. + /// + /// # Returns + /// A vector containing the neighborhood cells marked as soft barriers for + /// the selected retry state. pub(super) fn get_3x3_soft_barrier_cells( &self, index: &ArrayIndex, @@ -195,15 +253,25 @@ impl NeighborhoodReader { ) } - /// Return the grid shape backing this reader as `(rows, cols)` + /// Return the grid shape backing this reader as `(rows, cols)`. + /// + /// # Returns + /// The routing grid dimensions recorded when the reader was opened. pub(super) fn grid_shape(&self) -> (u64, u64) { (self.grid_nrows, self.grid_ncols) } - /// Build the row and column ranges for a clipped 3x3 neighborhood + /// Build the row and column ranges for a clipped 3x3 neighborhood. /// /// The returned subset includes the leading band dimension expected by /// the derived swap arrays. + /// + /// # Arguments + /// `index`: Center grid index for the requested neighborhood. + /// + /// # Returns + /// A tuple containing the clipped row range, clipped column range, and + /// the corresponding swap-array subset including the leading band axis. pub(super) fn neighborhood_subset( &self, index: &ArrayIndex, @@ -241,10 +309,21 @@ impl NeighborhoodReader { (i_range, j_range, subset) } - /// Read cost values for every cell in a neighborhood subset + /// Read cost values for every cell in a neighborhood subset. /// /// When `is_invariant` is true, values are read from the invariant cost /// array. Otherwise values are read from the primary cost array. + /// + /// # Arguments + /// `i_range`: Row indices covered by the neighborhood subset. + /// `j_range`: Column indices covered by the neighborhood subset. + /// `subset`: Swap-array subset to read from the selected cache. + /// `is_invariant`: Whether to read from the invariant cost cache instead + /// of the primary cost cache. + /// + /// # Returns + /// A vector pairing each neighborhood cell coordinate with the decoded + /// cost value read from the selected cache. pub(super) fn get_neighbor_costs( &self, i_range: std::ops::Range, @@ -281,7 +360,21 @@ impl NeighborhoodReader { neighbor_costs } - /// Read barrier cells from a cached boolean neighborhood mask + /// Read barrier cells from a cached boolean neighborhood mask. + /// + /// This helper is shared by hard and soft barrier lookups. It materializes + /// the necessary derived data, reads the boolean neighborhood mask from the + /// provided cache, and returns the coordinates of every barrier cell. + /// + /// # Arguments + /// `index`: Center grid index for the neighborhood lookup. + /// `cache`: Chunk cache for the barrier mask to inspect. + /// `ensure_derived_data_for_subset`: Callback that materializes the + /// required swap chunks before the cached + /// read occurs. + /// + /// # Returns + /// A vector of neighborhood indices whose cached mask value is `true`. fn get_3x3_cached_barrier_cells( &self, index: &ArrayIndex, @@ -311,7 +404,7 @@ impl NeighborhoodReader { } } -/// Split the requested cache size across all neighborhood reader caches +/// Split the requested cache size across all neighborhood reader caches. /// /// One third of `cache_size` is assigned to each of the two cost caches, /// with a minimum of 1 byte per cache. The remaining budget is then split @@ -321,6 +414,15 @@ impl NeighborhoodReader { /// minimum of 1 byte per cache. Saturating subtraction is used for the /// remainder calculations so very small cache sizes still produce valid /// nonzero budgets. +/// +/// # Arguments +/// `cache_size`: Total cache budget, in bytes. +/// `soft_barrier_cache_count`: Number of cumulative soft barrier caches that +/// need a share of the remaining budget. +/// +/// # Returns +/// A `CacheBudgets` value containing the per-cache allocations used to build +/// the neighborhood reader. fn distribute_cache_budgets(cache_size: u64, soft_barrier_cache_count: usize) -> CacheBudgets { let per_cost_cache = (cache_size / 3).max(1); let remaining_cache = cache_size.saturating_sub(2 * per_cost_cache).max(1); diff --git a/crates/revrt/src/dataset/state.rs b/crates/revrt/src/dataset/state.rs index 401c42e0..d29b8e04 100644 --- a/crates/revrt/src/dataset/state.rs +++ b/crates/revrt/src/dataset/state.rs @@ -1,3 +1,8 @@ +//! Derived chunk materialization state +//! +//! This module tracks which swap chunks have already been derived so repeated +//! neighborhood reads can avoid recomputing the same cost and barrier data. + use std::sync::RwLock; use tracing::{debug, trace}; @@ -6,11 +11,26 @@ use ndarray::Array2; use super::swap::SourceLayout; +/// Track which swap chunks have already been materialized. +/// +/// The internal boolean grid mirrors the source chunk layout. A value of +/// `true` means the corresponding derived swap chunk has already been written +/// and does not need to be recomputed. pub(super) struct DerivedChunkState { + /// Boolean materialization state indexed by chunk row and chunk column. swap_chunk_idx: RwLock>, } impl DerivedChunkState { + /// Create an empty materialization-state grid for a source layout. + /// + /// # Arguments + /// `layout`: Source layout whose chunk-grid dimensions determine the size + /// of the internal tracking array. + /// + /// # Returns + /// A `DerivedChunkState` initialized with all chunks marked as not yet + /// materialized. pub(super) fn new(layout: &SourceLayout) -> Self { Self { swap_chunk_idx: Array2::from_elem( @@ -21,6 +41,20 @@ impl DerivedChunkState { } } + /// Materialize any missing derived chunks overlapping a subset. + /// + /// This method first determines which chunk-grid cells intersect the + /// requested subset. Each chunk is checked under a read lock and, when + /// still missing, rechecked under a write lock before invoking the + /// provided `materialize_chunk` callback. This avoids duplicate work when + /// multiple threads request the same chunk concurrently. + /// + /// # Arguments + /// `array`: Swap array whose chunk grid is used to map the subset to + /// chunk indices. + /// `subset`: Requested array subset that may span one or more chunks. + /// `materialize_chunk`: Callback that computes and writes the derived data + /// for a given chunk row and column index. pub(super) fn ensure_derived_data_for_subset( &self, array: &zarrs::array::Array, diff --git a/crates/revrt/src/dataset/swap.rs b/crates/revrt/src/dataset/swap.rs index 92d245ef..b55f5ef7 100644 --- a/crates/revrt/src/dataset/swap.rs +++ b/crates/revrt/src/dataset/swap.rs @@ -1,3 +1,9 @@ +//! Swap dataset initialization helpers +//! +//! This module inspects the source dataset to recover the grid and chunk +//! layout needed by routing, then creates a temporary swap dataset with the +//! derived arrays used during neighborhood expansion. + use std::path::Path; use tracing::{debug, trace}; @@ -8,14 +14,36 @@ use zarrs::storage::{ use crate::error::{Error, Result}; +/// Grid and chunk metadata derived from the source dataset. +/// +/// The swap dataset mirrors the representative source array layout so all +/// derived cost and barrier arrays align with the original feature data. pub(super) struct SourceLayout { + /// Chunk grid definition copied from the representative source array. pub(super) chunk_grid: ChunkGrid, + /// Number of chunk rows in the source grid. pub(super) chunk_grid_rows: usize, + /// Number of chunk columns in the source grid. pub(super) chunk_grid_cols: usize, + /// Number of rows in the full source grid. pub(super) grid_nrows: u64, + /// Number of columns in the full source grid. pub(super) grid_ncols: u64, } +/// Inspect the source dataset and recover the layout used for swap storage. +/// +/// A representative non-coordinate variable is selected from the source store +/// and used to infer the full grid shape and chunk grid. Coordinate-like +/// arrays such as latitude, longitude, and spatial reference metadata are +/// ignored during selection. +/// +/// # Arguments +/// `source`: Source dataset storage containing the input feature arrays. +/// +/// # Returns +/// A `SourceLayout` describing the representative array's grid and chunking, +/// which is then reused when creating swap arrays. pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result { let entries = source .list() @@ -72,6 +100,22 @@ pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result< Ok(layout) } +/// Create and initialize the derived swap dataset. +/// +/// The swap dataset contains floating-point cost arrays and boolean barrier +/// masks with the same chunk structure as the representative source array. +/// One cumulative soft barrier mask is created for each retry state, including +/// the initial state where no soft barrier groups have been dropped. +/// +/// # Arguments +/// `swap_path`: Filesystem location where the swap dataset should be created. +/// `layout`: Grid and chunk metadata copied from the source dataset. +/// `soft_barrier_group_count`: Number of soft barrier importance groups, +/// which determines how many cumulative retry +/// masks must be created. +/// +/// # Returns +/// A readable and writable storage handle for the initialized swap dataset. pub(super) fn initialize_swap>( swap_path: P, layout: &SourceLayout, @@ -104,10 +148,31 @@ pub(super) fn initialize_swap>( Ok(swap) } +/// Build the array name for a cumulative soft barrier retry mask. +/// +/// # Arguments +/// `retry_state`: Retry-state index whose cumulative mask name should be +/// constructed. +/// +/// # Returns +/// The swap-array name used to store the cumulative soft barrier mask for the +/// requested retry state. pub(super) fn cumulative_soft_barrier_mask_name(retry_state: usize) -> String { format!("soft_barrier_mask_retry_{retry_state}") } +/// Add a floating-point derived layer to the swap dataset. +/// +/// The created array uses the source chunk grid, a leading `band` dimension, +/// and a `NaN` fill value so unread cells default to an invalid routing cost. +/// +/// # Arguments +/// `layer_name`: Name of the derived layer to create. +/// `chunk_shape`: Chunk grid copied from the representative source array. +/// `swap`: Swap dataset storage that will receive the new array. +/// +/// # Returns +/// `Ok(())` after the array metadata has been written successfully. fn add_layer_to_data( layer_name: &str, chunk_shape: &ChunkGrid, @@ -138,6 +203,19 @@ fn add_layer_to_data( Ok(()) } +/// Add a boolean derived layer to the swap dataset. +/// +/// The created array uses the source chunk grid, a leading `band` dimension, +/// and an all-`false` fill value so barriers are absent until explicitly +/// materialized for a chunk. +/// +/// # Arguments +/// `layer_name`: Name of the boolean mask layer to create. +/// `chunk_shape`: Chunk grid copied from the representative source array. +/// `swap`: Swap dataset storage that will receive the new array. +/// +/// # Returns +/// `Ok(())` after the array metadata has been written successfully. fn add_bool_layer_to_data( layer_name: &str, chunk_shape: &ChunkGrid, From 2ae6c1a807d36a82022c7022dee7a77f0f5e900e Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:47:22 -0600 Subject: [PATCH 30/71] Add tests --- crates/revrt/src/dataset/state.rs | 81 +++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/crates/revrt/src/dataset/state.rs b/crates/revrt/src/dataset/state.rs index d29b8e04..0947daf9 100644 --- a/crates/revrt/src/dataset/state.rs +++ b/crates/revrt/src/dataset/state.rs @@ -107,3 +107,84 @@ impl DerivedChunkState { } } } + +#[cfg(test)] +mod tests { + use std::sync::{Arc, Mutex}; + + use zarrs::array_subset::ArraySubset; + use zarrs::filesystem::FilesystemStore; + use zarrs::storage::ReadableListableStorage; + + use super::*; + use crate::dataset::samples; + use crate::dataset::swap::inspect_source_layout; + + #[test] + fn new_initializes_all_chunks_as_not_materialized() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + + let state = DerivedChunkState::new(&layout); + let chunk_idx = state + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + + assert_eq!(chunk_idx.dim(), (2, 2)); + assert!(chunk_idx.iter().all(|&value| !value)); + } + + #[test] + fn ensure_derived_data_for_subset_only_materializes_missing_chunks() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + let readable_source: Arc = Arc::new( + FilesystemStore::new(tmp.path()).expect("could not reopen readable test store"), + ); + let array = + zarrs::array::Array::open(readable_source, "/A").expect("failed to open source array"); + let state = DerivedChunkState::new(&layout); + let materialized = Mutex::new(Vec::new()); + + let first_subset = ArraySubset::new_with_ranges(&[0..1, 1..7, 1..3]); + state.ensure_derived_data_for_subset(&array, &first_subset, |ci, cj| { + materialized + .lock() + .expect("failed to record materialized chunk") + .push((ci, cj)); + }); + + let second_subset = ArraySubset::new_with_ranges(&[0..1, 3..6, 2..7]); + state.ensure_derived_data_for_subset(&array, &second_subset, |ci, cj| { + materialized + .lock() + .expect("failed to record materialized chunk") + .push((ci, cj)); + }); + + state.ensure_derived_data_for_subset(&array, &second_subset, |ci, cj| { + materialized + .lock() + .expect("failed to record materialized chunk") + .push((ci, cj)); + }); + + assert_eq!( + *materialized + .lock() + .expect("failed to read materialized chunks"), + vec![(0, 0), (1, 0), (0, 1), (1, 1)] + ); + + let chunk_idx = state + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + assert_eq!(*chunk_idx, Array2::from_elem((2, 2), true)); + } +} From bc1da55f5790ebc12d8de6ba26ea31caf1a8a244 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:51:33 -0600 Subject: [PATCH 31/71] Add tests --- crates/revrt/src/dataset/derived.rs | 75 ++++++++++++++++++++ crates/revrt/src/dataset/mod.rs | 102 ---------------------------- 2 files changed, 75 insertions(+), 102 deletions(-) diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index ddaff221..5f48a3d3 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -302,3 +302,78 @@ fn combine_barrier_layers_for_subset( Some(output) } + +#[cfg(test)] +mod tests { + use std::sync::Arc; + + use zarrs::array::Array; + use zarrs::array_subset::ArraySubset; + use zarrs::filesystem::FilesystemStore; + + use super::*; + use crate::dataset::samples; + use crate::dataset::swap::{initialize_swap, inspect_source_layout}; + + #[test] + fn materialize_chunk_extracts_hard_barriers_and_preserves_costs() { + let json = r#" + { + "cost_layers": [{"layer_name": "A"}], + "barrier_layers": [ + { + "layer_name": "B", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + } + ] + } + "#; + + let source_dir = samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(samples::LayerConfig::sequential("A", 1)) + .layer(samples::LayerConfig::new( + "B", + samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), + )) + .build() + .expect("Error creating test zarr"); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(source_dir.path()).expect("could not open source")); + let cost_function = CostFunction::from_json(json).unwrap(); + let layout = inspect_source_layout(&source).expect("Error inspecting source layout"); + let swap_dir = tempfile::TempDir::new().expect("could not create swap dir"); + let swap = initialize_swap( + swap_dir.path(), + &layout, + cost_function.soft_barrier_groups().len(), + ) + .expect("Error initializing swap dataset"); + let writer = DerivedDataWriter::new(source, swap.clone(), cost_function); + + assert_eq!(writer.hard_barrier_layers().len(), 1); + + writer.materialize_chunk(0, 0); + + let subset = ArraySubset::new_with_ranges(&[0..1, 0..3, 0..3]); + let cost_values: Vec = Array::open(swap.clone(), "/cost") + .expect("could not open derived cost array") + .retrieve_array_subset_elements(&subset) + .expect("could not read derived costs"); + let hard_barrier_mask: Vec = Array::open(swap, "/hard_barrier_mask") + .expect("could not open hard barrier mask") + .retrieve_array_subset_elements(&subset) + .expect("could not read hard barrier mask"); + + assert_eq!( + cost_values, + vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0] + ); + assert_eq!( + hard_barrier_mask, + vec![false, true, false, true, false, true, false, true, false] + ); + } +} diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index d434e86a..00a9377d 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -229,15 +229,6 @@ impl Dataset { }); } - #[cfg(test)] - /// Return the extracted hard barrier layers for assertions in tests. - /// - /// # Returns - /// A shared slice of hard barrier layers owned by the derived data writer. - pub(super) fn hard_barrier_layers(&self) -> &[crate::cost::BarrierLayer] { - self.derived_data_writer.hard_barrier_layers() - } - #[cfg(test)] /// Return the number of soft barrier importance groups in tests. /// @@ -289,49 +280,6 @@ impl Dataset { self.neighborhood_reader .get_neighbor_costs(i_range, j_range, subset, is_invariant) } - - #[cfg(test)] - /// Build explicit barrier cells directly from barrier layers for tests. - /// - /// This bypasses the cached swap masks so tests can compare the direct - /// barrier interpretation of source features against derived swap output. - /// - /// # Arguments - /// `index`: Center cell whose 3x3 neighborhood should be inspected. - /// `barrier_layers`: Barrier layers to evaluate directly from source data. - /// - /// # Returns - /// A vector of neighborhood cells where any provided barrier layer is true. - pub(super) fn get_3x3_barrier_cells( - &self, - index: &ArrayIndex, - barrier_layers: &[crate::cost::BarrierLayer], - ) -> Vec { - if barrier_layers.is_empty() { - return Vec::new(); - } - - let (i_range, j_range, subset) = self.neighborhood_subset(index); - let mut features = LazySubset::::new(self.source.clone(), subset); - let barrier_masks = barrier_layers - .iter() - .map(|layer| crate::cost::build_single_barrier_layer(layer, &mut features)) - .collect::>(); - let mut barrier_cells = Vec::new(); - - for (row_offset, ir) in i_range.enumerate() { - for (col_offset, jr) in j_range.clone().enumerate() { - let is_barrier = barrier_masks - .iter() - .any(|mask| mask[[0, row_offset, col_offset]]); - if is_barrier { - barrier_cells.push(ArrayIndex { i: ir, j: jr }); - } - } - } - - barrier_cells - } } #[cfg(test)] @@ -1043,54 +991,4 @@ mod tests { ); assert!(dataset.get_3x3_soft_barrier_cells(¢er, 1).is_empty()); } - - #[test] - fn test_open_extracts_hard_barriers_while_preserving_barrier_free_costs() { - let json = r#" - { - "cost_layers": [{"layer_name": "A"}], - "barrier_layers": [ - { - "layer_name": "B", - "barrier_operator": "eq", - "barrier_threshold": 1.0 - } - ] - } - "#; - - let tmp = samples::ZarrTestBuilder::new() - .dimensions(1, 3, 3) - .chunks(1, 3, 3) - .layer(samples::LayerConfig::sequential("A", 1)) - .layer(samples::LayerConfig::new( - "B", - samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), - )) - .build() - .expect("Error creating test zarr"); - let cost_function = CostFunction::from_json(json).unwrap(); - let dataset = - Dataset::open(tmp.path(), cost_function, 1_000).expect("Error opening dataset"); - - assert_eq!(dataset.hard_barrier_layers().len(), 1); - - let results = dataset.get_3x3(&ArrayIndex { i: 1, j: 1 }); - let (i_range, j_range, subset) = dataset.neighborhood_subset(&ArrayIndex { i: 1, j: 1 }); - let raw_costs = dataset.get_neighbor_costs(i_range, j_range, &subset, false); - let barrier_cells = dataset - .get_3x3_barrier_cells(&ArrayIndex { i: 1, j: 1 }, dataset.hard_barrier_layers()); - - assert_eq!(raw_costs.len(), 9); - assert_eq!(results.len(), 4); - assert_eq!( - barrier_cells, - vec![ - ArrayIndex { i: 0, j: 1 }, - ArrayIndex { i: 1, j: 0 }, - ArrayIndex { i: 1, j: 2 }, - ArrayIndex { i: 2, j: 1 }, - ] - ); - } } From 66d869013e3f504486bc7998eed3e3504a6f59b8 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 13:56:01 -0600 Subject: [PATCH 32/71] Add tests --- crates/revrt/src/dataset/derived.rs | 200 +++++++++++++++++++++++++++- 1 file changed, 195 insertions(+), 5 deletions(-) diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index 5f48a3d3..0dc9ec59 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -307,14 +307,204 @@ fn combine_barrier_layers_for_subset( mod tests { use std::sync::Arc; + use ndarray::{ArrayD, IxDyn}; + use tempfile::TempDir; use zarrs::array::Array; use zarrs::array_subset::ArraySubset; use zarrs::filesystem::FilesystemStore; + use zarrs::storage::ReadableListableStorage; use super::*; - use crate::dataset::samples; + use crate::dataset::samples::{FillStrategy, LayerConfig, ZarrTestBuilder}; use crate::dataset::swap::{initialize_swap, inspect_source_layout}; + fn hard_barrier_a(_band: u64, row: u64, col: u64) -> f32 { + if row == 0 && col == 0 { 1.0 } else { 0.0 } + } + + fn hard_barrier_b(_band: u64, row: u64, col: u64) -> f32 { + if row == 0 && col == 1 { 1.0 } else { 0.0 } + } + + fn soft_barrier_low(_band: u64, row: u64, col: u64) -> f32 { + if row == 1 && col == 0 { 1.0 } else { 0.0 } + } + + fn soft_barrier_high(_band: u64, row: u64, col: u64) -> f32 { + if row == 1 && col == 1 { 1.0 } else { 0.0 } + } + + fn make_source_store() -> (TempDir, ReadableListableStorage) { + let source_tmp = ZarrTestBuilder::new() + .dimensions(1, 4, 4) + .chunks(1, 2, 2) + .layer(LayerConfig::constant("cost_length", 2.0)) + .layer(LayerConfig::constant("cost_invariant_src", 3.0)) + .layer(LayerConfig::new( + "hard_barrier_a", + FillStrategy::Custom(hard_barrier_a), + )) + .layer(LayerConfig::new( + "hard_barrier_b", + FillStrategy::Custom(hard_barrier_b), + )) + .layer(LayerConfig::new( + "soft_barrier_low", + FillStrategy::Custom(soft_barrier_low), + )) + .layer(LayerConfig::new( + "soft_barrier_high", + FillStrategy::Custom(soft_barrier_high), + )) + .build() + .unwrap(); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(source_tmp.path()).unwrap()); + + (source_tmp, source) + } + + fn read_subset_values( + store: &zarrs::storage::ReadableWritableListableStorage, + path: &str, + subset: &ArraySubset, + ) -> Vec { + zarrs::array::Array::open(store.clone(), path) + .unwrap() + .retrieve_array_subset_elements(subset) + .unwrap() + } + + #[test] + fn empty_bool_mask_matches_subset_shape() { + let subset = ArraySubset::new_with_start_shape(vec![0, 1, 2], vec![1, 2, 3]).unwrap(); + + let result = empty_bool_mask(&subset); + + assert_eq!(result.shape(), &[1, 2, 3]); + assert!(result.iter().all(|value| !value)); + } + + #[test] + fn combine_barrier_layers_returns_none_for_empty_input() { + let (_source_tmp, source) = make_source_store(); + let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); + let mut features = LazySubset::::new(source, subset.clone()); + + let result = combine_barrier_layers_for_subset(&[], &mut features, &subset); + + assert_eq!(result, None); + } + + #[test] + fn combine_barrier_layers_ors_masks_for_subset() { + let (_source_tmp, source) = make_source_store(); + let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); + let mut features = LazySubset::::new(source.clone(), subset.clone()); + let cost_function = CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost_length"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier_a", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }, + { + "layer_name": "hard_barrier_b", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + } + ] + }"#, + ) + .unwrap(); + let layers = cost_function.hard_barrier_layers(); + + let result = combine_barrier_layers_for_subset(&layers, &mut features, &subset).unwrap(); + + assert_eq!( + result, + ArrayD::from_shape_vec(IxDyn(&[1, 2, 2]), vec![true, true, false, false],).unwrap(), + ); + } + + #[test] + fn materialize_chunk_writes_costs_and_barrier_masks() { + let (_source_tmp, source) = make_source_store(); + let cost_function = CostFunction::from_json( + r#"{ + "cost_layers": [ + {"layer_name": "cost_length"}, + { + "layer_name": "cost_invariant_src", + "is_invariant": true + } + ], + "barrier_layers": [ + { + "layer_name": "hard_barrier_a", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }, + { + "layer_name": "hard_barrier_b", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }, + { + "layer_name": "soft_barrier_low", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "soft_barrier_high", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2 + } + ] + }"#, + ) + .unwrap(); + let layout = super::super::swap::inspect_source_layout(&source).unwrap(); + let swap_tmp = TempDir::new().unwrap(); + let swap = super::super::swap::initialize_swap(swap_tmp.path(), &layout, 2).unwrap(); + let writer = DerivedDataWriter::new(source, swap.clone(), cost_function); + let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); + + assert_eq!(writer.hard_barrier_layers().len(), 2); + assert_eq!(writer.soft_barrier_group_count(), 2); + + writer.materialize_chunk(0, 0); + + assert_eq!( + read_subset_values::(&swap, "/cost", &subset), + vec![2.0, 2.0, 2.0, 2.0], + ); + assert_eq!( + read_subset_values::(&swap, "/cost_invariant", &subset), + vec![3.0, 3.0, 3.0, 3.0], + ); + assert_eq!( + read_subset_values::(&swap, "/hard_barrier_mask", &subset), + vec![true, true, false, false], + ); + assert_eq!( + read_subset_values::(&swap, "/soft_barrier_mask_retry_0", &subset), + vec![false, false, true, true], + ); + assert_eq!( + read_subset_values::(&swap, "/soft_barrier_mask_retry_1", &subset), + vec![false, false, false, true], + ); + assert_eq!( + read_subset_values::(&swap, "/soft_barrier_mask_retry_2", &subset), + vec![false, false, false, false], + ); + } + #[test] fn materialize_chunk_extracts_hard_barriers_and_preserves_costs() { let json = r#" @@ -330,13 +520,13 @@ mod tests { } "#; - let source_dir = samples::ZarrTestBuilder::new() + let source_dir = ZarrTestBuilder::new() .dimensions(1, 3, 3) .chunks(1, 3, 3) - .layer(samples::LayerConfig::sequential("A", 1)) - .layer(samples::LayerConfig::new( + .layer(LayerConfig::sequential("A", 1)) + .layer(LayerConfig::new( "B", - samples::FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), + FillStrategy::Values(vec![0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0]), )) .build() .expect("Error creating test zarr"); From 847a8a36be37ca6312cb2199321e6bb433df9d74 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:01:13 -0600 Subject: [PATCH 33/71] Move tests --- crates/revrt/src/dataset/mod.rs | 57 ------------------------------ crates/revrt/src/dataset/reader.rs | 43 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 57 deletions(-) diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 00a9377d..9790a581 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -228,58 +228,6 @@ impl Dataset { self.derived_data_writer.materialize_chunk(ci, cj) }); } - - #[cfg(test)] - /// Return the number of soft barrier importance groups in tests. - /// - /// # Returns - /// The number of distinct retry states backed by cumulative soft barrier - /// masks, excluding the final fully relaxed state calculation details. - pub(super) fn soft_barrier_group_count(&self) -> usize { - self.derived_data_writer.soft_barrier_group_count() - } - - #[cfg(test)] - /// Delegate neighborhood-subset construction for test assertions. - /// - /// # Arguments - /// `index`: Center cell whose neighborhood bounds should be computed. - /// - /// # Returns - /// The clipped row range, clipped column range, and matching swap-array - /// subset for the requested neighborhood. - fn neighborhood_subset( - &self, - index: &ArrayIndex, - ) -> ( - std::ops::Range, - std::ops::Range, - zarrs::array_subset::ArraySubset, - ) { - self.neighborhood_reader.neighborhood_subset(index) - } - - #[cfg(test)] - /// Delegate neighborhood cost reads for test assertions. - /// - /// # Arguments - /// `i_range`: Row range covering the neighborhood. - /// `j_range`: Column range covering the neighborhood. - /// `subset`: Swap-array subset to read. - /// `is_invariant`: Whether to read the invariant cost array. - /// - /// # Returns - /// A vector pairing neighborhood coordinates with their cached cost values. - fn get_neighbor_costs( - &self, - i_range: std::ops::Range, - j_range: std::ops::Range, - subset: &zarrs::array_subset::ArraySubset, - is_invariant: bool, - ) -> Vec<((u64, u64), f32)> { - self.neighborhood_reader - .get_neighbor_costs(i_range, j_range, subset, is_invariant) - } } #[cfg(test)] @@ -838,9 +786,6 @@ mod tests { Dataset::open(tmp.path(), cost_function, 1_000).expect("Error opening dataset"); let results = dataset.get_3x3(&ArrayIndex { i: 1, j: 1 }); - let (i_range, j_range, subset) = dataset.neighborhood_subset(&ArrayIndex { i: 1, j: 1 }); - let raw_costs = dataset.get_neighbor_costs(i_range, j_range, &subset, false); - assert_eq!(raw_costs.len(), 9); assert_eq!( results, vec![ @@ -926,7 +871,6 @@ mod tests { let dataset = Dataset::open(tmp.path(), CostFunction::from_json(json).unwrap(), 1_000) .expect("Error opening dataset"); - assert_eq!(dataset.soft_barrier_group_count(), 2); let center = ArrayIndex { i: 1, j: 1 }; dataset.get_3x3(¢er); @@ -984,7 +928,6 @@ mod tests { let center = ArrayIndex { i: 1, j: 1 }; dataset.get_3x3(¢er); - assert_eq!(dataset.soft_barrier_group_count(), 1); assert_eq!( dataset.get_3x3_soft_barrier_cells(¢er, 0), vec![ArrayIndex { i: 0, j: 1 }, ArrayIndex { i: 1, j: 0 }] diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index ee1848e2..fd322a23 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -556,6 +556,49 @@ mod tests { assert!(neighbors.is_empty()); } + #[test] + fn get_3x3_filters_hard_barriers_without_mutating_cached_costs() { + let fixture = reader_fixture( + vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0], + vec![0.0; 9], + vec![false, true, false, true, false, true, false, true, false], + vec![false; 9], + vec![false; 9], + ); + let index = ArrayIndex { i: 1, j: 1 }; + + let (i_range, j_range, subset) = fixture.reader.neighborhood_subset(&index); + let raw_costs = fixture + .reader + .get_neighbor_costs(i_range, j_range, &subset, false); + let neighbors = fixture.reader.get_3x3(&index, true, |_array, _subset| {}); + + assert_eq!(raw_costs.len(), 9); + assert_eq!( + raw_costs, + vec![ + ((0, 0), 1.0), + ((0, 1), 2.0), + ((0, 2), 3.0), + ((1, 0), 4.0), + ((1, 1), 5.0), + ((1, 2), 6.0), + ((2, 0), 7.0), + ((2, 1), 8.0), + ((2, 2), 9.0), + ] + ); + assert_eq!( + neighbors, + vec![ + (ArrayIndex { i: 0, j: 0 }, 3.0 * SQRT_2), + (ArrayIndex { i: 0, j: 2 }, 4.0 * SQRT_2), + (ArrayIndex { i: 2, j: 0 }, 6.0 * SQRT_2), + (ArrayIndex { i: 2, j: 2 }, 7.0 * SQRT_2), + ] + ); + } + #[test] fn get_3x3_soft_barrier_cells_reads_retry_state_specific_mask() { let fixture = reader_fixture( From c9215648347e17e44e6ce0f5799b4f369c05b8c8 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:12:14 -0600 Subject: [PATCH 34/71] Minor refactor --- crates/revrt/src/dataset/derived.rs | 173 ++++++++++++++++++++++++- crates/revrt/src/dataset/mod.rs | 20 +-- crates/revrt/src/dataset/state.rs | 190 ---------------------------- 3 files changed, 172 insertions(+), 211 deletions(-) delete mode 100644 crates/revrt/src/dataset/state.rs diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index 0dc9ec59..2311ea19 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -5,10 +5,14 @@ //! length-dependent cost layers, builds the hard barrier mask, and writes //! cumulative soft barrier masks that can be reused across retry states. +use std::sync::RwLock; + +use ndarray::Array2; use tracing::trace; use zarrs::storage::{ReadableListableStorage, ReadableWritableListableStorage}; use super::LazySubset; +use super::swap::SourceLayout; use super::swap::cumulative_soft_barrier_mask_name; use crate::cost::{BarrierLayer, CostFunction}; @@ -24,6 +28,8 @@ pub(super) struct DerivedDataWriter { source: ReadableListableStorage, /// Writable swap storage where derived arrays are materialized. swap: ReadableWritableListableStorage, + /// Boolean materialization state indexed by chunk row and chunk column. + swap_chunk_idx: RwLock>, /// Barrier layers that always behave as hard exclusions. hard_barrier_layers: Vec, /// Soft barrier layers grouped by importance in ascending retry order. @@ -36,6 +42,8 @@ impl DerivedDataWriter { /// Create a writer for materializing derived swap data. /// /// # Arguments + /// `layout`: Source layout whose chunk-grid dimensions determine the size + /// of the internal tracking array. /// `source`: Storage containing the original input feature arrays. /// `swap`: Writable storage that will receive derived arrays. /// `cost_function`: Full cost function definition, including barrier @@ -43,8 +51,10 @@ impl DerivedDataWriter { /// /// # Returns /// A `DerivedDataWriter` configured to compute cost arrays and barrier - /// masks for chunk-sized subsets. + /// masks for chunk-sized subsets while tracking which chunks have already + /// been materialized. pub(super) fn new( + layout: &SourceLayout, source: ReadableListableStorage, swap: ReadableWritableListableStorage, cost_function: CostFunction, @@ -52,16 +62,77 @@ impl DerivedDataWriter { let hard_barrier_layers = cost_function.hard_barrier_layers(); let soft_barrier_groups = cost_function.soft_barrier_groups(); let cost_function = cost_function.without_barriers(); + let swap_chunk_idx = + Array2::from_elem((layout.chunk_grid_rows, layout.chunk_grid_cols), false).into(); Self { source, swap, + swap_chunk_idx, hard_barrier_layers, soft_barrier_groups, cost_function, } } + /// Materialize any missing derived chunks overlapping a subset. + /// + /// This method first determines which chunk-grid cells intersect the + /// requested subset. Each chunk is checked under a read lock and, when + /// still missing, rechecked under a write lock before invoking chunk + /// materialization. This avoids duplicate work when multiple threads + /// request the same chunk concurrently. + /// + /// # Arguments + /// `array`: Swap array whose chunk grid is used to map the subset to + /// chunk indices. + /// `subset`: Requested array subset that may span one or more chunks. + pub(super) fn ensure_derived_data_for_subset( + &self, + array: &zarrs::array::Array, + subset: &zarrs::array_subset::ArraySubset, + ) { + let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); + trace!("Derived-data chunks: {:?}", chunks); + trace!( + "Derived-data subset extends to {:?} chunks", + chunks.num_elements_usize() + ); + + for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { + for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { + trace!( + "Checking if derived data for chunk ({}, {}) has been calculated", + ci, cj + ); + if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { + trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); + continue; + } + + let mut chunk_idx = self + .swap_chunk_idx + .write() + .expect("Failed to acquire write lock"); + if chunk_idx[[ci as usize, cj as usize]] { + trace!( + "Derived data for chunk ({}, {}) already calculated while waiting for the lock", + ci, cj + ); + } else { + self.materialize_chunk(ci, cj); + chunk_idx[[ci as usize, cj as usize]] = true; + trace!( + "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", + ci, + cj, + chunk_idx.iter().filter(|&&value| value).count() + ); + } + } + } + } + /// Materialize every derived array for a single chunk. /// /// This computes both cost layers and all barrier masks for the chunk @@ -71,7 +142,7 @@ impl DerivedDataWriter { /// # Arguments /// `ci`: Chunk row index in the swap dataset. /// `cj`: Chunk column index in the swap dataset. - pub(super) fn materialize_chunk(&self, ci: u64, cj: u64) { + fn materialize_chunk(&self, ci: u64, cj: u64) { trace!("Creating a LazySubset for ({}, {})", ci, cj); let variable = zarrs::array::Array::open(self.swap.clone(), "/cost").unwrap(); @@ -305,7 +376,7 @@ fn combine_barrier_layers_for_subset( #[cfg(test)] mod tests { - use std::sync::Arc; + use std::sync::{Arc, Mutex}; use ndarray::{ArrayD, IxDyn}; use tempfile::TempDir; @@ -315,6 +386,7 @@ mod tests { use zarrs::storage::ReadableListableStorage; use super::*; + use crate::dataset::samples; use crate::dataset::samples::{FillStrategy, LayerConfig, ZarrTestBuilder}; use crate::dataset::swap::{initialize_swap, inspect_source_layout}; @@ -471,7 +543,7 @@ mod tests { let layout = super::super::swap::inspect_source_layout(&source).unwrap(); let swap_tmp = TempDir::new().unwrap(); let swap = super::super::swap::initialize_swap(swap_tmp.path(), &layout, 2).unwrap(); - let writer = DerivedDataWriter::new(source, swap.clone(), cost_function); + let writer = DerivedDataWriter::new(&layout, source, swap.clone(), cost_function); let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); assert_eq!(writer.hard_barrier_layers().len(), 2); @@ -541,7 +613,7 @@ mod tests { cost_function.soft_barrier_groups().len(), ) .expect("Error initializing swap dataset"); - let writer = DerivedDataWriter::new(source, swap.clone(), cost_function); + let writer = DerivedDataWriter::new(&layout, source, swap.clone(), cost_function); assert_eq!(writer.hard_barrier_layers().len(), 1); @@ -566,4 +638,95 @@ mod tests { vec![false, true, false, true, false, true, false, true, false] ); } + + #[test] + fn new_initializes_all_chunks_as_not_materialized() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + let swap_tmp = TempDir::new().expect("could not create swap dir"); + let swap = initialize_swap(swap_tmp.path(), &layout, 0) + .expect("failed to initialize swap dataset"); + let cost_function = CostFunction::from_json(r#"{"cost_layers": [{"layer_name": "A"}]}"#) + .expect("failed to construct cost function"); + + let writer = DerivedDataWriter::new(&layout, source, swap, cost_function); + let chunk_idx = writer + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + + assert_eq!(chunk_idx.dim(), (2, 2)); + assert!(chunk_idx.iter().all(|&value| !value)); + } + + #[test] + fn ensure_derived_data_for_subset_only_materializes_missing_chunks() { + let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); + let source: ReadableListableStorage = + Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); + let layout = inspect_source_layout(&source).expect("source layout inspection failed"); + let readable_source: Arc = Arc::new( + FilesystemStore::new(tmp.path()).expect("could not reopen readable test store"), + ); + let array = + zarrs::array::Array::open(readable_source, "/A").expect("failed to open source array"); + let swap_tmp = TempDir::new().expect("could not create swap dir"); + let swap = initialize_swap(swap_tmp.path(), &layout, 0) + .expect("failed to initialize swap dataset"); + let cost_function = CostFunction::from_json(r#"{"cost_layers": [{"layer_name": "A"}]}"#) + .expect("failed to construct cost function"); + let writer = DerivedDataWriter::new(&layout, source, swap, cost_function); + let materialized = Mutex::new(Vec::new()); + + let first_subset = ArraySubset::new_with_ranges(&[0..1, 1..7, 1..3]); + writer.ensure_derived_data_for_subset(&array, &first_subset); + { + let chunk_idx = writer + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + for (ci, cj) in [(0, 0), (1, 0)] { + if chunk_idx[[ci, cj]] { + materialized + .lock() + .expect("failed to record materialized chunk") + .push((ci as u64, cj as u64)); + } + } + } + + let second_subset = ArraySubset::new_with_ranges(&[0..1, 3..6, 2..7]); + writer.ensure_derived_data_for_subset(&array, &second_subset); + { + let chunk_idx = writer + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + for (ci, cj) in [(0, 1), (1, 1)] { + if chunk_idx[[ci, cj]] { + materialized + .lock() + .expect("failed to record materialized chunk") + .push((ci as u64, cj as u64)); + } + } + } + + writer.ensure_derived_data_for_subset(&array, &second_subset); + + assert_eq!( + *materialized + .lock() + .expect("failed to read materialized chunks"), + vec![(0, 0), (1, 0), (0, 1), (1, 1)] + ); + + let chunk_idx = writer + .swap_chunk_idx + .read() + .expect("failed to acquire read lock"); + assert_eq!(*chunk_idx, Array2::from_elem((2, 2), true)); + } } diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 9790a581..cce4fa14 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -19,7 +19,6 @@ mod lazy_subset; mod reader; #[cfg(test)] pub(crate) mod samples; -mod state; mod swap; use std::path::PathBuf; @@ -33,7 +32,6 @@ use crate::error::Result; use derived::DerivedDataWriter; pub(crate) use lazy_subset::LazySubset; use reader::NeighborhoodReader; -use state::DerivedChunkState; use swap::{initialize_swap, inspect_source_layout}; /// Manage source features together with derived swap-backed routing data. @@ -52,13 +50,7 @@ pub(super) struct Dataset { /// the dataset handle. #[allow(dead_code)] cost_path: Option, - /// State tracking which swap chunks have already been materialized. - /// - /// Internally this mirrors the source chunk grid as a boolean array where - /// `true` means the corresponding derived swap chunk has already been - /// computed. - derived_chunk_state: DerivedChunkState, - /// Writer responsible for materializing derived chunk data into swap. + /// Derived-data materializer responsible for chunk tracking and writes. derived_data_writer: DerivedDataWriter, /// Reader responsible for cached neighborhood access to derived data. neighborhood_reader: NeighborhoodReader, @@ -142,9 +134,8 @@ impl Dataset { let source_layout = inspect_source_layout(&source)?; let swap = initialize_swap(swap_fp, &source_layout, soft_barrier_group_count)?; - let derived_chunk_state = DerivedChunkState::new(&source_layout); let derived_data_writer = - DerivedDataWriter::new(source.clone(), swap.clone(), cost_function); + DerivedDataWriter::new(&source_layout, source.clone(), swap.clone(), cost_function); let neighborhood_reader = NeighborhoodReader::open( swap.clone(), @@ -158,7 +149,6 @@ impl Dataset { Ok(Self { source, cost_path: None, - derived_chunk_state, derived_data_writer, neighborhood_reader, grid_shape, @@ -223,10 +213,8 @@ impl Dataset { array: &zarrs::array::Array, subset: &zarrs::array_subset::ArraySubset, ) { - self.derived_chunk_state - .ensure_derived_data_for_subset(array, subset, |ci, cj| { - self.derived_data_writer.materialize_chunk(ci, cj) - }); + self.derived_data_writer + .ensure_derived_data_for_subset(array, subset); } } diff --git a/crates/revrt/src/dataset/state.rs b/crates/revrt/src/dataset/state.rs deleted file mode 100644 index 0947daf9..00000000 --- a/crates/revrt/src/dataset/state.rs +++ /dev/null @@ -1,190 +0,0 @@ -//! Derived chunk materialization state -//! -//! This module tracks which swap chunks have already been derived so repeated -//! neighborhood reads can avoid recomputing the same cost and barrier data. - -use std::sync::RwLock; - -use tracing::{debug, trace}; - -use ndarray::Array2; - -use super::swap::SourceLayout; - -/// Track which swap chunks have already been materialized. -/// -/// The internal boolean grid mirrors the source chunk layout. A value of -/// `true` means the corresponding derived swap chunk has already been written -/// and does not need to be recomputed. -pub(super) struct DerivedChunkState { - /// Boolean materialization state indexed by chunk row and chunk column. - swap_chunk_idx: RwLock>, -} - -impl DerivedChunkState { - /// Create an empty materialization-state grid for a source layout. - /// - /// # Arguments - /// `layout`: Source layout whose chunk-grid dimensions determine the size - /// of the internal tracking array. - /// - /// # Returns - /// A `DerivedChunkState` initialized with all chunks marked as not yet - /// materialized. - pub(super) fn new(layout: &SourceLayout) -> Self { - Self { - swap_chunk_idx: Array2::from_elem( - (layout.chunk_grid_rows, layout.chunk_grid_cols), - false, - ) - .into(), - } - } - - /// Materialize any missing derived chunks overlapping a subset. - /// - /// This method first determines which chunk-grid cells intersect the - /// requested subset. Each chunk is checked under a read lock and, when - /// still missing, rechecked under a write lock before invoking the - /// provided `materialize_chunk` callback. This avoids duplicate work when - /// multiple threads request the same chunk concurrently. - /// - /// # Arguments - /// `array`: Swap array whose chunk grid is used to map the subset to - /// chunk indices. - /// `subset`: Requested array subset that may span one or more chunks. - /// `materialize_chunk`: Callback that computes and writes the derived data - /// for a given chunk row and column index. - pub(super) fn ensure_derived_data_for_subset( - &self, - array: &zarrs::array::Array, - subset: &zarrs::array_subset::ArraySubset, - materialize_chunk: F, - ) where - F: Fn(u64, u64), - { - let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); - trace!("Derived-data chunks: {:?}", chunks); - trace!( - "Derived-data subset extends to {:?} chunks", - chunks.num_elements_usize() - ); - - for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { - for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { - trace!( - "Checking if derived data for chunk ({}, {}) has been calculated", - ci, cj - ); - if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { - trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); - continue; - } - - debug!("Requesting write lock for swap_chunk_idx ({}, {})", ci, cj); - let mut chunk_idx = self - .swap_chunk_idx - .write() - .expect("Failed to acquire write lock"); - debug!("Acquired write lock for swap_chunk_idx ({}, {})", ci, cj); - if chunk_idx[[ci as usize, cj as usize]] { - trace!( - "Derived data for chunk ({}, {}) already calculated while waiting for the lock", - ci, cj - ); - } else { - materialize_chunk(ci, cj); - chunk_idx[[ci as usize, cj as usize]] = true; - debug!( - "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", - ci, - cj, - chunk_idx.iter().filter(|&&value| value).count() - ); - } - debug!("Released write lock for swap_chunk_idx ({}, {})", ci, cj); - } - } - } -} - -#[cfg(test)] -mod tests { - use std::sync::{Arc, Mutex}; - - use zarrs::array_subset::ArraySubset; - use zarrs::filesystem::FilesystemStore; - use zarrs::storage::ReadableListableStorage; - - use super::*; - use crate::dataset::samples; - use crate::dataset::swap::inspect_source_layout; - - #[test] - fn new_initializes_all_chunks_as_not_materialized() { - let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); - let source: ReadableListableStorage = - Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); - let layout = inspect_source_layout(&source).expect("source layout inspection failed"); - - let state = DerivedChunkState::new(&layout); - let chunk_idx = state - .swap_chunk_idx - .read() - .expect("failed to acquire read lock"); - - assert_eq!(chunk_idx.dim(), (2, 2)); - assert!(chunk_idx.iter().all(|&value| !value)); - } - - #[test] - fn ensure_derived_data_for_subset_only_materializes_missing_chunks() { - let tmp = samples::multi_variable_random(1, 8, 8, 1, 4, 4, &["A"]); - let source: ReadableListableStorage = - Arc::new(FilesystemStore::new(tmp.path()).expect("could not open test store")); - let layout = inspect_source_layout(&source).expect("source layout inspection failed"); - let readable_source: Arc = Arc::new( - FilesystemStore::new(tmp.path()).expect("could not reopen readable test store"), - ); - let array = - zarrs::array::Array::open(readable_source, "/A").expect("failed to open source array"); - let state = DerivedChunkState::new(&layout); - let materialized = Mutex::new(Vec::new()); - - let first_subset = ArraySubset::new_with_ranges(&[0..1, 1..7, 1..3]); - state.ensure_derived_data_for_subset(&array, &first_subset, |ci, cj| { - materialized - .lock() - .expect("failed to record materialized chunk") - .push((ci, cj)); - }); - - let second_subset = ArraySubset::new_with_ranges(&[0..1, 3..6, 2..7]); - state.ensure_derived_data_for_subset(&array, &second_subset, |ci, cj| { - materialized - .lock() - .expect("failed to record materialized chunk") - .push((ci, cj)); - }); - - state.ensure_derived_data_for_subset(&array, &second_subset, |ci, cj| { - materialized - .lock() - .expect("failed to record materialized chunk") - .push((ci, cj)); - }); - - assert_eq!( - *materialized - .lock() - .expect("failed to read materialized chunks"), - vec![(0, 0), (1, 0), (0, 1), (1, 1)] - ); - - let chunk_idx = state - .swap_chunk_idx - .read() - .expect("failed to acquire read lock"); - assert_eq!(*chunk_idx, Array2::from_elem((2, 2), true)); - } -} From 3abdd103e3311de432d5549d3bafa9b6274e8a5c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:44:14 -0600 Subject: [PATCH 35/71] Refactor --- crates/revrt/src/dataset/derived.rs | 136 ++++++++++++++-------------- crates/revrt/src/dataset/mod.rs | 33 ++----- crates/revrt/src/dataset/reader.rs | 121 ++++++++++++++++--------- 3 files changed, 150 insertions(+), 140 deletions(-) diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index 2311ea19..23608e12 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -12,6 +12,7 @@ use tracing::trace; use zarrs::storage::{ReadableListableStorage, ReadableWritableListableStorage}; use super::LazySubset; +use super::reader::DerivedDataMaterializer; use super::swap::SourceLayout; use super::swap::cumulative_soft_barrier_mask_name; use crate::cost::{BarrierLayer, CostFunction}; @@ -75,64 +76,6 @@ impl DerivedDataWriter { } } - /// Materialize any missing derived chunks overlapping a subset. - /// - /// This method first determines which chunk-grid cells intersect the - /// requested subset. Each chunk is checked under a read lock and, when - /// still missing, rechecked under a write lock before invoking chunk - /// materialization. This avoids duplicate work when multiple threads - /// request the same chunk concurrently. - /// - /// # Arguments - /// `array`: Swap array whose chunk grid is used to map the subset to - /// chunk indices. - /// `subset`: Requested array subset that may span one or more chunks. - pub(super) fn ensure_derived_data_for_subset( - &self, - array: &zarrs::array::Array, - subset: &zarrs::array_subset::ArraySubset, - ) { - let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); - trace!("Derived-data chunks: {:?}", chunks); - trace!( - "Derived-data subset extends to {:?} chunks", - chunks.num_elements_usize() - ); - - for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { - for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { - trace!( - "Checking if derived data for chunk ({}, {}) has been calculated", - ci, cj - ); - if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { - trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); - continue; - } - - let mut chunk_idx = self - .swap_chunk_idx - .write() - .expect("Failed to acquire write lock"); - if chunk_idx[[ci as usize, cj as usize]] { - trace!( - "Derived data for chunk ({}, {}) already calculated while waiting for the lock", - ci, cj - ); - } else { - self.materialize_chunk(ci, cj); - chunk_idx[[ci as usize, cj as usize]] = true; - trace!( - "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", - ci, - cj, - chunk_idx.iter().filter(|&&value| value).count() - ); - } - } - } - } - /// Materialize every derived array for a single chunk. /// /// This computes both cost layers and all barrier masks for the chunk @@ -157,15 +100,6 @@ impl DerivedDataWriter { self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); } - /// Return the hard barrier layers tracked by this writer. - /// - /// # Returns - /// A shared slice of barrier layers that should always be treated as - /// impassable. - pub(super) fn hard_barrier_layers(&self) -> &[BarrierLayer] { - &self.hard_barrier_layers - } - /// Return the number of soft barrier importance groups. /// /// # Returns @@ -316,6 +250,70 @@ impl DerivedDataWriter { } } +impl DerivedDataMaterializer for DerivedDataWriter { + fn has_hard_barriers(&self) -> bool { + !self.hard_barrier_layers.is_empty() + } + + /// Materialize any missing derived chunks overlapping a subset. + /// + /// This method first determines which chunk-grid cells intersect the + /// requested subset. Each chunk is checked under a read lock and, when + /// still missing, rechecked under a write lock before invoking chunk + /// materialization. This avoids duplicate work when multiple threads + /// request the same chunk concurrently. + /// + /// # Arguments + /// `array`: Swap array whose chunk grid is used to map the subset to + /// chunk indices. + /// `subset`: Requested array subset that may span one or more chunks. + fn ensure_derived_data_for_subset( + &self, + array: &zarrs::array::Array, + subset: &zarrs::array_subset::ArraySubset, + ) { + let chunks = &array.chunks_in_array_subset(subset).unwrap().unwrap(); + trace!("Derived-data chunks: {:?}", chunks); + trace!( + "Derived-data subset extends to {:?} chunks", + chunks.num_elements_usize() + ); + + for ci in chunks.start()[1]..(chunks.start()[1] + chunks.shape()[1]) { + for cj in chunks.start()[2]..(chunks.start()[2] + chunks.shape()[2]) { + trace!( + "Checking if derived data for chunk ({}, {}) has been calculated", + ci, cj + ); + if self.swap_chunk_idx.read().unwrap()[[ci as usize, cj as usize]] { + trace!("Derived data for chunk ({}, {}) already calculated", ci, cj); + continue; + } + + let mut chunk_idx = self + .swap_chunk_idx + .write() + .expect("Failed to acquire write lock"); + if chunk_idx[[ci as usize, cj as usize]] { + trace!( + "Derived data for chunk ({}, {}) already calculated while waiting for the lock", + ci, cj + ); + } else { + self.materialize_chunk(ci, cj); + chunk_idx[[ci as usize, cj as usize]] = true; + trace!( + "Recorded derived data for chunk ({}, {}) as calculated. Total number of computed chunks: {}", + ci, + cj, + chunk_idx.iter().filter(|&&value| value).count() + ); + } + } + } + } +} + /// Create an all-false boolean mask for a subset shape. /// /// # Arguments @@ -546,7 +544,7 @@ mod tests { let writer = DerivedDataWriter::new(&layout, source, swap.clone(), cost_function); let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); - assert_eq!(writer.hard_barrier_layers().len(), 2); + assert!(writer.has_hard_barriers()); assert_eq!(writer.soft_barrier_group_count(), 2); writer.materialize_chunk(0, 0); @@ -615,7 +613,7 @@ mod tests { .expect("Error initializing swap dataset"); let writer = DerivedDataWriter::new(&layout, source, swap.clone(), cost_function); - assert_eq!(writer.hard_barrier_layers().len(), 1); + assert!(writer.has_hard_barriers()); writer.materialize_chunk(0, 0); diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index cce4fa14..5747cbce 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -167,11 +167,8 @@ impl Dataset { /// A vector of neighboring indices paired with movement costs from the /// center cell. pub(super) fn get_3x3(&self, index: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { - self.neighborhood_reader.get_3x3( - index, - !self.derived_data_writer.hard_barrier_layers().is_empty(), - |array, subset| self.ensure_derived_data_for_subset(array, subset), - ) + self.neighborhood_reader + .get_3x3(index, &self.derived_data_writer) } /// Return soft-barrier cells in the 3x3 neighborhood of an index. @@ -194,27 +191,11 @@ impl Dataset { ) -> Vec { let retry_state = dropped_soft_groups.min(self.derived_data_writer.soft_barrier_group_count()); - self.neighborhood_reader - .get_3x3_soft_barrier_cells(index, retry_state, |array, subset| { - self.ensure_derived_data_for_subset(array, subset) - }) - } - - /// Ensure all derived swap data exists for a requested subset. - /// - /// Any chunk overlapped by `subset` is materialized exactly once through - /// the tracked chunk state before cached neighborhood reads proceed. - /// - /// # Arguments - /// `array`: Swap array whose subset is about to be accessed. - /// `subset`: Requested subset within the swap array. - fn ensure_derived_data_for_subset( - &self, - array: &zarrs::array::Array, - subset: &zarrs::array_subset::ArraySubset, - ) { - self.derived_data_writer - .ensure_derived_data_for_subset(array, subset); + self.neighborhood_reader.get_3x3_soft_barrier_cells( + index, + retry_state, + &self.derived_data_writer, + ) } } diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index fd322a23..41c58df5 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -17,6 +17,19 @@ use super::swap::cumulative_soft_barrier_mask_name; use crate::ArrayIndex; use crate::error::{Error, Result}; +/// Capability required to materialize derived swap data for a subset. +pub(super) trait DerivedDataMaterializer { + /// Whether the derived dataset includes a hard barrier mask. + fn has_hard_barriers(&self) -> bool; + + /// Ensure all derived swap data exists for a requested subset. + fn ensure_derived_data_for_subset( + &self, + array: &zarrs::array::Array, + subset: &zarrs::array_subset::ArraySubset, + ); +} + #[derive(Debug, Clone, Copy)] /// Cache sizes assigned to each neighborhood reader dataset. /// @@ -136,24 +149,18 @@ impl NeighborhoodReader { /// /// # Arguments /// `index`: Grid index whose neighborhood should be read. - /// `has_hard_barriers`: Whether the hard barrier mask should be consulted - /// while filtering candidate neighbors. - /// `ensure_derived_data_for_subset`: Callback that materializes the - /// required swap chunks before the cached - /// read occurs. + /// `data_materializer`: Derived-data materializer responsible for + /// ensuring the required swap chunks exist + /// before the cached read occurs. /// /// # Returns /// A vector of reachable neighboring indices paired with movement costs /// from the center cell to each neighbor. - pub(super) fn get_3x3( + pub(super) fn get_3x3( &self, index: &ArrayIndex, - has_hard_barriers: bool, - ensure_derived_data_for_subset: F, - ) -> Vec<(ArrayIndex, f32)> - where - F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), - { + data_materializer: &impl DerivedDataMaterializer, + ) -> Vec<(ArrayIndex, f32)> { let &ArrayIndex { i, j } = index; trace!("Getting 3x3 neighborhood for (i={}, j={})", i, j); @@ -164,12 +171,12 @@ impl NeighborhoodReader { let (i_range, j_range, subset) = self.neighborhood_subset(index); trace!("Cost subset: {:?}", subset); - ensure_derived_data_for_subset(&cost_array, &subset); + data_materializer.ensure_derived_data_for_subset(&cost_array, &subset); let neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, false); let invariant_neighbors = self.get_neighbor_costs(i_range.clone(), j_range.clone(), &subset, true); - let hard_barrier_values: Vec = if has_hard_barriers { + let hard_barrier_values: Vec = if data_materializer.has_hard_barriers() { self.hard_barrier_cache .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) .unwrap() @@ -230,26 +237,23 @@ impl NeighborhoodReader { /// # Arguments /// `index`: Grid index whose neighborhood should be inspected. /// `retry_state`: Index into the cumulative soft barrier mask caches. - /// `ensure_derived_data_for_subset`: Callback that materializes the - /// required swap chunks before the cached - /// read occurs. + /// `data_materializer`: Derived-data materializer responsible for ensuring + /// the required swap chunks exist before the cached + /// read occurs. /// /// # Returns /// A vector containing the neighborhood cells marked as soft barriers for /// the selected retry state. - pub(super) fn get_3x3_soft_barrier_cells( + pub(super) fn get_3x3_soft_barrier_cells( &self, index: &ArrayIndex, retry_state: usize, - ensure_derived_data_for_subset: F, - ) -> Vec - where - F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), - { + data_materializer: &impl DerivedDataMaterializer, + ) -> Vec { self.get_3x3_cached_barrier_cells( index, &self.cumulative_soft_barrier_caches[retry_state], - ensure_derived_data_for_subset, + data_materializer, ) } @@ -369,23 +373,20 @@ impl NeighborhoodReader { /// # Arguments /// `index`: Center grid index for the neighborhood lookup. /// `cache`: Chunk cache for the barrier mask to inspect. - /// `ensure_derived_data_for_subset`: Callback that materializes the - /// required swap chunks before the cached - /// read occurs. + /// `data_materializer`: Derived-data materializer responsible for ensuring + /// the required swap chunks exist before the cached + /// read occurs. /// /// # Returns /// A vector of neighborhood indices whose cached mask value is `true`. - fn get_3x3_cached_barrier_cells( + fn get_3x3_cached_barrier_cells( &self, index: &ArrayIndex, cache: &ChunkCacheDecodedLruSizeLimit, - ensure_derived_data_for_subset: F, - ) -> Vec - where - F: Fn(&zarrs::array::Array, &zarrs::array_subset::ArraySubset), - { + data_materializer: &impl DerivedDataMaterializer, + ) -> Vec { let (i_range, j_range, subset) = self.neighborhood_subset(index); - ensure_derived_data_for_subset(&cache.array(), &subset); + data_materializer.ensure_derived_data_for_subset(&cache.array(), &subset); let barrier_values = cache .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) .unwrap(); @@ -459,6 +460,23 @@ mod tests { use crate::dataset::samples::{LayerConfig, ZarrTestBuilder}; use crate::dataset::swap::{initialize_swap, inspect_source_layout}; + struct NoOpMaterializer { + has_hard_barriers: bool, + } + + impl DerivedDataMaterializer for NoOpMaterializer { + fn has_hard_barriers(&self) -> bool { + self.has_hard_barriers + } + + fn ensure_derived_data_for_subset( + &self, + _array: &zarrs::array::Array, + _subset: &zarrs::array_subset::ArraySubset, + ) { + } + } + #[test] fn distribute_cache_budgets_splits_budget_across_cache_types() { let budgets = distribute_cache_budgets(120, 4); @@ -515,10 +533,12 @@ mod tests { vec![true, false, false, false, false, false, false, true, false], ); - let neighbors = - fixture - .reader - .get_3x3(&ArrayIndex { i: 1, j: 1 }, true, |_array, _subset| {}); + let neighbors = fixture.reader.get_3x3( + &ArrayIndex { i: 1, j: 1 }, + &NoOpMaterializer { + has_hard_barriers: true, + }, + ); let expected = [ (ArrayIndex { i: 0, j: 0 }, 3.0 * SQRT_2 + 1.0), @@ -548,10 +568,12 @@ mod tests { vec![false; 9], ); - let neighbors = - fixture - .reader - .get_3x3(&ArrayIndex { i: 1, j: 1 }, true, |_array, _subset| {}); + let neighbors = fixture.reader.get_3x3( + &ArrayIndex { i: 1, j: 1 }, + &NoOpMaterializer { + has_hard_barriers: true, + }, + ); assert!(neighbors.is_empty()); } @@ -571,7 +593,12 @@ mod tests { let raw_costs = fixture .reader .get_neighbor_costs(i_range, j_range, &subset, false); - let neighbors = fixture.reader.get_3x3(&index, true, |_array, _subset| {}); + let neighbors = fixture.reader.get_3x3( + &index, + &NoOpMaterializer { + has_hard_barriers: true, + }, + ); assert_eq!(raw_costs.len(), 9); assert_eq!( @@ -612,12 +639,16 @@ mod tests { let retry_zero = fixture.reader.get_3x3_soft_barrier_cells( &ArrayIndex { i: 1, j: 1 }, 0, - |_array, _subset| {}, + &NoOpMaterializer { + has_hard_barriers: false, + }, ); let retry_one = fixture.reader.get_3x3_soft_barrier_cells( &ArrayIndex { i: 1, j: 1 }, 1, - |_array, _subset| {}, + &NoOpMaterializer { + has_hard_barriers: false, + }, ); assert_eq!( From 7462df701407d5d808c00797407e9d1130f07495 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:48:21 -0600 Subject: [PATCH 36/71] Minor refactor --- crates/revrt/src/dataset/reader.rs | 63 +++++++++--------------------- 1 file changed, 18 insertions(+), 45 deletions(-) diff --git a/crates/revrt/src/dataset/reader.rs b/crates/revrt/src/dataset/reader.rs index 41c58df5..8a0c9718 100644 --- a/crates/revrt/src/dataset/reader.rs +++ b/crates/revrt/src/dataset/reader.rs @@ -250,11 +250,24 @@ impl NeighborhoodReader { retry_state: usize, data_materializer: &impl DerivedDataMaterializer, ) -> Vec { - self.get_3x3_cached_barrier_cells( - index, - &self.cumulative_soft_barrier_caches[retry_state], - data_materializer, - ) + let (i_range, j_range, subset) = self.neighborhood_subset(index); + let cache = &self.cumulative_soft_barrier_caches[retry_state]; + data_materializer.ensure_derived_data_for_subset(&cache.array(), &subset); + let barrier_values = cache + .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) + .unwrap(); + let mut barrier_cells = Vec::new(); + + for ((ir, jr), is_barrier) in i_range + .flat_map(|row| iter::repeat(row).zip(j_range.clone())) + .zip(barrier_values) + { + if is_barrier { + barrier_cells.push(ArrayIndex { i: ir, j: jr }); + } + } + + barrier_cells } /// Return the grid shape backing this reader as `(rows, cols)`. @@ -363,46 +376,6 @@ impl NeighborhoodReader { trace!("Neighbors {:?}", neighbor_costs); neighbor_costs } - - /// Read barrier cells from a cached boolean neighborhood mask. - /// - /// This helper is shared by hard and soft barrier lookups. It materializes - /// the necessary derived data, reads the boolean neighborhood mask from the - /// provided cache, and returns the coordinates of every barrier cell. - /// - /// # Arguments - /// `index`: Center grid index for the neighborhood lookup. - /// `cache`: Chunk cache for the barrier mask to inspect. - /// `data_materializer`: Derived-data materializer responsible for ensuring - /// the required swap chunks exist before the cached - /// read occurs. - /// - /// # Returns - /// A vector of neighborhood indices whose cached mask value is `true`. - fn get_3x3_cached_barrier_cells( - &self, - index: &ArrayIndex, - cache: &ChunkCacheDecodedLruSizeLimit, - data_materializer: &impl DerivedDataMaterializer, - ) -> Vec { - let (i_range, j_range, subset) = self.neighborhood_subset(index); - data_materializer.ensure_derived_data_for_subset(&cache.array(), &subset); - let barrier_values = cache - .retrieve_array_subset_elements::(&subset, &CodecOptions::default()) - .unwrap(); - let mut barrier_cells = Vec::new(); - - for ((ir, jr), is_barrier) in i_range - .flat_map(|row| iter::repeat(row).zip(j_range.clone())) - .zip(barrier_values) - { - if is_barrier { - barrier_cells.push(ArrayIndex { i: ir, j: jr }); - } - } - - barrier_cells - } } /// Split the requested cache size across all neighborhood reader caches. From f7c1fd21f64405ec1e62969e5543d76a04b9942a Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:57:35 -0600 Subject: [PATCH 37/71] Minor refactor --- crates/revrt/src/dataset/derived.rs | 13 ++----------- crates/revrt/src/dataset/mod.rs | 13 +++++++++++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/crates/revrt/src/dataset/derived.rs b/crates/revrt/src/dataset/derived.rs index 23608e12..3ab9f316 100644 --- a/crates/revrt/src/dataset/derived.rs +++ b/crates/revrt/src/dataset/derived.rs @@ -34,7 +34,7 @@ pub(super) struct DerivedDataWriter { /// Barrier layers that always behave as hard exclusions. hard_barrier_layers: Vec, /// Soft barrier layers grouped by importance in ascending retry order. - soft_barrier_groups: Vec<(u32, Vec)>, + pub(super) soft_barrier_groups: Vec<(u32, Vec)>, /// Cost function stripped of barrier layers for numeric cost derivation. cost_function: CostFunction, } @@ -100,15 +100,6 @@ impl DerivedDataWriter { self.calculate_chunk_cumulative_soft_barrier_masks(&mut data, &subset, &chunk_subset); } - /// Return the number of soft barrier importance groups. - /// - /// # Returns - /// The count of retry-state groups that can be progressively dropped - /// during routing retries. - pub(super) fn soft_barrier_group_count(&self) -> usize { - self.soft_barrier_groups.len() - } - /// Compute and store one of the two chunk cost arrays. /// /// The cost function is evaluated either for invariant terms or for @@ -545,7 +536,7 @@ mod tests { let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); assert!(writer.has_hard_barriers()); - assert_eq!(writer.soft_barrier_group_count(), 2); + assert_eq!(writer.soft_barrier_groups.len(), 2); writer.materialize_chunk(0, 0); diff --git a/crates/revrt/src/dataset/mod.rs b/crates/revrt/src/dataset/mod.rs index 5747cbce..b9809a29 100644 --- a/crates/revrt/src/dataset/mod.rs +++ b/crates/revrt/src/dataset/mod.rs @@ -27,7 +27,7 @@ use tracing::{debug, info, trace}; use zarrs::storage::ReadableListableStorage; use crate::ArrayIndex; -use crate::cost::CostFunction; +use crate::cost::{BarrierLayer, CostFunction}; use crate::error::Result; use derived::DerivedDataWriter; pub(crate) use lazy_subset::LazySubset; @@ -190,13 +190,22 @@ impl Dataset { dropped_soft_groups: usize, ) -> Vec { let retry_state = - dropped_soft_groups.min(self.derived_data_writer.soft_barrier_group_count()); + dropped_soft_groups.min(self.derived_data_writer.soft_barrier_groups.len()); self.neighborhood_reader.get_3x3_soft_barrier_cells( index, retry_state, &self.derived_data_writer, ) } + + /// Return the number of soft barrier importance groups. + /// + /// # Returns + /// The count of retry-state groups that can be progressively dropped + /// during routing retries. + pub(super) fn soft_barrier_groups(&self) -> &Vec<(u32, Vec)> { + &self.derived_data_writer.soft_barrier_groups + } } #[cfg(test)] From a95e9b074b4b1be2c4c98504549eab98be316742 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:58:14 -0600 Subject: [PATCH 38/71] Scenario now uses soft barriers --- crates/revrt/src/routing/scenario.rs | 363 +++++++++++++++++++++++++-- 1 file changed, 344 insertions(+), 19 deletions(-) diff --git a/crates/revrt/src/routing/scenario.rs b/crates/revrt/src/routing/scenario.rs index 83c4a6ae..f11b818f 100644 --- a/crates/revrt/src/routing/scenario.rs +++ b/crates/revrt/src/routing/scenario.rs @@ -12,19 +12,19 @@ //! with asynchronous I/O we keep the memory footprint low while //! sustaining high performance as possible. +use std::collections::HashSet; use std::path::PathBuf; use tracing::trace; -use super::{Features, cost_as_u64}; +use super::cost_as_u64; +use crate::routing::features::Features; use crate::{ArrayIndex, Result}; pub(super) struct Scenario { pub dataset: crate::dataset::Dataset, #[allow(dead_code)] features: Features, - #[allow(dead_code)] - cost_function: crate::CostFunction, } impl Scenario { @@ -39,16 +39,12 @@ impl Scenario { let features = Features::open(&store_path)?; let dataset = crate::dataset::Dataset::open_with_swap( store_path, - cost_function.clone(), + cost_function, cache_size, swap_fp, )?; - Ok(Self { - dataset, - features, - cost_function, - }) + Ok(Self { dataset, features }) } pub(super) fn new>( @@ -59,31 +55,360 @@ impl Scenario { trace!("Opening scenario with: {:?}", store_path.as_ref()); let features = Features::open(&store_path)?; - let dataset = crate::dataset::Dataset::open(store_path, cost_function.clone(), cache_size)?; + let dataset = crate::dataset::Dataset::open(store_path, cost_function, cache_size)?; - Ok(Self { - dataset, - features, - cost_function, - }) + Ok(Self { dataset, features }) } pub(super) fn get_3x3(&self, position: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { self.dataset.get_3x3(position) } - /// Determine the successors of a position. - pub(super) fn successors(&self, position: &ArrayIndex) -> Vec<(ArrayIndex, u64)> { + pub(super) fn successors_for_attempt( + &self, + position: &ArrayIndex, + dropped_soft_groups: usize, + ) -> Vec<(ArrayIndex, u64)> { let neighbors = self.get_3x3(position); + let soft_barrier_cells: HashSet<_> = self + .dataset + .get_3x3_soft_barrier_cells(position, dropped_soft_groups) + .into_iter() + .collect(); + + if soft_barrier_cells.contains(position) { + return Vec::new(); + } + let neighbors = neighbors .into_iter() - .map(|(p, c)| (p, cost_as_u64(c))) // ToDo: Maybe it's better to have get_3x3 return a u64 - then we can skip this map altogether + .filter(|(p, c)| c.is_finite() && *c > 0.0 && !soft_barrier_cells.contains(p)) + .map(|(p, c)| (p, cost_as_u64(c))) .collect(); trace!("Adjusting neighbors' types: {:?}", neighbors); neighbors } + pub(super) fn soft_barrier_group_count(&self) -> usize { + self.dataset.soft_barrier_groups().len() + } + + pub(super) fn dropped_barrier_layers(&self, dropped_soft_groups: usize) -> Vec { + let mut dropped_barrier_layers = Vec::new(); + + for (__, layers) in self + .dataset + .soft_barrier_groups() + .iter() + .take(dropped_soft_groups) + { + for layer in layers { + dropped_barrier_layers.push(layer.layer_name().to_string()); + } + } + + dropped_barrier_layers + } + pub(super) fn grid_shape(&self) -> (u64, u64) { - self.dataset.grid_shape() + self.dataset.grid_shape + } +} + +#[cfg(test)] +mod tests { + use super::Scenario; + use crate::ArrayIndex; + + #[test] + fn successors_keep_hard_barriers_after_soft_groups_drop() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(crate::dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(crate::dataset::samples::LayerConfig::new( + "hard_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }, + { + "layer_name": "soft_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + + let start = ArrayIndex { i: 1, j: 1 }; + let initial_successors = scenario.successors_for_attempt(&start, 0); + let relaxed_successors = scenario.successors_for_attempt(&start, 1); + + assert!( + !initial_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 0, j: 1 }) + ); + assert!( + !initial_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 1, j: 0 }) + ); + + assert!( + !relaxed_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 0, j: 1 }) + ); + assert!( + relaxed_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 1, j: 0 }) + ); + } + + #[test] + fn successors_return_empty_when_start_is_hard_barrier() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(crate::dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(crate::dataset::samples::LayerConfig::new( + "hard_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + + let successors = scenario.successors_for_attempt(&ArrayIndex { i: 1, j: 1 }, 0); + + assert!(successors.is_empty()); + } + + #[test] + fn successors_use_cumulative_soft_masks_by_retry_state() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(crate::dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier_low", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier_high", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier_low", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "soft_barrier_high", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + + let start = ArrayIndex { i: 1, j: 1 }; + let initial_successors = scenario.successors_for_attempt(&start, 0); + let retry_one_successors = scenario.successors_for_attempt(&start, 1); + let retry_two_successors = scenario.successors_for_attempt(&start, 2); + + assert_eq!(scenario.soft_barrier_group_count(), 2); + assert!( + !initial_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 1, j: 0 }) + ); + assert!( + !initial_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 0, j: 1 }) + ); + assert!( + retry_one_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 1, j: 0 }) + ); + assert!( + !retry_one_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 0, j: 1 }) + ); + assert!( + retry_two_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 1, j: 0 }) + ); + assert!( + retry_two_successors + .iter() + .any(|(p, _)| *p == ArrayIndex { i: 0, j: 1 }) + ); + } + + #[test] + fn successors_return_empty_when_start_is_in_active_soft_mask() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(crate::dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + + assert!( + scenario + .successors_for_attempt(&ArrayIndex { i: 1, j: 1 }, 0) + .is_empty() + ); + assert!( + !scenario + .successors_for_attempt(&ArrayIndex { i: 1, j: 1 }, 1) + .is_empty() + ); + } + + #[test] + fn dropped_barrier_layers_follows_soft_barrier_groups() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 3) + .chunks(1, 3, 3) + .layer(crate::dataset::samples::LayerConfig::constant("cost", 1.0)) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier_low_a", + crate::dataset::samples::FillStrategy::Constant(0.0), + )) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier_low_b", + crate::dataset::samples::FillStrategy::Constant(0.0), + )) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier_high", + crate::dataset::samples::FillStrategy::Constant(0.0), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier_low_a", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "soft_barrier_low_b", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + }, + { + "layer_name": "soft_barrier_high", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + + assert!(scenario.dropped_barrier_layers(0).is_empty()); + assert_eq!( + scenario.dropped_barrier_layers(1), + vec!["soft_barrier_low_a", "soft_barrier_low_b"] + ); + assert_eq!( + scenario.dropped_barrier_layers(2), + vec![ + "soft_barrier_low_a", + "soft_barrier_low_b", + "soft_barrier_high" + ] + ); } } From b8631b99c4b305ec5f303a4116fbe483be104e39 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 14:59:27 -0600 Subject: [PATCH 39/71] Docs --- crates/revrt/src/routing/scenario.rs | 69 ++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/crates/revrt/src/routing/scenario.rs b/crates/revrt/src/routing/scenario.rs index f11b818f..259bc3b1 100644 --- a/crates/revrt/src/routing/scenario.rs +++ b/crates/revrt/src/routing/scenario.rs @@ -21,13 +21,33 @@ use super::cost_as_u64; use crate::routing::features::Features; use crate::{ArrayIndex, Result}; +/// Scenario state required to evaluate routing moves. +/// +/// A scenario owns the derived routing dataset together with the feature +/// metadata used to open and validate the underlying store. It provides +/// helpers for neighborhood lookups, retry-aware soft barrier filtering, +/// and reporting information about the active barrier groups. pub(super) struct Scenario { + /// Derived dataset containing cost arrays and barrier masks. pub dataset: crate::dataset::Dataset, #[allow(dead_code)] + /// Source feature metadata kept alive for scenario lifetime management. features: Features, } impl Scenario { + /// Open a scenario backed by a swap dataset. + /// + /// # Arguments + /// `store_path`: Path to the source dataset store. + /// `cost_function`: Cost function used to derive routing costs and + /// barrier masks. + /// `cache_size`: Maximum cache size for dataset-backed reads. + /// `swap_fp`: Filesystem path where the swap dataset should be created. + /// + /// # Returns + /// A `Scenario` whose dataset materializes derived arrays in the swap + /// location while reusing the source feature definitions. pub(super) fn new_with_swap>( store_path: P, cost_function: crate::cost::CostFunction, @@ -47,6 +67,16 @@ impl Scenario { Ok(Self { dataset, features }) } + /// Open a scenario that derives routing data directly from the source. + /// + /// # Arguments + /// `store_path`: Path to the source dataset store. + /// `cost_function`: Cost function used to derive routing costs and + /// barrier masks. + /// `cache_size`: Maximum cache size for dataset-backed reads. + /// + /// # Returns + /// A `Scenario` ready to serve neighborhood and barrier queries. pub(super) fn new>( store_path: P, cost_function: crate::cost::CostFunction, @@ -60,10 +90,32 @@ impl Scenario { Ok(Self { dataset, features }) } + /// Retrieve the local 3x3 neighborhood costs around a position. + /// + /// # Arguments + /// `position`: Grid index at the center of the neighborhood query. + /// + /// # Returns + /// Neighbor positions and their floating-point traversal costs. pub(super) fn get_3x3(&self, position: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { self.dataset.get_3x3(position) } + /// Return retry-aware successor cells for a routing attempt. + /// + /// The returned successors exclude non-finite or non-positive costs and + /// any cells covered by currently active soft barrier groups. If the + /// starting cell itself is masked by an active soft barrier, no + /// successors are returned. + /// + /// # Arguments + /// `position`: Current grid position whose neighbors should be explored. + /// `dropped_soft_groups`: Number of lowest-importance soft barrier + /// groups that should be ignored for this retry. + /// + /// # Returns + /// Neighbor positions and integer-encoded traversal costs suitable for + /// routing expansion. pub(super) fn successors_for_attempt( &self, position: &ArrayIndex, @@ -89,10 +141,23 @@ impl Scenario { neighbors } + /// Count the configured soft barrier groups. + /// + /// # Returns + /// Number of retry stages available for progressively dropping soft + /// barrier groups. pub(super) fn soft_barrier_group_count(&self) -> usize { self.dataset.soft_barrier_groups().len() } + /// List barrier layer names dropped for a retry state. + /// + /// # Arguments + /// `dropped_soft_groups`: Number of soft barrier groups dropped in + /// ascending importance order. + /// + /// # Returns + /// Barrier layer names belonging to the dropped groups. pub(super) fn dropped_barrier_layers(&self, dropped_soft_groups: usize) -> Vec { let mut dropped_barrier_layers = Vec::new(); @@ -110,6 +175,10 @@ impl Scenario { dropped_barrier_layers } + /// Return the scenario grid dimensions. + /// + /// # Returns + /// Tuple of `(rows, cols)` describing the routing grid shape. pub(super) fn grid_shape(&self) -> (u64, u64) { self.dataset.grid_shape } From a02a87a9d5e62d82ac9c558779754c6a5a3fd9c3 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:04:58 -0600 Subject: [PATCH 40/71] Update routing to support barriers --- crates/revrt/src/routing/mod.rs | 203 +++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 57 deletions(-) diff --git a/crates/revrt/src/routing/mod.rs b/crates/revrt/src/routing/mod.rs index 6cb6677a..57cabcb6 100644 --- a/crates/revrt/src/routing/mod.rs +++ b/crates/revrt/src/routing/mod.rs @@ -12,12 +12,11 @@ use std::str::FromStr; use std::sync::{Arc, mpsc}; use rayon::prelude::{IntoParallelIterator, ParallelIterator}; -use tracing::debug; +use tracing::{debug, info}; use crate::{ArrayIndex, RevrtRoutingSolutions, Solution, error::Result}; use algorithm::Algorithm; use algorithm::AlgorithmType; -use features::Features; use scenario::Scenario; // Percent of the total memory allocation given to the Zarr cache. @@ -36,22 +35,7 @@ impl Routing { end: Vec, ) -> impl Iterator> { debug!("Starting compute with {} start points", start.len()); - let grid_shape = self.scenario.grid_shape(); - - let solution: Vec> = start - .into_par_iter() - .filter_map(|s| { - self.algorithm.compute( - s, - &end, - |p| self.scenario.successors(p), - |p| end.contains(p), - grid_shape, - ) - }) - .collect(); - - solution.into_iter() + compute_route_attempt_result(&self.scenario, &self.algorithm, start, &end).into_iter() } pub(super) fn new>( @@ -169,52 +153,84 @@ impl ParRouting { end_inds, }| { debug!("Computing routes between {start_inds:?} and {end_inds:?}"); - let grid_shape = scenario.grid_shape(); - // if end_inds.last() == Some(&ArrayIndex { i: 2, j: 6 }) { - // use std::thread; - // use std::time::Duration; - // // let mut rng = rand::rng(); - // // let delay_secs = rng.random_range(3..=7); - // let delay_secs = if start_inds.first() == Some(&ArrayIndex { i: 1, j: 1 }) { - // 6 - // // return sender.send(Err(InvalidRouteStart( - // // "start index ArrayIndex { i: 1, j: 1 } is invalid".into(), - // // ))); - // } else { - // 10 - // }; - // // println!("Sleeping {delay_secs}s before yielding"); - // // io::stdout().flush().expect("Failed to flush stdout"); - // thread::sleep(Duration::from_secs(delay_secs)); - // } - let routes: RevrtRoutingSolutions = start_inds - .into_par_iter() - .filter_map(|s| { - let end_ind_vec: Vec<_> = end_inds.iter().cloned().collect(); - algorithm.compute( - &s, - &end_ind_vec, - |p| scenario.successors(p), - |p| end_inds.contains(p), - grid_shape, - ) - // pathfinding::prelude::dijkstra( - // &s, - // |p| scenario.successors(p), - // |p| end_inds.contains(p), - // ) - }) - // .map(|(route, total_cost)| Solution::new(route, unscaled_cost(total_cost))) - .collect(); - let num_routes = routes.len(); + let result = compute_route_attempt_result( + &scenario, + &algorithm, + &start_inds, + &end_inds.iter().cloned().collect::>(), + ); + let num_routes = result.len(); debug!("Finished computing {num_routes} route(s) to {end_inds:?}"); - sender.send((route_id, routes)) + sender.send((route_id, result)) }, ); }); } } +fn compute_route_attempt_result( + scenario: &Scenario, + algorithm: &Algorithm, + start: &[ArrayIndex], + end: &[ArrayIndex], +) -> RevrtRoutingSolutions { + start + .into_par_iter() + .filter_map(|start_point| compute_solution_for_start(scenario, algorithm, start_point, end)) + .collect() +} + +fn compute_solution_for_start( + scenario: &Scenario, + algorithm: &Algorithm, + start_point: &ArrayIndex, + end: &[ArrayIndex], +) -> Option> { + let grid_shape = scenario.grid_shape(); + + // if end_inds.last() == Some(&ArrayIndex { i: 2, j: 6 }) { + // use std::thread; + // use std::time::Duration; + // // let mut rng = rand::rng(); + // // let delay_secs = rng.random_range(3..=7); + // let delay_secs = if start_inds.first() == Some(&ArrayIndex { i: 1, j: 1 }) { + // 6 + // // return sender.send(Err(InvalidRouteStart( + // // "start index ArrayIndex { i: 1, j: 1 } is invalid".into(), + // // ))); + // } else { + // 10 + // }; + // // println!("Sleeping {delay_secs}s before yielding"); + // // io::stdout().flush().expect("Failed to flush stdout"); + // thread::sleep(Duration::from_secs(delay_secs)); + // } + + for dropped_soft_groups in 0..=scenario.soft_barrier_group_count() { + if dropped_soft_groups > 0 { + info!( + "Retrying route from {:?} with {} soft-barrier group(s) dropped", + start_point, dropped_soft_groups + ); + } + + let solution = algorithm.compute( + start_point, + end, + |p| scenario.successors_for_attempt(p, dropped_soft_groups), + |p| end.contains(p), + grid_shape, + ); + + if let Some(solution) = solution { + let dropped_barrier_layers = scenario.dropped_barrier_layers(dropped_soft_groups); + return Some(solution.record_dropped_barriers(dropped_barrier_layers)); + } + } + + None +} + const PRECISION_SCALAR: f32 = 1e4; fn cost_as_u64(cost: f32) -> u64 { let cost = cost * PRECISION_SCALAR; @@ -242,3 +258,76 @@ fn per_rayon_worker_memory_budget(total_budget_bytes: u64) -> u64 { per_worker_budget } + +#[cfg(test)] +mod tests { + use super::{Algorithm, AlgorithmType, Scenario, compute_route_attempt_result}; + use crate::ArrayIndex; + + #[test] + fn compute_route_attempt_result_tracks_dropped_barriers_per_start() { + let store = crate::dataset::samples::ZarrTestBuilder::new() + .dimensions(1, 3, 5) + .chunks(1, 3, 5) + .layer(crate::dataset::samples::LayerConfig::ones("cost")) + .layer(crate::dataset::samples::LayerConfig::new( + "hard_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .layer(crate::dataset::samples::LayerConfig::new( + "soft_barrier", + crate::dataset::samples::FillStrategy::Values(vec![ + 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, + ]), + )) + .build() + .unwrap(); + let cost_function = crate::cost::CostFunction::from_json( + r#"{ + "cost_layers": [{"layer_name": "cost"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0 + }, + { + "layer_name": "soft_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1 + } + ], + "ignore_invalid_costs": false + }"#, + ) + .unwrap(); + let scenario = Scenario::new(store.path(), cost_function, 1_000).unwrap(); + let algorithm = Algorithm::from_selection(AlgorithmType::Dijkstra, 8 * 1024 * 1024); + let start = [ArrayIndex::new(0, 0), ArrayIndex::new(2, 0)]; + let end = [ArrayIndex::new(0, 4), ArrayIndex::new(2, 4)]; + + let result = compute_route_attempt_result(&scenario, &algorithm, &start, &end); + + assert_eq!(result.len(), 2); + + let top_solution = result + .iter() + .find(|solution| solution.route().first() == Some(&ArrayIndex::new(0, 0))) + .unwrap(); + assert_eq!(top_solution.route().last(), Some(&ArrayIndex::new(0, 4))); + assert_eq!( + top_solution.dropped_barrier_layers(), + &vec!["soft_barrier".to_string()] + ); + + let bottom_solution = result + .iter() + .find(|solution| solution.route().first() == Some(&ArrayIndex::new(2, 0))) + .unwrap(); + assert_eq!(bottom_solution.route().last(), Some(&ArrayIndex::new(2, 4))); + assert!(bottom_solution.dropped_barrier_layers().is_empty()); + } +} From 69d2f1ce675c8010200d20c49afee75b980e1e2a Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:05:21 -0600 Subject: [PATCH 41/71] Update python interface --- crates/revrt/src/ffi/mod.rs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/crates/revrt/src/ffi/mod.rs b/crates/revrt/src/ffi/mod.rs index 764fdaf0..bb1053ea 100644 --- a/crates/revrt/src/ffi/mod.rs +++ b/crates/revrt/src/ffi/mod.rs @@ -13,7 +13,7 @@ use crate::{ArrayIndex, RevrtRoutingSolutions, Solution, resolve, resolve_genera type PyRoutePoint = (u64, u64); type PyPossibleRouteNodes = Vec; -type PyRouteResult = (Vec, f32); +type PyRouteResult = (Vec, f32, Vec); type PyRoutingSolutions = Vec; type PyRouteYield = PyResult>; type PyRouteDefinition = (u32, PyPossibleRouteNodes, PyPossibleRouteNodes); @@ -37,9 +37,13 @@ impl From<&PyRouteDefinition> for RouteDefinition { impl From> for PyRouteResult { fn from(solution: Solution) -> Self { - let Solution { route, total_cost } = solution; + let Solution { + route, + total_cost, + dropped_barrier_layers, + } = solution; let path = route.into_iter().map(Into::into).collect(); - (path, total_cost) + (path, total_cost, dropped_barrier_layers) } } @@ -126,9 +130,9 @@ fn simplify_using_slopes(path: Vec<(f64, f64)>, slope_tolerance: f64) -> Vec<(f6 /// cost_function : str /// JSON string representation of the cost function. The following /// keys are allowed in the cost function: "cost_layers", -/// "friction_layers", and "ignore_invalid_costs". See the -/// documentation of the cost function for details on each of these -/// inputs. +/// "friction_layers", "barrier_layers", and +/// "ignore_invalid_costs". See the documentation of the cost +/// function for details on each of these inputs. /// start : list of tuple /// List of two-tuples containing non-negative integers representing /// the indices in the array for the pixel from which routing should @@ -209,9 +213,9 @@ fn find_paths( /// cost_function : str /// JSON string representation of the cost function. The following /// keys are allowed in the cost function: "cost_layers", -/// "friction_layers", and "ignore_invalid_costs". See the -/// documentation of the cost function for details on each of these -/// inputs. +/// "friction_layers", "barrier_layers", and +/// "ignore_invalid_costs". See the documentation of the cost +/// function for details on each of these inputs. /// route_definitions : list of tuple /// List of tuples containing path definitions. Each path definition /// tuple should be of the form (int, list, list). The int input is @@ -253,12 +257,15 @@ fn find_paths( /// (as given in the input) and the second element is a list of path /// routing results. Each result is a tuple where the first element /// is a list of points that the route goes through and the second -/// element is the final route cost. The result list will contain -/// multiple tuples if the path definition had multiple starting points. -/// An empty list will be returned if no paths were found from any of -/// the starting points to any of the ending points. This generator -/// will yield one tuple per path definition. Order is not guaranteed, -/// so use the route ID input to match results to inputs. +/// element is the final route cost. The third and fourth elements of +/// each routing result are lists containing the names and importance +/// ranks of any soft barriers dropped to obtain that specific path. +/// The result list will contain multiple tuples if the path definition +/// had multiple starting points. An empty list will be returned if no +/// paths were found from any of the starting points to any of the +/// ending points. This generator will yield one tuple per path +/// definition. Order is not guaranteed, so use the route ID input to +/// match results to inputs. #[pyclass] struct RouteFinder { /// Path to the Zarr file containing the cost layers From 309e0dbcbe05e2df58c832d6f0547ad1d81b0961 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:42:04 -0600 Subject: [PATCH 42/71] Add `BarrierLayer` model --- revrt/models/cost_layers.py | 75 ++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/revrt/models/cost_layers.py b/revrt/models/cost_layers.py index 28e79bb6..62b7b1c4 100644 --- a/revrt/models/cost_layers.py +++ b/revrt/models/cost_layers.py @@ -1,14 +1,28 @@ """Definition of friction, barrier, and costs processing config files""" +import re from pathlib import Path from typing import Literal from typing_extensions import TypedDict -from pydantic import BaseModel, DirectoryPath, FilePath +from pydantic import BaseModel, DirectoryPath, FilePath, field_validator from revrt.constants import ALL, BARRIER_H5_LAYER_NAME +_BARRIER_VALUE_PATTERN = re.compile( + r"^\s*(>=|<=|==|>|<)\s*" + r"(-?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)\s*$" +) +_BARRIER_OPERATOR_MAP = { + ">": "gt", + ">=": "ge", + "<": "lt", + "<=": "le", + "==": "eq", +} + + Extents = Literal["all", "wet", "wet+", "landfall", "dry+", "dry"] """Terms for specifying masks @@ -161,6 +175,65 @@ class LayerBuildConfig(BaseModel, extra="forbid"): """ +def parse_barrier_values(barrier_values): + """Parse barrier comparison text into an operator and threshold""" + match = _BARRIER_VALUE_PATTERN.fullmatch(barrier_values) + if match is None: + msg = ( + "Barrier values must use one of the supported comparison " + "operators ('>', '>=', '<', '<=', '==') followed by a " + f"number. Got: {barrier_values!r}" + ) + raise ValueError(msg) + + operator, threshold = match.groups() + return _BARRIER_OPERATOR_MAP[operator], float(threshold) + + +class BarrierLayer(BaseModel, extra="forbid"): + """Config for a routing barrier layer""" + + layer_name: str + """Name of layer in H5/Zarr file""" + + barrier_values: str + """Comparison definition describing barrier cells""" + + barrier_importance: int | None = None + """Optional rank used when relaxing soft barriers""" + + @field_validator("barrier_values") + @classmethod + def _validate_barrier_values(cls, barrier_values): + parse_barrier_values(barrier_values) + return barrier_values + + @field_validator("barrier_importance") + @classmethod + def _validate_barrier_importance(cls, barrier_importance): + if barrier_importance is not None and barrier_importance <= 0: + msg = ( + "Barrier importance must be a positive integer when " + f"provided. Got: {barrier_importance!r}" + ) + raise ValueError(msg) + + return barrier_importance + + def to_routing_dict(self): + """Convert barrier config to the normalized routing payload""" + barrier_operator, barrier_threshold = parse_barrier_values( + self.barrier_values + ) + + return { + "layer_name": self.layer_name, + "barrier_operator": barrier_operator, + "barrier_threshold": barrier_threshold, + "barrier_importance": self.barrier_importance, + } + + class DryCosts(BaseModel, extra="forbid"): """Config items required to generate dry costs""" From ffa974682177a52746bd0d68b41093091464f747 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:47:15 -0600 Subject: [PATCH 43/71] Pass barrier layers down --- revrt/routing/base.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index 8328d4a3..20d7a9c5 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -39,6 +39,7 @@ def __init__( cost_layers, friction_layers=None, tracked_layers=None, + barrier_layers=None, cost_multiplier_layer=None, cost_multiplier_scalar=1, ignore_invalid_costs=True, @@ -56,6 +57,9 @@ def __init__( friction_layers : list, optional List of dictionaries defining layers that influence routing but are excluded from reports. + barrier_layers : list, optional + List of dictionaries defining explicit hard or soft + barriers in the routing surface. tracked_layers : dict, optional Layers to summarize along the path, mapped to aggregation names. @@ -80,6 +84,7 @@ def __init__( self.cost_fpath = cost_fpath self.cost_layers = cost_layers self.friction_layers = friction_layers or [] + self.barrier_layers = barrier_layers or [] self.tracked_layers = tracked_layers or {} self.cost_multiplier_layer = cost_multiplier_layer self.cost_multiplier_scalar = cost_multiplier_scalar @@ -91,6 +96,7 @@ def __repr__(self): "RoutingScenario:" f"\n\t- cost_layers: {self.cost_layers}" f"\n\t- friction_layers: {self.friction_layers}" + f"\n\t- barrier_layers: {self.barrier_layers}" f"\n\t- cost_multiplier_layer: {self.cost_multiplier_layer}" f"\n\t- cost_multiplier_scalar: {self.cost_multiplier_scalar}" f"\n\t- algorithm: {self.algorithm}" @@ -103,6 +109,7 @@ def cost_function_json(self): { "cost_layers": list(self._cost_layers_for_rust()), "friction_layers": list(self._friction_layers_for_rust()), + "barrier_layers": list(self._barrier_layers_for_rust()), "ignore_invalid_costs": self.ignore_invalid_costs, } ) @@ -135,6 +142,11 @@ def _friction_layers_for_rust(self): out_layer.pop("include_in_report", None) yield out_layer + def _barrier_layers_for_rust(self): + """Barrier layers formatted for Rust ingestion""" + for layer in self.barrier_layers: + yield BarrierLayer(**layer).to_routing_dict() + class RoutingLayerManager: """Class to build routing layers from user input""" From 4868dee8624884094e7bf3c4ef889c90a27e8f8b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:48:09 -0600 Subject: [PATCH 44/71] Fix order --- revrt/routing/base.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index 20d7a9c5..ff19bdf2 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -17,6 +17,7 @@ from shapely.geometry.linestring import LineString from revrt import RouteFinder, simplify_using_slopes +from revrt.models.cost_layers import BarrierLayer from revrt.utilities.handlers import IncrementalWriter from revrt.exceptions import ( revrtKeyError, @@ -60,6 +61,9 @@ def __init__( barrier_layers : list, optional List of dictionaries defining explicit hard or soft barriers in the routing surface. + barrier_layers : list, optional + List of dictionaries defining explicit hard or soft + barriers in the routing surface. tracked_layers : dict, optional Layers to summarize along the path, mapped to aggregation names. From 764e1aa32292f12685affb6d3a9c3cd1ab93e2b8 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:51:24 -0600 Subject: [PATCH 45/71] Use barrier layers to compute hash --- revrt/routing/cli/utilities.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/revrt/routing/cli/utilities.py b/revrt/routing/cli/utilities.py index 1ea8df32..57563ece 100644 --- a/revrt/routing/cli/utilities.py +++ b/revrt/routing/cli/utilities.py @@ -22,7 +22,14 @@ @contextlib.contextmanager def routing_layer_mover( - save, cost_fpath, out_fp, route_attrs, job_name, route_cl, route_fl + save, + cost_fpath, + out_fp, + route_attrs, + job_name, + route_cl, + route_fl, + route_bl, ): """Yield temporary routing-layer path and optionally persist it @@ -46,6 +53,9 @@ def routing_layer_mover( route_fl : list List of dictionaries representing friction layer definitions used to build the output hash suffix. + route_bl : list + List of dictionaries representing barrier layer definitions + used to build the output hash suffix. Yields ------ @@ -84,6 +94,7 @@ def routing_layer_mover( voltage=voltage, cost_layers=route_cl, friction_layers=route_fl, + barrier_layers=route_bl, ) logger.info("Saved routing layer to %s", saved_fp) @@ -141,12 +152,13 @@ def _extract_batch_group(route_attrs): return polarity, voltage -def _route_layer_hash(cost_layers, friction_layers): +def _route_layer_hash(cost_layers, friction_layers, barrier_layers): """Compute short hash for layer definitions""" payload = json.dumps( { "cost_layers": cost_layers, "friction_layers": friction_layers, + "barrier_layers": barrier_layers, }, sort_keys=True, separators=(",", ":"), @@ -184,12 +196,15 @@ def _persist_routing_layer_output( voltage, cost_layers, friction_layers, + barrier_layers, ): """Save routing layer output with coordinates""" extra_outputs = Path(out_dir) / "extra_outputs" extra_outputs.mkdir(parents=True, exist_ok=True) - layer_hash = _route_layer_hash(cost_layers, friction_layers) + layer_hash = _route_layer_hash( + cost_layers, friction_layers, barrier_layers + ) base_name = ( f"{slugify(job_name)}_" f"p-{slugify(polarity)}_" From dc5be91e5dafe50fa65f455fe9293d82f707d4b5 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:57:59 -0600 Subject: [PATCH 46/71] Add barrier layers as config input --- revrt/routing/cli/point_to_feature.py | 36 +++++++++++++++++++++++++++ revrt/routing/cli/point_to_point.py | 34 +++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/revrt/routing/cli/point_to_feature.py b/revrt/routing/cli/point_to_feature.py index 595dcc13..36c9a007 100644 --- a/revrt/routing/cli/point_to_feature.py +++ b/revrt/routing/cli/point_to_feature.py @@ -36,6 +36,7 @@ def __init__( out_fp, cost_layers, friction_layers=None, + barrier_layers=None, transmission_config=None, connection_identifier_column="end_feat_id", ): @@ -80,6 +81,7 @@ def __init__( out_fp=out_fp, cost_layers=cost_layers, friction_layers=friction_layers, + barrier_layers=barrier_layers, transmission_config=transmission_config, ) self.features_fpath = features_fpath @@ -187,6 +189,7 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 out_dir, job_name, friction_layers=None, + barrier_layers=None, tracked_layers=None, cost_multiplier_layer=None, cost_multiplier_scalar=1, @@ -376,6 +379,38 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 Default is ``False``. By default, ``None``. + barrier_layers : list, optional + Layers defining explicit routing barriers that routes should + not cross. Unlike `friction_layers`, barrier layers do not add + a penalty to the routing surface. Instead, any pixel matching a + barrier definition is treated as blocked during routing. + + Each item in this list should be a dictionary containing the + following keys: + + - ``"layer_name"``: (REQUIRED) Name of layer in the + layered file containing the values to test for + barrier cells. + - ``"barrier_values"``: (REQUIRED) Comparison expression + defining which pixel values act as barriers. + Supported operators are ``">"``, ``">="``, ``"<"``, + ``"<="``, and ``"=="``, followed by a numeric + threshold. For example, ``">=15"`` marks all pixels + with values greater than or equal to ``15`` as + barriers, and ``"==1"`` marks pixels equal to ``1`` + as barriers. + - ``"barrier_importance"``: (OPTIONAL) Positive integer + ranking used to define a soft barrier. When a route + cannot be found, reVRt will iteratively drop the + lowest-ranked soft barrier and retry routing until a + route is found or all ranked barriers have been + removed. + + If ``"barrier_importance"`` is omitted, the barrier is treated + as a hard barrier and is never relaxed. This allows hard and + soft barriers to be combined in the same routing run. Multiple + entries may reference the same layer with different + ``"barrier_values"`` definitions. By default, ``None``. tracked_layers : dict, optional Dictionary mapping layer names to strings, where the strings are dask aggregation methods (similar to what numpy has) that @@ -490,6 +525,7 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 out_fp=out_fp, cost_layers=cost_layers, friction_layers=friction_layers, + barrier_layers=barrier_layers, transmission_config=transmission_config, connection_identifier_column=connection_identifier_column, ) diff --git a/revrt/routing/cli/point_to_point.py b/revrt/routing/cli/point_to_point.py index c223b7ca..b44d7a3f 100644 --- a/revrt/routing/cli/point_to_point.py +++ b/revrt/routing/cli/point_to_point.py @@ -89,6 +89,7 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 out_dir, job_name, friction_layers=None, + barrier_layers=None, tracked_layers=None, cost_multiplier_layer=None, cost_multiplier_scalar=1, @@ -265,6 +266,38 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 Default is ``False``. By default, ``None``. + barrier_layers : list, optional + Layers defining explicit routing barriers that routes should + not cross. Unlike `friction_layers`, barrier layers do not add + a penalty to the routing surface. Instead, any pixel matching a + barrier definition is treated as blocked during routing. + + Each item in this list should be a dictionary containing the + following keys: + + - ``"layer_name"``: (REQUIRED) Name of layer in the + layered file containing the values to test for + barrier cells. + - ``"barrier_values"``: (REQUIRED) Comparison expression + defining which pixel values act as barriers. + Supported operators are ``">"``, ``">="``, ``"<"``, + ``"<="``, and ``"=="``, followed by a numeric + threshold. For example, ``">=15"`` marks all pixels + with values greater than or equal to ``15`` as + barriers, and ``"==1"`` marks pixels equal to ``1`` + as barriers. + - ``"barrier_importance"``: (OPTIONAL) Positive integer + ranking used to define a soft barrier. When a route + cannot be found, reVRt will iteratively drop the + lowest-ranked soft barrier and retry routing until a + route is found or all ranked barriers have been + removed. + + If ``"barrier_importance"`` is omitted, the barrier is treated + as a hard barrier and is never relaxed. This allows hard and + soft barriers to be combined in the same routing run. Multiple + entries may reference the same layer with different + ``"barrier_values"`` definitions. By default, ``None``. tracked_layers : dict, optional Dictionary mapping layer names to strings, where the strings are dask aggregation methods (similar to what numpy has) that @@ -369,6 +402,7 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 out_fp=out_fp, cost_layers=cost_layers, friction_layers=friction_layers, + barrier_layers=barrier_layers, transmission_config=transmission_config, ) From 684f8c4239ed57b7bb8e882dd94f9c472caaeee5 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:58:43 -0600 Subject: [PATCH 47/71] Add barrier layer as input --- revrt/routing/cli/base.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/revrt/routing/cli/base.py b/revrt/routing/cli/base.py index 9e7ff162..f013a8a4 100644 --- a/revrt/routing/cli/base.py +++ b/revrt/routing/cli/base.py @@ -47,6 +47,7 @@ def __init__( out_fp, cost_layers, friction_layers=None, + barrier_layers=None, transmission_config=None, ): """ @@ -77,6 +78,11 @@ def __init__( (i.e. friction, barriers, etc.). See the description of :func:`revrt.routing.cli.point_to_point.compute_lcp_routes` for more details. + barrier_layers : list + Layers defining explicit hard or soft routing barriers. See + the description of + :func:`revrt.routing.cli.point_to_point.compute_lcp_routes` + for more details. transmission_config : path-like or dict, optional Dictionary of transmission cost configuration values, or path to JSON/JSON5 file containing this dictionary. See the @@ -89,6 +95,7 @@ def __init__( self.out_fp = Path(out_fp) self.cost_layers = cost_layers self.friction_layers = friction_layers or [] + self.barrier_layers = barrier_layers or [] self.transmission_config = transmission_config @property From a6214424e97ca25d983f29a8914fe5a92bf3d69b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 15:59:09 -0600 Subject: [PATCH 48/71] Pass through barrier layer input --- revrt/routing/cli/base.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/revrt/routing/cli/base.py b/revrt/routing/cli/base.py index f013a8a4..8d9714cf 100644 --- a/revrt/routing/cli/base.py +++ b/revrt/routing/cli/base.py @@ -144,10 +144,11 @@ def __iter__(self): ) route_cl = self._update_cl(polarity, voltage) route_fl = self._update_fl(polarity, voltage) + route_bl = self.barrier_layers route_definitions, route_attrs = ( self._convert_to_route_definitions(routes) ) - yield route_cl, route_fl, route_definitions, route_attrs + yield route_cl, route_fl, route_bl, route_definitions, route_attrs @property def _paths_to_compute(self): @@ -222,11 +223,14 @@ def run_lcp( # noqa routes_to_compute.num_routes, ) for route_batch in routes_to_compute: - route_cl, route_fl, route_definitions, route_attrs = route_batch + route_cl, route_fl, route_bl, route_definitions, route_attrs = ( + route_batch + ) scenario = RoutingScenario( cost_fpath=cost_fpath, cost_layers=route_cl, friction_layers=route_fl, + barrier_layers=route_bl, tracked_layers=tracked_layers, cost_multiplier_layer=cost_multiplier_layer, cost_multiplier_scalar=cost_multiplier_scalar, @@ -249,6 +253,7 @@ def run_lcp( # noqa job_name=job_name, route_cl=route_cl, route_fl=route_fl, + route_bl=route_bl, ) with rl_mover as routing_layer_out_fp: From 1590cc347c147a09078d5ea0c4a6726e750e3da6 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 16:01:20 -0600 Subject: [PATCH 49/71] Add new input --- revrt/routing/cli/build_costs.py | 1 + 1 file changed, 1 insertion(+) diff --git a/revrt/routing/cli/build_costs.py b/revrt/routing/cli/build_costs.py index db9aa031..415c36c8 100644 --- a/revrt/routing/cli/build_costs.py +++ b/revrt/routing/cli/build_costs.py @@ -63,6 +63,7 @@ def build_routing_layer(lcp_config_fp, out_dir, polarity=None, voltage=None): cost_fpath=config["cost_fpath"], cost_layers=route_cl, friction_layers=route_fl, + barrier_layers=config.get("barrier_layers"), cost_multiplier_layer=config.get("cost_multiplier_layer"), cost_multiplier_scalar=config.get("cost_multiplier_scalar", 1), ignore_invalid_costs=config.get("ignore_invalid_costs", False), From 2e9f72300190e0677f1f9ab6842d23e1417e9422 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 16:01:56 -0600 Subject: [PATCH 50/71] Add logic to build barrier mask --- revrt/routing/base.py | 53 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 47 insertions(+), 6 deletions(-) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index ff19bdf2..2cbbcca5 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -58,15 +58,12 @@ def __init__( friction_layers : list, optional List of dictionaries defining layers that influence routing but are excluded from reports. - barrier_layers : list, optional - List of dictionaries defining explicit hard or soft - barriers in the routing surface. - barrier_layers : list, optional - List of dictionaries defining explicit hard or soft - barriers in the routing surface. tracked_layers : dict, optional Layers to summarize along the path, mapped to aggregation names. + barrier_layers : list, optional + List of dictionaries defining explicit hard or soft + barriers in the routing surface. cost_multiplier_layer : str, optional Layer name providing spatial multipliers for total cost. cost_multiplier_scalar : int or float, optional @@ -184,6 +181,7 @@ def __init__(self, routing_scenario, chunks="auto"): self.li_cost = None self.untracked_cost = None self.final_routing_layer = None + self.barrier_mask = None def __repr__(self): return f"RoutingLayerManager for {self.routing_scenario!r}" @@ -280,12 +278,18 @@ def _build_final_routing_layer(self): frictions = da.where(frictions <= -1, -1.0 + 1e-7, frictions) self.final_routing_layer *= 1 + frictions self.final_routing_layer += self.li_cost + self.barrier_mask = self._build_barrier_mask() self.final_routing_layer.values = da.where( self.final_routing_layer <= 0, -1 if self.routing_scenario.ignore_invalid_costs else 1e10, self.final_routing_layer, ) + self.final_routing_layer.values = da.where( + self.barrier_mask, + da.nan, + self.final_routing_layer.values, + ) def _extract_and_scale_cost_layer(self, layer_info): """Extract layer based on name and scale according to input""" @@ -313,6 +317,43 @@ def _extract_and_scale_friction_layer(self, mask_layer_name, layer_info): cost *= layer_info.get("multiplier_scalar", 1) return cost + def _build_barrier_mask(self): + """Build a mask for always-active explicit barriers""" + barrier_mask = da.zeros(self._full_shape, dtype=bool) + for layer_info in self._iter_hard_barrier_layers(): + barrier_mask |= self._extract_barrier_layer(layer_info) + return barrier_mask + + def _iter_hard_barrier_layers(self): + """Yield barrier layers without retry importance""" + for layer_info in self.routing_scenario.barrier_layers: + if layer_info.get("barrier_importance") is None: + yield BarrierLayer(**layer_info).to_routing_dict() + + def _extract_barrier_layer(self, layer_info): + """Extract one barrier layer mask from the layered file""" + layer = self._extract_layer(layer_info["layer_name"]) + layer_data = getattr(layer, "data", layer) + threshold = layer_info["barrier_threshold"] + operator = layer_info["barrier_operator"] + + if operator == "gt": + return layer_data > threshold + if operator == "ge": + return layer_data >= threshold + if operator == "lt": + return layer_data < threshold + if operator == "le": + return layer_data <= threshold + if operator == "eq": + return layer_data == threshold + + msg = ( + "Did not recognize barrier operator " + f"{operator!r} for layer {layer_info['layer_name']!r}" + ) + raise revrtKeyError(msg) + def _extract_layer(self, layer_name): """Extract layer based on name""" self._verify_layer_exists(layer_name) From 640f5f87373c5332dbc7c8144173c48d0d45f24b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 16:05:26 -0600 Subject: [PATCH 51/71] Catch and report dropped barrier layers --- revrt/routing/base.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index 2cbbcca5..b3bdb18a 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -867,9 +867,12 @@ def _skip_failed_routes(self, routing_results): start_points, end_points, ) - for indices, optimized_objective in solutions: + for indices, optimized_objective, dbl in solutions: attrs_key = (route_id, indices[0]) - attrs = self.route_attrs.get(attrs_key, self.default_attrs) + attrs = { + **self.route_attrs.get(attrs_key, self.default_attrs), + "dropped_barrier_layers": json.dumps(dbl), + } yield indices, optimized_objective, attrs time_elapsed = f"{(time.monotonic() - ts) / 60:.2f} minute(s)" From 5fcc60fd3a0126603467f47a036ac82d2c9f9662 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 16:09:34 -0600 Subject: [PATCH 52/71] Add minor assert --- tests/python/integration/test_rust_bindings_integration.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/python/integration/test_rust_bindings_integration.py b/tests/python/integration/test_rust_bindings_integration.py index 3411d74a..2961332c 100644 --- a/tests/python/integration/test_rust_bindings_integration.py +++ b/tests/python/integration/test_rust_bindings_integration.py @@ -157,7 +157,8 @@ def test_route_finder_basic_single_route_layered_file(tmp_path, algorithm): else: assert route_id == 2 assert len(solutions) == 1 - test_path, test_cost = solutions[0] + (test_path, test_cost, dropped_barrier_layers) = solutions[0] + assert dropped_barrier_layers == [] mcp = MCP_Geometric(cost_values[0]) costs, __ = mcp.find_costs(starts=[(1, 1)], ends=[(2, 6)]) From 6daa84c96e560099408aa09b3eabd8dabbcec359 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:08:35 -0600 Subject: [PATCH 53/71] Fix tests --- .../unit/routing/cli/test_routing_cli_point_to_feature.py | 3 ++- tests/python/unit/test_skimage_validate.py | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/python/unit/routing/cli/test_routing_cli_point_to_feature.py b/tests/python/unit/routing/cli/test_routing_cli_point_to_feature.py index 01f330eb..88cf79f1 100644 --- a/tests/python/unit/routing/cli/test_routing_cli_point_to_feature.py +++ b/tests/python/unit/routing/cli/test_routing_cli_point_to_feature.py @@ -122,9 +122,10 @@ def test_converter_maps_lat_lon_and_iterates(point_feature_dataset): batches = list(converter) assert len(batches) == 1 - route_cl, route_fl, route_definitions, route_attrs = batches[0] + route_cl, route_fl, route_bl, route_definitions, route_attrs = batches[0] assert route_cl == [{"layer_name": "tie_line_costs_400MW"}] assert not route_fl + assert not route_bl assert len(route_definitions) == 1 route_id, start_points, end_points = route_definitions[0] diff --git a/tests/python/unit/test_skimage_validate.py b/tests/python/unit/test_skimage_validate.py index cf987140..5ffb2859 100644 --- a/tests/python/unit/test_skimage_validate.py +++ b/tests/python/unit/test_skimage_validate.py @@ -52,7 +52,7 @@ def validate_find_paths_single_var(data, start, end, tmp_path, algorithm): ) assert len(results) == 1 - revrt_route, revrt_cost = results[0] + revrt_route, revrt_cost, dropped_barrier_layers = results[0] cost = da.values[0] mcp = MCP_Geometric(cost) @@ -63,6 +63,7 @@ def validate_find_paths_single_var(data, start, end, tmp_path, algorithm): assert np.array_equal(skimage_route, revrt_route) # compare final cost assert np.isclose(revrt_cost, costs[end]) + assert not dropped_barrier_layers # make sure path simplification is equivalent if len(revrt_route) > 1: @@ -99,7 +100,8 @@ def validate_route_finder_single_var(data, start, end, tmp_path, algorithm): route_id, solutions = results[0] assert route_id == 0 assert len(solutions) == 1 - revrt_route, revrt_cost = solutions[0] + (revrt_route, revrt_cost, dropped_barrier_layers) = solutions[0] + assert dropped_barrier_layers == [] cost = da.values[0] mcp = MCP_Geometric(cost) From a012ecc1f1c19817a77ecb29b048e0d07c0178c3 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:08:45 -0600 Subject: [PATCH 54/71] Use a revrt error --- revrt/models/cost_layers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/revrt/models/cost_layers.py b/revrt/models/cost_layers.py index 62b7b1c4..bdf2c0b7 100644 --- a/revrt/models/cost_layers.py +++ b/revrt/models/cost_layers.py @@ -8,6 +8,7 @@ from pydantic import BaseModel, DirectoryPath, FilePath, field_validator from revrt.constants import ALL, BARRIER_H5_LAYER_NAME +from revrt.exceptions import revrtConfigurationError _BARRIER_VALUE_PATTERN = re.compile( @@ -184,7 +185,7 @@ def parse_barrier_values(barrier_values): "operators ('>', '>=', '<', '<=', '==') followed by a " f"number. Got: {barrier_values!r}" ) - raise ValueError(msg) + raise revrtConfigurationError(msg) operator, threshold = match.groups() return _BARRIER_OPERATOR_MAP[operator], float(threshold) @@ -216,7 +217,7 @@ def _validate_barrier_importance(cls, barrier_importance): "Barrier importance must be a positive integer when " f"provided. Got: {barrier_importance!r}" ) - raise ValueError(msg) + raise revrtConfigurationError(msg) return barrier_importance From 114618f69de09ceec905af1013b278992f605768 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:09:01 -0600 Subject: [PATCH 55/71] Exit early if no routes --- revrt/routing/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index b3bdb18a..49799c07 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -781,6 +781,9 @@ def _compute_routes(self, out_fp, save_paths, rl=None): def _route_results(self, routing_layer_out_fp=None): """Generator yielding route results from Rust computations""" + if not self.route_definitions: + return + logger.debug( "Setting memory limit to %.2f GB for Rust computations", self.mem_limit_gb, From 7b218b0cbc9e9cdb8136a47ee198dd9766eb365c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:09:32 -0600 Subject: [PATCH 56/71] Add barrier tests --- .../test_rust_bindings_integration.py | 172 ++++++++++++++- tests/python/unit/test_rust_bindings.py | 203 +++++++++++++++++- 2 files changed, 369 insertions(+), 6 deletions(-) diff --git a/tests/python/integration/test_rust_bindings_integration.py b/tests/python/integration/test_rust_bindings_integration.py index 2961332c..9073610e 100644 --- a/tests/python/integration/test_rust_bindings_integration.py +++ b/tests/python/integration/test_rust_bindings_integration.py @@ -15,6 +15,43 @@ from revrt.utilities import LayeredFile +def _write_layers_to_layered_file(tmp_path, layers): + """Write in-memory arrays to a layered-file test store""" + + first_layer = next(iter(layers.values())) + height, width = first_layer.shape[1:] + cell_size = 1.0 + x0, y0 = 0.0, float(height) + transform = from_origin(x0, y0, cell_size, cell_size) + x_coords = ( + x0 + np.arange(width, dtype=np.float32) * cell_size + cell_size / 2 + ) + y_coords = ( + y0 - np.arange(height, dtype=np.float32) * cell_size - cell_size / 2 + ) + + layered_fp = tmp_path / "test_layered.zarr" + layer_file = LayeredFile(layered_fp) + for layer_name, layer_values in layers.items(): + da = xr.DataArray( + layer_values, + dims=("band", "y", "x"), + coords={"y": y_coords, "x": x_coords}, + ) + da = da.rio.write_crs("EPSG:4326") + da = da.rio.write_transform(transform) + + geotiff_fp = tmp_path / f"{layer_name}.tif" + da.rio.to_raster(geotiff_fp, driver="GTiff") + layer_file.write_geotiff_to_file( + geotiff_fp, + layer_name, + overwrite=True, + ) + + return layered_fp + + def test_find_paths_basic_single_route_layered_file(tmp_path): """Test routing using a LayeredFile-generated cost surface""" @@ -74,13 +111,54 @@ def test_find_paths_basic_single_route_layered_file(tmp_path): ) assert len(results) == 1 - test_path, test_cost = results[0] + test_path, test_cost, dropped_barrier_layers = results[0] mcp = MCP_Geometric(cost_values[0]) costs, __ = mcp.find_costs(starts=[(1, 1)], ends=[(2, 6)]) assert test_path == mcp.traceback((2, 6)) assert np.isclose(test_cost, costs[(2, 6)]) + assert not dropped_barrier_layers + + +def test_find_paths_respects_hard_barrier_layered_file(tmp_path): + """Test that hard barriers block routing for layered-file inputs""" + + layered_fp = _write_layers_to_layered_file( + tmp_path, + { + "test_costs": np.ones((1, 3, 3), dtype=np.float32), + "test_barrier": np.array( + [ + [ + [1, 1, 1], + [1, 0, 1], + [1, 1, 1], + ] + ], + dtype=np.float32, + ), + }, + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "test_barrier", + "barrier_values": "== 1", + } + ], + "ignore_invalid_costs": False, + } + results = find_paths( + zarr_fp=layered_fp, + cost_function=json.dumps(cost_definition), + start=[(1, 1)], + end=[(0, 0)], + ) + + assert results == [] @pytest.mark.parametrize( @@ -157,8 +235,10 @@ def test_route_finder_basic_single_route_layered_file(tmp_path, algorithm): else: assert route_id == 2 assert len(solutions) == 1 - (test_path, test_cost, dropped_barrier_layers) = solutions[0] + test_path, test_cost, dropped_barrier_layers = solutions[0][:3] assert dropped_barrier_layers == [] + if len(solutions[0]) > 3: + assert solutions[0][3] == [] mcp = MCP_Geometric(cost_values[0]) costs, __ = mcp.find_costs(starts=[(1, 1)], ends=[(2, 6)]) @@ -167,6 +247,94 @@ def test_route_finder_basic_single_route_layered_file(tmp_path, algorithm): assert np.isclose(test_cost, costs[(2, 6)]) +@pytest.mark.parametrize( + "algorithm", + [ + "astar", + "dijkstra", + "long-range-astar", + "long-range-dijkstra", + "bidirectional-long-range-dijkstra", + ], +) +def test_route_finder_retries_soft_barriers_layered_file(tmp_path, algorithm): + """Test mixed hard and soft barriers for layered-file inputs""" + + layered_fp = _write_layers_to_layered_file( + tmp_path, + { + "test_costs": np.ones((1, 3, 5), dtype=np.float32), + "hard_barrier": np.array( + [ + [ + [0, 0, 0, 0, 0], + [1, 1, 1, 1, 1], + [0, 0, 0, 0, 0], + ] + ], + dtype=np.float32, + ), + "soft_barrier": np.array( + [ + [ + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ], + dtype=np.float32, + ), + }, + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier", + "barrier_values": "== 1", + }, + { + "layer_name": "soft_barrier", + "barrier_values": "== 1", + "barrier_importance": 1, + }, + ], + "ignore_invalid_costs": False, + } + results = list( + RouteFinder( + zarr_fp=layered_fp, + cost_function=json.dumps(cost_definition), + route_definitions=[(7, [(0, 0), (2, 0)], [(0, 4), (2, 4)])], + algorithm=algorithm, + ) + ) + + assert len(results) == 1 + route_id, solutions = results[0] + assert route_id == 7 + assert len(solutions) == 2 + + solutions_by_start = { + tuple(solution[0][0]): solution for solution in solutions + } + + top_solution = solutions_by_start[(0, 0)] + assert top_solution[0][-1] == (0, 4) + assert top_solution[1] > 0 + assert top_solution[2] == ["soft_barrier"] + if len(top_solution) > 3: + assert top_solution[3] == [1] + + bottom_solution = solutions_by_start[(2, 0)] + assert bottom_solution[0][-1] == (2, 4) + assert bottom_solution[1] > 0 + assert bottom_solution[2] == [] + if len(bottom_solution) > 3: + assert bottom_solution[3] == [] + + @pytest.mark.parametrize( "algorithm", [ diff --git a/tests/python/unit/test_rust_bindings.py b/tests/python/unit/test_rust_bindings.py index 89859cda..6c05ad95 100644 --- a/tests/python/unit/test_rust_bindings.py +++ b/tests/python/unit/test_rust_bindings.py @@ -52,13 +52,106 @@ def test_find_paths_basic_single_route(tmp_path): ) assert len(results) == 1 - test_path, test_cost = results[0] + test_path, test_cost, dropped_barrier_layers = results[0] mcp = MCP_Geometric(da.values[0]) costs, __ = mcp.find_costs(starts=[(1, 1)], ends=[(2, 6)]) assert test_path == mcp.traceback((2, 6)) assert np.isclose(test_cost, costs[(2, 6)]) + assert not dropped_barrier_layers + + +def test_find_paths_respects_explicit_barrier_layers(tmp_path): + """find_paths treats explicit barrier layers as impassable""" + + cost_layer = xr.DataArray( + np.ones((1, 3, 3), dtype=np.float32), + dims=("band", "y", "x"), + ) + barrier_layer = xr.DataArray( + np.array( + [ + [ + [1, 1, 1], + [1, 0, 1], + [1, 1, 1], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + + test_cost_fp = tmp_path / "test_barrier.zarr" + ds = xr.Dataset({"test_costs": cost_layer, "test_barrier": barrier_layer}) + for layer_name in ds.data_vars: + ds[layer_name].encoding = { + "fill_value": 1_000.0, + "_FillValue": 1_000.0, + } + + ds.chunk({"x": 3, "y": 3}).to_zarr( + test_cost_fp, mode="w", zarr_format=3, consolidated=False + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "test_barrier", + "barrier_values": "== 1", + } + ], + "ignore_invalid_costs": False, + } + results = find_paths( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + start=[(1, 1)], + end=[(0, 0)], + ) + + assert results == [] + + +def test_find_paths_rejects_invalid_barrier_values(tmp_path): + """find_paths returns a validation error for malformed barriers""" + + da = xr.DataArray( + np.ones((1, 2, 2), dtype=np.float32), + dims=("band", "y", "x"), + ) + + test_cost_fp = tmp_path / "test_invalid_barrier.zarr" + ds = xr.Dataset({"test_costs": da, "test_barrier": da}) + for layer_name in ds.data_vars: + ds[layer_name].encoding = { + "fill_value": 1_000.0, + "_FillValue": 1_000.0, + } + + ds.chunk({"x": 2, "y": 2}).to_zarr( + test_cost_fp, mode="w", zarr_format=3, consolidated=False + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "test_barrier", + "barrier_values": "!= 1", + } + ], + } + + with pytest.raises(ValueError, match="Barrier values must use"): + find_paths( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + start=[(0, 0)], + end=[(1, 1)], + ) @pytest.mark.parametrize( @@ -116,7 +209,8 @@ def test_route_finder_basic_single_route(tmp_path, algorithm): else: assert route_id == 2 assert len(solutions) == 1 - test_path, test_cost = solutions[0] + (test_path, test_cost, dropped_barrier_layers) = solutions[0] + assert dropped_barrier_layers == [] mcp = MCP_Geometric(da.values[0]) costs, __ = mcp.find_costs(starts=[(1, 1)], ends=[(2, 6)]) @@ -270,10 +364,11 @@ def test_find_paths_supports_explicit_algorithm(tmp_path, algorithm): ) assert len(results) == 1 - path, cost = results[0] + path, cost, dropped_barrier_layers = results[0] assert path[0] == (1, 1) assert path[-1] == (2, 6) assert cost > 0 + assert not dropped_barrier_layers @pytest.mark.parametrize( @@ -330,12 +425,112 @@ def test_route_finder_supports_explicit_algorithm(tmp_path, algorithm): route_id, solutions = results[0] assert route_id == 2 assert len(solutions) == 1 - path, cost = solutions[0] + path, cost, dropped_barrier_layers = solutions[0] + assert dropped_barrier_layers == [] assert path[0] == (1, 1) assert path[-1] == (2, 6) assert cost > 0 +def test_route_finder_tracks_dropped_barriers_per_start_point(tmp_path): + """RouteFinder returns per-solution retry metadata for mixed starts""" + + cost_layer = xr.DataArray( + np.ones((1, 3, 5), dtype=np.float32), + dims=("band", "y", "x"), + ) + hard_barrier = xr.DataArray( + np.array( + [ + [ + [0, 0, 0, 0, 0], + [1, 1, 1, 1, 1], + [0, 0, 0, 0, 0], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + soft_barrier = xr.DataArray( + np.array( + [ + [ + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + + test_cost_fp = tmp_path / "mixed_retry.zarr" + ds = xr.Dataset( + { + "test_costs": cost_layer, + "hard_barrier": hard_barrier, + "soft_barrier": soft_barrier, + } + ) + for layer_name in ds.data_vars: + ds[layer_name].encoding = { + "fill_value": 1_000.0, + "_FillValue": 1_000.0, + } + + ds.chunk({"x": 5, "y": 3}).to_zarr( + test_cost_fp, mode="w", zarr_format=3, consolidated=False + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "hard_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + }, + { + "layer_name": "soft_barrier", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1, + }, + ], + "ignore_invalid_costs": False, + } + results = list( + RouteFinder( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + route_definitions=[(7, [(0, 0), (2, 0)], [(0, 4), (2, 4)])], + algorithm="dijkstra", + ) + ) + + assert len(results) == 1 + route_id, solutions = results[0] + assert route_id == 7 + assert len(solutions) == 2 + + solutions_by_start = { + tuple(path[0]): (path, cost, dropped_layers) + for path, cost, dropped_layers in solutions + } + + top_path, top_cost, top_layers = solutions_by_start[(0, 0)] + assert top_path[-1] == (0, 4) + assert top_cost > 0 + assert top_layers == ["soft_barrier"] + + bottom_path, bottom_cost, bottom_layers = solutions_by_start[(2, 0)] + assert bottom_path[-1] == (2, 4) + assert bottom_cost > 0 + assert bottom_layers == [] + + def test_find_paths_supports_a_star_alias(tmp_path): """find_paths accepts the hyphenated A* alias""" From cb9386a3625503c5e9aa3b1268c5f6ac3afbc8d0 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:09:46 -0600 Subject: [PATCH 57/71] Add test for barriers --- .../cli/test_routing_cli_build_costs.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/tests/python/unit/routing/cli/test_routing_cli_build_costs.py b/tests/python/unit/routing/cli/test_routing_cli_build_costs.py index 3674ac4b..290da988 100644 --- a/tests/python/unit/routing/cli/test_routing_cli_build_costs.py +++ b/tests/python/unit/routing/cli/test_routing_cli_build_costs.py @@ -156,6 +156,51 @@ def test_build_route_costs_command_writes_expected_layers( assert np.allclose(final_layer, expected_vals) +def test_build_route_costs_command_applies_explicit_barriers( + sample_layered_data, tmp_path +): + """build-route-costs applies explicit barriers to routing rasters""" + + config = { + "cost_fpath": str(sample_layered_data), + "cost_layers": [ + {"layer_name": "layer_2"}, + ], + "barrier_layers": [ + {"layer_name": "layer_1", "barrier_values": "==0"}, + ], + "ignore_invalid_costs": False, + } + + config_fp = tmp_path / "barrier_lcp_config.json" + config_fp.write_text(json.dumps(config)) + out_dir = tmp_path / "barrier_outputs" + + outputs = build_route_costs_command.runner( + lcp_config_fp=config_fp, + out_dir=out_dir, + polarity=None, + voltage=None, + ) + + cost_fp, final_fp = [Path(fp) for fp in outputs] + with xr.open_dataset( + sample_layered_data, consolidated=False, engine="zarr" + ) as ds: + expected_costs = ds["layer_2"].isel(band=0).astype(np.float32).load() + expected_final = expected_costs.to_numpy().copy() + expected_final[ds["layer_1"].isel(band=0).to_numpy() == 0] = np.nan + + with rasterio.open(cost_fp) as src: + agg_costs = src.read(1) + + with rasterio.open(final_fp) as src: + final_layer = src.read(1) + + assert np.allclose(agg_costs, expected_costs) + assert np.array_equal(final_layer, expected_final, equal_nan=True) + + @pytest.mark.skipif( (os.environ.get("TOX_RUNNING") == "True") and (platform.system() == "Windows"), From 26d013d5cbbabd07e93da49b6f052a3ccdbecf7e Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 17:11:18 -0600 Subject: [PATCH 58/71] Add barrier tests --- .../python/unit/routing/test_routing_base.py | 236 ++++++++++++++++++ 1 file changed, 236 insertions(+) diff --git a/tests/python/unit/routing/test_routing_base.py b/tests/python/unit/routing/test_routing_base.py index 4ef5306f..34d094f8 100644 --- a/tests/python/unit/routing/test_routing_base.py +++ b/tests/python/unit/routing/test_routing_base.py @@ -1,5 +1,6 @@ """reVrt tests for routing one point to many endpoints""" +import json from pathlib import Path import pytest @@ -1984,6 +1985,92 @@ def test_friction_layer_requires_mask(sample_layered_data): routing_layers.close() +def test_barrier_layers_are_normalized_for_rust(sample_layered_data): + """Barrier layers are passed through for Rust-side parsing""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_1"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 2, + }, + {"layer_name": "layer_6", "barrier_values": "<0"}, + ], + ) + + cost_function = json.loads(scenario.cost_function_json) + assert cost_function["barrier_layers"] == [ + { + "layer_name": "layer_4", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2, + }, + { + "layer_name": "layer_6", + "barrier_operator": "lt", + "barrier_threshold": 0, + "barrier_importance": None, + }, + ] + + +def test_invalid_barrier_values_raise(sample_layered_data): + """Barrier layers reject malformed comparison expressions""" + + with pytest.raises(ValueError, match="Barrier values must use"): + RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_1"}], + barrier_layers=[{"layer_name": "layer_4", "barrier_values": "~1"}], + ).cost_function_json() + + +def test_barrier_importance_must_be_positive(sample_layered_data): + """Barrier layers reject non-positive soft barrier ranks""" + + with pytest.raises(ValueError, match="positive integer"): + RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_1"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 0, + } + ], + ).cost_function_json() + + +def test_explicit_barriers_remain_hard(sample_layered_data): + """Explicit barriers stay impassable even with soft invalid costs""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[{"layer_name": "layer_4", "barrier_values": "==1"}], + ignore_invalid_costs=False, + ) + + routing_layers = RoutingLayerManager(scenario).build() + try: + barrier_value = ( + routing_layers.final_routing_layer.isel(y=0, x=3).compute().item() + ) + free_value = ( + routing_layers.final_routing_layer.isel(y=0, x=2).compute().item() + ) + finally: + routing_layers.close() + + assert np.isnan(barrier_value) + assert free_value > 0 + + def test_soft_barrier_setting_controls_barrier_value(sample_layered_data): """Soft barriers convert impassable cells to large positive costs""" @@ -2017,6 +2104,155 @@ def test_soft_barrier_setting_controls_barrier_value(sample_layered_data): soft_layers.close() +def test_explicit_barrier_blocks_route_even_with_soft_invalid_costs( + sample_layered_data, tmp_path +): + """Explicit barriers block routes regardless of invalid cost setting""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[{"layer_name": "layer_4", "barrier_values": "==1"}], + ignore_invalid_costs=False, + algorithm="dijkstra", + ) + + out_csv = tmp_path / "routes.csv" + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + ([(1, 1)], [(1, 5)]), + ], + ) + route_computer.process(out_fp=out_csv, save_paths=False) + + assert not out_csv.exists() + + +def test_soft_barrier_points_remain_valid_for_retry(sample_layered_data): + """Soft barriers do not invalidate Python-side route endpoints""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 1, + }, + { + "layer_name": "layer_5", + "barrier_values": "==1", + "barrier_importance": 1, + }, + ], + ignore_invalid_costs=False, + ) + + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + ([(1, 1)], [(1, 5)]), + ], + ) + try: + assert route_computer._validate_start_points([(0, 3)]) == [(0, 3)] + assert route_computer._validate_end_points([(0, 3)]) == [(0, 3)] + finally: + route_computer._reset_routing_layers() + + +def test_soft_barrier_retry_returns_route_with_metadata( + sample_layered_data, tmp_path +): + """Soft barrier retries drop ranked barriers and record metadata""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 1, + } + ], + ignore_invalid_costs=False, + algorithm="dijkstra", + ) + + out_csv = tmp_path / "routes.csv" + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + ([(1, 1)], [(1, 5)]), + ], + ) + route_computer.process(out_fp=out_csv, save_paths=False) + + output = pd.read_csv(out_csv) + assert len(output) == 1 + route = output.iloc[0] + assert route["dropped_barrier_layers"] == '["layer_4"]' + + +def test_skip_failed_routes_preserves_per_solution_retry_metadata( + sample_layered_data, +): + """Batch routing applies dropped barrier metadata per solution""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_1"}], + algorithm="dijkstra", + ) + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + (13, [(1, 1), (1, 2)], [(2, 6)]), + ], + route_attrs={ + (13, (1, 2)): {"route_type": "secondary"}, + }, + ) + + routed = list( + route_computer._skip_failed_routes( + [ + ( + 13, + [ + ( + [(1, 1), (2, 2), (2, 6)], + 10.0, + [], + ), + ( + [(1, 2), (2, 3), (2, 6)], + 12.0, + ["layer_4"], + ), + ], + ) + ] + ) + ) + + assert len(routed) == 2 + + first_indices, first_objective, first_attrs = routed[0] + assert first_indices[0] == (1, 1) + assert first_objective == pytest.approx(10.0) + assert first_attrs["dropped_barrier_layers"] == "[]" + + second_indices, second_objective, second_attrs = routed[1] + assert second_indices[0] == (1, 2) + assert second_objective == pytest.approx(12.0) + assert second_attrs["route_type"] == "secondary" + assert second_attrs["dropped_barrier_layers"] == '["layer_4"]' + + @pytest.mark.parametrize("ignore_invalid_costs", [True, False]) @pytest.mark.parametrize( "algorithm", From 8484645eeeabeb85a6a652ebdf58f4830be5aaf9 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Fri, 17 Apr 2026 19:15:13 -0600 Subject: [PATCH 59/71] Add tests --- .../test_rust_bindings_integration.py | 81 ++++++++++++++ .../python/unit/routing/test_routing_base.py | 73 ++++++++++++ tests/python/unit/test_rust_bindings.py | 105 +++++++++++++++++- 3 files changed, 258 insertions(+), 1 deletion(-) diff --git a/tests/python/integration/test_rust_bindings_integration.py b/tests/python/integration/test_rust_bindings_integration.py index 9073610e..7f071917 100644 --- a/tests/python/integration/test_rust_bindings_integration.py +++ b/tests/python/integration/test_rust_bindings_integration.py @@ -335,6 +335,87 @@ def test_route_finder_retries_soft_barriers_layered_file(tmp_path, algorithm): assert bottom_solution[3] == [] +@pytest.mark.parametrize( + "algorithm", + [ + "astar", + "dijkstra", + "long-range-astar", + "long-range-dijkstra", + "bidirectional-long-range-dijkstra", + ], +) +def test_route_finder_drops_multiple_soft_barrier_groups_layered_file( + tmp_path, algorithm +): + """Layered-file routing drops soft barriers in importance order""" + + layered_fp = _write_layers_to_layered_file( + tmp_path, + { + "test_costs": np.ones((1, 3, 5), dtype=np.float32), + "soft_barrier_low": np.array( + [ + [ + [0, 0, 1, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 1, 0, 0], + ] + ], + dtype=np.float32, + ), + "soft_barrier_high": np.array( + [ + [ + [0, 0, 0, 1, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 1, 0], + ] + ], + dtype=np.float32, + ), + }, + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier_low", + "barrier_values": "== 1", + "barrier_importance": 1, + }, + { + "layer_name": "soft_barrier_high", + "barrier_values": "== 1", + "barrier_importance": 2, + }, + ], + "ignore_invalid_costs": False, + } + results = list( + RouteFinder( + zarr_fp=layered_fp, + cost_function=json.dumps(cost_definition), + route_definitions=[(9, [(1, 0)], [(1, 4)])], + algorithm=algorithm, + ) + ) + + assert len(results) == 1 + route_id, solutions = results[0] + assert route_id == 9 + assert len(solutions) == 1 + + solution = solutions[0] + assert solution[0][0] == (1, 0) + assert solution[0][-1] == (1, 4) + assert solution[1] > 0 + assert solution[2] == ["soft_barrier_low", "soft_barrier_high"] + if len(solution) > 3: + assert solution[3] == [1, 2] + + @pytest.mark.parametrize( "algorithm", [ diff --git a/tests/python/unit/routing/test_routing_base.py b/tests/python/unit/routing/test_routing_base.py index 34d094f8..d6ba7cbb 100644 --- a/tests/python/unit/routing/test_routing_base.py +++ b/tests/python/unit/routing/test_routing_base.py @@ -2197,6 +2197,79 @@ def test_soft_barrier_retry_returns_route_with_metadata( assert route["dropped_barrier_layers"] == '["layer_4"]' +def test_soft_barrier_start_point_retries_and_records_metadata( + sample_layered_data, tmp_path +): + """Routes starting on a soft barrier succeed after retry""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 1, + } + ], + ignore_invalid_costs=False, + algorithm="dijkstra", + ) + + out_csv = tmp_path / "routes.csv" + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + ([(1, 3)], [(1, 5)]), + ], + ) + route_computer.process(out_fp=out_csv, save_paths=False) + + output = pd.read_csv(out_csv) + assert len(output) == 1 + route = output.iloc[0] + assert route["start_row"] == 1 + assert route["start_col"] == 3 + assert route["end_row"] == 1 + assert route["end_col"] == 5 + assert route["dropped_barrier_layers"] == '["layer_4"]' + + +def test_soft_barrier_retry_exhaustion_returns_no_route( + sample_layered_data, assert_message_was_logged, tmp_path +): + """Routing reports no solution after exhausting soft barrier retries""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_7"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "==1", + "barrier_importance": 1, + } + ], + ignore_invalid_costs=True, + algorithm="dijkstra", + ) + + out_csv = tmp_path / "routes.csv" + route_computer = BatchRouteProcessor( + routing_scenario=scenario, + route_definitions=[ + ([(4, 0)], [(4, 5)]), + ], + ) + route_computer.process(out_fp=out_csv, save_paths=False) + + assert_message_was_logged( + "Unable to find route from [(4, 0)] to any of [(4, 5)]", + "ERROR", + ) + assert not out_csv.exists() + + def test_skip_failed_routes_preserves_per_solution_retry_metadata( sample_layered_data, ): diff --git a/tests/python/unit/test_rust_bindings.py b/tests/python/unit/test_rust_bindings.py index 6c05ad95..d0aa8667 100644 --- a/tests/python/unit/test_rust_bindings.py +++ b/tests/python/unit/test_rust_bindings.py @@ -140,7 +140,7 @@ def test_find_paths_rejects_invalid_barrier_values(tmp_path): "barrier_layers": [ { "layer_name": "test_barrier", - "barrier_values": "!= 1", + "barrier_values": "~1", } ], } @@ -531,6 +531,109 @@ def test_route_finder_tracks_dropped_barriers_per_start_point(tmp_path): assert bottom_layers == [] +@pytest.mark.parametrize( + "algorithm", + [ + "astar", + "dijkstra", + "long-range-astar", + "long-range-dijkstra", + "bidirectional-long-range-dijkstra", + ], +) +def test_route_finder_drops_soft_barriers_by_importance(tmp_path, algorithm): + """RouteFinder drops soft barrier groups in ascending importance order""" + + cost_layer = xr.DataArray( + np.ones((1, 3, 5), dtype=np.float32), + dims=("band", "y", "x"), + ) + soft_barrier_low = xr.DataArray( + np.array( + [ + [ + [0, 0, 1, 0, 0], + [0, 0, 1, 0, 0], + [0, 0, 1, 0, 0], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + soft_barrier_high = xr.DataArray( + np.array( + [ + [ + [0, 0, 0, 1, 0], + [0, 0, 0, 1, 0], + [0, 0, 0, 1, 0], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + + test_cost_fp = tmp_path / "ordered_retry.zarr" + ds = xr.Dataset( + { + "test_costs": cost_layer, + "soft_barrier_low": soft_barrier_low, + "soft_barrier_high": soft_barrier_high, + } + ) + for layer_name in ds.data_vars: + ds[layer_name].encoding = { + "fill_value": 1_000.0, + "_FillValue": 1_000.0, + } + + ds.chunk({"x": 5, "y": 3}).to_zarr( + test_cost_fp, mode="w", zarr_format=3, consolidated=False + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier_low", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 1, + }, + { + "layer_name": "soft_barrier_high", + "barrier_operator": "eq", + "barrier_threshold": 1.0, + "barrier_importance": 2, + }, + ], + "ignore_invalid_costs": False, + } + results = list( + RouteFinder( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + route_definitions=[(9, [(1, 0)], [(1, 4)])], + algorithm=algorithm, + ) + ) + + assert len(results) == 1 + route_id, solutions = results[0] + assert route_id == 9 + assert len(solutions) == 1 + + path, cost, dropped_layers = solutions[0][:3] + assert path[0] == (1, 0) + assert path[-1] == (1, 4) + assert cost > 0 + assert dropped_layers == ["soft_barrier_low", "soft_barrier_high"] + if len(solutions[0]) > 3: + assert solutions[0][3] == [1, 2] + + def test_find_paths_supports_a_star_alias(tmp_path): """find_paths accepts the hyphenated A* alias""" From f40cbff6bbb97cf13a4f145cb43f6fb20c09e22d Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 11:43:22 -0600 Subject: [PATCH 60/71] Add support for != --- crates/revrt/src/cost.rs | 33 +++++ docs/source/guides/routing_layers.md | 10 +- revrt/models/cost_layers.py | 5 +- revrt/routing/base.py | 2 + revrt/routing/cli/point_to_feature.py | 13 +- revrt/routing/cli/point_to_point.py | 13 +- .../test_rust_bindings_integration.py | 40 ++++++ .../python/unit/routing/test_routing_base.py | 51 ++++++++ tests/python/unit/test_rust_bindings.py | 119 +++++++++++++++--- 9 files changed, 253 insertions(+), 33 deletions(-) diff --git a/crates/revrt/src/cost.rs b/crates/revrt/src/cost.rs index 38b4deb7..e075d7a9 100644 --- a/crates/revrt/src/cost.rs +++ b/crates/revrt/src/cost.rs @@ -41,6 +41,8 @@ pub(crate) struct CostFunction { #[derive(Clone, Copy, Debug, serde::Deserialize)] pub(crate) enum BarrierOperator { + #[serde(rename = "ne")] + NotEqual, #[serde(rename = "gt")] GreaterThan, #[serde(rename = "ge")] @@ -333,6 +335,7 @@ pub(crate) fn build_single_barrier_layer( .expect("Barrier layer not found in features"); barrier_values.mapv(|value| match layer.barrier_operator { + BarrierOperator::NotEqual => value != layer.barrier_threshold, BarrierOperator::GreaterThan => value > layer.barrier_threshold, BarrierOperator::GreaterThanOrEqual => value >= layer.barrier_threshold, BarrierOperator::LessThan => value < layer.barrier_threshold, @@ -417,6 +420,7 @@ mod test_builder { mod test { use super::*; use crate::dataset::{make_lazy_subset_for_tests, samples}; + use ndarray::ArrayD; use std::sync::Arc; use zarrs::array_subset::ArraySubset; use zarrs::filesystem::FilesystemStore; @@ -461,6 +465,35 @@ mod test { assert_eq!(cost.cost_layers[4].is_invariant, Some(true)); } + #[test] + fn test_build_single_barrier_layer_supports_not_equal() { + let tmp = samples::ZarrTestBuilder::new() + .dimensions(1, 2, 2) + .chunks(1, 2, 2) + .layer(samples::LayerConfig::new( + "barrier", + samples::FillStrategy::Values(vec![0.0, 1.0, 2.0, 0.0]), + )) + .build() + .expect("Failed to create barrier zarr"); + let store: ReadableListableStorage = Arc::new(FilesystemStore::new(tmp.path()).unwrap()); + let subset = ArraySubset::new_with_start_shape(vec![0, 0, 0], vec![1, 2, 2]).unwrap(); + let mut features = make_lazy_subset_for_tests(store, subset); + let layer = BarrierLayer { + layer_name: "barrier".to_string(), + barrier_operator: BarrierOperator::NotEqual, + barrier_threshold: 0.0, + barrier_importance: None, + }; + + let barrier = build_single_barrier_layer(&layer, &mut features); + + assert_eq!( + barrier, + ArrayD::from_shape_vec(IxDyn(&[1, 2, 2]), vec![false, true, true, false]).unwrap() + ); + } + #[test] fn test_friction_only_returns_zeros() { let (_tmp, mut features) = make_features_for_costs_tests(); diff --git a/docs/source/guides/routing_layers.md b/docs/source/guides/routing_layers.md index 28a22192..6b353db1 100644 --- a/docs/source/guides/routing_layers.md +++ b/docs/source/guides/routing_layers.md @@ -167,9 +167,10 @@ as described below). ### Building barrier layers Barrier layers are geospatial layers just like costs or frictions that are paired with a definition of what values should act as the barrier (the standard -comparison operators are allowed: ``>``, ``>=``, ``<``, ``<=``, ``==``). Any -pixel with a value that satisfies the comparison operator will be treated as a -barrier that cannot be crossed by a route. For example, this configuration: +comparison operators are allowed: ``==``, ``!=``, ``>``, ``>=``, ``<``, ``<=``). +Any pixel with a value that satisfies the comparison operator will be +treated as a barrier that cannot be crossed by a route. For example, this +configuration: ```json5 {"layer_name": "slope", "barrier_values": ">=15"} @@ -179,6 +180,9 @@ would tell the routing algorithm that any pixels with a value {math}`\ge 15` in the ``slope`` layer should be completely avoided. As with all the other layers, you can specify multiple barriers to be considered during routing: +Using ``"!=0"`` is also valid when you want every non-zero pixel in a layer to +act as a barrier. + ```json5 "barrier_layers": [ {"layer_name": "slope", "barrier_values": ">=15"}, diff --git a/revrt/models/cost_layers.py b/revrt/models/cost_layers.py index bdf2c0b7..b55e657f 100644 --- a/revrt/models/cost_layers.py +++ b/revrt/models/cost_layers.py @@ -12,10 +12,11 @@ _BARRIER_VALUE_PATTERN = re.compile( - r"^\s*(>=|<=|==|>|<)\s*" + r"^\s*(!=|>=|<=|==|>|<)\s*" r"(-?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)\s*$" ) _BARRIER_OPERATOR_MAP = { + "!=": "ne", ">": "gt", ">=": "ge", "<": "lt", @@ -182,7 +183,7 @@ def parse_barrier_values(barrier_values): if match is None: msg = ( "Barrier values must use one of the supported comparison " - "operators ('>', '>=', '<', '<=', '==') followed by a " + "operators ('==', '!=', '>', '>=', '<', '<=') followed by a " f"number. Got: {barrier_values!r}" ) raise revrtConfigurationError(msg) diff --git a/revrt/routing/base.py b/revrt/routing/base.py index 49799c07..8e8b6f02 100644 --- a/revrt/routing/base.py +++ b/revrt/routing/base.py @@ -345,6 +345,8 @@ def _extract_barrier_layer(self, layer_info): return layer_data < threshold if operator == "le": return layer_data <= threshold + if operator == "ne": + return layer_data != threshold if operator == "eq": return layer_data == threshold diff --git a/revrt/routing/cli/point_to_feature.py b/revrt/routing/cli/point_to_feature.py index 36c9a007..1f934c0d 100644 --- a/revrt/routing/cli/point_to_feature.py +++ b/revrt/routing/cli/point_to_feature.py @@ -393,12 +393,13 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 barrier cells. - ``"barrier_values"``: (REQUIRED) Comparison expression defining which pixel values act as barriers. - Supported operators are ``">"``, ``">="``, ``"<"``, - ``"<="``, and ``"=="``, followed by a numeric - threshold. For example, ``">=15"`` marks all pixels - with values greater than or equal to ``15`` as - barriers, and ``"==1"`` marks pixels equal to ``1`` - as barriers. + Supported operators are ``"=="``, ``"!="``, ``">"``, + ``">="``, ``"<"``, and ``"<="``, followed by a + numeric threshold. For example, ``">=15"`` marks + pixels with values greater than or equal to ``15`` + as barriers, ``"==1"`` marks pixels equal to ``1`` + as barriers, and ``"!=0"`` marks every non-zero + pixel as a barrier. - ``"barrier_importance"``: (OPTIONAL) Positive integer ranking used to define a soft barrier. When a route cannot be found, reVRt will iteratively drop the diff --git a/revrt/routing/cli/point_to_point.py b/revrt/routing/cli/point_to_point.py index b44d7a3f..07b6fa1f 100644 --- a/revrt/routing/cli/point_to_point.py +++ b/revrt/routing/cli/point_to_point.py @@ -280,12 +280,13 @@ def compute_lcp_routes( # noqa: PLR0913, PLR0917 barrier cells. - ``"barrier_values"``: (REQUIRED) Comparison expression defining which pixel values act as barriers. - Supported operators are ``">"``, ``">="``, ``"<"``, - ``"<="``, and ``"=="``, followed by a numeric - threshold. For example, ``">=15"`` marks all pixels - with values greater than or equal to ``15`` as - barriers, and ``"==1"`` marks pixels equal to ``1`` - as barriers. + Supported operators are ``"=="``, ``"!="``, ``">"``, + ``">="``, ``"<"``, and ``"<="``, followed by a + numeric threshold. For example, ``">=15"`` marks + pixels with values greater than or equal to ``15`` + as barriers, ``"==1"`` marks pixels equal to ``1`` + as barriers, and ``"!=0"`` marks every non-zero + pixel as a barrier. - ``"barrier_importance"``: (OPTIONAL) Positive integer ranking used to define a soft barrier. When a route cannot be found, reVRt will iteratively drop the diff --git a/tests/python/integration/test_rust_bindings_integration.py b/tests/python/integration/test_rust_bindings_integration.py index 7f071917..4cf72363 100644 --- a/tests/python/integration/test_rust_bindings_integration.py +++ b/tests/python/integration/test_rust_bindings_integration.py @@ -161,6 +161,46 @@ def test_find_paths_respects_hard_barrier_layered_file(tmp_path): assert results == [] +def test_find_paths_respects_not_equal_barrier_layered_file(tmp_path): + """Test that not-equal barriers block routing for layered-file inputs""" + + layered_fp = _write_layers_to_layered_file( + tmp_path, + { + "test_costs": np.ones((1, 3, 3), dtype=np.float32), + "test_barrier": np.array( + [ + [ + [1, 1, 1], + [1, 0, 1], + [1, 1, 1], + ] + ], + dtype=np.float32, + ), + }, + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "test_barrier", + "barrier_values": "!= 0", + } + ], + "ignore_invalid_costs": False, + } + results = find_paths( + zarr_fp=layered_fp, + cost_function=json.dumps(cost_definition), + start=[(1, 1)], + end=[(0, 0)], + ) + + assert results == [] + + @pytest.mark.parametrize( "algorithm", [ diff --git a/tests/python/unit/routing/test_routing_base.py b/tests/python/unit/routing/test_routing_base.py index d6ba7cbb..c00d5562 100644 --- a/tests/python/unit/routing/test_routing_base.py +++ b/tests/python/unit/routing/test_routing_base.py @@ -2018,6 +2018,32 @@ def test_barrier_layers_are_normalized_for_rust(sample_layered_data): ] +def test_barrier_layers_normalize_not_equal_for_rust(sample_layered_data): + """Barrier layers normalize the not-equal operator for Rust""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_1"}], + barrier_layers=[ + { + "layer_name": "layer_4", + "barrier_values": "!=0", + "barrier_importance": 1, + } + ], + ) + + cost_function = json.loads(scenario.cost_function_json) + assert cost_function["barrier_layers"] == [ + { + "layer_name": "layer_4", + "barrier_operator": "ne", + "barrier_threshold": 0.0, + "barrier_importance": 1, + } + ] + + def test_invalid_barrier_values_raise(sample_layered_data): """Barrier layers reject malformed comparison expressions""" @@ -2071,6 +2097,31 @@ def test_explicit_barriers_remain_hard(sample_layered_data): assert free_value > 0 +def test_not_equal_barriers_remain_hard(sample_layered_data): + """Not-equal barriers stay impassable even with soft invalid costs""" + + scenario = RoutingScenario( + cost_fpath=sample_layered_data, + cost_layers=[{"layer_name": "layer_2"}], + barrier_layers=[{"layer_name": "layer_4", "barrier_values": "!=0"}], + ignore_invalid_costs=False, + ) + + routing_layers = RoutingLayerManager(scenario).build() + try: + barrier_value = ( + routing_layers.final_routing_layer.isel(y=0, x=3).compute().item() + ) + free_value = ( + routing_layers.final_routing_layer.isel(y=0, x=2).compute().item() + ) + finally: + routing_layers.close() + + assert np.isnan(barrier_value) + assert free_value > 0 + + def test_soft_barrier_setting_controls_barrier_value(sample_layered_data): """Soft barriers convert impassable cells to large positive costs""" diff --git a/tests/python/unit/test_rust_bindings.py b/tests/python/unit/test_rust_bindings.py index d0aa8667..030ffa29 100644 --- a/tests/python/unit/test_rust_bindings.py +++ b/tests/python/unit/test_rust_bindings.py @@ -100,7 +100,8 @@ def test_find_paths_respects_explicit_barrier_layers(tmp_path): "barrier_layers": [ { "layer_name": "test_barrier", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, } ], "ignore_invalid_costs": False, @@ -115,23 +116,36 @@ def test_find_paths_respects_explicit_barrier_layers(tmp_path): assert results == [] -def test_find_paths_rejects_invalid_barrier_values(tmp_path): - """find_paths returns a validation error for malformed barriers""" +def test_find_paths_respects_not_equal_barrier_layers(tmp_path): + """find_paths treats not-equal barrier layers as impassable""" - da = xr.DataArray( - np.ones((1, 2, 2), dtype=np.float32), + cost_layer = xr.DataArray( + np.ones((1, 3, 3), dtype=np.float32), + dims=("band", "y", "x"), + ) + barrier_layer = xr.DataArray( + np.array( + [ + [ + [1, 1, 1], + [1, 0, 1], + [1, 1, 1], + ] + ], + dtype=np.float32, + ), dims=("band", "y", "x"), ) - test_cost_fp = tmp_path / "test_invalid_barrier.zarr" - ds = xr.Dataset({"test_costs": da, "test_barrier": da}) + test_cost_fp = tmp_path / "test_barrier_ne.zarr" + ds = xr.Dataset({"test_costs": cost_layer, "test_barrier": barrier_layer}) for layer_name in ds.data_vars: ds[layer_name].encoding = { "fill_value": 1_000.0, "_FillValue": 1_000.0, } - ds.chunk({"x": 2, "y": 2}).to_zarr( + ds.chunk({"x": 3, "y": 3}).to_zarr( test_cost_fp, mode="w", zarr_format=3, consolidated=False ) @@ -140,18 +154,20 @@ def test_find_paths_rejects_invalid_barrier_values(tmp_path): "barrier_layers": [ { "layer_name": "test_barrier", - "barrier_values": "~1", + "barrier_operator": "ne", + "barrier_threshold": 1, } ], + "ignore_invalid_costs": False, } + results = find_paths( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + start=[(1, 1)], + end=[(0, 0)], + ) - with pytest.raises(ValueError, match="Barrier values must use"): - find_paths( - zarr_fp=test_cost_fp, - cost_function=json.dumps(cost_definition), - start=[(0, 0)], - end=[(1, 1)], - ) + assert results == [] @pytest.mark.parametrize( @@ -531,6 +547,77 @@ def test_route_finder_tracks_dropped_barriers_per_start_point(tmp_path): assert bottom_layers == [] +def test_route_finder_retries_not_equal_soft_barriers(tmp_path): + """RouteFinder retries soft barriers defined with not-equal""" + + cost_layer = xr.DataArray( + np.ones((1, 3, 5), dtype=np.float32), + dims=("band", "y", "x"), + ) + soft_barrier = xr.DataArray( + np.array( + [ + [ + [0, 0, 1, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + ] + ], + dtype=np.float32, + ), + dims=("band", "y", "x"), + ) + + test_cost_fp = tmp_path / "retry_ne.zarr" + ds = xr.Dataset( + { + "test_costs": cost_layer, + "soft_barrier": soft_barrier, + } + ) + for layer_name in ds.data_vars: + ds[layer_name].encoding = { + "fill_value": 1_000.0, + "_FillValue": 1_000.0, + } + + ds.chunk({"x": 5, "y": 3}).to_zarr( + test_cost_fp, mode="w", zarr_format=3, consolidated=False + ) + + cost_definition = { + "cost_layers": [{"layer_name": "test_costs"}], + "barrier_layers": [ + { + "layer_name": "soft_barrier", + "barrier_operator": "ne", + "barrier_threshold": 1, + "barrier_importance": 1, + }, + ], + "ignore_invalid_costs": False, + } + results = list( + RouteFinder( + zarr_fp=test_cost_fp, + cost_function=json.dumps(cost_definition), + route_definitions=[(11, [(0, 0)], [(0, 4)])], + algorithm="dijkstra", + ) + ) + + assert len(results) == 1 + route_id, solutions = results[0] + assert route_id == 11 + assert len(solutions) == 1 + + path, cost, dropped_layers = solutions[0] + assert path[0] == (0, 0) + assert path[-1] == (0, 4) + assert cost > 0 + assert dropped_layers == ["soft_barrier"] + + @pytest.mark.parametrize( "algorithm", [ From d754238426392e469f60e0c569fc663e39eb09b2 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 11:45:01 -0600 Subject: [PATCH 61/71] Remove unused function --- crates/revrt/src/routing/scenario.rs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/crates/revrt/src/routing/scenario.rs b/crates/revrt/src/routing/scenario.rs index 259bc3b1..2f4ffc19 100644 --- a/crates/revrt/src/routing/scenario.rs +++ b/crates/revrt/src/routing/scenario.rs @@ -90,17 +90,6 @@ impl Scenario { Ok(Self { dataset, features }) } - /// Retrieve the local 3x3 neighborhood costs around a position. - /// - /// # Arguments - /// `position`: Grid index at the center of the neighborhood query. - /// - /// # Returns - /// Neighbor positions and their floating-point traversal costs. - pub(super) fn get_3x3(&self, position: &ArrayIndex) -> Vec<(ArrayIndex, f32)> { - self.dataset.get_3x3(position) - } - /// Return retry-aware successor cells for a routing attempt. /// /// The returned successors exclude non-finite or non-positive costs and @@ -121,7 +110,7 @@ impl Scenario { position: &ArrayIndex, dropped_soft_groups: usize, ) -> Vec<(ArrayIndex, u64)> { - let neighbors = self.get_3x3(position); + let neighbors = self.dataset.get_3x3(position); let soft_barrier_cells: HashSet<_> = self .dataset .get_3x3_soft_barrier_cells(position, dropped_soft_groups) From 76047ff0dfb8daf927e74df4466c714b267d0d2c Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 12:16:24 -0600 Subject: [PATCH 62/71] Fix a star logic --- crates/revrt/src/network/long_range/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/revrt/src/network/long_range/mod.rs b/crates/revrt/src/network/long_range/mod.rs index ccbe0206..e8449d74 100644 --- a/crates/revrt/src/network/long_range/mod.rs +++ b/crates/revrt/src/network/long_range/mod.rs @@ -206,14 +206,14 @@ impl FrontierOnlySearchState { } let next_cost = from_cost.saturating_add(u64::from(edge_cost)); + let estimated_cost = estimate_total_cost(neighbor, next_cost); let should_update = self .best_node_costs .get(&neighbor_slot) - .map(|current_best| next_cost < current_best.cost) + .map(|current_best| estimated_cost < current_best.estimated_cost) .unwrap_or(true); if should_update { - let estimated_cost = estimate_total_cost(neighbor, next_cost); self.best_node_costs.insert( neighbor_slot, BestNodeCost { From d9eb6e7b35f720964000e9fffb9a49fb45c1931b Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 12:26:27 -0600 Subject: [PATCH 63/71] Fix docs --- docs/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index fc441b00..2ea193cb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -381,6 +381,7 @@ def setup(app): ] + [ ("py:obj", f"revrt.models.cost_layers.{cl}.{meth}") for cl in [ + "BarrierLayer", "DryCosts", "RangeConfig", "Rasterize", From 93a3af9b632555ce20083c3567409e8c9fd6331f Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 12:29:32 -0600 Subject: [PATCH 64/71] Bump Python version --- pixi.lock | 4 ++-- pyproject.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pixi.lock b/pixi.lock index 4801bb15..3135c1aa 100644 --- a/pixi.lock +++ b/pixi.lock @@ -17570,8 +17570,8 @@ packages: requires_python: '>=3.9' - pypi: ./ name: nlr-revrt - version: 0.5.0 - sha256: f4d73973c42cadf38446a13b2e67e4919ccb2cc324250020eb621585d3e75587 + version: 0.6.0 + sha256: c0c2d72376d07134dbd2e63a8bad7cb1c487969f14655b2b49f9912866e2e128 requires_dist: - affine>=2.4.0,<3 - dask>=2026.3.0,<2027 diff --git a/pyproject.toml b/pyproject.toml index 5e65e993..90b5c2ad 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "maturin" [project] name = "NLR-reVRt" -version = "0.5.0" +version = "0.6.0" description = "National Laboratory of the Rockies' (NLR's) Transmission for reV tool" readme = "README.rst" authors = [ From 213c8f28dc9e0ff4abd7eda5d4b283902d959986 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 12:29:38 -0600 Subject: [PATCH 65/71] Bump rust version --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d017a5c2..c432d31f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1796,7 +1796,7 @@ checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "revrt" -version = "0.1.2" +version = "0.1.3" dependencies = [ "criterion", "derive_builder", diff --git a/Cargo.toml b/Cargo.toml index 07c3549f..76c8afa2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ default-members = ["crates/revrt"] resolver = "3" [workspace.package] -version = "0.1.2" +version = "0.1.3" authors = [ "Guilherme Castelão ", "Paul Pinchuk ", @@ -17,7 +17,7 @@ categories = ["simulation"] keywords = ["NRL", "routing", "transmission", "reV", "reVX"] [workspace.dependencies] -revrt = { version = "0.1.2", path = "crates/revrt" } +revrt = { version = "0.1.3", path = "crates/revrt" } clap = { version = "4.5.48", features = ["derive", "cargo"] } criterion = { version = "0.8.1", features = ["html_reports"] } derive_builder = "0.20.2" From 8ca18c1eddaf522ec7f42b61a8c2063a5e79a0f9 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 12:41:51 -0600 Subject: [PATCH 66/71] PR comments --- crates/revrt/src/dataset/swap.rs | 25 ++++++++++---- crates/revrt/src/ffi/mod.rs | 33 ++++++++++--------- .../python/unit/routing/test_routing_base.py | 8 ++--- 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/crates/revrt/src/dataset/swap.rs b/crates/revrt/src/dataset/swap.rs index b55f5ef7..e7030c4c 100644 --- a/crates/revrt/src/dataset/swap.rs +++ b/crates/revrt/src/dataset/swap.rs @@ -45,9 +45,11 @@ pub(super) struct SourceLayout { /// A `SourceLayout` describing the representative array's grid and chunking, /// which is then reused when creating swap arrays. pub(super) fn inspect_source_layout(source: &ReadableListableStorage) -> Result { - let entries = source - .list() - .expect("failed to list variables in source dataset"); + let entries = source.list().map_err(|err| { + Error::IO(std::io::Error::other(format!( + "failed to list variables in source dataset: {err}" + ))) + })?; let first_entry_opt = entries .into_iter() .map(|entry| entry.to_string()) @@ -122,8 +124,11 @@ pub(super) fn initialize_swap>( soft_barrier_group_count: usize, ) -> Result { let swap: ReadableWritableListableStorage = std::sync::Arc::new( - zarrs::filesystem::FilesystemStore::new(swap_path) - .expect("could not open filesystem store"), + zarrs::filesystem::FilesystemStore::new(swap_path).map_err(|error| { + Error::IO(std::io::Error::other(format!( + "could not open filesystem store: {error}" + ))) + })?, ); debug!("Creating a new group for the cost dataset"); @@ -142,8 +147,14 @@ pub(super) fn initialize_swap>( )?; } - debug!("Swap dataset contents: {:?}", swap.list().unwrap()); - debug!("Swap dataset size: {:?}", swap.size().unwrap()); + match swap.list() { + Ok(list) => debug!("Swap dataset contents: {:?}", list), + Err(error) => trace!("Could not inspect swap dataset contents: {error}"), + } + match swap.size() { + Ok(size) => debug!("Swap dataset size: {:?}", size), + Err(error) => trace!("Could not inspect swap dataset size: {error}"), + } Ok(swap) } diff --git a/crates/revrt/src/ffi/mod.rs b/crates/revrt/src/ffi/mod.rs index bb1053ea..00b06418 100644 --- a/crates/revrt/src/ffi/mod.rs +++ b/crates/revrt/src/ffi/mod.rs @@ -168,10 +168,14 @@ fn simplify_using_slopes(path: Vec<(f64, f64)>, slope_tolerance: f64) -> Vec<(f6 /// Returns /// ------- /// list of tuple -/// List of path routing results. Each result is a tuple -/// where the first element is a list of points that the -/// route goes through and the second element is the final -/// route cost. +/// List of path routing results. Each result is a tuple where the first +/// element is a list of points that the route goes through, the +/// second element is the final route cost, and the third element is +/// a list containing the names of any soft barriers dropped to obtain +/// that specific path. The result list will contain multiple tuples if +/// the path definition had multiple starting points. An empty list will +/// be returned if no paths were found from any of the starting points to +/// any of the ending points (even with soft barriers dropped). #[pyfunction] #[pyo3(signature = (zarr_fp, cost_function, start, end, algorithm="long_range_dijkstra", routing_layer_out_fp=None, mem_limit_bytes=250_000_000, log_level=None))] #[allow(clippy::type_complexity, clippy::too_many_arguments)] @@ -255,17 +259,16 @@ fn find_paths( /// A tuple representing the route finding result for a single /// path definition. The first element is the route definition ID /// (as given in the input) and the second element is a list of path -/// routing results. Each result is a tuple where the first element -/// is a list of points that the route goes through and the second -/// element is the final route cost. The third and fourth elements of -/// each routing result are lists containing the names and importance -/// ranks of any soft barriers dropped to obtain that specific path. -/// The result list will contain multiple tuples if the path definition -/// had multiple starting points. An empty list will be returned if no -/// paths were found from any of the starting points to any of the -/// ending points. This generator will yield one tuple per path -/// definition. Order is not guaranteed, so use the route ID input to -/// match results to inputs. +/// routing results. Each routing result is a tuple where the first +/// element is a list of points that the route goes through, the +/// second element is the final route cost, and the third element is +/// a list containing the names of any soft barriers dropped to obtain +/// that specific path. The result list will contain multiple tuples if +/// the path definition had multiple starting points. An empty list will +/// be returned if no paths were found from any of the starting points to +/// any of the ending points (even with soft barriers dropped). This +/// generator will yield one tuple per path definition. Order is not +/// guaranteed, so use the route ID input to match results to inputs. #[pyclass] struct RouteFinder { /// Path to the Zarr file containing the cost layers diff --git a/tests/python/unit/routing/test_routing_base.py b/tests/python/unit/routing/test_routing_base.py index c00d5562..68874460 100644 --- a/tests/python/unit/routing/test_routing_base.py +++ b/tests/python/unit/routing/test_routing_base.py @@ -2048,18 +2048,18 @@ def test_invalid_barrier_values_raise(sample_layered_data): """Barrier layers reject malformed comparison expressions""" with pytest.raises(ValueError, match="Barrier values must use"): - RoutingScenario( + __ = RoutingScenario( cost_fpath=sample_layered_data, cost_layers=[{"layer_name": "layer_1"}], barrier_layers=[{"layer_name": "layer_4", "barrier_values": "~1"}], - ).cost_function_json() + ).cost_function_json def test_barrier_importance_must_be_positive(sample_layered_data): """Barrier layers reject non-positive soft barrier ranks""" with pytest.raises(ValueError, match="positive integer"): - RoutingScenario( + __ = RoutingScenario( cost_fpath=sample_layered_data, cost_layers=[{"layer_name": "layer_1"}], barrier_layers=[ @@ -2069,7 +2069,7 @@ def test_barrier_importance_must_be_positive(sample_layered_data): "barrier_importance": 0, } ], - ).cost_function_json() + ).cost_function_json def test_explicit_barriers_remain_hard(sample_layered_data): From 2d57f13a51c5166a0e9821787e7f3d2d87c148a8 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Sat, 18 Apr 2026 13:30:39 -0600 Subject: [PATCH 67/71] Fix outdated tests --- .../test_rust_bindings_integration.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tests/python/integration/test_rust_bindings_integration.py b/tests/python/integration/test_rust_bindings_integration.py index 4cf72363..8817cfc1 100644 --- a/tests/python/integration/test_rust_bindings_integration.py +++ b/tests/python/integration/test_rust_bindings_integration.py @@ -146,7 +146,8 @@ def test_find_paths_respects_hard_barrier_layered_file(tmp_path): "barrier_layers": [ { "layer_name": "test_barrier", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, } ], "ignore_invalid_costs": False, @@ -186,7 +187,8 @@ def test_find_paths_respects_not_equal_barrier_layered_file(tmp_path): "barrier_layers": [ { "layer_name": "test_barrier", - "barrier_values": "!= 0", + "barrier_operator": "ne", + "barrier_threshold": 0, } ], "ignore_invalid_costs": False, @@ -332,11 +334,13 @@ def test_route_finder_retries_soft_barriers_layered_file(tmp_path, algorithm): "barrier_layers": [ { "layer_name": "hard_barrier", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, }, { "layer_name": "soft_barrier", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, "barrier_importance": 1, }, ], @@ -422,12 +426,14 @@ def test_route_finder_drops_multiple_soft_barrier_groups_layered_file( "barrier_layers": [ { "layer_name": "soft_barrier_low", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, "barrier_importance": 1, }, { "layer_name": "soft_barrier_high", - "barrier_values": "== 1", + "barrier_operator": "eq", + "barrier_threshold": 1, "barrier_importance": 2, }, ], From 341c2610d531a71a1c5f44b27cb14648ae27c350 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Tue, 21 Apr 2026 14:39:46 -0600 Subject: [PATCH 68/71] Update lockfile --- pixi.lock | 7454 +++++++++++++++++++++++++++-------------------------- 1 file changed, 3823 insertions(+), 3631 deletions(-) diff --git a/pixi.lock b/pixi.lock index 3135c1aa..af235df7 100644 --- a/pixi.lock +++ b/pixi.lock @@ -16,24 +16,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -48,7 +48,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda @@ -73,12 +73,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -87,7 +87,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 @@ -104,46 +104,46 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.12.1-hf05ffb4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hf08fa70_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -152,39 +152,39 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.12.3-py310h2b5ca13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.13.1-py310h2b5ca13_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.10-h05a5f5f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda @@ -197,13 +197,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -216,8 +216,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-22.0.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-22.0.0-py314h52d6ec5_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py314hbcf5174_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -225,7 +225,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda @@ -235,19 +235,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda @@ -266,17 +266,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -288,16 +287,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -311,13 +310,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: @@ -327,24 +327,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -358,7 +358,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda @@ -384,8 +384,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda @@ -408,23 +408,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py314hf3ac25a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -438,9 +438,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda @@ -451,35 +451,35 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.4.5-py314h6bf1ee8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-h4132b18_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py314hd47142c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.12.3-py310h655e229_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.13.1-py310h655e229_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/minizip-4.0.10-hfb7a1ec_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda @@ -492,13 +492,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.3.2-py310h6cf5e2e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numcodecs-0.16.5-py314hc4308db_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py314hc4308db_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -511,8 +511,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py314hee6578b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py314h35e0213_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py314h687fbad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -520,7 +520,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda @@ -530,14 +530,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rasterio-1.5.0-py314h061e49a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda @@ -559,7 +559,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda @@ -567,8 +567,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py314h3d180e3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -580,16 +579,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py314h03d016b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -603,13 +602,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -619,24 +619,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -650,7 +650,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda @@ -676,8 +676,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda @@ -700,23 +700,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.5-gpl_h6fbacd7_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -730,9 +730,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.1-ha937536_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -743,35 +743,35 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.53-hfab5511_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.1-h8d039ee_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.12.3-py310hc7c2786_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.13.1-py310hc7c2786_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/minizip-4.0.10-hff1a8ea_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhcf101f3_1.conda @@ -784,13 +784,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.2-py310h06fc29a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h248ca61_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py314ha3d490a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -803,8 +803,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-22.0.0-py314he55896b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-22.0.0-py314hf20a12a_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.12.1-py314h3da1bed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -812,7 +812,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda @@ -822,14 +822,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda @@ -851,7 +851,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.1-h85ec8f2_1.conda @@ -859,8 +859,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -872,16 +871,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.2-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -895,13 +894,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -911,19 +911,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -937,7 +942,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda @@ -963,8 +968,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -983,23 +988,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py314hf309875_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -1009,9 +1014,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -1021,34 +1026,36 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-c-1.10.0-h2466b09_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.12.3-py310h6f63dbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.13.1-py310h6f63dbe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/minizip-4.0.10-h9fa1bad_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/mkl-2025.3.0-hac47afa_455.conda @@ -1059,27 +1066,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nh3-0.3.2-py310hdba2031_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py314hd8fd7ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-22.0.0-py314h86ab7b2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py314hb5be3fa_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py314h1c1cb05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -1087,7 +1096,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda @@ -1098,13 +1107,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda @@ -1126,17 +1135,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -1154,16 +1162,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py314h5a2d7ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -1177,13 +1185,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl - pypi: ./ default: @@ -1201,24 +1210,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda @@ -1231,7 +1240,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1251,12 +1260,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -1265,7 +1274,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -1275,32 +1284,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda @@ -1308,12 +1317,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hf08fa70_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -1322,30 +1331,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda @@ -1362,13 +1371,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda @@ -1379,8 +1388,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-22.0.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-22.0.0-py314h52d6ec5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py314hbcf5174_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -1395,15 +1404,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -1421,17 +1430,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1442,16 +1450,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -1465,13 +1473,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: @@ -1480,24 +1489,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.6-hd145fbb_1.conda @@ -1509,7 +1518,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1532,8 +1541,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda @@ -1550,23 +1559,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py314hf3ac25a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -1580,9 +1589,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda @@ -1593,26 +1602,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.4.5-py314h6bf1ee8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda @@ -1629,13 +1638,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numcodecs-0.16.5-py314hc4308db_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py314hc4308db_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda @@ -1646,8 +1655,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py314hee6578b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py314h35e0213_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py314h687fbad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -1662,10 +1671,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rasterio-1.5.0-py314h061e49a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda @@ -1687,7 +1696,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda @@ -1695,8 +1704,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py314h3d180e3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1707,16 +1715,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py314h03d016b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -1730,13 +1738,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -1745,24 +1754,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda @@ -1774,7 +1783,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -1797,8 +1806,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda @@ -1815,23 +1824,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.5-gpl_h6fbacd7_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -1845,9 +1854,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.1-ha937536_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -1858,26 +1867,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.53-hfab5511_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.1-h8d039ee_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda @@ -1894,13 +1903,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h248ca61_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py314ha3d490a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda @@ -1911,8 +1920,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-22.0.0-py314he55896b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-22.0.0-py314hf20a12a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.12.1-py314h3da1bed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -1927,10 +1936,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda @@ -1952,7 +1961,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.1-h85ec8f2_1.conda @@ -1960,8 +1969,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -1972,16 +1980,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.2-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -1995,13 +2003,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -2010,19 +2019,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda @@ -2034,7 +2048,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -2057,8 +2071,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda @@ -2071,23 +2085,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py314hf309875_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -2097,9 +2111,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -2109,24 +2123,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda @@ -2142,25 +2158,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py314hd8fd7ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-22.0.0-py314h86ab7b2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py314hb5be3fa_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py314h1c1cb05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -2175,9 +2193,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda @@ -2199,17 +2217,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -2226,16 +2243,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py314h5a2d7ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -2249,13 +2266,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl - pypi: ./ dev: @@ -2273,7 +2291,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/affine-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.12.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda @@ -2282,26 +2300,25 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/arrow-1.4.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -2323,14 +2340,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.25.0-py314ha0b5721_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-25.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.5-py314hc02f841_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -2347,11 +2363,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.2-py314hd8ed1ab_100.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314h7fe84b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhcf101f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h24cb091_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/debugpy-1.8.18-py314h42812f9_0.conda @@ -2368,29 +2384,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-hc364b38_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fqdn-1.5.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -2400,17 +2416,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.14-hecca717_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.0-h6083320_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.22.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.1.1-py314hf4b5fa8_0.conda @@ -2420,7 +2436,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyha191276_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda @@ -2455,41 +2471,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyha804496_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h6395336_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-21.1.8-default_h746c552_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.125-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda @@ -2497,50 +2513,52 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-1.7.0-ha4b6fd6_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hf08fa70_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libllvm21-21.1.8-hf7376ad_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libntlm-1.8-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopengl-1.7.0-ha4b6fd6_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.1-hb80d175_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.328.1-h5279c79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda @@ -2550,10 +2568,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.43-h711ed8c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzip-1.11.2-h6991a6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.0.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.46.0-py314h946fb2a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda @@ -2563,12 +2581,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/makefun-1.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.10.8-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.12.3-py310h2b5ca13_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.13.1-py310h2b5ca13_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mercantile-1.2.1-pyhd8ed1ab_1.conda @@ -2579,33 +2597,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py314hed328fd_100.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.63.1-py314h8169c2f_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.0-py314h8169c2f_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.0-h8d634f6_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.8.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.8.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.3.1-pyhc455866_0.conda @@ -2614,11 +2632,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py314h8ec4b1a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipreqs-0.4.13-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pixman-0.46.4-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda @@ -2633,28 +2651,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-22.0.0-py314h52d6ec5_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygls-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py314hbcf5174_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h24aeaa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.1-py314hf36963e_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py314h3987850_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda @@ -2663,15 +2682,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.9.0-py314hc02f841_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyzmq-27.1.0-py312hfb55c3c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.1-hb82b983_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -2682,17 +2700,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.2-h40fa522_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.11-h7805a7d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-src-1.94.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py314ha0b5721_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.26.0-np2py314hda1ea4c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.1-py314hdafbbf9_0.conda @@ -2716,10 +2734,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.1.2-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda @@ -2730,11 +2748,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -2748,15 +2766,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-hb711507_2.conda @@ -2767,28 +2785,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.46-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.2-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.6-he73a12e_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.6-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.8.2-hb9d3cd8_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxtst-1.2.5-hb9d3cd8_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yarg-0.1.9-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -2802,13 +2821,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: @@ -2827,24 +2847,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -2865,13 +2885,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cartopy-0.25.0-py314hc4308db_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-25.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cffi-2.0.0-py314h8ca4d5a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/cftime-1.6.5-py314h26e5826_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/charls-2.4.2-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -2890,7 +2909,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/cytoolz-1.1.0-py314h6482030_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/dav1d-1.2.1-h0dc2134_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/debugpy-1.8.19-py314h655ac26_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decopatch-1.4.10-pyhd8ed1ab_1.conda @@ -2905,7 +2924,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fiona-1.10.1-py314he09d67a_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda @@ -2914,12 +2933,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda @@ -2929,14 +2948,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf4-4.2.15-h8138101_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc1508a4_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-2.1.0-nompi_h3b1597d_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.22.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda @@ -2947,7 +2966,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda @@ -2979,19 +2998,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/jxrlib-1.1-h10d778d_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py314hf3ac25a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.5-he7c3a48_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libavif16-1.3.0-h1c10324_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda @@ -2999,7 +3018,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -3013,9 +3032,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda @@ -3024,34 +3043,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/liblapack-3.11.0-5_h859234e_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/liblzma-5.8.1-hd471939_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.9.3-nompi_habf9e57_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.10.0-nompi_h7d224f4_104.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzip-1.11.2-h31df5bb_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzopfli-1.0.3-h046ec9c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.0.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.46.0-py314h85c3bf0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.4.5-py314h6bf1ee8_1.conda @@ -3061,12 +3080,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/makefun-1.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-3.10.8-py314hee6578b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py314hd47142c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.12.3-py310h655e229_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.13.1-py310h655e229_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mercantile-1.2.1-pyhd8ed1ab_1.conda @@ -3077,32 +3096,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/muparser-2.3.5-hb996559_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/netcdf4-1.7.3-nompi_py314hf60e252_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/netcdf4-1.7.4-nompi_py311h8ff4399_107.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nh3-0.3.2-py310h6cf5e2e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.63.1-py314h385e359_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.65.0-py314h34b395f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numcodecs-0.16.5-py314hc4308db_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjph-0.26.0-h51ff197_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py314hc4308db_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.8.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.8.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.3.1-pyhc455866_0.conda @@ -3111,10 +3130,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.1.0-py314hf9dbaa9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipreqs-0.4.13-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.0-h3124640_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prometheus-cpp-1.3.0-h7802330_0.conda @@ -3129,9 +3148,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py314h35e0213_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygls-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyobjc-core-12.1-py314h681fd4f_0.conda @@ -3139,19 +3158,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py314h687fbad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.7.2-py314h56c42be_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda @@ -3160,14 +3180,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pywavelets-1.9.0-py314hd1ec8a2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyzmq-27.1.0-py312hb7d603e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rasterio-1.5.0-py314h061e49a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rav1e-0.7.1-h371c88c_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -3178,16 +3197,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py314ha7b6dee_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.15.2-h8ee721d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.15.11-h16586dd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-src-1.94.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.25.2-py314hc4308db_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.26.0-np2py314h08932fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py314he40e093_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.3-py314hbb40827_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.0.0-pyh5552912_0.conda @@ -3210,7 +3229,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda @@ -3223,11 +3242,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py314h3d180e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -3241,26 +3260,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py314h03d016b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yarg-0.1.9-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h6c33b1e_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h27d9b8f_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zfp-1.0.1-h1b13a81_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -3274,13 +3293,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -3299,24 +3319,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -3337,13 +3357,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cartopy-0.25.0-py314ha3d490a_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-25.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cffi-2.0.0-py314h44086f9_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cftime-1.6.5-py314h2115a04_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/charls-2.4.2-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -3362,7 +3381,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/cytoolz-1.1.0-py314h0612a62_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/dav1d-1.2.1-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/debugpy-1.8.19-py314hf820bb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decopatch-1.4.10-pyhd8ed1ab_1.conda @@ -3377,7 +3396,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.10.1-py314hf8d3afe_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda @@ -3386,12 +3405,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda @@ -3401,14 +3420,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf4-4.2.15-h2ee6834_7.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_hd3baa01_104.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.22.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda @@ -3419,7 +3438,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh5552912_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyh53cf698_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda @@ -3451,19 +3470,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jxrlib-1.1-h93a5062_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh534df25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.5-gpl_h6fbacd7_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.3.0-hb06b76e_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda @@ -3471,7 +3490,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -3485,9 +3504,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.1-ha937536_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -3496,34 +3515,34 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblapack-3.11.0-5_hd9741b5_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/liblzma-5.8.1-h39f12f2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.3-nompi_h80c4520_103.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h28ce51b_104.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.53-hfab5511_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzip-1.11.2-h1336266_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzopfli-1.0.3-h9f76cd9_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.0.3-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.46.0-py314ha398f32_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda @@ -3533,12 +3552,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/makefun-1.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-3.10.8-py314he55896b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.12.3-py310hc7c2786_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.13.1-py310hc7c2786_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mercantile-1.2.1-pyhd8ed1ab_1.conda @@ -3549,32 +3568,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/muparser-2.3.5-h11e0b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.3-nompi_py314ha229517_100.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311hfd37af6_107.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nh3-0.3.2-py310h06fc29a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h248ca61_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.63.1-py314h945de62_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.0-py314hb38061f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjph-0.26.0-h2a4d681_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py314ha3d490a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.8.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.8.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.3.1-pyhc455866_0.conda @@ -3583,10 +3602,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.0-py314hab283cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipreqs-0.4.13-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.7.1-h46dec42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda @@ -3601,9 +3620,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-22.0.0-py314hf20a12a_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygls-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyobjc-core-12.1-py314h3a4d195_0.conda @@ -3611,19 +3630,20 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.12.1-py314h3da1bed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.7.2-py314h87291f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda @@ -3632,14 +3652,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pywavelets-1.9.0-py314hdcf55e8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyzmq-27.1.0-py312hd65ceae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.7.1-h0716509_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda @@ -3650,16 +3669,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.2-h279115b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.11-hc5c3a1d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-src-1.94.0-unix_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.25.2-py314ha3d490a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.26.0-np2py314hc49a259_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.3-py314h725efaa_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.0.0-pyh5552912_0.conda @@ -3682,7 +3701,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.1-h85ec8f2_1.conda @@ -3695,11 +3714,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -3713,26 +3732,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/uri-template-1.3.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/widgetsnbextension-4.0.15-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yarg-0.1.9-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.2-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -3746,13 +3765,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -3771,19 +3791,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/asttokens-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/async-lru-2.0.5-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhcf101f3_2.conda @@ -3803,14 +3828,13 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cached-property-1.5.2-hd8ed1ab_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/cached_property-1.5.2-pyha770c72_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cairo-1.18.4-h477c42c_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cartopy-0.25.0-py314hd8fd7ce_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/cattrs-25.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cffi-2.0.0-py314h5a2d7ad_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cftime-1.6.5-py314h2dcd201_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/charls-2.4.2-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -3829,7 +3853,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/cytoolz-1.1.0-py314h5a2d7ad_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-2026.3.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/dask-core-2026.3.0-pyhc364b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/dav1d-1.2.1-hcfcfb64_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/debugpy-1.8.19-py314hb98de8c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/decopatch-1.4.10-pyhd8ed1ab_1.conda @@ -3845,7 +3869,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/executing-2.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fiona-1.10.1-py314h1c1cb05_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2 @@ -3861,12 +3885,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.0-hd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/giflib-5.2.2-h64bf75a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_0.conda @@ -3874,16 +3898,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/graphite2-1.3.14-hac47afa_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.16.0-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.3.0-h5a1b470_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.3.2-h5a1b470_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/hdf4-4.2.15-h5557f11_7.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_h89f0904_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.22.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.9-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.28.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hvplot-0.12.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda @@ -3894,7 +3918,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipykernel-7.1.0-pyh6dadd2b_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyhe2676ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ipywidgets-8.1.8-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/isoduration-20.11.0-pyhd8ed1ab_1.conda @@ -3925,19 +3949,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/jxrlib-1.1-hcfcfb64_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/keyring-25.7.0-pyh7428d3b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py314hf309875_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.4-h20038f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libavif16-1.3.0-he916da2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda @@ -3946,7 +3970,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libclang13-21.1.8-default_ha2db4b5_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -3955,11 +3979,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libfreetype6-2.14.1-hdbac1cb_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -3970,20 +3994,22 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h7d90bef_103.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.10.0-nompi_hf1713fe_104.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.328.1-h477610d_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda @@ -3992,11 +4018,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxslt-1.1.43-h0fbe4c1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzip-1.11.2-h3135430_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzopfli-1.0.3-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/linkify-it-py-2.0.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.46.0-py314hb492ee6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/lsprotocol-2025.0.0-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda @@ -4006,12 +4032,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/makefun-1.16.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-3.10.8-py314h86ab7b2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.2.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.12.3-py310h6f63dbe_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.13.1-py310h6f63dbe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mercantile-1.2.1-pyhd8ed1ab_1.conda @@ -4023,30 +4049,31 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/multipledispatch-0.6.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/nest-asyncio-1.6.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py314h640c526_100.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.4-nompi_py311h5c67aab_107.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/nh3-0.3.2-py310hdba2031_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-7.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/notebook-shim-0.2.4-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.63.1-py314h36f8cf2_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.65.0-py314h36f8cf2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjph-0.26.0-hf13a347_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py314hd8fd7ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.8.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/panel-1.8.5-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/param-2.3.1-pyhc455866_0.conda @@ -4054,13 +4081,14 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pipreqs-0.4.13-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pixman-0.46.4-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.52-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.52-hd8ed1ab_0.conda @@ -4071,28 +4099,29 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py314hb5be3fa_0_cpu.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyct-0.6.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygls-2.0.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py314h1c1cb05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py314h422fe16_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyshp-3.0.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.10.1-py314h2c9462b_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.10.2-py314h447aaf0_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.2-h4df99d1_100.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-json-logger-2.0.7-pyhd8ed1ab_0.conda @@ -4101,18 +4130,17 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyviz_comms-3.0.6-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywavelets-1.9.0-py314h2dcd201_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-ctypes-0.2.3-py314h86ab7b2_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pywinpty-2.0.15-py314h51f0985_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyzmq-27.1.0-py312hbb5da91_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.10.1-h68b6638_4.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.10.2-h35725d6_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rav1e-0.7.1-ha073cba_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/referencing-0.37.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda @@ -4122,16 +4150,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3986-validator-0.1.1-pyh9f0ad1d_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/rfc3987-syntax-1.1.0-pyhe01879c_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.2-h213852a_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.11-h02f8532_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-src-1.94.0-win_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.25.2-py314hd8fd7ce_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.26.0-np2py314he3c5115_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.3-py314h221f224_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/send2trash-2.0.0-pyh6dadd2b_0.conda @@ -4154,10 +4182,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/svt-av1-3.1.2-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda @@ -4168,11 +4196,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.5.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda @@ -4190,7 +4218,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/webcolors-25.10.0-pyhd8ed1ab_0.conda @@ -4200,19 +4228,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/winpty-0.4.3-4.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py314h5a2d7ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/yarg-0.1.9-py_1.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zfp-1.0.1-h2f0f97f_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -4226,13 +4254,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl - pypi: ./ doc: @@ -4251,24 +4280,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda @@ -4282,7 +4311,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -4302,12 +4331,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda @@ -4317,7 +4346,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda @@ -4327,32 +4356,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda @@ -4360,12 +4389,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hf08fa70_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -4374,37 +4403,37 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/make-4.4.1-hb9d3cd8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.10.8-py314h1194b4b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda @@ -4413,21 +4442,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py314h9891dd4_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/muparser-2.3.5-h5888daf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.8.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py314h8ec4b1a_0.conda @@ -4437,9 +4466,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-22.0.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-22.0.0-py314h52d6ec5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py314hbcf5174_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -4454,15 +4483,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -4481,17 +4510,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4502,16 +4530,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -4525,13 +4553,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: @@ -4541,24 +4570,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda @@ -4571,7 +4600,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -4594,8 +4623,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda @@ -4613,23 +4642,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py314hf3ac25a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlidec-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -4643,9 +4672,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda @@ -4656,33 +4685,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.4.5-py314h6bf1ee8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lzo-2.10-h4132b18_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/make-4.4.1-h00291cd_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/matplotlib-base-3.10.8-py314hd47142c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda @@ -4691,21 +4720,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/msgpack-python-1.1.2-py314h00ed6fe_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/muparser-2.3.5-hb996559_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.5-h0622a9a_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numcodecs-0.16.5-py314hc4308db_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py314hc4308db_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.8.3-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.1.0-py314hf9dbaa9_0.conda @@ -4715,9 +4744,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py314hee6578b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py314h35e0213_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py314h687fbad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -4732,10 +4761,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rasterio-1.5.0-py314h061e49a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda @@ -4758,7 +4787,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda @@ -4766,8 +4795,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py314h3d180e3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -4778,16 +4806,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py314h03d016b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -4801,13 +4829,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -4817,24 +4846,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda @@ -4847,7 +4876,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_8.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -4870,8 +4899,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda @@ -4889,23 +4918,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.5-gpl_h6fbacd7_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlidec-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -4919,9 +4948,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.1-ha937536_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -4932,33 +4961,33 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.53-hfab5511_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.1-h8d039ee_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lzo-2.10-h925e9cb_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/make-4.4.1-hc9fafa5_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/matplotlib-base-3.10.8-py314hd63e3f0_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda @@ -4967,21 +4996,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/msgpack-python-1.1.2-py314h784bc60_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/muparser-2.3.5-h11e0b38_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-h5e97a16_3.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h248ca61_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py314ha3d490a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.8.3-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.0-py314hab283cf_0.conda @@ -4991,9 +5020,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-22.0.0-py314he55896b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-22.0.0-py314hf20a12a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.12.1-py314h3da1bed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -5008,10 +5037,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda @@ -5034,7 +5063,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.1-h85ec8f2_1.conda @@ -5042,8 +5071,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -5054,16 +5082,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.2-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -5077,13 +5105,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -5093,19 +5122,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/alabaster-1.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.14.3-pyha770c72_0.conda @@ -5118,7 +5152,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -5141,8 +5175,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_0.conda @@ -5156,23 +5190,23 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py314hf309875_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlidec-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -5182,9 +5216,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -5194,24 +5228,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/lz4-4.4.5-py314hfc2a91f_1.conda @@ -5219,7 +5255,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/lzo-2.10-h6a83c73_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/make-4.4.1-h0e40799_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mapclassify-2.10.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/matplotlib-base-3.10.8-py314hfa45d96_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda @@ -5229,30 +5265,32 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/msgpack-python-1.1.2-py314h909e829_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py314hd8fd7ce_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.8.3-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-22.0.0-py314h86ab7b2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py314hb5be3fa_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py314h1c1cb05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda @@ -5267,9 +5305,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda @@ -5292,17 +5330,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/text-unidecode-1.3-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda @@ -5319,16 +5356,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py314h5a2d7ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -5342,13 +5379,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl - pypi: ./ test: @@ -5367,24 +5405,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.12.6-hb03c661_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.45-default_hfdba357_105.conda @@ -5399,9 +5437,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.6-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/c-blosc2-2.22.0-hc31b594_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -5424,16 +5461,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h9dce30a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-15.2.0-hc5723f1_16.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/geos-3.14.1-h480dda7_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.2-hd590300_0.conda @@ -5443,8 +5480,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/imagecodecs-2026.1.1-py314hf4b5fa8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/imageio-2.37.0-pyhfb79c49_0.conda @@ -5458,19 +5495,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-4.18.0-he073ed8_9.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.9-py314h97ea11e_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.17-h717163a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.45-default_hbd61a6d_105.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h0aef613_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h6395336_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libblas-3.11.0-5_h4a7cf45_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.2.0-hb03c661_1.conda @@ -5478,15 +5515,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.2.0-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.11.0-5_h0358290_openblas.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.25-h17f619e_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-he0feb66_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-15.2.0-hcc6f6b0_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_16.conda @@ -5494,12 +5531,12 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libhwy-1.3.0-h4c17acf_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libjxl-0.11.1-hf08fa70_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-haa4a5bd_1022.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.11.0-5_h47877c9_openblas.conda @@ -5508,30 +5545,30 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.30-pthreads_h94d23a6_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-15.2.0-h90f66d4_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_16.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-15.2.0-hd446a21_116.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-hdf11a46_16.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.22.0-h454ac66_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.7.1-h9d88235_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.17.0-h8a09558_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hca6bf5a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-he237659_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libxml2-devel-2.15.1-he237659_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/lz4-4.4.5-py314hd4c109c_1.conda @@ -5550,19 +5587,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/nlohmann_json-3.12.0-h54a6638_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openjph-0.26.0-h8d634f6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.47-haa7fec5_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pillow-12.1.0-py314h8ec4b1a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/proj-9.7.1-h99ae125_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/prometheus-cpp-1.3.0-ha5d0236_0.conda @@ -5570,42 +5607,42 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-hb9d3cd8_1002.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-22.0.0-py314hdafbbf9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-22.0.0-py314h52d6ec5_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyogrio-0.12.1-py314hbcf5174_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.7.2-py314h24aeaa0_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.2-h32b2ec7_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.9.0-py314hc02f841_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rav1e-0.7.1-h8fae777_3.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py314ha0b5721_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.26.0-np2py314hda1ea4c_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/scipy-1.16.3-py314hf07bd8e_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -5625,10 +5662,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/svt-av1-3.1.2-hecca717_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.28-h4ee821c_9.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda @@ -5636,11 +5673,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_ha0e22de_103.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/tornado-6.5.3-py314h5bd0f2a_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -5648,19 +5685,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-17.0.0-py314h5bd0f2a_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.17.3-py314h5bd0f2a_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.3.0-hd9031aa_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.5-hb03c661_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -5674,13 +5711,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b4/63/2ab26e4209773223159b83aa32721b4021ffb08102f8ac7d689c943fded1/multidict-6.7.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: ./ osx-64: @@ -5690,24 +5728,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aom-3.9.1-hf036a51_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-cal-0.9.13-hea39f9f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-common-0.12.6-h8616949_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-sdkutils-0.2.4-h901532c_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/blosc-1.21.6-hd145fbb_1.conda @@ -5721,9 +5759,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.34.6-hb5e19a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-blosc2-2.22.0-hedb7e5f_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/charls-2.4.2-he965462_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -5746,15 +5783,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/fiona-1.10.1-py314he09d67a_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/freexl-2.0.0-h3183152_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/geos-3.14.1-he483b9e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/gflags-2.2.2-hac325c4_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/giflib-5.2.2-h10d778d_0.conda @@ -5764,7 +5801,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/imagecodecs-2026.1.1-py314h804db01_0.conda @@ -5777,18 +5814,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/json-c-0.18-hc62ec3d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/jxrlib-1.1-h10d778d_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/kiwisolver-1.4.9-py314hf3ac25a_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lcms2-2.17-h72f5680_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lerc-4.0.0-hcca01a6_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.5-he7c3a48_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libarchive-3.8.5-gpl_h264331f_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libavif16-1.3.0-h1c10324_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libblas-3.11.0-5_he492b99_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlicommon-1.2.0-h8616949_1.conda @@ -5796,7 +5833,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libbrotlienc-1.2.0-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcblas-3.11.0-5_h9b27e0a_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcrc32c-1.1.2-he49afe7_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libdeflate-1.25-h517ebb2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20250104-pl5321ha958ccf_0.conda @@ -5810,9 +5847,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libgdal-core-3.12.1-hc010f1d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_15.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_15.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libhwy-1.3.0-hab838a1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libiconv-1.18-h57a12c2_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda @@ -5823,27 +5860,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libmpdec-4.0.0-h6e16a3a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.67.0-h3338091_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libopenblas-0.3.30-openmp_h6006d49_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/librttopo-1.1.0-h16cd5d8_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libspatialite-5.1.0-gpl_hb921464_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.1-hed3591d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libthrift-0.22.0-h687e942_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libtiff-4.7.1-ha0a348c_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libwebp-base-1.6.0-hb807250_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxcb-1.17.0-hf1f96e2_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-16-2.15.1-he456531_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-2.15.1-h24ca049_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libxml2-devel-2.15.1-h24ca049_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzopfli-1.0.3-h046ec9c_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-4.4.5-py314h6bf1ee8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/lz4-c-1.10.0-h240833e_1.conda @@ -5861,19 +5898,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/nlohmann_json-3.12.0-h53ec75d_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/numcodecs-0.16.5-py314hc4308db_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjpeg-2.5.4-h87e8dc5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openjph-0.26.0-h51ff197_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.6.0-h230baf5_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pandas-2.3.3-py314hc4308db_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pcre2-10.47-h13923f0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pillow-12.1.0-py314hf9dbaa9_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/proj-9.7.0-h3124640_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/prometheus-cpp-1.3.0-h7802330_0.conda @@ -5881,41 +5918,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/pthread-stubs-0.4-h00291cd_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-22.0.0-py314hee6578b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyarrow-core-22.0.0-py314h35e0213_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyogrio-0.12.1-py314h687fbad_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/pyproj-3.7.2-py314h56c42be_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.14.2-hf88997e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/pywavelets-1.9.0-py314hd1ec8a2_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/qhull-2020.2-h3c5361c_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rasterio-1.5.0-py314h061e49a_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rav1e-0.7.1-h371c88c_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.25.2-py314hc4308db_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.26.0-np2py314h08932fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py314he40e093_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scipy-1.16.3-py314hbb40827_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -5935,7 +5972,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda @@ -5945,11 +5982,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-hf689a15_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/tornado-6.5.4-py314h3d180e3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -5957,19 +5994,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/unicodedata2-17.0.0-py314h6482030_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/uriparser-0.9.8-h6aefe2f_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/wrapt-1.17.3-py314h03d016b_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xerces-c-3.3.0-ha8d0d41_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxau-1.0.12-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xorg-libxdmcp-1.1.5-h8616949_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zfp-1.0.1-h1b13a81_4.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-ng-2.3.2-h8bce59a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.7-h3eecb57_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -5983,13 +6020,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/14/2c/f069cab5b51d175a1a2cb4ccdf7a2c2dabd58aa5bd933fa036a8d15e2404/multidict-6.7.0-cp314-cp314-macosx_10_13_x86_64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: ./ osx-arm64: @@ -5999,24 +6037,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aom-3.9.1-h7bae524_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-cal-0.9.13-h6ee9776_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-common-0.12.6-hc919400_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-sdkutils-0.2.4-h16f91aa_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/blosc-1.21.6-h7dd00d9_1.conda @@ -6030,9 +6068,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-ares-1.34.6-hc919400_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-blosc2-2.22.0-hb83781b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-hbd8a1cb_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/charls-2.4.2-h13dd4ca_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyh8f84b5b_1.conda @@ -6055,15 +6092,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/fiona-1.10.1-py314hf8d3afe_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freetype-2.14.1-hce30654_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/freexl-2.0.0-h3ab3353_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/geos-3.14.1-h5afe852_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/gflags-2.2.2-hf9b8971_1005.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/giflib-5.2.2-h93a5062_0.conda @@ -6073,7 +6110,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/icu-78.2-h38cb7af_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/imagecodecs-2026.1.1-py314h9b5940c_0.conda @@ -6086,18 +6123,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/json-c-0.18-he4178ee_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/jxrlib-1.1-h93a5062_3.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/kiwisolver-1.4.9-py314h42813c9_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lcms2-2.17-h7eeda09_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lerc-4.0.0-hd64df32_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarchive-3.8.5-gpl_h6fbacd7_100.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libavif16-1.3.0-hb06b76e_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libblas-3.11.0-5_h51639a9_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlicommon-1.2.0-hc919400_1.conda @@ -6105,7 +6142,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libbrotlienc-1.2.0-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcblas-3.11.0-5_hb0561ab_openblas.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcrc32c-1.1.2-hbdafb3b_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-21.1.8-hf598326_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libdeflate-1.25-hc11a715_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20250104-pl5321hafb1f1b_0.conda @@ -6119,9 +6156,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgdal-core-3.12.1-ha937536_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_16.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_16.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libhwy-1.3.0-h48b13b8_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libiconv-1.18-h23cfdf5_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libjpeg-turbo-3.1.2-hc919400_0.conda @@ -6132,27 +6169,27 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libmpdec-4.0.0-h5505292_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.67.0-hc438710_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopenblas-0.3.30-openmp_ha158390_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libpng-1.6.53-hfab5511_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/librttopo-1.1.0-ha909e78_20.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libspatialite-5.1.0-gpl_ha239c29_119.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.51.1-h1b79a29_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.1-h1590b86_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libthrift-0.22.0-h14a376c_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libtiff-4.7.1-h4030677_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libwebp-base-1.6.0-h07db88b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxcb-1.17.0-hdb1d25a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-16-2.15.1-h5ef1a60_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-2.15.1-h8d039ee_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libxml2-devel-2.15.1-h8d039ee_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzopfli-1.0.3-h9f76cd9_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-4.4.5-py314h24f3bdd_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/lz4-c-1.10.0-h286801f_1.conda @@ -6170,19 +6207,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/nlohmann_json-3.12.0-h248ca61_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numcodecs-0.16.5-py314ha3d490a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjpeg-2.5.4-hbfb3c88_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openjph-0.26.0-h2a4d681_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.6.0-h5503f6c_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandas-2.3.3-py314ha3d490a_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pcre2-10.47-h30297fc_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pillow-12.1.0-py314hab283cf_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/proj-9.7.1-h46dec42_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/prometheus-cpp-1.3.0-h0967b3e_0.conda @@ -6190,41 +6227,41 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pthread-stubs-0.4-hd74edd7_1002.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-22.0.0-py314he55896b_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyarrow-core-22.0.0-py314hf20a12a_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyogrio-0.12.1-py314h3da1bed_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pyproj-3.7.2-py314h87291f3_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.14.2-h40d2674_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pywavelets-1.9.0-py314hdcf55e8_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/qhull-2020.2-h420ef59_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rasterio-1.5.0-py314h5002e4e_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rav1e-0.7.1-h0716509_3.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.25.2-py314ha3d490a_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.26.0-np2py314hc49a259_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scipy-1.16.3-py314h725efaa_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -6244,7 +6281,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sqlite-3.51.1-h85ec8f2_1.conda @@ -6254,11 +6291,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h892fb3f_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tornado-6.5.4-py314h0612a62_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -6266,19 +6303,19 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/unicodedata2-17.0.0-py314h0612a62_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uriparser-0.9.8-h00cdb27_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.6.3-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/wrapt-1.17.3-py314hb84d1df_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xerces-c-3.3.0-h25f632f_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxau-1.0.12-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xorg-libxdmcp-1.1.5-hc919400_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zfp-1.0.1-ha86207d_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-ng-2.3.2-hed4e4f5_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.7-hbf9d68e_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -6292,13 +6329,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/42/e2/64bb41266427af6642b6b128e8774ed84c11b80a90702c13ac0a86bb10cc/multidict-6.7.0-cp314-cp314-macosx_11_0_arm64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: ./ win-64: @@ -6309,19 +6347,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aom-3.9.1-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-cal-0.9.13-h46f3b43_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-common-0.12.6-hfd05255_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-sdkutils-0.2.4-hcb3a2da_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/backports.zstd-1.3.0-py314h680f03e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/blosc-1.21.6-hfd34d9b_1.conda @@ -6334,9 +6377,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/c-ares-1.34.6-hfd05255_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/c-blosc2-2.22.0-h2af8807_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2026.1.4-h4c7d964_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2026.1.4-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/charls-2.4.2-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.3.1-pyha7b4d00_1.conda @@ -6359,15 +6401,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/donfig-0.8.1.post1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/fiona-1.10.1-py314h1c1cb05_6.conda - conda: https://conda.anaconda.org/conda-forge/noarch/folium-0.20.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fonttools-4.61.1-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freetype-2.14.1-h57928b3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/freexl-2.0.0-hf297d47_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/fsspec-2025.12.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/geos-3.14.1-hdade9fe_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/giflib-5.2.2-h64bf75a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/google-crc32c-1.8.0-py314h720154c_0.conda @@ -6375,7 +6417,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/icu-78.2-h637d24d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/imagecodecs-2026.1.1-py314h793c6fb_0.conda @@ -6387,18 +6429,18 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/joblib-1.5.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/jxrlib-1.1-hcfcfb64_3.conda - conda: https://conda.anaconda.org/conda-forge/win-64/kiwisolver-1.4.9-py314hf309875_2.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/lazy-loader-0.4-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lcms2-2.17-hbcf6048_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/lerc-4.0.0-h6470a55_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.4-h20038f6_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libarchive-3.8.5-gpl_he24518a_100.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libavif16-1.3.0-he916da2_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libblas-3.11.0-5_hf2e6a31_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlicommon-1.2.0-hfd05255_1.conda @@ -6406,7 +6448,7 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libbrotlienc-1.2.0-hfd05255_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcblas-3.11.0-5_h2a3cdd5_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libcrc32c-1.1.2-h0e60522_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libdeflate-1.25-h51727cc_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libevent-2.1.12-h3671451_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.7.3-hac47afa_0.conda @@ -6416,9 +6458,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/libgcc-15.2.0-h8ee18e1_16.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgdal-core-3.12.1-h4c6072a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libgomp-15.2.0-h8ee18e1_16.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libhwy-1.3.0-ha71e874_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda @@ -6428,24 +6470,26 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/liblapack-3.11.0-5_hf9ab0e9_mkl.conda - conda: https://conda.anaconda.org/conda-forge/win-64/liblzma-5.8.1-h2466b09_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libmpdec-4.0.0-h2466b09_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/librttopo-1.1.0-haa95264_20.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libspatialite-5.1.0-gpl_h0cd62ae_119.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libssh2-1.11.1-h9aa295b_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libthrift-0.22.0-h23985f6_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libtiff-4.7.1-h8f73337_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwebp-base-1.6.0-h4d5522a_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxcb-1.17.0-h0e4246c_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-16-2.15.1-h3cfd58e_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-2.15.1-h779ef1b_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libxml2-devel-2.15.1-h779ef1b_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/libzopfli-1.0.3-h0e60522_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 @@ -6463,60 +6507,62 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/muparser-2.3.5-he0c23c2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/numcodecs-0.16.5-py314hd8fd7ce_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjpeg-2.5.4-h24db6dd_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openjph-0.26.0-hf13a347_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.6.0-h725018a_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pandas-2.3.3-py314hd8fd7ce_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pcre2-10.47-hd2b5f0e_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pillow-12.1.0-py314h61b30b5_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/proj-9.7.1-h7b1ce8f_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-7.2.1-py314hc5dbbe4_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pthread-stubs-0.4-h0e40799_1002.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-22.0.0-py314h86ab7b2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyarrow-core-22.0.0-py314hb5be3fa_0_cpu.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyogrio-0.12.1-py314h1c1cb05_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.3.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/pyproj-3.7.2-py314h422fe16_2.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-profiling-1.8.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.14.2-h4b44e0e_100_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-slugify-8.0.4-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2025.3-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/pywavelets-1.9.0-py314h2dcd201_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/qhull-2020.2-hc790b64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rasterio-1.5.0-py314h807bb43_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rasterstats-0.20.0-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rav1e-0.7.1-ha073cba_3.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.25.2-py314hd8fd7ce_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.26.0-np2py314he3c5115_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scipy-1.16.3-py314h221f224_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda @@ -6536,10 +6582,10 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/svt-av1-3.1.2-hac47afa_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tbb-2022.3.0-h3155e25_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tblib-3.2.2-pyhcf101f3_0.conda @@ -6547,11 +6593,11 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/threadpoolctl-3.6.0-pyhecae5ae_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/tifffile-2025.12.20-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h2c6b04d_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/tornado-6.5.4-py314h5a2d7ad_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda @@ -6563,21 +6609,21 @@ environments: - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-h41ae7f8_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.44.35208-h818238b_34.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.44.35208-h818238b_34.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda - conda: https://conda.anaconda.org/conda-forge/noarch/win_inet_pton-1.1.0-pyh7428d3b_8.conda - conda: https://conda.anaconda.org/conda-forge/win-64/wrapt-1.17.3-py314h5a2d7ad_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xerces-c-3.3.0-hac47afa_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxau-1.0.12-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/xorg-libxdmcp-1.1.5-hba3369d_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/yaml-0.2.5-h6a83c73_3.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zfp-1.0.1-h2f0f97f_5.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhcf101f3_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zlib-ng-2.3.2-h0261ad2_1.conda - conda: https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_6.conda - pypi: https://files.pythonhosted.org/packages/b7/58/3bf0b7d474607dc7fd67dd1365c4e0f392c8177eaf4054e5ddee3ebd53b5/aiobotocore-2.26.0-py3-none-any.whl @@ -6591,13 +6637,14 @@ environments: - pypi: https://files.pythonhosted.org/packages/66/da/412cc1711b6c77b7ca852f48b93bae5d8722cdabe86e9427ea2e204dfefd/h5pyd-0.23.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/82/16/7ed27b680791b939de138f906d5cf2b4657b0d45ca6f5dd6236fdddafb1a/multidict-6.7.0-cp314-cp314-win_amd64.whl - - pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl - pypi: ./ packages: @@ -6818,17 +6865,17 @@ packages: - pkg:pypi/alabaster?source=hash-mapping size: 18684 timestamp: 1733750512696 -- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.2-hb03c661_0.conda - sha256: 05e6f5c9c73e09ddde9ffa2d3004b6af6a0825d9bb4d34b41043d1d398932751 - md5: ada39f5726bc5481e9dce293709dfabc +- conda: https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.15.3-hb03c661_0.conda + sha256: d88aa7ae766cf584e180996e92fef2aa7d8e0a0a5ab1d4d49c32390c1b5fff31 + md5: dcdc58c15961dbf17a0621312b01f5cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: LGPL-2.1-or-later license_family: GPL purls: [] - size: 584398 - timestamp: 1767969626545 + size: 584660 + timestamp: 1768327524772 - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda sha256: e0ea1ba78fbb64f17062601edda82097fcf815012cf52bb704150a2668110d48 md5: 2934f256a8acfe48f6ebb4fce6cde29c @@ -7030,17 +7077,6 @@ packages: - pkg:pypi/async-lru?source=hash-mapping size: 17335 timestamp: 1742153708859 -- conda: https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.2-h39aace5_0.conda - sha256: a9c114cbfeda42a226e2db1809a538929d2f118ef855372293bd188f71711c48 - md5: 791365c5f65975051e4e017b5da3abf5 - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - license: GPL-2.0-or-later - license_family: GPL - purls: [] - size: 68072 - timestamp: 1756738968573 - conda: https://conda.anaconda.org/conda-forge/noarch/attrs-25.4.0-pyhcf101f3_1.conda sha256: c13d5e42d187b1d0255f591b7ce91201d4ed8a5370f0d986707a802c20c9d32f md5: 537296d57ea995666c68c821b00e360b @@ -7053,69 +7089,69 @@ packages: - pkg:pypi/attrs?source=compressed-mapping size: 64759 timestamp: 1764875182184 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.9.3-hef928c7_0.conda - sha256: d9c5babed03371448bb0dc91a1573c80d278d1222a3b0accef079ed112e584f9 - md5: bdd464b33f6540ed70845b946c11a7b8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.10.1-h2d2dd48_2.conda + sha256: 292aa18fe6ab5351710e6416fbd683eaef3aa5b1b7396da9350ff08efc660e4f + md5: 675ea6d90900350b1dcfa8231a5ea2dd depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 133443 - timestamp: 1764765235190 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.9.3-hdff831d_0.conda - sha256: aaadae39675911059bf0caa072c9d0cab622278365f6c3ceb6a63a2e9e57df03 - md5: a04fb222805ce5697065036ae1676436 + size: 134426 + timestamp: 1774274932726 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-auth-0.10.1-hfd47d4b_2.conda + sha256: a8a1ed63c7917278de7c1084d5a53ea7697e4d661757f51fa9556f6d043d2332 + md5: 1ad72a30bee6953028cce501c81476eb depends: - - __osx >=10.13 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 + - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 119662 - timestamp: 1764765258455 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.9.3-h1ddaa69_0.conda - sha256: 491576e1ef8640e0cc345705c2028aebb98e015d51471395fe595f60a3b33884 - md5: f0cc47ecd2058f2dd65fde1a5f6528ec + size: 120834 + timestamp: 1774275051230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-auth-0.10.1-hcb83491_2.conda + sha256: aba942578ad57e7b584434ed4e39c5ff7ed4ad3f326ac3eda26913ca343ea255 + md5: 1c701edc28f543a0e040325b223d5ca0 depends: - __osx >=11.0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 114473 - timestamp: 1764765266429 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.9.3-h2970c50_0.conda - sha256: 1ca3be8873335aff46da2d613c0e9e0c27b9878e402548e3cf31cd378a2f9342 - md5: 6f42aac88a3b880dd3a4e0fe61f418bc + size: 116820 + timestamp: 1774275057443 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-auth-0.10.1-h5d51246_2.conda + sha256: f937d40f01493c4799a673f56d70434d6cddb2ec967cf642a39e0e04282a9a1e + md5: 908d5d8755564e2c3f3770fca7ff0736 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 125616 - timestamp: 1764765271198 + size: 127421 + timestamp: 1774275018076 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.9.13-h2c9d079_1.conda sha256: f21d648349a318f4ae457ea5403d542ba6c0e0343b8642038523dd612b2a5064 md5: 3c3d02681058c3d206b562b2e3bc337f @@ -7207,9 +7243,9 @@ packages: purls: [] size: 236441 timestamp: 1763586152571 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.1-h8b1a151_9.conda - sha256: 96edccb326b8c653c8eb95a356e01d4aba159da1a97999577b7dd74461b040b4 - md5: f7ec84186dfe7a9e3a9f9e5a4d023e75 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.3.2-h8b1a151_0.conda + sha256: 1838bdc077b77168416801f4715335b65e9223f83641a2c28644f8acd8f9db0e + md5: f16f498641c9e05b645fe65902df661a depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 @@ -7217,33 +7253,33 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 22272 - timestamp: 1764593718823 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.1-h901532c_9.conda - sha256: b99ddb6654ca12b9f530ca4cbe4d2063335d4ac43f9d97092c4076ccaf9b89e7 - md5: abb79371a321d47da8f7ddca128533de + size: 22278 + timestamp: 1767790836624 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-compression-0.3.2-hb9ea233_0.conda + sha256: 599eff2c7b6d2e4e2ed1594e330f5f4f06f0fbe21d20d53beb78e3443344555c + md5: da394e3dc9c78278c8bdbd3a81fdbdb2 depends: - __osx >=10.13 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 21423 - timestamp: 1764593738902 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.1-h16f91aa_9.conda - sha256: 988f2251c5ddb91a93a3893e52eccb4fdd8b755af80bbc2bf739aabc25c5cfdf - md5: 8dc111381c4c73deb8b9a529b3abee4a + size: 21769 + timestamp: 1767790884673 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-compression-0.3.2-h3e7f9b5_0.conda + sha256: ce405171612acef0924a1ff9729d556db7936ad380a81a36325b7df5405a6214 + md5: 6edccad10fc1c76a7a34b9c14efbeaa3 depends: - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 21372 - timestamp: 1764593773975 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.1-hcb3a2da_9.conda - sha256: ff1046d67709960859adfa5793391a2d233bb432ec7429069fcfab5b643827df - md5: 0888dbe9e883582d138ec6221f5482d6 + size: 21470 + timestamp: 1767790900862 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-compression-0.3.2-hcb3a2da_0.conda + sha256: f98fbb797d28de3ae41dbd42590549ee0a2a4e61772f9cc6d1a4fa45d47637de + md5: 0385f2340be1776b513258adaf70e208 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -7252,166 +7288,166 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 23136 - timestamp: 1764593733263 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.5.7-h28f887f_1.conda - sha256: a5b151db1c8373b6ca2dacea65bc8bda02791a43685eebfa4ea987bb1a758ca9 - md5: 7b8e3f846353b75db163ad93248e5f9d + size: 23087 + timestamp: 1767790877990 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.6.0-h9b893ba_1.conda + sha256: 4a1a060ab40cb4fa39d24418758ca9faa1f51df6918f05143118e79bb11b4350 + md5: cd4946050ecfcb3c6fd09106ae6a261e depends: - - libgcc >=14 - libstdcxx >=14 + - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 58806 - timestamp: 1764675439822 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.5.7-ha05da6a_1.conda - sha256: 56f7aebd59d5527830ef7cf6e91f63ee4c5cf510af56529276affe8e2dc9eb24 - md5: e0d71662f35b21fb993484238b4861d9 + size: 58989 + timestamp: 1774270004533 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-event-stream-0.6.0-ha9bd753_1.conda + sha256: ebabb698d403645908c80a4b5b68574ae1bcdd4e8fa2656b5fa3e90f436aa3ca + md5: 0a2789f092ae9f948052a9879e3db8b1 depends: - - __osx >=10.13 + - __osx >=11.0 - libcxx >=19 - - aws-c-io >=0.23.3,<0.23.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 52911 - timestamp: 1764675471218 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.5.7-h9ae9c55_1.conda - sha256: c336b71a356d9b39fa6e9769d475dea6fd0cfe25ad81dcecac3102ef30f8b753 - md5: 53c59e7f68bbd3754de6c8dcd4c27f86 + size: 53812 + timestamp: 1774270090968 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-event-stream-0.6.0-h351c84d_1.conda + sha256: 8927fac75ad4cc4a2fbece5dbcc666cd6672a8ad87370cb183ff4d4f3e11f371 + md5: 228fe528ff814e420d8e13757f3c381e depends: - libcxx >=19 - __osx >=11.0 - - aws-checksums >=0.2.7,<0.2.8.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 52221 - timestamp: 1764675514267 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.5.7-ha388e84_1.conda - sha256: 5fbbfd835831dace087064d08c38eb279b7db3231fbd0db32fad86fe9273c10c - md5: 34e3b065b76c8a144c92e224cc3f5672 + size: 53641 + timestamp: 1774270084862 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-event-stream-0.6.0-h87b2689_1.conda + sha256: 63b7a1d3bfcfabeb5d4819c2577ff9fa93e28814ab63a5419740adf9b13a0f3a + md5: d2edd57e91a743151d816920cad61e54 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 57054 - timestamp: 1764675494741 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.7-ha8fc4e3_5.conda - sha256: 5527224d6e0813e37426557d38cb04fed3753d6b1e544026cfbe2654f5e556be - md5: 3028f20dacafc00b22b88b324c8956cc + size: 57598 + timestamp: 1774270085349 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.10.12-h4bacb7b_1.conda + sha256: c6f910d400ef9034493988e8cd37bd4712e42d85921122bcda4ba68d4614b131 + md5: 7bc920933e5fb225aba86a788164a8f1 depends: - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-compression >=0.3.1,<0.3.2.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 224580 - timestamp: 1764675497060 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.7-h924c446_5.conda - sha256: 53ee041db79f6cbff62179b2f693e50e484d163b9a843a3dbbb80dbc36220c7e - md5: acff093ebb711857fb78fae3b656631c + size: 225868 + timestamp: 1774270031584 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-http-0.10.12-h1037d30_1.conda + sha256: 2d4f9530f8501f7d4dba75410ffccfce077f8146aaffb480966dd170b617e225 + md5: 653c8a2b287bc6980b834b0a94896f56 depends: - - __osx >=10.13 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - __osx >=11.0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-compression >=0.3.1,<0.3.2.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 192149 - timestamp: 1764675489248 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.7-h5928ca5_5.conda - sha256: 29e180b61155279a2e64011b95957fbe38385113c60467b8d34fce47bc29c728 - md5: f12bd6066c693efba2e5886e2c70d7ba + size: 193409 + timestamp: 1774270095369 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-http-0.10.12-h95cdebe_1.conda + sha256: b25380b43c2c5733dcaac88b075fa286893af1c147ca40d50286df150ace5fb8 + md5: 806ff124512457583d675c62336b1392 depends: - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-compression >=0.3.1,<0.3.2.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 171020 - timestamp: 1764675515369 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.7-hc678f4a_5.conda - sha256: 4f41b922ce01c983f98898208d49af5f3d6b0d8f3e8dcb44bd13d8183287b19a - md5: 3427460b0654d317e72a0ba959bb3a23 + size: 172940 + timestamp: 1774270153001 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-http-0.10.12-h612f3e8_1.conda + sha256: dc297fbce04335f5f80b30bcdee1925ed4a0d95e7a2382523870c6b4981ca1b2 + md5: 26af0e9d7853d27e909ce01c287692b4 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-compression >=0.3.1,<0.3.2.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-compression >=0.3.2,<0.3.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 206709 - timestamp: 1764675527860 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.23.3-hdaf4b65_5.conda - sha256: 07d7f2a4493ada676084c3f4313da1fab586cf0a7302572c5d8dde6606113bf4 - md5: 132e8f8f40f0ffc0bbde12bb4e8dd1a1 + size: 207778 + timestamp: 1774270109581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.26.3-hc87160b_0.conda + sha256: c66ebb7815949db72bab7c86bf477197e4bc6937c381cf32248bdd1ce496db00 + md5: dde6a3e4fe6bb2ecd2a7050dd1e701fb depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - s2n >=1.6.2,<1.6.3.0a0 + - libgcc >=14 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - s2n >=1.7.1,<1.7.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 181361 - timestamp: 1765168239856 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.23.3-hf559bb5_5.conda - sha256: 734496fb5a33a4d13ff0a27c5bc4a0f4e7fe9ed15ec099722d5be82b456b9502 - md5: d9cc056da3a1ee0a2da750d10a5496f3 + size: 181624 + timestamp: 1773868304737 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-io-0.26.3-hc95b61d_0.conda + sha256: 666c24912c4fcc33f87f232f0154e784c44e953c718a90d37ee660b56735d693 + md5: 6db10338a49d5ed2bb4aa1099660a7b9 depends: - - __osx >=10.15 - - aws-c-cal >=0.9.13,<0.9.14.0a0 + - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 182572 - timestamp: 1765168277462 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.23.3-hbe03c90_5.conda - sha256: bf1c7cf7997d28922283e6612e5ea6a9409fcfc2749cd4acfafd1bf6e0c57c08 - md5: c249aa1a151e319d7acd05a2e1f165d2 + size: 182875 + timestamp: 1773868329671 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-io-0.26.3-h4137820_0.conda + sha256: 0e6ba2c8f250f466b9d671d3970e1f7c149c925b79c10fa7778708192a2a7833 + md5: 730d1cbd0973bd7ac150e181d3b572f3 depends: - __osx >=11.0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 176451 - timestamp: 1765168273313 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.23.3-h0d5b9f9_5.conda - sha256: 2d726ffd67fb387dbebf63c9b9965b476b9d670f683e71c3dca1feb6365ddc7c - md5: 400792109e426730ac9047fd6c9537ef + size: 177072 + timestamp: 1773868341204 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-io-0.26.3-h0d5b9f9_0.conda + sha256: 3c9d50fb7895df4edd72d177299551608c24d8b0b82db0cf34c8e2bf6644979c + md5: ce36c60ed6b15c8dbb7ccddec4ebf57f depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -7421,131 +7457,131 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 182053 - timestamp: 1765168273517 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.13.3-hc63082f_11.conda - sha256: fb102b0346a1f5c4f3bb680ec863c529b0333fa4119d78768c3e8a5d1cc2c812 - md5: 6a653aefdc5d83a4f959869d1759e6e3 + size: 182296 + timestamp: 1773868342627 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.15.2-he9ea9c5_1.conda + sha256: 3fc68793c0ca2c36524ae67abac696ce6b066a8be6b2b980cbdc40ae1310041a + md5: 8e77514673f5773b40ff8953583938b6 depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 + - libgcc >=14 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 216454 - timestamp: 1764681745427 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.13.3-ha72ff4e_11.conda - sha256: c05215c85f90a0caba1202f4c852d6e3a2ad93b4a25f286435a8e855db4237ae - md5: 96f22c912f1cf3493d9113b9fd04c912 + size: 221711 + timestamp: 1774275485771 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-mqtt-0.15.2-h6fabf1c_1.conda + sha256: 038c5ee255149fac9a8ae250ec4ae07874de03b441e13bbcb1da2f1209bf824e + md5: 9b31ecb17e02da5f8fb4107f158f7ff2 depends: - - __osx >=10.13 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 188230 - timestamp: 1764681760102 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.13.3-haf5c5c8_11.conda - sha256: 880996ae8c792eb15fcbca0a452d8b3508dba16ed7384bdb73fb7ed6c075c125 - md5: 3fcd02361ce1427ae5968fcd532a85b4 + size: 193461 + timestamp: 1774275585830 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-mqtt-0.15.2-h69e7467_1.conda + sha256: 69a12dfccdeb1497e3fbcaedea77c7adab854b482558aaa4ce5dea3a80d08c76 + md5: 1f4f6b9a183bea3ddf9af5ebcda0933d depends: - __osx >=11.0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 150454 - timestamp: 1764681796127 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.13.3-hfa314fa_11.conda - sha256: 9b241397ef436dcf67e8e6cde15ff9c0d03ea942ad11e27c77caecce0d51b5be - md5: 6c043365f1d3f89c0b68238c6f5b8cce + size: 156423 + timestamp: 1774275623505 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-mqtt-0.15.2-h904b250_1.conda + sha256: f99bf60673f0d5a143450009c9454087c9bca01be74ae08394f8fc47789fa56a + md5: fbccf4b054995b97bf98c38f0989a9a3 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 206357 - timestamp: 1764681793150 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.3-h06ab39a_1.conda - sha256: 8de2292329dce2fd512413d83988584d616582442a07990f67670f9bc793a98b - md5: 3689a4290319587e3b54a4f9e68f70c8 + size: 212290 + timestamp: 1774275592614 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.11.5-h6d69fc9_5.conda + sha256: c15869656f5fbebe27cc5aa58b23831f75d85502d324fedd7ee7e552c79b495d + md5: 4c5c16bf1133dcfe100f33dd4470998e depends: - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - openssl >=3.5.4,<4.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - openssl >=3.5.5,<4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 151382 - timestamp: 1765174166541 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.3-he30762a_1.conda - sha256: 9c989a5f0b35ff5cee91b74bcba0d540ce5684450dc072ba0bb5299783cdf9cd - md5: 33c653401dc7b016b0011cb4d16de458 + size: 151340 + timestamp: 1774282148690 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-c-s3-0.11.5-hb15a67f_5.conda + sha256: a32c773421a3e29f6aa442a21d870b456664e89f0246e9787a0b817b8b44eb71 + md5: de95ae4c99b257ffeb2391c9d46b6e58 depends: - - __osx >=10.13 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 + - __osx >=11.0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 133827 - timestamp: 1765174162875 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.3-h8da9771_1.conda - sha256: 31f432d1a0f7dacbe80b476c3236c22a71f4018e840ae6974e843d38d5763335 - md5: 06417cb45f131cf503d3483446cedbc3 + size: 134173 + timestamp: 1774282225703 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-c-s3-0.11.5-ha5d16b2_5.conda + sha256: bd8f4ffb8346dd02bda2bc1ae9993ebdb131298b1308cb9e6b1e771b530d9dd5 + md5: f33735fd60f9c4a21c51a0283eb8afc1 depends: - __osx >=11.0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 129384 - timestamp: 1765174183548 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.3-ha659bf3_1.conda - sha256: cda138c03683e85f29eafc680b043a40f304ac8759138dc141a42878eb17a90f - md5: dcfc08ccd8e332411c454e38110ea915 + size: 129783 + timestamp: 1774282252139 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-c-s3-0.11.5-h87bd87b_5.conda + sha256: 62367b6d4d8aa1b43fb63e51d779bb829dfdd53d908c1b6700efa23255dd38db + md5: 2d90128559ec4b3c78d1b889b8b13b50 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-checksums >=0.2.7,<0.2.8.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-checksums >=0.2.10,<0.2.11.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 141805 - timestamp: 1765174184168 + size: 141733 + timestamp: 1774282227215 - conda: https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.2.4-h8b1a151_4.conda sha256: 9d62c5029f6f8219368a8665f0a549da572dc777f52413b7d75609cacdbc02cc md5: c7e3e08b7b1b285524ab9d74162ce40b @@ -7593,43 +7629,43 @@ packages: purls: [] size: 56509 timestamp: 1764610148907 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.7-h8b1a151_5.conda - sha256: a8693d2e06903a09e98fe724ed5ec32e7cd1b25c405d754f0ab7efb299046f19 - md5: 68da5b56dde41e172b7b24f071c4b392 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.2.10-h8b1a151_0.conda + sha256: 09472dd5fa4473cffd44741ee4c1112f2c76d7168d1343de53c2ad283dc1efa6 + md5: f8e1bcc5c7d839c5882e94498791be08 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 76915 - timestamp: 1764593731486 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.7-h901532c_5.conda - sha256: 0f67c453829592277f90d520f7855e260cf0565a3dc59fe90c55293996b7fbe9 - md5: cccf553ce36da9ae739206b69c1a4d28 + size: 101435 + timestamp: 1771063496927 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-checksums-0.2.10-h31279ed_0.conda + sha256: 8776d3d51e03ba373a13e4cd4adaf70fd15323c50f1dde85669dc4e379c10dbd + md5: 28a458ade86d135a90951d816760cc5c depends: - - __osx >=10.13 + - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 75646 - timestamp: 1764593751665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.7-h16f91aa_5.conda - sha256: c630ece8c0fe99cdf03774bb0b048cfd72daec0458dbc825be5de0106431087e - md5: ee9ebfd7b6fdf61dd632e4fea6287c47 + size: 95954 + timestamp: 1771063481230 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-checksums-0.2.10-h3e7f9b5_0.conda + sha256: 06661bc848b27aa38a85d8018ace8d4f4a3069e22fa0963e2431dc6c0dc30450 + md5: 07f6c5a5238f5deeed6e985826b30de8 depends: - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 74377 - timestamp: 1764593734393 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.7-hcb3a2da_5.conda - sha256: ca5e0719b7ca257462a4aa7d3b99fde756afaf579ee1472cac91c04c7bf3a725 - md5: 38f1501fc55f833a4567c83581a2d2ed + size: 91917 + timestamp: 1771063496505 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-checksums-0.2.10-hcb3a2da_0.conda + sha256: 505b2365bbf3c197c9c2e007ba8262bcdaaddc970f84ce67cf73868ca2990989 + md5: 96e950e5007fb691322db578736aba52 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -7638,364 +7674,431 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 93142 - timestamp: 1764593765744 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.35.4-h8824e59_0.conda - sha256: 524fc8aa2645e5701308b865bf5c523257feabc6dfa7000cb8207ccfbb1452a1 - md5: 113b9d9913280474c0868b0e290c0326 + size: 116853 + timestamp: 1771063509650 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.37.4-h4c8aef7_3.conda + sha256: b82d0bc6d4b716347e1aefb0acc6e4bff04b3f807537ada9b458a7e467beb2a0 + md5: 798a499cf76e530a992365d557ba5827 depends: - - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - __glibc >=2.17,<3.0.a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-cal >=0.9.13,<0.9.14.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - - aws-c-s3 >=0.11.3,<0.11.4.0a0 + - aws-c-cal >=0.9.13,<0.9.14.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 408804 - timestamp: 1765200263609 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.35.4-h7484968_0.conda - sha256: d3ab94c9245f667c78940d6838529401795ce0df02ad561d190c38819a312cd9 - md5: 31db311b3005b16ff340796e424a6b3c + size: 410120 + timestamp: 1774286908570 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-crt-cpp-0.37.4-h1135fef_3.conda + sha256: 9b0b483955197f0e4e6107adab3f9ccfbcc6f55716fe1a79d0708e0494c9f33e + md5: 5db17ee0bbf98a7f75d49fb621f446da depends: - libcxx >=19 - - __osx >=10.13 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - - aws-c-s3 >=0.11.3,<0.11.4.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - __osx >=11.0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 343812 - timestamp: 1765200322696 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.35.4-h74951b9_0.conda - sha256: 465527f414c2399ab70503d9d4e891658e7698439ba7f22d723f2ca8c03bb3e8 - md5: 87351fb3a08425237b701c582773be1a + size: 347001 + timestamp: 1774287065748 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-crt-cpp-0.37.4-h5505c15_3.conda + sha256: bb9e0abbe22825810776e4c6929f4587567b795272126aaca7e55b30c91f2d29 + md5: a13b36ec511c0589632e3689cd34ccc0 depends: - - __osx >=11.0 - libcxx >=19 + - __osx >=11.0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 - - aws-c-s3 >=0.11.3,<0.11.4.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 266862 - timestamp: 1765200345049 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.35.4-hca034e6_0.conda - sha256: 7b4aef9e1823207a5f91e8b5b95853bdfafcfea306cd62b99fd53c38aa5c3da0 - md5: ce1a20b5c406727e32222ac91e5848c4 + size: 269460 + timestamp: 1774286981607 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-crt-cpp-0.37.4-h4f72eff_3.conda + sha256: 4a072a69e8b0a6552269cdf32831dc2cfa429a61c58edc5353f94dde09a3002f + md5: 81e1ff78b80119ec772bf28b30216f00 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-c-mqtt >=0.13.3,<0.13.4.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 - - aws-c-http >=0.10.7,<0.10.8.0a0 - aws-c-cal >=0.9.13,<0.9.14.0a0 - - aws-c-auth >=0.9.3,<0.9.4.0a0 - - aws-c-s3 >=0.11.3,<0.11.4.0a0 - - aws-c-io >=0.23.3,<0.23.4.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-mqtt >=0.15.2,<0.15.3.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 302247 - timestamp: 1765200336894 -- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.606-h20b40b1_10.conda - sha256: e0d81b7dd6d054d457a1c54d17733d430d96dc5ca9b2ca69a72eb41c3fc8c9bf - md5: 937d1d4c233adc6eeb2ac3d6e9a73e53 + size: 304084 + timestamp: 1774286995597 +- conda: https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.747-hc3785e1_3.conda + sha256: 62b7e565852fa061a26281b2890e432853fabefa8ea3dc22d00d39295a030805 + md5: cfffedbfd03d5a6bb74157c14b6f0cdf depends: + - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - - __glibc >=2.17,<3.0.a0 - - libcurl >=8.17.0,<9.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - libzlib >=1.3.1,<2.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - libcurl >=8.19.0,<9.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3472674 - timestamp: 1765257107074 -- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.606-h386ebac_10.conda - sha256: 3b7ee2bc2bbd41e1fca87b1c1896b2186644f20912bf89756fd39020f8461e13 - md5: 768c6b78e331a2938af208e062fd6702 + size: 3624521 + timestamp: 1773666645246 +- conda: https://conda.anaconda.org/conda-forge/osx-64/aws-sdk-cpp-1.11.747-h17cee85_3.conda + sha256: 18d5f429af85e49fc0d6137e18cc9f01e7d780a41b0b00294e2675a11518f13b + md5: e8299cee5be5f088f68a0d354a9e0b78 depends: - libcxx >=19 - - __osx >=10.13 - - libcurl >=8.17.0,<9.0a0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - libzlib >=1.3.1,<2.0a0 + - __osx >=11.0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - libcurl >=8.19.0,<9.0a0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3313002 - timestamp: 1765257111791 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.606-h4e1b0f7_10.conda - sha256: 87660413df6c49984a897544c8ace8461cd4ed69301ede5a793d00530985f702 - md5: a392fe9e9a3c6e0b65161533aca39be9 + size: 3476887 + timestamp: 1773666675362 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/aws-sdk-cpp-1.11.747-had22720_3.conda + sha256: b5ce4fafe17ab58980f944b9a45504ce45dda0423064591d51240eb8308589af + md5: 157ae2a6008d62f61107f5b78dce06d2 depends: - - __osx >=11.0 - libcxx >=19 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 - - libzlib >=1.3.1,<2.0a0 + - __osx >=11.0 - aws-c-common >=0.12.6,<0.12.7.0a0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - libcurl >=8.17.0,<9.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - libcurl >=8.19.0,<9.0a0 + - libzlib >=1.3.1,<2.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3121951 - timestamp: 1765257130593 -- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.606-hac16450_10.conda - sha256: 8a12c4f6774ecb3641048b74133ff5e6c2b560469fe5ac1d7515631b84e63059 - md5: d9b942bede589d0ad1e8e360e970efd0 + size: 3260974 + timestamp: 1773666675518 +- conda: https://conda.anaconda.org/conda-forge/win-64/aws-sdk-cpp-1.11.747-hd55a107_3.conda + sha256: b2ca74995fecfc1029f95c6256dea6d7e035e24633870a52665a8d48f49331f8 + md5: 48efab184702deb479a3766b1462efec depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - aws-c-common >=0.12.6,<0.12.7.0a0 - libzlib >=1.3.1,<2.0a0 - - aws-c-event-stream >=0.5.7,<0.5.8.0a0 + - aws-c-event-stream >=0.6.0,<0.6.1.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3438133 - timestamp: 1765257127502 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.1-h3a458e0_0.conda - sha256: cba633571e7368953520a4f66dc74c3942cc12f735e0afa8d3d5fc3edf35c866 - md5: 1d4e0d37da5f3c22ecd44033f673feba + size: 23794273 + timestamp: 1773666686533 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.16.2-h206d751_0.conda + sha256: 321d1070905e467b6bc6f5067b97c1868d7345c272add82b82e08a0224e326f0 + md5: 5492abf806c45298ae642831c670bba0 depends: - __glibc >=2.17,<3.0.a0 - - libcurl >=8.14.1,<9.0a0 + - libcurl >=8.18.0,<9.0a0 - libgcc >=14 - libstdcxx >=14 - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT purls: [] - size: 348231 - timestamp: 1760926677260 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.1-he2a98a9_0.conda - sha256: 923a0f9fab0c922e17f8bb27c8210d8978111390ff4e0cf6c1adff3c1a4d13bc - md5: 9f39c22aad61e76bfb73bb7d4114efac + size: 348729 + timestamp: 1768837519361 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-core-cpp-1.16.2-h87f1c7e_0.conda + sha256: bc2cde0d7204b3574084de1d83d80bceb7eb1550a17a0f0ccedbb312145475d3 + md5: 24997c4c96d1875956abd9ce37f262eb depends: - __osx >=10.13 - - libcurl >=8.14.1,<9.0a0 + - libcurl >=8.18.0,<9.0a0 - libcxx >=19 - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT purls: [] - size: 297681 - timestamp: 1760927174036 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.1-h88fedcc_0.conda - sha256: d995413e4daf19ee3120f3ab9f0c9e330771787f33cbd4a33d8e5445f52022e3 - md5: fbe485a39b05090c0b5f8bb4febcd343 + size: 298273 + timestamp: 1768837905794 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-core-cpp-1.16.2-he5ae378_0.conda + sha256: d9a04af33d9200fcd9f6c954e2a882c5ac78af4b82025623e59cb7f7e590b451 + md5: 7efe92d28599c224a24de11bb14d395e depends: - __osx >=11.0 - - libcurl >=8.14.1,<9.0a0 + - libcurl >=8.18.0,<9.0a0 - libcxx >=19 - openssl >=3.5.4,<4.0a0 license: MIT license_family: MIT purls: [] - size: 289984 - timestamp: 1760927117177 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.2-h3a5f585_1.conda - sha256: fc1df5ea2595f4f16d0da9f7713ce5fed20cb1bfc7fb098eda7925c7d23f0c45 - md5: 4e921d9c85e6559c60215497978b3cdb + size: 290928 + timestamp: 1768837810218 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-core-cpp-1.16.2-h49e36cd_0.conda + sha256: 3f3bdc95cc398afe1dc23655aa3480fd2c972307987b2451d4723de6228b9427 + md5: b625bbba0b9ae28003bd96342043ea0c + depends: + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 500955 + timestamp: 1768837821295 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.13.3-hed0cdb0_1.conda + sha256: 2beb6ae8406f946b8963a67e72fe74453e1411c5ae7e992978340de6c512d13c + md5: 68bfb556bdf56d56e9f38da696e752ca depends: - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libgcc >=14 - libstdcxx >=14 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 249684 - timestamp: 1761066654684 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.2-h0e8e1c8_1.conda - sha256: 555e9c9262b996f8c688598760b4cddf4d16ae1cb2f0fd0a31cb76c2fdc7d628 - md5: 32eb613f88ae1530ca78481bdce41cdd + size: 250511 + timestamp: 1770344967948 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-identity-cpp-1.13.3-h1135191_1.conda + sha256: 182769c18c23e2b29bb35f6fca4c233f0125f84418dacb2c36912298dafbe42e + md5: 14d2491d2dfcbb127fa0ff6219704ab5 depends: - __osx >=10.13 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libcxx >=19 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 174582 - timestamp: 1761067038720 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.2-h853621b_1.conda - sha256: a4ed52062025035d9c1b3d8c70af39496fc5153cc741420139a770bc1312cfd6 - md5: fac63edc393d7035ab23fbccdeda34f4 + size: 175167 + timestamp: 1770345309347 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-identity-cpp-1.13.3-h810541e_1.conda + sha256: 428fa73808a688a252639080b6751953ad7ecd8a4cbd8f23147b954d6902b31b + md5: ca46cc84466b5e05f15a4c4f263b6e80 depends: - __osx >=11.0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libcxx >=19 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 167424 + timestamp: 1770345338067 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-identity-cpp-1.13.3-h5ffce34_1.conda + sha256: 33a0c86a7095d0716f428818157fc1d74b04949f99d2211b3030b9c9f1426c63 + md5: 998e10f568f0db5615ef880673bc3f35 + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 167268 - timestamp: 1761066827371 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.15.0-h2a74896_1.conda - sha256: 58879f33cd62c30a4d6a19fd5ebc59bd0c4560f575bd02645d93d342b6f881d2 - md5: ffd553ff98ce5d74d3d89ac269153149 + size: 424962 + timestamp: 1770345047909 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.16.0-hdd73cc9_1.conda + sha256: cef75b91bdd5a65c560b501df78905437cc2090a64b4c5ecd7da9e08e9e9af7c + md5: 939d9ce324e51961c7c4c0046733dbb7 depends: - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 576406 - timestamp: 1761080005291 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.15.0-h388f2e7_1.conda - sha256: 0a736f04c9778b87884422ebb6b549495430652204d964ff161efb719362baee - md5: 6b5f36e610295f4f859dd9cf680bbf7d + size: 579825 + timestamp: 1770321459546 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-blobs-cpp-12.16.0-h9b4319f_1.conda + sha256: e4756a363d3abf2de78c068df050d7db53072c27f5a12666e008bd027ab5610a + md5: 2d5fe7cce366e8b01d4b45985c131fb8 depends: - __osx >=10.13 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 432811 - timestamp: 1761080273088 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.15.0-h10d327b_1.conda - sha256: 274267b458ed51f4b71113fe615121fabd6f1d7b62ebfefdad946f8436a5db8e - md5: 443b74cf38c6b0f4b675c0517879ce69 + size: 433648 + timestamp: 1770321878865 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-blobs-cpp-12.16.0-hc57151b_1.conda + sha256: 9de2f050a49597e5b98b59bf90880e00bfdff79a3afbb18828565c3a645d62d6 + md5: f08b3b9d7333dc427b79897e6e3e7f29 depends: - __osx >=11.0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 425175 - timestamp: 1761080947110 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.11.0-h3d7a050_1.conda - sha256: eb590e5c47ee8e6f8cc77e9c759da860ae243eed56aceb67ce51db75f45c9a50 - md5: 89985ba2a3742f34be6aafd6a8f3af8c + size: 426735 + timestamp: 1770322058844 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-blobs-cpp-12.16.0-hcd625b1_1.conda + sha256: 654fae004aee8616a8ed4935a6fa703d629e4d1686a9fe431ef2e689846c0016 + md5: bc419192d40ca1b4928f70519d54b96c + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 781612 + timestamp: 1770321543576 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.12.0-ha7a2c86_1.conda + sha256: ef7d1cae36910b21385d0816f8524a84dee1513e0306927e41a6bd32b5b9a0d0 + md5: 6400f73fe5ebe19fe7aca3616f1f1de7 depends: - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libgcc >=14 - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 149620 - timestamp: 1761066643066 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.11.0-h56a711b_1.conda - sha256: 322919e9842ddf5c9d0286667420a76774e1e42ae0520445d65726f8a2565823 - md5: 278ccb9a3616d4342731130287c3ba79 + size: 150405 + timestamp: 1770240307002 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-common-cpp-12.12.0-h7373072_1.conda + sha256: 4ecd8e48c9222fce1c69d25e85056ab60c44e65b7a160484aae86a65c684b7e8 + md5: 743d031253118e250b26f32809910191 depends: - __osx >=10.13 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libcxx >=19 - libxml2 - libxml2-16 >=2.14.6 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 126230 - timestamp: 1761066840950 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.11.0-h7e4aa5d_1.conda - sha256: 74803bd26983b599ea54ff1267a0c857ff37ccf6f849604a72eb63d8d30e4425 - md5: ac9113ea0b7ed5ecf452503f82bf2956 + size: 126170 + timestamp: 1770240607790 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-common-cpp-12.12.0-he467506_1.conda + sha256: 541be427e681d129c8722e81548d2e51c4b1a817f88333f3fbb3dcdef7eacafb + md5: b658a3fb0fc412b2a4d30da3fcec036f depends: - __osx >=11.0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 - libcxx >=19 - libxml2 - libxml2-16 >=2.14.6 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 + license: MIT + license_family: MIT + purls: [] + size: 121500 + timestamp: 1770240531430 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-common-cpp-12.12.0-h5ffce34_1.conda + sha256: 98dfdd2d86d34b93a39d04a73eb4ca26cc0986bf20892005a66db13077eb4b86 + md5: 716715d06097dfd791b0bab525839910 + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 121744 - timestamp: 1761066874537 -- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.13.0-hf38f1be_1.conda - sha256: 9f3d0f484e97cef5f019b7faef0c07fb7ee6c584e3a6e2954980f440978a365e - md5: f10b9303c7239fbce3580a60a92bcf97 + size: 246289 + timestamp: 1770240396492 +- conda: https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.14.0-h52c5a47_1.conda + sha256: 55aa8ad5217d358e0ccf4a715bd1f9bafef3cd1c2ea4021f0e916f174c20f8e3 + md5: 6d10339800840562b7dad7775f5d2c16 depends: - __glibc >=2.17,<3.0.a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 299198 - timestamp: 1761094654852 -- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.13.0-h1984e67_1.conda - sha256: 268175ab07f1917eff35e4c38a17a2b71c5f9b86e38e5c0b313da477600a82df - md5: ef5701f2da108d432e7872d58e8ac64e + size: 302524 + timestamp: 1770384269834 +- conda: https://conda.anaconda.org/conda-forge/osx-64/azure-storage-files-datalake-cpp-12.14.0-he1781d6_1.conda + sha256: 1ae895785ce2947686ba55126e8ebda4a42f9e0c992bf2c710436d95c85ac756 + md5: cd3513aad4fac4078622d18538244fdc depends: - __osx >=10.13 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 203298 - timestamp: 1761095036240 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.13.0-hb288d13_1.conda - sha256: 2205e24d587453a04b075f86c59e3e72ad524c447fc5be61d7d1beb3cf2d7661 - md5: 595091ae43974e5059d6eabf0a6a7aa5 + size: 205170 + timestamp: 1770384661520 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/azure-storage-files-datalake-cpp-12.14.0-hf8a9d22_1.conda + sha256: 1891df88b68768bc042ea766c1be279bff0fdaf471470bfa3fa599284dbd0975 + md5: 601ac4f945ba078955557edf743f1f78 depends: - __osx >=11.0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-common-cpp >=12.11.0,<12.11.1.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 - libcxx >=19 license: MIT license_family: MIT purls: [] - size: 197152 - timestamp: 1761094913245 + size: 198153 + timestamp: 1770384528646 +- conda: https://conda.anaconda.org/conda-forge/win-64/azure-storage-files-datalake-cpp-12.14.0-h1678c0b_1.conda + sha256: 9941733f0f4b3a2649f534c71195c8e7a92984e9e9f17c7eb6d84803e3cdccf1 + md5: 64afdd17c4a6f4cb1d97caaad1fdc191 + depends: + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-common-cpp >=12.12.0,<12.12.1.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + license: MIT + license_family: MIT + purls: [] + size: 438910 + timestamp: 1770384369008 - conda: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda sha256: 1c656a35800b7f57f7371605bc6507c8d3ad60fbaaec65876fce7f73df1fc8ac md5: 0a01c169f0ab0f91b26e77a3301fbfe4 @@ -8596,17 +8699,17 @@ packages: - pkg:pypi/cached-property?source=hash-mapping size: 11065 timestamp: 1615209567874 -- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-6.2.4-pyhd8ed1ab_0.conda - sha256: e00325243791f4337d147224e4e1508de450aeeab1abc0470f2227748deddbfc - md5: 629c8fd0c11eb853732608e2454abf8e +- conda: https://conda.anaconda.org/conda-forge/noarch/cachetools-7.0.6-pyhd8ed1ab_0.conda + sha256: f31f02b8bfa312bca79abbc24a0dd1930291cbdaca321b6d1c230687b175a9ff + md5: 14e77b3ebe7b8e37f6254a59ee245184 depends: - python >=3.10 license: MIT license_family: MIT purls: - - pkg:pypi/cachetools?source=hash-mapping - size: 16867 - timestamp: 1765829705483 + - pkg:pypi/cachetools?source=compressed-mapping + size: 19184 + timestamp: 1776719139785 - conda: https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.4-he90730b_1.conda sha256: 06525fa0c4e4f56e771a3b986d0fdf0f0fc5a3270830ee47e127a5105bde1b9a md5: bb6c4808bfa69d6f7f6b07e5846ced37 @@ -8889,17 +8992,6 @@ packages: - pkg:pypi/cftime?source=compressed-mapping size: 378461 timestamp: 1767649080533 -- conda: https://conda.anaconda.org/conda-forge/noarch/chardet-5.2.0-pyhd8ed1ab_3.conda - sha256: cfca3959d2bec9fcfec98350ecdd88b71dac6220d1002c257d65b40f6fbba87c - md5: 56bfd153e523d9b9d05e4cf3c1cfe01c - depends: - - python >=3.9 - license: LGPL-2.1-only - license_family: GPL - purls: - - pkg:pypi/chardet?source=hash-mapping - size: 132170 - timestamp: 1741798023836 - conda: https://conda.anaconda.org/conda-forge/linux-64/charls-2.4.2-h59595ed_0.conda sha256: 18f1c43f91ccf28297f92b094c2c8dbe9c6e8241c0d3cbd6cda014a990660fdd md5: 4336bd67920dd504cd8c6761d6a99645 @@ -9293,22 +9385,22 @@ packages: - pkg:pypi/cycler?source=compressed-mapping size: 14778 timestamp: 1764466758386 -- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hd9c7081_0.conda - sha256: ee09ad7610c12c7008262d713416d0b58bf365bc38584dce48950025850bdf3f - md5: cae723309a49399d2949362f4ab5c9e4 +- conda: https://conda.anaconda.org/conda-forge/linux-64/cyrus-sasl-2.1.28-hac629b4_1.conda + sha256: 7684da83306bb69686c0506fb09aa7074e1a55ade50c3a879e4e5df6eebb1009 + md5: af491aae930edc096b58466c51c4126c depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=13 - libntlm >=1.8,<2.0a0 - libstdcxx >=13 - libxcrypt >=4.4.36 - - openssl >=3.5.0,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause-Attribution license_family: BSD purls: [] - size: 209774 - timestamp: 1750239039316 + size: 210103 + timestamp: 1771943128249 - conda: https://conda.anaconda.org/conda-forge/linux-64/cytoolz-1.1.0-py314h5bd0f2a_1.conda sha256: 7d0c7ac736f944ae1e97a2f066d5529d280d7d014bbf181c1d6d48d5efb1488d md5: 51b0391b0ce96be49b1174e9a3e4a279 @@ -9411,9 +9503,9 @@ packages: - pkg:pypi/dask?source=hash-mapping size: 1066502 timestamp: 1773823162829 -- conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.18.2-pyhd8ed1ab_0.conda - sha256: afa4c88adcd3242acb4a6e271c8af60df1e21262ff656bb8e8cbbf97b473c4c1 - md5: 7202ca262fc28025443238271066d88b +- conda: https://conda.anaconda.org/conda-forge/noarch/datashader-0.19.0-pyhd8ed1ab_0.conda + sha256: cfecc3dad48250f530ebd16f52061cb37bc9fdbdfec25098bf2de8424996b0bc + md5: 7718b2244ac8f3b4188ed4a06d49faf5 depends: - colorcet - multipledispatch @@ -9432,8 +9524,8 @@ packages: license_family: BSD purls: - pkg:pypi/datashader?source=hash-mapping - size: 17240471 - timestamp: 1754389607986 + size: 9618951 + timestamp: 1774010655548 - conda: https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda sha256: 22053a5842ca8ee1cf8e1a817138cdb5e647eb2c46979f84153f6ad7bde73020 md5: 418c6ca5929a611cbd69204907a83995 @@ -9722,16 +9814,16 @@ packages: - pkg:pypi/executing?source=hash-mapping size: 30753 timestamp: 1756729456476 -- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.2-pyhd8ed1ab_0.conda - sha256: 8c4210ed4dc439e87528635e226042ddab9bf458d4d0a12e7ba48d6c5babd0f8 - md5: 7e7cf4d6c2be6991e6ae2b3f4331701c +- conda: https://conda.anaconda.org/conda-forge/noarch/filelock-3.29.0-pyhd8ed1ab_0.conda + sha256: 6b471a18372bbd52bdf32fc965f71de3bc1b5219418b8e6b3875a67a7b08c483 + md5: 8fa8358d022a3a9bd101384a808044c6 depends: - python >=3.10 license: Unlicense purls: - pkg:pypi/filelock?source=compressed-mapping - size: 18646 - timestamp: 1767377337824 + size: 34211 + timestamp: 1776621506566 - conda: https://conda.anaconda.org/conda-forge/linux-64/fiona-1.10.1-py314hbcf5174_6.conda sha256: 6a25e057b4fc912ea56accdfd8b083653861c2b61fb875584385c9c27223334b md5: 9973d51b9bb91ae8cca8cfff05d9106b @@ -9867,21 +9959,22 @@ packages: purls: [] size: 1620504 timestamp: 1727511233259 -- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.15.0-h7e30c49_1.conda - sha256: 7093aa19d6df5ccb6ca50329ef8510c6acb6b0d8001191909397368b65b02113 - md5: 8f5b0b297b59e1ac160ad4beec99dbee +- conda: https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.17.1-h27c8c51_0.conda + sha256: aa4a44dba97151221100a637c7f4bde619567afade9c0265f8e1c8eed8d7bd8c + md5: 867127763fbe935bab59815b6e0b7b5c depends: - __glibc >=2.17,<3.0.a0 - - freetype >=2.12.1,<3.0a0 - - libexpat >=2.6.3,<3.0a0 - - libgcc >=13 - - libuuid >=2.38.1,<3.0a0 + - libexpat >=2.7.4,<3.0a0 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libgcc >=14 + - libuuid >=2.41.3,<3.0a0 - libzlib >=1.3.1,<2.0a0 license: MIT license_family: MIT purls: [] - size: 265599 - timestamp: 1730283881107 + size: 270705 + timestamp: 1771382710863 - conda: https://conda.anaconda.org/conda-forge/win-64/fontconfig-2.15.0-h765892d_1.conda sha256: ed122fc858fb95768ca9ca77e73c8d9ddc21d4b2e13aaab5281e27593e840691 md5: 9bb0026a2131b09404c59c4290c697cd @@ -9949,16 +10042,16 @@ packages: - pkg:pypi/fqdn?source=hash-mapping size: 16705 timestamp: 1733327494780 -- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.1-ha770c72_0.conda - sha256: bf8e4dffe46f7d25dc06f31038cacb01672c47b9f45201f065b0f4d00ab0a83e - md5: 4afc585cd97ba8a23809406cd8a9eda8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/freetype-2.14.3-ha770c72_0.conda + sha256: c934c385889c7836f034039b43b05ccfa98f53c900db03d8411189892ced090b + md5: 8462b5322567212beeb025f3519fb3e2 depends: - - libfreetype 2.14.1 ha770c72_0 - - libfreetype6 2.14.1 h73754d4_0 + - libfreetype 2.14.3 ha770c72_0 + - libfreetype6 2.14.3 h73754d4_0 license: GPL-2.0-only OR FTL purls: [] - size: 173114 - timestamp: 1757945422243 + size: 173839 + timestamp: 1774298173462 - conda: https://conda.anaconda.org/conda-forge/osx-64/freetype-2.14.1-h694c41f_0.conda sha256: 9f8282510db291496e89618fc66a58a1124fe7a6276fbd57ed18c602ce2576e9 md5: ca641fdf8b7803f4b7212b6d66375930 @@ -10103,12 +10196,12 @@ packages: - pkg:pypi/geographiclib?source=hash-mapping size: 40836 timestamp: 1755865181359 -- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.2-pyhd8ed1ab_0.conda - sha256: 7c3e5dc62c0b3d067a6f517ea9176e9d52682499d4afb78704354a60f37c5444 - md5: 3b9d40bef27d094e48bb1a821e86a252 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-1.1.3-pyhd8ed1ab_0.conda + sha256: c9ed18fb6270202299671f8075dd4f2fdff42220e4fd958e84629375769747f0 + md5: 4eb8b870142ca06d2a1d2c74662eac7d depends: - folium - - geopandas-base 1.1.2 pyha770c72_0 + - geopandas-base 1.1.3 pyha770c72_0 - mapclassify >=2.5.0 - matplotlib-base - pyogrio >=0.7.2 @@ -10118,11 +10211,11 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 8454 - timestamp: 1766475276498 -- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.2-pyha770c72_0.conda - sha256: e907715daf3b312a12d124744abe9644540f104832055b58edcf0c19eb4c45c0 - md5: ca79e96c1fd39ab6d12c8f99968111b1 + size: 8761 + timestamp: 1773131235020 +- conda: https://conda.anaconda.org/conda-forge/noarch/geopandas-base-1.1.3-pyha770c72_0.conda + sha256: b07fc3edb5cb86df52081e5cb120a03a178767ed079b5d2cd313212351460620 + md5: 18789a85c307970ae1786dfc6dfd234f depends: - numpy >=1.24 - packaging @@ -10133,8 +10226,8 @@ packages: license_family: BSD purls: - pkg:pypi/geopandas?source=hash-mapping - size: 254151 - timestamp: 1766475275483 + size: 254983 + timestamp: 1773131233972 - conda: https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_2.conda sha256: ac453c9558c48febe452c79281c632b3749baef7c04ed4b62f871709aee2aa03 md5: 40182a8d62a61d147ec7d3e4c5c36ac2 @@ -10189,26 +10282,26 @@ packages: purls: [] size: 1772787 timestamp: 1761593910217 -- conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.0-hd8ed1ab_0.conda - noarch: python - sha256: a1226002ed9395e069b61a510a3f85e5c37b63584648b8ba9708d961eb9e2bc5 - md5: f51689c296a037479281233ff55c5d68 +- conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-1.15.1-pyhd8ed1ab_0.conda + sha256: 97bb6e9fb7e0c546b09c418a783c383f45524c872182729fca2fa7548c6eb2c3 + md5: bb92eaf3d9b30b2f04f65686b4e1d11f depends: - datashader - geopandas-base - - geoviews-core 1.15.0 pyha770c72_0 + - geoviews-core 1.15.1 pyha770c72_0 - netcdf4 - pandas - pyct + - python >=3.10 - xarray license: BSD-3-Clause license_family: BSD purls: [] - size: 8677 - timestamp: 1763115357487 -- conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.0-pyha770c72_0.conda - sha256: 438fcbdb19f5f57d3cbf314623e534d71daea9d11b7c95086d3e7d2299dae42f - md5: fa5dd6e7904e1cab50273e4f7591a93f + size: 8875 + timestamp: 1768375468696 +- conda: https://conda.anaconda.org/conda-forge/noarch/geoviews-core-1.15.1-pyha770c72_0.conda + sha256: f02b166089a5fbb11d81db73ac8150835e1c10e9f8d2ec3c0e503656c12325b4 + md5: 44d1dcb11f7136ddb356b4b9eb0f6a6d depends: - bokeh >=3.8.0 - cartopy >=0.18.0 @@ -10222,13 +10315,13 @@ packages: - shapely >=1.8.0 - xyzservices constrains: - - geoviews 1.15.0 + - geoviews 1.15.1 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/geoviews?source=hash-mapping - size: 419083 - timestamp: 1763115285383 + size: 418482 + timestamp: 1768375420333 - conda: https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-h5888daf_1005.conda sha256: 6c33bf0c4d8f418546ba9c250db4e4221040936aef8956353bc764d4877bc39a md5: d411fc29e338efb48c5fd4576d71d881 @@ -10516,33 +10609,32 @@ packages: - s3fs ; extra == 'aws' - h5py ; extra == 'hdf5' requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-12.3.0-h6083320_0.conda - sha256: eb0ff4632c76d5840ad8f509dc55694f79d9ac9bea5529944640e28e490361b0 - md5: 1ea5ed29aea252072b975a232b195146 +- conda: https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-14.2.0-h6083320_0.conda + sha256: 232c95b56d16d33d8256026a3b1ad34f7f9a75c179d388854be0fd624ddba9e3 + md5: e194f6a2f498f0c7b1e6498bd0b12645 depends: - __glibc >=2.17,<3.0.a0 - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - - icu >=78.1,<79.0a0 - - libexpat >=2.7.3,<3.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 + - icu >=78.3,<79.0a0 + - libexpat >=2.7.5,<3.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 - libgcc >=14 - - libglib >=2.86.3,<3.0a0 + - libglib >=2.86.4,<3.0a0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: MIT - license_family: MIT purls: [] - size: 2062122 - timestamp: 1766937132307 -- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.3.0-h5a1b470_0.conda - sha256: 158ebfb3ae932162e794da869505761d2d32677a3b80377abef1a3e3499d0c61 - md5: 0eb57e84ceeb62c0189827fe7966bdc5 + size: 2333599 + timestamp: 1776778392713 +- conda: https://conda.anaconda.org/conda-forge/win-64/harfbuzz-12.3.2-h5a1b470_0.conda + sha256: f55c689dfb49a3778c2e3369a9103393f6cbd8efc9105753b8e081909dae74dd + md5: fb5d7b9527b418f83e3316f3e6daa8a2 depends: - cairo >=1.18.4,<2.0a0 - graphite2 >=1.3.14,<2.0a0 - - icu >=78.1,<79.0a0 + - icu >=78.2,<79.0a0 - libexpat >=2.7.3,<3.0a0 - libfreetype >=2.14.1 - libfreetype6 >=2.14.1 @@ -10554,8 +10646,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 1143524 - timestamp: 1766937684751 + size: 1127522 + timestamp: 1769445644521 - conda: https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda sha256: 0d09b6dc1ce5c4005ae1c6a19dc10767932ef9a5e9c755cfdbb5189ac8fb0684 md5: bd77f8da987968ec3927990495dc22e4 @@ -10607,74 +10699,98 @@ packages: purls: [] size: 779637 timestamp: 1695662145568 -- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.6-nompi_h1b119a7_104.conda - sha256: 454e9724b322cee277abd7acf4f8d688e9c4ded006b6d5bc9fcc2a1ff907d27a - md5: 0857f4d157820dcd5625f61fdfefb780 +- conda: https://conda.anaconda.org/conda-forge/linux-64/hdf5-2.1.0-nompi_hd4fcb43_104.conda + sha256: c6ff674a4a5a237fcf748fed8f64e79df54b42189986e705f35ba64dc6603235 + md5: 1d92558abd05cea0577f83a5eca38733 depends: - __glibc >=2.17,<3.0.a0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.17.0,<9.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libgcc >=14 - libgfortran - libgfortran5 >=14.3.0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3720961 - timestamp: 1764771748126 -- conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-1.14.6-nompi_hc1508a4_104.conda - sha256: aed322f0e8936960332305fbc213831a3cd301db5ea22c06e1293d953ddec563 - md5: 9425a5c53febdf71696aed291586d038 + size: 4138489 + timestamp: 1775243967708 +- conda: https://conda.anaconda.org/conda-forge/osx-64/hdf5-2.1.0-nompi_h3b1597d_104.conda + sha256: b184d5cace3a16644e857da93c4b9048370c0ee28b8fedd55ffaaf25c65d8bc1 + md5: 8b1abc9a6f2a3f439f5f314a6763956a depends: - - __osx >=10.13 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.17.0,<9.0a0 + - __osx >=11.0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3528765 - timestamp: 1764773824647 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-1.14.6-nompi_hd3baa01_104.conda - sha256: 3cd591334a838b127dfe8a626f38241892063eac8873abb93255962c71155533 - md5: 5a1cbaf2349dd2e6dd6cfaab378de51b + size: 3875210 + timestamp: 1775244947555 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/hdf5-2.1.0-nompi_hc95e3eb_104.conda + sha256: 5b96accf983be97718fbfaddd6706591d7ef6511b4ccdac8a09f6b9899d1b284 + md5: e5390fd4a3b964a3ed619480df918294 depends: - __osx >=11.0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.17.0,<9.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - libgfortran - libgfortran5 >=14.3.0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.5,<4.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3292042 - timestamp: 1764771887501 -- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-1.14.6-nompi_h89f0904_104.conda - sha256: cc948149f700033ff85ce4a1854edf6adcb5881391a3df5c40cbe2a793dd9f81 - md5: 9cc4a5567d46c7fcde99563e86522882 + size: 3418702 + timestamp: 1775244340092 +- conda: https://conda.anaconda.org/conda-forge/win-64/hdf5-2.1.0-nompi_hd96b29f_104.conda + sha256: ad660bf000e2a905ebdc8c297d9b3851ac48834284b673e655adda490425f652 + md5: 37c1890c40a1514fa92ba13e27d5b1c3 depends: - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - aws-c-auth >=0.10.1,<0.10.2.0a0 + - aws-c-common >=0.12.6,<0.12.7.0a0 + - aws-c-http >=0.10.12,<0.10.13.0a0 + - aws-c-io >=0.26.3,<0.26.4.0a0 + - aws-c-s3 >=0.11.5,<0.11.6.0a0 + - aws-c-sdkutils >=0.2.4,<0.2.5.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.5,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: BSD-3-Clause license_family: BSD purls: [] - size: 2028777 - timestamp: 1764771527382 + size: 2564561 + timestamp: 1775244102272 - conda: https://conda.anaconda.org/conda-forge/noarch/holoviews-1.22.1-pyhd8ed1ab_0.conda sha256: 598c989ceb11bba5c0c142b8394016ddb26153a02e8275eb045985913c72beaf md5: 32bc3daa3fa9619d84e634b4515f564a @@ -10770,9 +10886,9 @@ packages: - pkg:pypi/hyperframe?source=hash-mapping size: 17397 timestamp: 1737618427549 -- conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.150.0-pyha770c72_0.conda - sha256: b6b425c05530b17e654e91e2dd45d9dcabc45915d64cde4b5c3d6df3cc212aa5 - md5: 82e7f75d3239cad657f9bab986d93d9a +- conda: https://conda.anaconda.org/conda-forge/noarch/hypothesis-6.152.1-pyha770c72_0.conda + sha256: 99e19af83fee1b84002dbcfdbebf2ef5edf4f51acaee571c36d657485af3ba7f + md5: cf52934d1b2740dfc23c48fd0cd525f5 depends: - attrs >=22.2.0 - click >=7.0 @@ -10783,20 +10899,21 @@ packages: license: MPL-2.0 license_family: MOZILLA purls: - - pkg:pypi/hypothesis?source=compressed-mapping - size: 385639 - timestamp: 1767743688487 -- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.2-h33c6efd_0.conda - sha256: 142a722072fa96cf16ff98eaaf641f54ab84744af81754c292cb81e0881c0329 - md5: 186a18e3ba246eccfc7cff00cd19a870 + - pkg:pypi/hypothesis?source=hash-mapping + size: 378863 + timestamp: 1776218065958 +- conda: https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda + sha256: fbf86c4a59c2ed05bbffb2ba25c7ed94f6185ec30ecb691615d42342baa1a16a + md5: c80d8a3b84358cb967fa81e7075fbc8a depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 license: MIT + license_family: MIT purls: [] - size: 12728445 - timestamp: 1767969922681 + size: 12723451 + timestamp: 1773822285671 - conda: https://conda.anaconda.org/conda-forge/osx-64/icu-78.2-h14c5de8_0.conda sha256: f3066beae7fe3002f09c8a412cdf1819f49a2c9a485f720ec11664330cf9f1fe md5: 30334add4de016489b731c6662511684 @@ -11178,52 +11295,50 @@ packages: - pkg:pypi/ipykernel?source=hash-mapping size: 133820 timestamp: 1761567932044 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyh53cf698_0.conda - sha256: 4ff1733c59b72cf0c8ed9ddb6e948e99fc6b79b76989282c0c7a46aab56e6176 - md5: 8481978caa2f108e6ddbf8008a345546 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhccfa634_0.conda + sha256: a0d3e4c8e4d7b3801377a03de32951f68d77dd1bfe25082c7915f4e6b0aaa463 + md5: 3734e3b6618ea6e04ad08678d8ed7a45 depends: - - __unix - - pexpect >4.3 - - decorator >=4.3.2 + - __win + - decorator >=5.1.0 - ipython_pygments_lexers >=1.0.0 - - jedi >=0.18.1 - - matplotlib-inline >=0.1.5 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 - prompt-toolkit >=3.0.41,<3.1.0 - - pygments >=2.11.0 - - python >=3.11 + - pygments >=2.14.0 + - python >=3.12 - stack_data >=0.6.0 - traitlets >=5.13.0 - - typing_extensions >=4.6 + - colorama >=0.4.4 - python license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/ipython?source=compressed-mapping - size: 646242 - timestamp: 1767621166614 -- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.9.0-pyhe2676ad_0.conda - sha256: 1697fae5859f61938ab44af38126115ad18fc059462bb370c5f8740d7bc4a803 - md5: fe785355648dec69d2f06fa14c9e6e84 + size: 648954 + timestamp: 1774610078420 +- conda: https://conda.anaconda.org/conda-forge/noarch/ipython-9.12.0-pyhecfbec7_0.conda + sha256: 932044bd893f7adce6c9b384b96a72fd3804cc381e76789398c2fae900f21df7 + md5: b293210beb192c3024683bf6a998a0b8 depends: - - __win - - colorama >=0.4.4 - - decorator >=4.3.2 + - __unix + - decorator >=5.1.0 - ipython_pygments_lexers >=1.0.0 - - jedi >=0.18.1 - - matplotlib-inline >=0.1.5 + - jedi >=0.18.2 + - matplotlib-inline >=0.1.6 - prompt-toolkit >=3.0.41,<3.1.0 - - pygments >=2.11.0 - - python >=3.11 + - pygments >=2.14.0 + - python >=3.12 - stack_data >=0.6.0 - traitlets >=5.13.0 - - typing_extensions >=4.6 + - pexpect >4.6 - python license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/ipython?source=compressed-mapping - size: 645119 - timestamp: 1767621201570 + - pkg:pypi/ipython?source=hash-mapping + size: 649967 + timestamp: 1774609994657 - conda: https://conda.anaconda.org/conda-forge/noarch/ipython_pygments_lexers-1.1.1-pyhd8ed1ab_0.conda sha256: 894682a42a7d659ae12878dbcb274516a7031bbea9104e92f8e88c1f2765a104 md5: bd80ba060603cc228d9d81c257093119 @@ -11882,62 +11997,63 @@ packages: - pkg:pypi/kiwisolver?source=hash-mapping size: 73670 timestamp: 1762488752873 -- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda - sha256: 99df692f7a8a5c27cd14b5fb1374ee55e756631b9c3d659ed3ee60830249b238 - md5: 3f43953b7d3fb3aaa1d0d0723d91e368 +- conda: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.22.2-ha1258a1_0.conda + sha256: 3e307628ca3527448dd1cb14ad7bb9d04d1d28c7d4c5f97ba196ae984571dd25 + md5: fb53fb07ce46a575c5d004bbc96032c2 depends: - - keyutils >=1.6.1,<2.0a0 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - libgcc-ng >=12 - - libstdcxx-ng >=12 - - openssl >=3.3.1,<4.0a0 + - __glibc >=2.17,<3.0.a0 + - keyutils >=1.6.3,<2.0a0 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 1370023 - timestamp: 1719463201255 -- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.21.3-h37d8d59_0.conda - sha256: 83b52685a4ce542772f0892a0f05764ac69d57187975579a0835ff255ae3ef9c - md5: d4765c524b1d91567886bde656fb514b + size: 1386730 + timestamp: 1769769569681 +- conda: https://conda.anaconda.org/conda-forge/osx-64/krb5-1.22.2-h207b36a_0.conda + sha256: df009385e8262c234c0dae9016540b86dad3d299f0d9366d08e327e8e7731634 + md5: e66e2c52d2fdddcf314ad750fb4ebb4a depends: - __osx >=10.13 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 1185323 - timestamp: 1719463492984 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.21.3-h237132a_0.conda - sha256: 4442f957c3c77d69d9da3521268cad5d54c9033f1a73f99cde0a3658937b159b - md5: c6dc8a0fdec13a0565936655c33069a1 + size: 1193620 + timestamp: 1769770267475 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/krb5-1.22.2-h385eeb1_0.conda + sha256: c0a0bf028fe7f3defcdcaa464e536cf1b202d07451e18ad83fdd169d15bef6ed + md5: e446e1822f4da8e5080a9de93474184d depends: - __osx >=11.0 - - libcxx >=16 - - libedit >=3.1.20191231,<3.2.0a0 - - libedit >=3.1.20191231,<4.0a0 - - openssl >=3.3.1,<4.0a0 + - libcxx >=19 + - libedit >=3.1.20250104,<3.2.0a0 + - libedit >=3.1.20250104,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: MIT license_family: MIT purls: [] - size: 1155530 - timestamp: 1719463474401 -- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.21.3-hdf4eb48_0.conda - sha256: 18e8b3430d7d232dad132f574268f56b3eb1a19431d6d5de8c53c29e6c18fa81 - md5: 31aec030344e962fbd7dbbbbd68e60a9 + size: 1160828 + timestamp: 1769770119811 +- conda: https://conda.anaconda.org/conda-forge/win-64/krb5-1.22.2-h0ea6238_0.conda + sha256: eb60f1ad8b597bcf95dee11bc11fe71a8325bc1204cf51d2bb1f2120ffd77761 + md5: 4432f52dc0c8eb6a7a6abc00a037d93c depends: - - openssl >=3.3.1,<4.0a0 + - openssl >=3.5.5,<4.0a0 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: MIT license_family: MIT purls: [] - size: 712034 - timestamp: 1719463874284 + size: 751055 + timestamp: 1769769688841 - conda: https://conda.anaconda.org/conda-forge/noarch/lark-1.3.1-pyhd8ed1ab_0.conda sha256: 49570840fb15f5df5d4b4464db8ee43a6d643031a2bc70ef52120a52e3809699 md5: 9b965c999135d43a3d0f7bd7d024e26a @@ -12072,110 +12188,110 @@ packages: purls: [] size: 164701 timestamp: 1745264384716 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20250512.1-cxx17_hba17884_0.conda - sha256: dcd1429a1782864c452057a6c5bc1860f2b637dc20a2b7e6eacd57395bbceff8 - md5: 83b160d4da3e1e847bf044997621ed63 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libabseil-20260107.1-cxx17_h7b12aa8_0.conda + sha256: a7a4481a4d217a3eadea0ec489826a69070fcc3153f00443aa491ed21527d239 + md5: 6f7b4302263347698fd24565fbf11310 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 constrains: - - libabseil-static =20250512.1=cxx17* - - abseil-cpp =20250512.1 + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 license: Apache-2.0 license_family: Apache purls: [] - size: 1310612 - timestamp: 1750194198254 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20250512.1-cxx17_hfc00f1c_0.conda - sha256: a878efebf62f039a1f1733c1e150a75a99c7029ece24e34efdf23d56256585b1 - md5: ddf1acaed2276c7eb9d3c76b49699a11 + size: 1384817 + timestamp: 1770863194876 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libabseil-20260107.1-cxx17_h7ed6875_0.conda + sha256: 2b4ff36082ddfbacc47ac6e11d4dd9f3403cd109ce8d7f0fbee0cdd47cdef013 + md5: 317f40d7bd7bf6d54b56d4a5b5f5085d depends: - __osx >=10.13 - - libcxx >=18 + - libcxx >=19 constrains: - - abseil-cpp =20250512.1 - - libabseil-static =20250512.1=cxx17* + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 license: Apache-2.0 license_family: Apache purls: [] - size: 1162435 - timestamp: 1750194293086 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20250512.1-cxx17_hd41c47c_0.conda - sha256: 7f0ee9ae7fa2cf7ac92b0acf8047c8bac965389e48be61bf1d463e057af2ea6a - md5: 360dbb413ee2c170a0a684a33c4fc6b8 + size: 1217836 + timestamp: 1770863510112 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libabseil-20260107.1-cxx17_h2062a1b_0.conda + sha256: 756611fbb8d2957a5b4635d9772bd8432cb6ddac05580a6284cca6fdc9b07fca + md5: bb65152e0d7c7178c0f1ee25692c9fd1 depends: - __osx >=11.0 - - libcxx >=18 + - libcxx >=19 constrains: - - libabseil-static =20250512.1=cxx17* - - abseil-cpp =20250512.1 + - abseil-cpp =20260107.1 + - libabseil-static =20260107.1=cxx17* license: Apache-2.0 license_family: Apache purls: [] - size: 1174081 - timestamp: 1750194620012 -- conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20250512.1-cxx17_habfad5f_0.conda - sha256: 78790771f44e146396d9ae92efbe1022168295afd8d174f653a1fa16f0f0fa32 - md5: d6a4cd236fc1c69a1cfc9698fb5e391f + size: 1229639 + timestamp: 1770863511331 +- conda: https://conda.anaconda.org/conda-forge/win-64/libabseil-20260107.1-cxx17_h0eb2380_0.conda + sha256: 7e7f3754f8afaabd946dc11d7c00fd1dc93f0388a2d226a7abf1bf07deab0e2b + md5: 60da39dd5fd93b2a4a0f986f3acc2520 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - - vc14_runtime >=14.42.34438 + - vc14_runtime >=14.44.35208 constrains: - - libabseil-static =20250512.1=cxx17* - - abseil-cpp =20250512.1 + - libabseil-static =20260107.1=cxx17* + - abseil-cpp =20260107.1 license: Apache-2.0 license_family: Apache purls: [] - size: 1615210 - timestamp: 1750194549591 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.4-h3f801dc_0.conda - sha256: 410ab78fe89bc869d435de04c9ffa189598ac15bb0fe1ea8ace8fb1b860a2aa3 - md5: 01ba04e414e47f95c03d6ddd81fd37be + size: 1884784 + timestamp: 1770863303486 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.5-h088129d_0.conda + sha256: 822e4ae421a7e9c04e841323526321185f6659222325e1a9aedec811c686e688 + md5: 86f7414544ae606282352fa1e116b41f depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libstdcxx >=13 + - libgcc >=14 + - libstdcxx >=14 license: BSD-2-Clause license_family: BSD purls: [] - size: 36825 - timestamp: 1749993532943 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.4-ha6bc127_0.conda - sha256: f4fe00ef0df58b670696c62f2ec3f6484431acbf366ecfbcb71141c81439e331 - md5: 1a768b826dfc68e07786788d98babfc3 + size: 36544 + timestamp: 1769221884824 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libaec-1.1.5-he7c3a48_0.conda + sha256: b42ac9c684c730cb97cb3931a0a97aaf791da38bace4f6944eca10de609e5946 + md5: 975f98248cde8d54884c6d1eb5184e13 depends: - __osx >=10.13 - - libcxx >=18 + - libcxx >=19 license: BSD-2-Clause license_family: BSD purls: [] - size: 30034 - timestamp: 1749993664561 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.4-h51d1e36_0.conda - sha256: 0ea6b73b3fb1511615d9648186a7409e73b7a8d9b3d890d39df797730e3d1dbb - md5: 8ed0f86b7a5529b98ec73b43a53ce800 + size: 30555 + timestamp: 1769222189944 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libaec-1.1.5-h8664d51_0.conda + sha256: af9cd8db11eb719e38a3340c88bb4882cf19b5b4237d93845224489fc2a13b46 + md5: 13e6d9ae0efbc9d2e9a01a91f4372b41 depends: - __osx >=11.0 - - libcxx >=18 + - libcxx >=19 license: BSD-2-Clause license_family: BSD purls: [] - size: 30173 - timestamp: 1749993648288 -- conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.4-h20038f6_0.conda - sha256: 0be89085effce9fdcbb6aea7acdb157b18793162f68266ee0a75acf615d4929b - md5: 85a2bed45827d77d5b308cb2b165404f + size: 30390 + timestamp: 1769222133373 +- conda: https://conda.anaconda.org/conda-forge/win-64/libaec-1.1.5-haf901d7_0.conda + sha256: e54c08964262c73671d9e80e400333e59c617e0b454476ad68933c0c458156c8 + md5: 43b6385cfad52a7083f2c41984eb4e91 depends: - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: BSD-2-Clause license_family: BSD purls: [] - size: 33847 - timestamp: 1749993666162 + size: 34463 + timestamp: 1769221960556 - conda: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.5-gpl_hc2c16d8_100.conda sha256: ee2cf1499a5a5fd5f03c6203597fe14bf28c6ca2a8fffb761e41f3cf371e768e md5: 5fdaa8b856683a5598459dead3976578 @@ -12257,33 +12373,33 @@ packages: purls: [] size: 1106553 timestamp: 1767630802450 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-hb6ed5f4_6_cpu.conda - build_number: 6 - sha256: bab5fcb86cf28a3de65127fbe61ed9194affc1cf2d9b60a9e09af8a8b96b93e3 - md5: fbaa3742ccca0f7096216c0832137b72 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-22.0.0-ha7f89c6_20_cpu.conda + build_number: 20 + sha256: cdd0d318852af86736e7f32a99e309909dfece3dcb8ede4ef684c2cb3b1f6db6 + md5: f789a770dcd0931d57f21abb43a15e72 depends: - __glibc >=2.17,<3.0.a0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-identity-cpp >=1.13.2,<1.13.3.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-files-datalake-cpp >=12.13.0,<12.13.1.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libgcc >=14 - - libgoogle-cloud >=2.39.0,<2.40.0a0 - - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.3.0,<2.3.1.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: @@ -12293,247 +12409,251 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 6324546 - timestamp: 1765381265473 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h563529e_6_cpu.conda - build_number: 6 - sha256: a478600f0bfef3505b4ee1277bd8c9eee78551045879c5c1007e03f25b14d946 - md5: 9cdb6f5779fb935d84e7cdaa00d5c26d + size: 6354197 + timestamp: 1774263607699 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-22.0.0-h805b2f2_20_cpu.conda + build_number: 20 + sha256: 3edccb4d05e3efa3e8e1518faac3ff9f67da1b5128b760780ad2f2713e8438f5 + md5: cb5b41b219616b93aadb4aa34be9478d depends: - __osx >=11.0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-identity-cpp >=1.13.2,<1.13.3.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-files-datalake-cpp >=12.13.0,<12.13.1.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libcxx >=19 - - libgoogle-cloud >=2.39.0,<2.40.0a0 - - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.3.0,<2.3.1.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - - parquet-cpp <0.0a0 - arrow-cpp <0.0a0 + - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu license: Apache-2.0 license_family: APACHE purls: [] - size: 4269871 - timestamp: 1765852154699 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-he6e817a_6_cpu.conda - build_number: 6 - sha256: 77d82f2d6787ec0300da0ad683d30eccc71723665c5dc4e7c6e4ca9b7955f599 - md5: b972d880c503c30ee178489ec76bbd6d + size: 4287902 + timestamp: 1774267001986 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-22.0.0-hf9aa2c5_20_cpu.conda + build_number: 20 + sha256: cddfa62a23bfd56b45b0c79e55fabd2214b8d92810620627bf5fe9f1229201fa + md5: 593f7d2598138be35adc46017d0eb466 depends: - __osx >=11.0 - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 - - azure-core-cpp >=1.16.1,<1.16.2.0a0 - - azure-identity-cpp >=1.13.2,<1.13.3.0a0 - - azure-storage-blobs-cpp >=12.15.0,<12.15.1.0a0 - - azure-storage-files-datalake-cpp >=12.13.0,<12.13.1.0a0 + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 - bzip2 >=1.0.8,<2.0a0 - glog >=0.7.1,<0.8.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libcxx >=19 - - libgoogle-cloud >=2.39.0,<2.40.0a0 - - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.3.0,<2.3.1.0a0 - snappy >=1.2.2,<1.3.0a0 - zstd >=1.5.7,<1.6.0a0 constrains: - parquet-cpp <0.0a0 - - arrow-cpp <0.0a0 - apache-arrow-proc =*=cpu + - arrow-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 4160249 - timestamp: 1765382560379 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-h89d7da9_6_cpu.conda - build_number: 6 - sha256: 5469cd02381c6760893fc2bcfda9cfb7a2c248527132964d36740e5789648133 - md5: e9fe1ee5e997417347e1ee312af94092 - depends: - - aws-crt-cpp >=0.35.4,<0.35.5.0a0 - - aws-sdk-cpp >=1.11.606,<1.11.607.0a0 + size: 4124176 + timestamp: 1774264348339 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-22.0.0-hc74aee5_20_cpu.conda + build_number: 20 + sha256: 394b0dedf60429d603d79401f6fdf437005d5c8c50410909f2a34f60d0758b53 + md5: d5fc668591fafedd8a104e8951dfd757 + depends: + - aws-crt-cpp >=0.37.4,<0.37.5.0a0 + - aws-sdk-cpp >=1.11.747,<1.11.748.0a0 + - azure-core-cpp >=1.16.2,<1.16.3.0a0 + - azure-identity-cpp >=1.13.3,<1.13.4.0a0 + - azure-storage-blobs-cpp >=12.16.0,<12.16.1.0a0 + - azure-storage-files-datalake-cpp >=12.14.0,<12.14.1.0a0 - bzip2 >=1.0.8,<2.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libbrotlidec >=1.2.0,<1.3.0a0 - libbrotlienc >=1.2.0,<1.3.0a0 - libcrc32c >=1.1.2,<1.2.0a0 - - libcurl >=8.17.0,<9.0a0 - - libgoogle-cloud >=2.39.0,<2.40.0a0 - - libgoogle-cloud-storage >=2.39.0,<2.40.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgoogle-cloud >=3.3.0,<3.4.0a0 + - libgoogle-cloud-storage >=3.3.0,<3.4.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.2,<2.0a0 - lz4-c >=1.10.0,<1.11.0a0 - - orc >=2.2.1,<2.2.2.0a0 + - orc >=2.3.0,<2.3.1.0a0 - snappy >=1.2.2,<1.3.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: + - arrow-cpp <0.0a0 - parquet-cpp <0.0a0 - apache-arrow-proc =*=cpu - - arrow-cpp <0.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 3965279 - timestamp: 1765381971425 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_6_cpu.conda - build_number: 6 - sha256: b7e013502eb6dbb59bf58c34b83ed4e7bbcc32ee37600016d862f0bb21a6dc5a - md5: 5a8f878ca313083960ab819a009848b3 + size: 4269273 + timestamp: 1774267699825 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-22.0.0-h635bf11_20_cpu.conda + build_number: 20 + sha256: c8c372e95c4724b640166d1d0f8eff31f05f6f9e9a1163f4ffc5b91b59659d34 + md5: 25a77d7a5984556c5e40beb3d8319012 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 22.0.0 hb6ed5f4_6_cpu - - libarrow-compute 22.0.0 h8c2c5c3_6_cpu + - libarrow 22.0.0 ha7f89c6_20_cpu + - libarrow-compute 22.0.0 h53684a4_20_cpu - libgcc >=14 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] - size: 585860 - timestamp: 1765381484672 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h2db2d7d_6_cpu.conda - build_number: 6 - sha256: 48aaec89f7058d4f9a5a0a26a5d85b27d8bdd92afb29b8af15d07fda5776a675 - md5: 6167eebc2d1a893b5c9da5b28803c9b1 + size: 609647 + timestamp: 1774263843907 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-acero-22.0.0-h1d24c07_20_cpu.conda + build_number: 20 + sha256: 6f71796df03aae70300af190fa49d7f3687e1ed449acecb3d446c6029d5bd0b7 + md5: 8f806738052877813e17ded7bff928ad depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h563529e_6_cpu - - libarrow-compute 22.0.0 h7751554_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 h805b2f2_20_cpu + - libarrow-compute 22.0.0 hbd17586_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 557962 - timestamp: 1765852618606 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-hc317990_6_cpu.conda - build_number: 6 - sha256: 3250653194b95fc30785f7fc394381318ecc3afb500884967b6d736349b135fe - md5: f17f28aba732a290919eecdec17677d9 + size: 580327 + timestamp: 1774267987985 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-acero-22.0.0-h4bbd9f8_20_cpu.conda + build_number: 20 + sha256: 8bbdd38df70815394a682fdafeab4822456441750008291cd09593b09092a818 + md5: e7a2d2d6626acad969bb9ebe49bf04d8 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 he6e817a_6_cpu - - libarrow-compute 22.0.0 h75845d1_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hf9aa2c5_20_cpu + - libarrow-compute 22.0.0 h0eeae98_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 523683 - timestamp: 1765383066107 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_6_cpu.conda - build_number: 6 - sha256: bea322b50e5db84ba1de28a70e0da9ebb44a8d525a0ffb5facc2fa0b8332c3e5 - md5: bbef682dd3d8f686faad9f1a94b3d9ae + size: 544027 + timestamp: 1774265051226 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-acero-22.0.0-h7d8d6a5_20_cpu.conda + build_number: 20 + sha256: bdc18695df0f5d153d124ebd524c9ad16f83628cb435236b007932767c7e2f70 + md5: 6d4aa99011fda0d92aa217aba9d9f946 depends: - - libarrow 22.0.0 h89d7da9_6_cpu - - libarrow-compute 22.0.0 h2db994a_6_cpu + - libarrow 22.0.0 hc74aee5_20_cpu + - libarrow-compute 22.0.0 h081cd8e_20_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 451321 - timestamp: 1765382291986 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h8c2c5c3_6_cpu.conda - build_number: 6 - sha256: 0cd08dd11263105e2bf45514e08f8e4a59fac41a80a82f17540e047242835872 - md5: d2cd924b5f451a7c258001cb1c14155d + size: 474877 + timestamp: 1774268075904 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-compute-22.0.0-h53684a4_20_cpu.conda + build_number: 20 + sha256: 80551fcef6101e3e6055d513696341e19f8c23c57ae99f90d1760183845d2790 + md5: f8cbf08d8544b048baf85b3af440d292 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 22.0.0 hb6ed5f4_6_cpu + - libarrow 22.0.0 ha7f89c6_20_cpu - libgcc >=14 - - libre2-11 >=2025.8.12 + - libre2-11 >=2025.11.5 - libstdcxx >=14 - - libutf8proc >=2.11.2,<2.12.0a0 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] - size: 2973397 - timestamp: 1765381343806 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-h7751554_6_cpu.conda - build_number: 6 - sha256: 68fabdf5dc7a06e952271894d3ed55edf65b60f342fc53d93862989293f03071 - md5: 1feda49b7df6cf16240c90b06e4220ec + size: 2995862 + timestamp: 1774263694498 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-compute-22.0.0-hbd17586_20_cpu.conda + build_number: 20 + sha256: 0401b531530c4cf74ef06bf4ee67de4257b16f7d3fae20cdefb440d71b41cd8f + md5: 6c0ea26b2cce01747e59778da8361659 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h563529e_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 h805b2f2_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 - - libutf8proc >=2.11.2,<2.12.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] - size: 2399998 - timestamp: 1765852317142 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h75845d1_6_cpu.conda - build_number: 6 - sha256: 053d096e77464ea8da7c35ab167864bacac3590af304aa3368d09aba8cdf8af8 - md5: 51b139c330f194379c4271c91c9cd1c7 + size: 2421637 + timestamp: 1774267402496 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-compute-22.0.0-h0eeae98_20_cpu.conda + build_number: 20 + sha256: eee769d7ef87fb4a045afe3294de83e1ad912b5a995678851d1e38e368127395 + md5: f21ae40d990b00c1ddd0a0979d14d437 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 he6e817a_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hf9aa2c5_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 - - libutf8proc >=2.11.2,<2.12.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 license: Apache-2.0 license_family: APACHE purls: [] - size: 2155806 - timestamp: 1765382724366 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h2db994a_6_cpu.conda - build_number: 6 - sha256: f26d1d4752f847c11ed3202b1314b1729a52f1468b17dfd3174885db7e3e2dfe - md5: 922c36699625c3f49940337feeba8291 + size: 2180042 + timestamp: 1774264610527 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-compute-22.0.0-h081cd8e_20_cpu.conda + build_number: 20 + sha256: ad1e08a272ffdd795d65d73b80b4ab0de768b2ec1afadf41c7d79da1e7129def + md5: 225254de665577b784bd3a689fb47c04 depends: - - libarrow 22.0.0 h89d7da9_6_cpu - - libre2-11 >=2025.8.12 - - libutf8proc >=2.11.2,<2.12.0a0 + - libarrow 22.0.0 hc74aee5_20_cpu + - libre2-11 >=2025.11.5 + - libutf8proc >=2.11.3,<2.12.0a0 - re2 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -12541,156 +12661,156 @@ packages: license: Apache-2.0 license_family: APACHE purls: [] - size: 1685242 - timestamp: 1765382093115 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_6_cpu.conda - build_number: 6 - sha256: d0321d8d82ccc55557ccb3119174179de3f282df68a6efe60f9c523bbf242a1f - md5: 579bdb829ab093d048e49a289d3c9883 + size: 1784102 + timestamp: 1774267842569 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-22.0.0-h635bf11_20_cpu.conda + build_number: 20 + sha256: 884ebe646898369984c2a3423269ee79c7752e535fbc7ac5cd49287abda9c714 + md5: 905b15720f48be0f507adfc7becb0865 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 22.0.0 hb6ed5f4_6_cpu - - libarrow-acero 22.0.0 h635bf11_6_cpu - - libarrow-compute 22.0.0 h8c2c5c3_6_cpu + - libarrow 22.0.0 ha7f89c6_20_cpu + - libarrow-acero 22.0.0 h635bf11_20_cpu + - libarrow-compute 22.0.0 h53684a4_20_cpu - libgcc >=14 - - libparquet 22.0.0 h7376487_6_cpu + - libparquet 22.0.0 h7376487_20_cpu - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] - size: 584952 - timestamp: 1765381575560 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h2db2d7d_6_cpu.conda - build_number: 6 - sha256: 31b84bde000c0c5544feaaef82919eb0e3e934cfd5bf06b87ce5fc5a3ae09e33 - md5: d5a2c15f5cb9928b4d5847b2ca13af5f + size: 607358 + timestamp: 1774263948311 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-dataset-22.0.0-h1d24c07_20_cpu.conda + build_number: 20 + sha256: 13c9137b2dded36d42e9d74df29fe332ae6ee4705a1c807a2f6e743b674bbdcc + md5: be2eae8e7b0ebcc9c9ce4a76e941bcae depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h563529e_6_cpu - - libarrow-acero 22.0.0 h2db2d7d_6_cpu - - libarrow-compute 22.0.0 h7751554_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 h805b2f2_20_cpu + - libarrow-acero 22.0.0 h1d24c07_20_cpu + - libarrow-compute 22.0.0 hbd17586_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libparquet 22.0.0 habb56ca_6_cpu - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libparquet 22.0.0 hfa831cf_20_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 538184 - timestamp: 1765852838778 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-hc317990_6_cpu.conda - build_number: 6 - sha256: ab07545a7f99cb8026b3bfe0f7f2c33d3204972fe1d5eb011adf2eb002277989 - md5: cf0d62de81a3a2b7afb723b4b629879a + size: 561688 + timestamp: 1774268429274 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-dataset-22.0.0-h4bbd9f8_20_cpu.conda + build_number: 20 + sha256: f07f78967067e849a6565266d6b68348c0781d4ecb04f5841b1638e3de9b1c37 + md5: 8c7eee735f51b30ba96c52ee30725b49 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 he6e817a_6_cpu - - libarrow-acero 22.0.0 hc317990_6_cpu - - libarrow-compute 22.0.0 h75845d1_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hf9aa2c5_20_cpu + - libarrow-acero 22.0.0 h4bbd9f8_20_cpu + - libarrow-compute 22.0.0 h0eeae98_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libparquet 22.0.0 h0ac143b_6_cpu - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libparquet 22.0.0 h8e9781e_20_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 520397 - timestamp: 1765383321028 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_6_cpu.conda - build_number: 6 - sha256: 147e9f2092443bf4facda44323097d8a494b4930c2865996aa54e2d19a454d93 - md5: 974630001cbf61d4d94a7c7c142eade4 - depends: - - libarrow 22.0.0 h89d7da9_6_cpu - - libarrow-acero 22.0.0 h7d8d6a5_6_cpu - - libarrow-compute 22.0.0 h2db994a_6_cpu - - libparquet 22.0.0 h7051d1f_6_cpu + size: 543935 + timestamp: 1774265296927 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-dataset-22.0.0-h7d8d6a5_20_cpu.conda + build_number: 20 + sha256: d9847aadfe39e9582d659421b65c458eba5fb1d4bbde0ee14854e7b5ee45896d + md5: 5f56391d9c08bfa1e19f743499e20bf7 + depends: + - libarrow 22.0.0 hc74aee5_20_cpu + - libarrow-acero 22.0.0 h7d8d6a5_20_cpu + - libarrow-compute 22.0.0 h081cd8e_20_cpu + - libparquet 22.0.0 h7051d1f_20_cpu - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 435881 - timestamp: 1765382430115 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-h3f74fd7_6_cpu.conda - build_number: 6 - sha256: a343378e20aaa27e955c1f84394f00668458b69f6eaf7efcf4b21a3f8f10e02a - md5: cfc7d2c5a81eb6de3100661a69de5f3d + size: 458603 + timestamp: 1774268251134 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-22.0.0-hb4dd7c2_20_cpu.conda + build_number: 20 + sha256: 4f75f30685e2b817a4fb0c542db8d4ee8a7b12514f17da053fe59064fefe9520 + md5: 022b35815a3d5713c5f3371fa99450ab depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 hb6ed5f4_6_cpu - - libarrow-acero 22.0.0 h635bf11_6_cpu - - libarrow-dataset 22.0.0 h635bf11_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 ha7f89c6_20_cpu + - libarrow-acero 22.0.0 h635bf11_20_cpu + - libarrow-dataset 22.0.0 h635bf11_20_cpu - libgcc >=14 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libstdcxx >=14 license: Apache-2.0 license_family: APACHE purls: [] - size: 487167 - timestamp: 1765381605708 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h4653b8a_6_cpu.conda - build_number: 6 - sha256: 6ff0417c6e95b299f684e812c4cebe3fb9c935be8a628da875c40ce9588911b5 - md5: 0420b6cb0c11dfaf0dbd607cd808cf9c + size: 513365 + timestamp: 1774263983257 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libarrow-substrait-22.0.0-h60c59b2_20_cpu.conda + build_number: 20 + sha256: 1361d5d092325af0b409cc757ff94febc1a3d9d6b11e06c8b2489b251fae80aa + md5: 69c7d0626fcdfffab7d85ad3123f29e2 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h563529e_6_cpu - - libarrow-acero 22.0.0 h2db2d7d_6_cpu - - libarrow-dataset 22.0.0 h2db2d7d_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 h805b2f2_20_cpu + - libarrow-acero 22.0.0 h1d24c07_20_cpu + - libarrow-dataset 22.0.0 h1d24c07_20_cpu - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 452871 - timestamp: 1765852913291 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h144af7f_6_cpu.conda - build_number: 6 - sha256: f2181c286af7d0d4cf381976f100daf1ac84b9661975130adce4ce7a03025696 - md5: 58a5b39bc7d23fa938affe1bfc43c241 + size: 479367 + timestamp: 1774268586244 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libarrow-substrait-22.0.0-h8746646_20_cpu.conda + build_number: 20 + sha256: 33fb875cfde7d17c4f297ca651ac3c722d83f12ab10506ef1ea05de3d2dbe7a7 + md5: efdf96d912047ea5d0d577b73877a5b2 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 he6e817a_6_cpu - - libarrow-acero 22.0.0 hc317990_6_cpu - - libarrow-dataset 22.0.0 hc317990_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hf9aa2c5_20_cpu + - libarrow-acero 22.0.0 h4bbd9f8_20_cpu + - libarrow-dataset 22.0.0 h4bbd9f8_20_cpu - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 458819 - timestamp: 1765383438751 -- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-hf865cc0_6_cpu.conda - build_number: 6 - sha256: 393a9bedc2424ea2335364de0be0de69f6dbcc456c893b70a9776975acd749d0 - md5: 01d0606bf4202d358a71545759223202 + size: 482419 + timestamp: 1774265418762 +- conda: https://conda.anaconda.org/conda-forge/win-64/libarrow-substrait-22.0.0-h524e9bd_20_cpu.conda + build_number: 20 + sha256: c3ceb7a7eca05bef852337fe371830d2ebefe06d96ff2cfd17387672a1eb3b1c + md5: 667918de3c43cd347424504474911009 depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h89d7da9_6_cpu - - libarrow-acero 22.0.0 h7d8d6a5_6_cpu - - libarrow-dataset 22.0.0 h7d8d6a5_6_cpu - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hc74aee5_20_cpu + - libarrow-acero 22.0.0 h7d8d6a5_20_cpu + - libarrow-dataset 22.0.0 h7d8d6a5_20_cpu + - libprotobuf >=6.33.5,<6.33.6.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 364040 - timestamp: 1765382475732 + size: 390123 + timestamp: 1774268303655 - conda: https://conda.anaconda.org/conda-forge/linux-64/libavif16-1.3.0-h6395336_2.conda sha256: e3a44c0eda23aa15c9a8dfa8c82ecf5c8b073e68a16c29edd0e409e687056d30 md5: c09c4ac973f7992ba0c6bb1aafd77bd4 @@ -13018,22 +13138,9 @@ packages: purls: [] size: 68079 timestamp: 1765819124349 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp21.1-21.1.8-default_h99862b1_1.conda - sha256: fd494cb13a139067a00dab2a641347c692abc149bcae6872502640b14e12dc4d - md5: e933f92cedca212eb2916f24823cf90b - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libllvm21 >=21.1.8,<21.2.0a0 - - libstdcxx >=14 - license: Apache-2.0 WITH LLVM-exception - license_family: Apache - purls: [] - size: 21054217 - timestamp: 1767834505759 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-21.1.8-default_h746c552_1.conda - sha256: 4507075f64c65b45b049e5b19842186d25c99af4b4922910f231776e46d33799 - md5: e00afd65b88a3258212661b32c1469cb +- conda: https://conda.anaconda.org/conda-forge/linux-64/libclang13-21.1.8-default_h746c552_1.conda + sha256: 4507075f64c65b45b049e5b19842186d25c99af4b4922910f231776e46d33799 + md5: e00afd65b88a3258212661b32c1469cb depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -13100,74 +13207,74 @@ packages: purls: [] size: 25694 timestamp: 1633684287072 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-hb8b1518_5.conda - sha256: cb83980c57e311783ee831832eb2c20ecb41e7dee6e86e8b70b8cef0e43eab55 - md5: d4a250da4737ee127fb1fa6452a9002e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h7a8fb5f_6.conda + sha256: 205c4f19550f3647832ec44e35e6d93c8c206782bdd620c1d7cf66237580ff9c + md5: 49c553b47ff679a6a1e9fc80b9c5a2d4 depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 4523621 - timestamp: 1749905341688 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.18.0-h4e3cde8_0.conda - sha256: 5454709d9fb6e9c3dd6423bc284fa7835a7823bfa8323f6e8786cdd555101fab - md5: 0a5563efed19ca4461cf927419b6eb73 + size: 4518030 + timestamp: 1770902209173 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.19.0-hcf29cc6_0.conda + sha256: a0390fd0536ebcd2244e243f5f00ab8e76ab62ed9aa214cd54470fe7496620f4 + md5: d50608c443a30c341c24277d28290f76 depends: - __glibc >=2.17,<3.0.a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - libnghttp2 >=1.67.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 462942 - timestamp: 1767821743793 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.18.0-h9348e2b_0.conda - sha256: 1a0af3b7929af3c5893ebf50161978f54ae0256abb9532d4efba2735a0688325 - md5: de1910529f64ba4a9ac9005e0be78601 + size: 466704 + timestamp: 1773218522665 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libcurl-8.19.0-h8f0b9e4_0.conda + sha256: 55c6b34ae18a7f8f57d9ffe3f4ec2a82ddcc8a87248d2447f9bbba3ba66d8aec + md5: 8bc2742696d50c358f4565b25ba33b08 depends: - - __osx >=10.13 - - krb5 >=1.21.3,<1.22.0a0 + - __osx >=11.0 + - krb5 >=1.22.2,<1.23.0a0 - libnghttp2 >=1.67.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 419089 - timestamp: 1767822218800 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.18.0-he38603e_0.conda - sha256: 11c78b3e89bc332933386f0a11ac60d9200afb7a811b9e3bec98aef8d4a6389b - md5: 36190179a799f3aee3c2d20a8a2b970d + size: 419039 + timestamp: 1773219507657 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcurl-8.19.0-hd5a2499_0.conda + sha256: c4d581b067fa60f9dc0e1c5f18b756760ff094a03139e6b206eb98d185ae2bb1 + md5: 9fc7771fc8104abed9119113160be15a depends: - __osx >=11.0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libnghttp2 >=1.67.0,<2.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: curl license_family: MIT purls: [] - size: 402681 - timestamp: 1767822693908 -- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.18.0-h43ecb02_0.conda - sha256: 86258e30845571ea13855e8a0605275905781476f3edf8ae5df90a06fcada93a - md5: 2688214a9bee5d5650cd4f5f6af5c8f2 + size: 399616 + timestamp: 1773219210246 +- conda: https://conda.anaconda.org/conda-forge/win-64/libcurl-8.19.0-h8206538_0.conda + sha256: 6b2143ba5454b399dab4471e9e1d07352a2f33b569975e6b8aedc2d9bf51cbb0 + md5: ed181e29a7ebf0f60b84b98d6140a340 depends: - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libssh2 >=1.11.1,<2.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 @@ -13176,8 +13283,8 @@ packages: license: curl license_family: MIT purls: [] - size: 383261 - timestamp: 1767821977053 + size: 392543 + timestamp: 1773218585056 - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-21.1.8-h3d58e20_0.conda sha256: cbd8e821e97436d8fc126c24b50df838b05ba4c80494fbb93ccaf2e3b2d109fb md5: 9f8a60a77ecafb7966ca961c94f33bd1 @@ -13300,6 +13407,18 @@ packages: purls: [] size: 44840 timestamp: 1731330973553 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libegl-devel-1.7.0-ha4b6fd6_2.conda + sha256: f6e7095260305dc05238062142fb8db4b940346329b5b54894a90610afa6749f + md5: b513eb83b3137eca1192c34bf4f013a7 + depends: + - __glibc >=2.17,<3.0.a0 + - libegl 1.7.0 ha4b6fd6_2 + - libgl-devel 1.7.0 ha4b6fd6_2 + - xorg-libx11 + license: LicenseRef-libglvnd + purls: [] + size: 30380 + timestamp: 1731331017249 - conda: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 md5: 172bf1cd1ff8629f2b1179945ed45055 @@ -13370,19 +13489,19 @@ packages: purls: [] size: 410555 timestamp: 1685726568668 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.3-hecca717_0.conda - sha256: 1e1b08f6211629cbc2efe7a5bca5953f8f6b3cae0eeb04ca4dacee1bd4e2db2f - md5: 8b09ae86839581147ef2e5c5e229d164 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.5-hecca717_0.conda + sha256: e8c2b57f6aacabdf2f1b0924bd4831ce5071ba080baa4a9e8c0d720588b6794c + md5: 49f570f3bc4c874a06ea69b7225753af depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 constrains: - - expat 2.7.3.* + - expat 2.7.5.* license: MIT license_family: MIT purls: [] - size: 76643 - timestamp: 1763549731408 + size: 76624 + timestamp: 1774719175983 - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.7.3-heffb93a_0.conda sha256: d11b3a6ce5b2e832f430fd112084533a01220597221bee16d6c7dc3947dffba6 md5: 222e0732a1d0780a622926265bee14ef @@ -13464,15 +13583,15 @@ packages: purls: [] size: 44866 timestamp: 1760295760649 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.1-ha770c72_0.conda - sha256: 4641d37faeb97cf8a121efafd6afd040904d4bca8c46798122f417c31d5dfbec - md5: f4084e4e6577797150f9b04a4560ceb0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype-2.14.3-ha770c72_0.conda + sha256: 38f014a7129e644636e46064ecd6b1945e729c2140e21d75bb476af39e692db2 + md5: e289f3d17880e44b633ba911d57a321b depends: - - libfreetype6 >=2.14.1 + - libfreetype6 >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 7664 - timestamp: 1757945417134 + size: 8049 + timestamp: 1774298163029 - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype-2.14.1-h694c41f_0.conda sha256: 035e23ef87759a245d51890aedba0b494a26636784910c3730d76f3dc4482b1d md5: e0e2edaf5e0c71b843e25a7ecc451cc9 @@ -13500,20 +13619,20 @@ packages: purls: [] size: 8109 timestamp: 1757946135015 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.1-h73754d4_0.conda - sha256: 4a7af818a3179fafb6c91111752954e29d3a2a950259c14a2fc7ba40a8b03652 - md5: 8e7251989bca326a28f4a5ffbd74557a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libfreetype6-2.14.3-h73754d4_0.conda + sha256: 16f020f96da79db1863fcdd8f2b8f4f7d52f177dd4c58601e38e9182e91adf1d + md5: fb16b4b69e3f1dcfe79d80db8fd0c55d depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libpng >=1.6.50,<1.7.0a0 - - libzlib >=1.3.1,<2.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libzlib >=1.3.2,<2.0a0 constrains: - - freetype >=2.14.1 + - freetype >=2.14.3 license: GPL-2.0-only OR FTL purls: [] - size: 386739 - timestamp: 1757945416744 + size: 384575 + timestamp: 1774298162622 - conda: https://conda.anaconda.org/conda-forge/osx-64/libfreetype6-2.14.1-h6912278_0.conda sha256: f5f28092e368efc773bcd1c381d123f8b211528385a9353e36f8808d00d11655 md5: dfbdc8fd781dc3111541e4234c19fdbd @@ -13878,9 +13997,20 @@ packages: purls: [] size: 134712 timestamp: 1731330998354 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.3-h6548e54_0.conda - sha256: 82d6c2ee9f548c84220fb30fb1b231c64a53561d6e485447394f0a0eeeffe0e6 - md5: 034bea55a4feef51c98e8449938e9cee +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgl-devel-1.7.0-ha4b6fd6_2.conda + sha256: e281356c0975751f478c53e14f3efea6cd1e23c3069406d10708d6c409525260 + md5: 53e7cbb2beb03d69a478631e23e340e9 + depends: + - __glibc >=2.17,<3.0.a0 + - libgl 1.7.0 ha4b6fd6_2 + - libglx-devel 1.7.0 ha4b6fd6_2 + license: LicenseRef-libglvnd + purls: [] + size: 113911 + timestamp: 1731331012126 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.4-h6548e54_1.conda + sha256: a27e44168a1240b15659888ce0d9b938ed4bdb49e9ea68a7c1ff27bcea8b55ce + md5: bb26456332b07f68bf3b7622ed71c0da depends: - __glibc >=2.17,<3.0.a0 - libffi >=3.5.2,<3.6.0a0 @@ -13889,14 +14019,14 @@ packages: - libzlib >=1.3.1,<2.0a0 - pcre2 >=10.47,<10.48.0a0 constrains: - - glib 2.86.3 *_0 + - glib 2.86.4 *_1 license: LGPL-2.1-or-later purls: [] - size: 3946542 - timestamp: 1765221858705 -- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.3-h0c9aed9_0.conda - sha256: 84b74fc81fff745f3d21a26c317ace44269a563a42ead3500034c27e407e1021 - md5: c2d5b6b790ef21abac0b5331094ccb56 + size: 4398701 + timestamp: 1771863239578 +- conda: https://conda.anaconda.org/conda-forge/win-64/libglib-2.86.4-h0c9aed9_1.conda + sha256: f035fb25f8858f201e0055c719ef91022e9465cd51fe803304b781863286fb10 + md5: 0329a7e92c8c8b61fcaaf7ad44642a96 depends: - libffi >=3.5.2,<3.6.0a0 - libiconv >=1.18,<2.0a0 @@ -13907,11 +14037,11 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - glib 2.86.3 *_0 + - glib 2.86.4 *_1 license: LGPL-2.1-or-later purls: [] - size: 3818991 - timestamp: 1765222145992 + size: 4095369 + timestamp: 1771863229701 - conda: https://conda.anaconda.org/conda-forge/linux-64/libglvnd-1.7.0-ha4b6fd6_2.conda sha256: 1175f8a7a0c68b7f81962699751bb6574e6f07db4c9f72825f978e3016f46850 md5: 434ca7e50e40f4918ab701e3facd59a0 @@ -13932,6 +14062,18 @@ packages: purls: [] size: 75504 timestamp: 1731330988898 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libglx-devel-1.7.0-ha4b6fd6_2.conda + sha256: 0a930e0148ab6e61089bbcdba25a2e17ee383e7de82e7af10cc5c12c82c580f3 + md5: 27ac5ae872a21375d980bd4a6f99edf3 + depends: + - __glibc >=2.17,<3.0.a0 + - libglx 1.7.0 ha4b6fd6_2 + - xorg-libx11 >=1.8.10,<2.0a0 + - xorg-xorgproto + license: LicenseRef-libglvnd + purls: [] + size: 26388 + timestamp: 1731331003255 - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-he0feb66_16.conda sha256: 5b3e5e4e9270ecfcd48f47e3a68f037f5ab0f529ccb223e8e5d5ac75a58fc687 md5: 26c46f90d0e727e95c6c9498a33a09f3 @@ -13954,238 +14096,242 @@ packages: purls: [] size: 663567 timestamp: 1765260367147 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.39.0-hdb79228_0.conda - sha256: d3341cf69cb02c07bbd1837968f993da01b7bd467e816b1559a3ca26c1ff14c5 - md5: a2e30ccd49f753fd30de0d30b1569789 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-3.3.0-h25dbb67_1.conda + sha256: 17ea802cef3942b0a850b8e33b03fc575f79734f3c829cdd6a4e56e2dae60791 + md5: b2baa4ce6a9d9472aaa602b88f8d40ac depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 - libgcc >=14 - - libgrpc >=1.73.1,<1.74.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libstdcxx >=14 - - openssl >=3.5.1,<4.0a0 + - openssl >=3.5.5,<4.0a0 constrains: - - libgoogle-cloud 2.39.0 *_0 + - libgoogle-cloud 3.3.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 1307909 - timestamp: 1752048413383 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-2.39.0-hed66dea_0.conda - sha256: 9b50362bafd60c4a3eb6c37e6dbf7e200562dab7ae1b282b1ebd633d4d77d4bd - md5: 06564befaabd2760dfa742e47074bad2 + size: 2558266 + timestamp: 1774212240265 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-3.3.0-h10ed7cb_1.conda + sha256: f1cbb2d47411d8a53b1e1f317fc36218faf741fefd01a17fc00522765d658e00 + md5: b17f4b2c7ae59e9c60ea906da04bc54a depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - - libgrpc >=1.73.1,<1.74.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - openssl >=3.5.1,<4.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.5,<4.0a0 constrains: - - libgoogle-cloud 2.39.0 *_0 + - libgoogle-cloud 3.3.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 899629 - timestamp: 1752048034356 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-2.39.0-head0a95_0.conda - sha256: 209facdb8ea5b68163f146525720768fa3191cef86c82b2538e8c3cafa1e9dd4 - md5: ad7272a081abe0966d0297691154eda5 + size: 1803918 + timestamp: 1774214391428 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-3.3.0-he41eb1d_1.conda + sha256: 632d23ea1c00b2f439d8846d4925646dafa6c0380ecc3353d8a9afa878829539 + md5: b4e0ec13e232efea554bb5155dc1ef32 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - - libgrpc >=1.73.1,<1.74.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - openssl >=3.5.1,<4.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - openssl >=3.5.5,<4.0a0 constrains: - - libgoogle-cloud 2.39.0 *_0 + - libgoogle-cloud 3.3.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 876283 - timestamp: 1752047598741 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-2.39.0-h19ee442_0.conda - sha256: 8f5b26e9ea985c819a67e41664da82219534f9b9c8ba190f7d3c440361e5accb - md5: c2c512f98c5c666782779439356a1713 + size: 1773417 + timestamp: 1774214139261 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-3.3.0-h2b231ac_1.conda + sha256: 922c3bb6cab8bc8a6f1ffc645a3357d81fb6e73df67e34da4b9106957147ca18 + md5: ff5955f74e7a90ff59b0c6b15f5f63d8 depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 - - libgrpc >=1.73.1,<1.74.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.1,<1.79.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - libgoogle-cloud 2.39.0 *_0 + - libgoogle-cloud 3.3.0 *_1 license: Apache-2.0 license_family: Apache purls: [] - size: 14952 - timestamp: 1752049549178 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.39.0-hdbdcf42_0.conda - sha256: 59eb8365f0aee384f2f3b2a64dcd454f1a43093311aa5f21a8bb4bd3c79a6db8 - md5: bd21962ff8a9d1ce4720d42a35a4af40 + size: 17141 + timestamp: 1774217556612 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-3.3.0-hdbdcf42_1.conda + sha256: 838b6798962039e7f1ed97be85c3a36ceacfd4611bdf76e7cc0b6cd8741edf57 + md5: da94b149c8eea6ceef10d9e408dcfeb3 depends: - __glibc >=2.17,<3.0.a0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libgcc >=14 - - libgoogle-cloud 2.39.0 hdb79228_0 + - libgoogle-cloud 3.3.0 h25dbb67_1 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] - size: 804189 - timestamp: 1752048589800 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-2.39.0-h8ac052b_0.conda - sha256: fe790fc9ed8ffa468d27e886735fe11844369caee406d98f1da2c0d8aed0401e - md5: 7600fb1377c8eb5a161e4a2520933daa + size: 779217 + timestamp: 1774212426084 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgoogle-cloud-storage-3.3.0-hea209c6_1.conda + sha256: 94c0e4cff0a6369df29b3a20f1d4fdb4d981e73e682a0cade6b6e847d9dc8f7d + md5: d1a3742cd1f9bc2e4f7395b446f49b96 depends: - __osx >=11.0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libcxx >=19 - - libgoogle-cloud 2.39.0 hed66dea_0 - - libzlib >=1.3.1,<2.0a0 + - libgoogle-cloud 3.3.0 h10ed7cb_1 + - libzlib >=1.3.2,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] - size: 543323 - timestamp: 1752048443047 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-2.39.0-hfa3a374_0.conda - sha256: a5160c23b8b231b88d0ff738c7f52b0ee703c4c0517b044b18f4d176e729dfd8 - md5: 147a468b9b6c3ced1fccd69b864ae289 + size: 540742 + timestamp: 1774214836989 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgoogle-cloud-storage-3.3.0-ha114238_1.conda + sha256: 024e3e099a478b3b89e0dee32348a55c6a1237fe66aa730172ae642f63ffc093 + md5: 7fb98178c58d71ba046a451968d8579f depends: - __osx >=11.0 - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - libcxx >=19 - - libgoogle-cloud 2.39.0 head0a95_0 - - libzlib >=1.3.1,<2.0a0 + - libgoogle-cloud 3.3.0 he41eb1d_1 + - libzlib >=1.3.2,<2.0a0 - openssl license: Apache-2.0 license_family: Apache purls: [] - size: 525153 - timestamp: 1752047915306 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-2.39.0-he04ea4c_0.conda - sha256: 51c29942d9bb856081605352ac74c45cad4fedbaac89de07c74efb69a3be9ab3 - md5: 26198e3dc20bbcbea8dd6fa5ab7ea1e0 + size: 523970 + timestamp: 1774214725148 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgoogle-cloud-storage-3.3.0-he04ea4c_1.conda + sha256: 70ccc4b8e2319156afba27ad72e14868102bcd7af43841824e1ca40439020a44 + md5: 9c487cf981c6d9cdfb718daebc35fcdf depends: - libabseil - libcrc32c >=1.1.2,<1.2.0a0 - libcurl - - libgoogle-cloud 2.39.0 h19ee442_0 - - libzlib >=1.3.1,<2.0a0 + - libgoogle-cloud 3.3.0 h2b231ac_1 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: Apache purls: [] - size: 14904 - timestamp: 1752049852815 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.73.1-h3288cfb_1.conda - sha256: bc9d32af6167b1f5bcda216dc44eddcb27f3492440571ab12f6e577472a05e34 - md5: ff63bb12ac31c176ff257e3289f20770 + size: 17112 + timestamp: 1774217996193 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.78.1-h1d1128b_0.conda + sha256: 5bb935188999fd70f67996746fd2dca85ec6204289e11695c316772e19451eb8 + md5: b5fb6d6c83f63d83ef2721dca6ff7091 depends: - __glibc >=2.17,<3.0.a0 - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libgcc >=14 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - re2 constrains: - - grpc-cpp =1.73.1 + - grpc-cpp =1.78.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 8349777 - timestamp: 1761058442526 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.73.1-h451496d_1.conda - sha256: 30378f4c9055224fecd1da8b9a65e2c0293cde68edca0f8a306fd9e92fd6ee1f - md5: d6ea2acfae86b523b54938c6bc30e378 + size: 7021360 + timestamp: 1774020290672 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libgrpc-1.78.1-h147dede_0.conda + sha256: ecf98c41dbde09fb3bf6878d7099613c10e256223ec7ccdb5eb401948eadc558 + md5: 69524227096cee1a8af2f4693cf6afa2 depends: - __osx >=11.0 - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - re2 constrains: - - grpc-cpp =1.73.1 + - grpc-cpp =1.78.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 5468625 - timestamp: 1761060387315 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.73.1-h3063b79_1.conda - sha256: c2099872b1aa06bf8153e35e5b706d2000c1fc16f4dde2735ccd77a0643a4683 - md5: f5856b3b9dae4463348a7ec23c1301f2 + size: 5153859 + timestamp: 1774015913341 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libgrpc-1.78.1-h3e3f78d_0.conda + sha256: a6e01573795484c2200e499ddffb825d24184888be6a596d4beaceebe6f8f525 + md5: 17b9e07ba9b46754a6953999a948dcf7 depends: - __osx >=11.0 - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.1,<20260108.0a0 - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - re2 constrains: - - grpc-cpp =1.73.1 + - grpc-cpp =1.78.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 5377798 - timestamp: 1761053602943 -- conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.73.1-h317e13b_1.conda - sha256: 95a83e98c35b8ec03d84f0714eefb2630078d9224360a93dbef6f2403414f76f - md5: 855b10d858d6c078a28d670cf32baa67 + size: 4820402 + timestamp: 1774012715207 +- conda: https://conda.anaconda.org/conda-forge/win-64/libgrpc-1.78.1-h9ff2b3e_0.conda + sha256: e5667a557c6211db4e1de0bf3146b880977cd7447dce5e5f5cb7d9e3dc9afa70 + md5: 26dbb65607f8fe485df5ee98fa6eb79f depends: - - c-ares >=1.34.5,<2.0a0 + - c-ares >=1.34.6,<2.0a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libre2-11 >=2025.8.12 + - libabseil >=20260107.1,<20260108.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libre2-11 >=2025.11.5 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - re2 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - grpc-cpp =1.73.1 + - grpc-cpp =1.78.1 license: Apache-2.0 license_family: APACHE purls: [] - size: 14433486 - timestamp: 1761053760632 + size: 11546515 + timestamp: 1774013326223 - conda: https://conda.anaconda.org/conda-forge/win-64/libhwloc-2.12.2-default_h4379cf1_1000.conda sha256: 8cdf11333a81085468d9aa536ebb155abd74adc293576f6013fc0c85a7a90da3 md5: 3b576f6860f838f950c570f4433b086e @@ -14291,9 +14437,9 @@ packages: purls: [] size: 95568 timestamp: 1723629479451 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.2-hb03c661_0.conda - sha256: cc9aba923eea0af8e30e0f94f2ad7156e2984d80d1e8e7fe6be5a1f257f0eb32 - md5: 8397539e3a0bbd1695584fb4f927485a +- conda: https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.1.4.1-hb03c661_0.conda + sha256: 10056646c28115b174de81a44e23e3a0a3b95b5347d2e6c45cc6d49d35294256 + md5: 6178c6f2fb254558238ef4e6c56fb782 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 @@ -14301,8 +14447,8 @@ packages: - jpeg <0.0.0a license: IJG AND BSD-3-Clause AND Zlib purls: [] - size: 633710 - timestamp: 1762094827865 + size: 633831 + timestamp: 1775962768273 - conda: https://conda.anaconda.org/conda-forge/osx-64/libjpeg-turbo-3.1.2-h8616949_0.conda sha256: ebe2877abc046688d6ea299e80d8322d10c69763f13a102010f90f7168cc5f54 md5: 48dda187f169f5a8f1e5e07701d5cdd9 @@ -14620,104 +14766,99 @@ packages: purls: [] size: 88657 timestamp: 1723861474602 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.3-nompi_h11f7409_103.conda - sha256: e9a8668212719a91a6b0348db05188dfc59de5a21888db13ff8510918a67b258 - md5: 3ccff1066c05a1e6c221356eecc40581 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.10.0-nompi_h3c9b436_104.conda + sha256: 6a1dbee34abe246c32abb89bd35855c25551de09562a719da97c4e5975f5f035 + md5: 6d38346d49e4638ec98649121d295d54 depends: - __glibc >=2.17,<3.0.a0 - - attr >=2.5.2,<2.6.0a0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - - hdf5 >=1.14.6,<1.14.7.0a0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.14.1,<9.0a0 + - hdf5 >=2.1.0,<3.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libgcc >=14 - libstdcxx >=14 - libxml2 - libxml2-16 >=2.14.6 - libzip >=1.11.2,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - - zlib + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] - size: 871447 - timestamp: 1757977084313 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.9.3-nompi_habf9e57_103.conda - sha256: 6e8bd953ce27e10d0c029badbe3a60510f6724b59ed63d79dd8fdd1a795719ea - md5: 0c48ab0a8d7c3af9f592d33c3d99f7d6 + size: 861080 + timestamp: 1776686233788 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libnetcdf-4.10.0-nompi_h7d224f4_104.conda + sha256: a44f7e91c740eac35e507eb8bb3b1b1edbf37eb498a2400b8165828175ca31fb + md5: af3769ed0f203a56e5775c113b446cd8 depends: - - __osx >=10.13 + - __osx >=11.0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - - hdf5 >=1.14.6,<1.14.7.0a0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.14.1,<9.0a0 + - hdf5 >=2.1.0,<3.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - libxml2 - libxml2-16 >=2.14.6 - libzip >=1.11.2,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - - zlib + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] - size: 728471 - timestamp: 1757977549393 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.9.3-nompi_h80c4520_103.conda - sha256: 60b5eff8d2347b20d7c435ba9b8e724bafb3ea9cc21da99b4339c6458dc48328 - md5: 926f5ea75a8e4ad5e8c026c07eab75ba + size: 727353 + timestamp: 1776686983748 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnetcdf-4.10.0-nompi_h28ce51b_104.conda + sha256: 7156ff14abb062f30f0736990f70a34bfe145ee67994aa6dce37cfdab5182adc + md5: 8e9bde85f3327812324b652e7577b17d depends: - __osx >=11.0 - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - - hdf5 >=1.14.6,<1.14.7.0a0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.14.1,<9.0a0 + - hdf5 >=2.1.0,<3.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libcxx >=19 - libxml2 - libxml2-16 >=2.14.6 - libzip >=1.11.2,<2.0a0 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.2,<4.0a0 - - zlib + - libzlib >=1.3.2,<2.0a0 + - openssl >=3.5.6,<4.0a0 - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] - size: 685237 - timestamp: 1757977534772 -- conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.9.3-nompi_h7d90bef_103.conda - sha256: 675b55d2b9d5ad2d2fb8c1c2cc06b65c48b958d1faf7b8116a6bc352696ef8f0 - md5: 0c157867805749ddbf608766f1350e11 + size: 681162 + timestamp: 1776687223384 +- conda: https://conda.anaconda.org/conda-forge/win-64/libnetcdf-4.10.0-nompi_hf1713fe_104.conda + sha256: 9c9cc620a21135cc1717f6f7ecd90938ff294225df91fecac68e65332c4b2f3e + md5: 3cef0c88f7e07cbe39382561a1bc23a2 depends: - blosc >=1.21.6,<2.0a0 - bzip2 >=1.0.8,<2.0a0 - hdf4 >=4.2.15,<4.2.16.0a0 - - hdf5 >=1.14.6,<1.14.7.0a0 - - libaec >=1.1.4,<2.0a0 - - libcurl >=8.14.1,<9.0a0 + - hdf5 >=2.1.0,<3.0a0 + - libaec >=1.1.5,<2.0a0 + - libcurl >=8.19.0,<9.0a0 - libxml2 - libxml2-16 >=2.14.6 - libzip >=1.11.2,<2.0a0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - - zlib - zstd >=1.5.7,<1.6.0a0 license: MIT license_family: MIT purls: [] - size: 678411 - timestamp: 1757977349918 + size: 663239 + timestamp: 1776686494614 - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda sha256: a4a7dab8db4dc81c736e9a9b42bdfd97b087816e029e221380511960ac46c690 md5: b499ce4b026493a13774bcf0f4c33849 @@ -14843,160 +14984,188 @@ packages: purls: [] size: 50757 timestamp: 1731330993524 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.21.0-hb9b0907_1.conda - sha256: ba9b09066f9abae9b4c98ffedef444bbbf4c068a094f6c77d70ef6f006574563 - md5: 1c0320794855f457dea27d35c4c71e23 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-1.26.0-h9692893_0.conda + sha256: 5126b75e7733de31e261aa275c0a1fd38b25fdfff23e7d7056ebd6ca76d11532 + md5: c360be6f9e0947b64427603e91f9651f depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 - - libgrpc >=1.73.1,<1.74.0a0 - - libopentelemetry-cpp-headers 1.21.0 ha770c72_1 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 ha770c72_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libzlib >=1.3.1,<2.0a0 - nlohmann_json - prometheus-cpp >=1.3.0,<1.4.0a0 constrains: - - cpp-opentelemetry-sdk =1.21.0 + - cpp-opentelemetry-sdk =1.26.0 license: Apache-2.0 license_family: APACHE purls: [] - size: 885397 - timestamp: 1751782709380 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.21.0-h7d3f41d_1.conda - sha256: 94df4129f94dbb17998a60bff0b53c700e6124a6cb67f3047fe7059ebaa7d357 - md5: 952dd64cff4a72cadf5e81572a7a81c8 + size: 934274 + timestamp: 1774001192674 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-1.26.0-h7a0a166_0.conda + sha256: 6da1b908f427d66ca4a062df2026059229bdbdf5264c4095eec1e64f9351c837 + md5: 93aab3ab901b5b57d8d5d72308ead951 depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 - - libgrpc >=1.73.1,<1.74.0a0 - - libopentelemetry-cpp-headers 1.21.0 h694c41f_1 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 h694c41f_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libzlib >=1.3.1,<2.0a0 - nlohmann_json - prometheus-cpp >=1.3.0,<1.4.0a0 constrains: - - cpp-opentelemetry-sdk =1.21.0 + - cpp-opentelemetry-sdk =1.26.0 license: Apache-2.0 license_family: APACHE purls: [] - size: 585875 - timestamp: 1751782877386 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.21.0-he15edb5_1.conda - sha256: 4bf8f703ddd140fe54d4c8464ac96b28520fbc1083cce52c136a85a854745d5c - md5: cbcea547d6d831863ab0a4e164099062 + size: 602246 + timestamp: 1774001890965 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-1.26.0-h08d5cc3_0.conda + sha256: 47ce35cc7b903d546cc8ac0a09abfab7aea955147dc18bb2c9eaa5dc7c378a37 + md5: 8cb49289db7cfec1dea3bf7e0e4f0c8d depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libcurl >=8.14.1,<9.0a0 - - libgrpc >=1.73.1,<1.74.0a0 - - libopentelemetry-cpp-headers 1.21.0 hce30654_1 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 hce30654_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 + - nlohmann_json + - prometheus-cpp >=1.3.0,<1.4.0a0 + constrains: + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 579527 + timestamp: 1774001294901 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-1.26.0-hc88f397_0.conda + sha256: 6dcfa1bca059be36b0991ae0ac77dfb8fd681da64204f7665efcfc818a366140 + md5: 8067042d713b975596c7e033841e1580 + depends: + - libabseil * cxx17* + - libabseil >=20260107.1,<20260108.0a0 + - libcurl >=8.19.0,<9.0a0 + - libgrpc >=1.78.0,<1.79.0a0 + - libopentelemetry-cpp-headers 1.26.0 h57928b3_0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libzlib >=1.3.1,<2.0a0 - nlohmann_json - prometheus-cpp >=1.3.0,<1.4.0a0 constrains: - - cpp-opentelemetry-sdk =1.21.0 + - cpp-opentelemetry-sdk =1.26.0 + license: Apache-2.0 + license_family: APACHE + purls: [] + size: 3881744 + timestamp: 1774001818145 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.26.0-ha770c72_0.conda + sha256: fec2ba047f7000c213ca7ace5452435197c79fbcb1690da7ce85e99312245984 + md5: cb93c6e226a7bed5557601846555153d license: Apache-2.0 license_family: APACHE purls: [] - size: 564609 - timestamp: 1751782939921 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libopentelemetry-cpp-headers-1.21.0-ha770c72_1.conda - sha256: b3a1b36d5f92fbbfd7b6426982a99561bdbd7e4adbafca1b7f127c9a5ab0a60f - md5: 9e298d76f543deb06eb0f3413675e13a + size: 396403 + timestamp: 1774001149705 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.26.0-h694c41f_0.conda + sha256: 039ced2fa6d5fc5d23d06e2764709f0db9af5fbaef486309d47bec0895eddfa6 + md5: 6ed6a92518104721c0e37c032dd9769e license: Apache-2.0 license_family: APACHE purls: [] - size: 363444 - timestamp: 1751782679053 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libopentelemetry-cpp-headers-1.21.0-h694c41f_1.conda - sha256: 5b43ec55305a6fabd8eb37cee06bc3260d3641f260435194837d0b64faa0b355 - md5: 62636543478d53b28c1fc5efce346622 + size: 395724 + timestamp: 1774001742305 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.26.0-hce30654_0.conda + sha256: 17f18bab128650598d2f09ae653ab406b9f049e0692b4519a2cf09a6f1603ee9 + md5: efdb13315f1041c7750214a20c1ab162 license: Apache-2.0 license_family: APACHE purls: [] - size: 362175 - timestamp: 1751782820895 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libopentelemetry-cpp-headers-1.21.0-hce30654_1.conda - sha256: ce74278453dec1e3c11158ec368c8f1b03862e279b63f79ed01f38567a1174e6 - md5: c7df4b2d612208f3a27486c113b6aefc + size: 396412 + timestamp: 1774001222028 +- conda: https://conda.anaconda.org/conda-forge/win-64/libopentelemetry-cpp-headers-1.26.0-h57928b3_0.conda + sha256: 3c91ca766deae1a33280cd5f01959487d0b7a7ec046725e17be75e0383013335 + md5: 17bebbaf295fd21280269f7c92d2715f license: Apache-2.0 license_family: APACHE purls: [] - size: 363213 - timestamp: 1751782889359 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_6_cpu.conda - build_number: 6 - sha256: c6cc2a73091e5c460c3cbd606927d5ed85d3706e19459073e1ea023d1e754d13 - md5: 83fd8f55f38ac972947c9eca12dc4657 + size: 436562 + timestamp: 1774001693139 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libparquet-22.0.0-h7376487_20_cpu.conda + build_number: 20 + sha256: b3fc3029b38c7ccab469b7dadcae92d5d64bf6e7559e9b1c09f1666e8ecf6496 + md5: 115b3a16130e053f182c7e67092956e3 depends: - __glibc >=2.17,<3.0.a0 - - libarrow 22.0.0 hb6ed5f4_6_cpu + - libarrow 22.0.0 ha7f89c6_20_cpu - libgcc >=14 - libstdcxx >=14 - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 1350396 - timestamp: 1765381452093 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-habb56ca_6_cpu.conda - build_number: 6 - sha256: 33042e728fe5072a3dc8d3f53c3bf7ccbcb4e31134539799ee9375bff4a52105 - md5: 886dc122316a8511edba3a3c53588916 + size: 1375778 + timestamp: 1774263807783 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libparquet-22.0.0-hfa831cf_20_cpu.conda + build_number: 20 + sha256: 00777fd2ee17508b6a615b696b7190adc37ea7473bf27717e990e4378afbb824 + md5: 0d095cf1d412f54c5ce64307614d885d depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 h563529e_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 h805b2f2_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 1079312 - timestamp: 1765852540125 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h0ac143b_6_cpu.conda - build_number: 6 - sha256: 329c6cd1fbeef6e91f8bc7a2e8bd28c50b72bc42e0a028d990e2281966f57ef5 - md5: 4939c8e3ca5f98f229be9f318df740e2 + size: 1103010 + timestamp: 1774267814058 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libparquet-22.0.0-h8e9781e_20_cpu.conda + build_number: 20 + sha256: 34d0a9c05fb1b7b35c7f4319e029633eb42d4350c8631f2a1e5bee43d542fe99 + md5: 6d2ff47d6d655d463862fa001e270d46 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 - - libarrow 22.0.0 he6e817a_6_cpu + - libabseil >=20260107.1,<20260108.0a0 + - libarrow 22.0.0 hf9aa2c5_20_cpu - libcxx >=19 - - libopentelemetry-cpp >=1.21.0,<1.22.0a0 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - libopentelemetry-cpp >=1.26.0,<1.27.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: Apache-2.0 license_family: APACHE purls: [] - size: 1048992 - timestamp: 1765382997871 -- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_6_cpu.conda - build_number: 6 - sha256: c30839adc47e3ccd6f717c33632d9b482e83f7e087a24211416246f8f05e9a54 - md5: d840a2b45e737bb768ec4e0d5bf36c90 + size: 1072574 + timestamp: 1774264943018 +- conda: https://conda.anaconda.org/conda-forge/win-64/libparquet-22.0.0-h7051d1f_20_cpu.conda + build_number: 20 + sha256: 6d9b5b16fce31e1dd55aff731698592e66ebecd6eefa17c1d475850bd35edc7a + md5: 28dfbb84b5aa40862bc20611f0061f91 depends: - - libarrow 22.0.0 h89d7da9_6_cpu + - libarrow 22.0.0 hc74aee5_20_cpu - libthrift >=0.22.0,<0.22.1.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: Apache-2.0 license_family: APACHE purls: [] - size: 927228 - timestamp: 1765382245972 + size: 944503 + timestamp: 1774268023136 - conda: https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hb9d3cd8_0.conda sha256: 0bd91de9b447a2991e666f284ae8c722ffb1d84acb594dbd0c031bd656fa32b2 md5: 70e3400cbbfa03e96dcde7fc13e38c7b @@ -15008,17 +15177,17 @@ packages: purls: [] size: 28424 timestamp: 1749901812541 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.53-h421ea60_0.conda - sha256: 8acdeb9a7e3d2630176ba8e947caf6bf4985a5148dec69b801e5eb797856688b - md5: 00d4e66b1f746cb14944cad23fffb405 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.58-h421ea60_0.conda + sha256: 377cfe037f3eeb3b1bf3ad333f724a64d32f315ee1958581fc671891d63d3f89 + md5: eba48a68a1a2b9d3c0d9511548db85db depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 317748 - timestamp: 1764981060755 + size: 317729 + timestamp: 1776315175087 - conda: https://conda.anaconda.org/conda-forge/osx-64/libpng-1.6.53-h380d223_0.conda sha256: 62a861e407bf0d0a2a983d0b0167ed263ae035cae7061976e9994f9963e6c68d md5: 0cdbbd56f660997cfe5d33e516afac2f @@ -15039,81 +15208,81 @@ packages: purls: [] size: 288210 timestamp: 1764981075326 -- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.53-h7351971_0.conda - sha256: e5d061e7bdb2b97227b6955d1aa700a58a5703b5150ab0467cc37de609f277b6 - md5: fb6f43f6f08ca100cb24cff125ab0d9e +- conda: https://conda.anaconda.org/conda-forge/win-64/libpng-1.6.58-h7351971_0.conda + sha256: 218913aeee391460bd0e341b834dbd9c6fa6ae0a4276c0c300266cc99a816a28 + md5: 52f1280563f3b48b5f75414cd2d15dd1 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: zlib-acknowledgement purls: [] - size: 383702 - timestamp: 1764981078732 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.1-hb80d175_3.conda - sha256: 21adefed86a36622dd500d7862cb980c5bdaab6ed3f4930a9b9afceabc7a6d58 - md5: c39da2ad0e7dd600d1eb3146783b057d + size: 385227 + timestamp: 1776315248638 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libpq-18.3-h9abb657_0.conda + sha256: c7e61b86c273ec1ce92c0e087d1a0f3ed3b9485507c6cd35e03bc63de1b6b03f + md5: 405ec206d230d9d37ad7c2636114cbf4 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - icu >=78.2,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 - libgcc >=14 - openldap >=2.6.10,<2.7.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: PostgreSQL purls: [] - size: 2761692 - timestamp: 1766448056465 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.31.1-h49aed37_4.conda - sha256: 0ef142ac31e6fd59b4af89ac800acb6deb3fbd9cc4ccf070c03cc2c784dc7296 - md5: 07479fc04ba3ddd5d9f760ef1635cfa7 + size: 2865686 + timestamp: 1772136328077 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-6.33.5-h2b00c02_0.conda + sha256: afbf195443269ae10a940372c1d37cda749355d2bd96ef9587a962abd87f2429 + md5: 11ac478fa72cf12c214199b8a96523f4 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libgcc >=14 - libstdcxx >=14 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 4372578 - timestamp: 1766316228461 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.31.1-hcc66ac3_4.conda - sha256: 2058eb9748a6e29a1821fea8aeea48e87d73c83be47b0504ac03914fee944d0e - md5: f22705f9ebb3f79832d635c4c2919b15 + size: 3638698 + timestamp: 1769749419271 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libprotobuf-6.33.5-h29d92e8_0.conda + sha256: adb74f4f1b1e13b02683ede915ce3a9fbf414325af8e035546c0498ffef870f6 + md5: d6d60b0a64a711d70ec2fd0105c299f9 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libcxx >=19 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3079808 - timestamp: 1766315644973 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.31.1-h98f38fd_4.conda - sha256: 505d62fb2a487aff594a30f6c419f8e861fb3a47e25e407dae2779ac4a585b18 - md5: 8a6b4281c176f1695ae0015f420e6aa9 + size: 2774545 + timestamp: 1769749167835 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libprotobuf-6.33.5-h4a5acfd_0.conda + sha256: 626852cd50690526c9eac216a9f467edd4cbb01060d0efe41b7def10b54bdb08 + md5: b839e3295b66434f20969c8b940f056a depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libcxx >=19 - libzlib >=1.3.1,<2.0a0 license: BSD-3-Clause license_family: BSD purls: [] - size: 3131502 - timestamp: 1766315339805 -- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.31.1-hdcda5b4_4.conda - sha256: a0f78f254f5833c8ec3ac38caf5dd7d826b5d7496df5aebc4b11baabd741e041 - md5: 2031f591ca8c1289838a4f85ea1c7e74 + size: 2713660 + timestamp: 1769748299578 +- conda: https://conda.anaconda.org/conda-forge/win-64/libprotobuf-6.33.5-h61fc761_0.conda + sha256: 73e2ac7ff32b635b9f6a485dfd5ec1968b7f4bd49f21350e919b2ed8966edaa3 + md5: 69e5855826e56ea4b67fb888ef879afd depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libzlib >=1.3.1,<2.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -15121,15 +15290,15 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 7488966 - timestamp: 1766316540495 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h7b12aa8_0.conda - sha256: eb5d5ef4d12cdf744e0f728b35bca910843c8cf1249f758cf15488ca04a21dbb - md5: a30848ebf39327ea078cf26d114cff53 + size: 7117788 + timestamp: 1769749718218 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2025.11.05-h0dc7533_1.conda + sha256: 138fc85321a8c0731c1715688b38e2be4fb71db349c9ab25f685315095ae70ff + md5: ced7f10b6cfb4389385556f47c0ad949 depends: - __glibc >=2.17,<3.0.a0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libgcc >=14 - libstdcxx >=14 constrains: @@ -15137,44 +15306,44 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 211099 - timestamp: 1762397758105 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h554ac88_0.conda - sha256: 901fb4cfdabf1495e7f080f8e8e218d1ad182c9bcd3cea2862481fef0e9d534f - md5: a0237623ed85308cb816c3dcced23db2 + size: 213122 + timestamp: 1768190028309 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libre2-11-2025.11.05-h6e8c311_1.conda + sha256: 092f1ed90ba105402b0868eda0a1a11fd1aedd93ea6bb7a57f6e2fc2218806d5 + md5: 154f9f623c04dac40752d279bfdecebf depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libcxx >=19 constrains: - re2 2025.11.05.* license: BSD-3-Clause license_family: BSD purls: [] - size: 180107 - timestamp: 1762398117273 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h91c62da_0.conda - sha256: 7b525313ab16415c4a3191ccf59157c3a4520ed762c8ec61fcfb81d27daa4723 - md5: 060f099756e6baf2ed51b9065e44eda8 + size: 179250 + timestamp: 1768190310379 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libre2-11-2025.11.05-h4c27e2a_1.conda + sha256: 1e2d23bbc1ffca54e4912365b7b59992b7ae5cbeb892779a6dcd9eca9f71c428 + md5: 40d8ad21be4ccfff83a314076c3563f4 depends: - __osx >=11.0 - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - libcxx >=19 constrains: - re2 2025.11.05.* license: BSD-3-Clause license_family: BSD purls: [] - size: 165593 - timestamp: 1762398300610 -- conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h0eb2380_0.conda - sha256: 8eb2c205588e6d751fe387e90f1321ac8bbaef0a12d125a1dd898e925327f8ae - md5: 960713477ad3d7f82e5199fa1b940495 + size: 165851 + timestamp: 1768190225157 +- conda: https://conda.anaconda.org/conda-forge/win-64/libre2-11-2025.11.05-h04e5de1_1.conda + sha256: 7e26b7868b10e40bc441e00c558927835eacef7e5a39611c2127558edd660c8f + md5: 3d863f1a19f579ca511f6ac02038ab5a depends: - libabseil * cxx17* - - libabseil >=20250512.1,<20250513.0a0 + - libabseil >=20260107.0,<20260108.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 @@ -15183,8 +15352,8 @@ packages: license: BSD-3-Clause license_family: BSD purls: [] - size: 263996 - timestamp: 1762397947932 + size: 266062 + timestamp: 1768190189553 - conda: https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h46dd2a8_20.conda sha256: eb4082a5135102f5ba9c302da13164d4ed1181d5f0db9d49e5e11a815a7b526f md5: df81fd57eacf341588d728c97920e86d @@ -15247,44 +15416,45 @@ packages: purls: [] size: 7660762 timestamp: 1765256861607 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - sha256: 0105bd108f19ea8e6a78d2d994a6d4a8db16d19a41212070d2d1d48a63c34161 - md5: a587892d3c13b6621a6091be690dbca2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.21-h280c20c_3.conda + sha256: 64e5c80cbce4680a2d25179949739a6def695d72c40ca28f010711764e372d97 + md5: 7af961ef4aa2c1136e11dd43ded245ab depends: - - libgcc-ng >=12 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 license: ISC purls: [] - size: 205978 - timestamp: 1716828628198 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.20-hfdf4475_0.conda - sha256: d3975cfe60e81072666da8c76b993af018cf2e73fe55acba2b5ba0928efaccf5 - md5: 6af4b059e26492da6013e79cbcb4d069 + size: 277661 + timestamp: 1772479381288 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libsodium-1.0.21-hc6ced15_3.conda + sha256: 7dd254e844372fbf3a60a7c029df1ea0cb3fa0b18586cda769d9cd6cc0e59c4b + md5: c4b8a6c8a8aa6ed657a3c1c1eb6917e9 depends: - __osx >=10.13 license: ISC purls: [] - size: 210249 - timestamp: 1716828641383 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.20-h99b78c6_0.conda - sha256: fade8223e1e1004367d7101dd17261003b60aa576df6d7802191f8972f7470b1 - md5: a7ce36e284c5faaf93c220dfc39e3abd + size: 291865 + timestamp: 1772479644707 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsodium-1.0.21-h1a92334_3.conda + sha256: df603472ea1ebd8e7d4fb71e4360fe48d10b11c240df51c129de1da2ff9e8227 + md5: 7cc5247987e6d115134ebab15186bc13 depends: - __osx >=11.0 license: ISC purls: [] - size: 164972 - timestamp: 1716828607917 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.20-hc70643c_0.conda - sha256: 7bcb3edccea30f711b6be9601e083ecf4f435b9407d70fc48fbcf9e5d69a0fc6 - md5: 198bb594f202b205c7d18b936fa4524f + size: 248039 + timestamp: 1772479570912 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsodium-1.0.21-h6a83c73_3.conda + sha256: d915f4fa8ebbf237c7a6e511ed458f2cfdc7c76843a924740318a15d0dd33d6d + md5: da2aa614d16a795b3007b6f4a1318a81 depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 license: ISC purls: [] - size: 202344 - timestamp: 1716828757533 + size: 276860 + timestamp: 1772479407566 - conda: https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-gpl_h2abfd87_119.conda sha256: 403c1ad74ee70caaac02216a233ef9ec4531497ee14e7fea93a254a005ece88d md5: 887245164c408c289d0cb45bd508ce5f @@ -15381,18 +15551,18 @@ packages: purls: [] size: 8671657 timestamp: 1761681604524 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.1-hf4e2dac_1.conda - sha256: d614540c55f22ad555633f75e174089018ddfc65c49f447f7bbdbc3c3013bec1 - md5: b1f35e70f047918b49fb4b181e40300e +- conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.53.0-hf4e2dac_0.conda + sha256: ec37c79f737933bbac965f5dc0f08ef2790247129a84bb3114fad4900adce401 + md5: 810d83373448da85c3f673fbcb7ad3a3 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 license: blessing purls: [] - size: 943451 - timestamp: 1766319676469 + size: 958864 + timestamp: 1775753750179 - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.51.1-hd09e2f1_1.conda sha256: 497b0a698ae87e024d24e242f93c56303731844d10861e1448f6d0a3d69c9ea7 md5: 75ba9aba95c277f12e23cdb0856fd9cd @@ -15414,17 +15584,17 @@ packages: purls: [] size: 905861 timestamp: 1766319901587 -- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.51.1-hf5d6505_1.conda - sha256: d6d86715a1afe11f626b7509935e9d2e14a4946632c0ac474526e20fc6c55f99 - md5: be65be5f758709fc01b01626152e96b0 +- conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.53.0-hf5d6505_0.conda + sha256: 7a6256ea136936df4c4f3b227ba1e273b7d61152f9811b52157af497f07640b0 + md5: 4152b5a8d2513fd7ae9fb9f221a5595d depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 1292859 - timestamp: 1766319616777 + size: 1301855 + timestamp: 1775753831574 - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda sha256: fa39bfd69228a13e553bd24601332b7cfeb30ca11a3ca50bb028108fe90a7661 md5: eecce068c7e4eddeb169591baac20ac4 @@ -15635,40 +15805,40 @@ packages: purls: [] size: 993166 timestamp: 1762022118895 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.2-hfe17d71_0.conda - sha256: 98812901f52df746f89e1fda2a65494dd30de9e826f89b49ebad5d53e5fc424d - md5: 5641725dfad698909ec71dac80d16736 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.11.3-hfe17d71_0.conda + sha256: ecbf4b7520296ed580498dc66a72508b8a79da5126e1d6dc650a7087171288f9 + md5: 1247168fe4a0b8912e3336bccdbf98a5 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 license: MIT license_family: MIT purls: [] - size: 85985 - timestamp: 1764062044259 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.2-h7983711_0.conda - sha256: 83f2799e28643c7793730aa32e007832ffb520c5d77714d2097c227424f33ef1 - md5: e630b1baa02a5eeb0ef351c6125865c4 + size: 85969 + timestamp: 1768735071295 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libutf8proc-2.11.3-hc282952_0.conda + sha256: 626db214208e8da6aa9a904518a0442e5bff7b4602cc295dd5ce1f4a98844c1d + md5: 2c49b6f6ec9a510bbb75ecbd2a572697 depends: - __osx >=10.13 license: MIT license_family: MIT purls: [] - size: 84943 - timestamp: 1764062312835 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.2-hd2415e0_0.conda - sha256: 5c7d4268a1bd02f3cbba6d8a8f9bd47829a46dbc81690a39b1c05e698c180570 - md5: 1ae98806b064c48f184d7c6e0ac506b6 + size: 84535 + timestamp: 1768735249136 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libutf8proc-2.11.3-h2431656_0.conda + sha256: ae1a82e62cd4e3c18e005ae7ff4358ed72b2bfbfe990d5a6a5587f81e9a100dc + md5: 2255add2f6ae77d0a96624a5cbde6d45 depends: - __osx >=11.0 license: MIT license_family: MIT purls: [] - size: 88014 - timestamp: 1764062565080 -- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.2-hb980946_0.conda - sha256: ff63a5e402fb5007174ea9796a210617da898a43d00b4e8a3192537cad0bd403 - md5: 405c392813b74f3df06276e99c0e2841 + size: 87916 + timestamp: 1768735311947 +- conda: https://conda.anaconda.org/conda-forge/win-64/libutf8proc-2.11.3-hb980946_0.conda + sha256: 5d82af0779eab283416240da792a0d2fe4f8213c447e9f04aeaab1801468a90c + md5: 5f34fcb6578ea9bdbfd53cc2cfb88200 depends: - ucrt >=10.0.20348.0 - vc >=14.3,<15 @@ -15676,8 +15846,8 @@ packages: license: MIT license_family: MIT purls: [] - size: 89116 - timestamp: 1764062179403 + size: 89061 + timestamp: 1768735187639 - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.3-h5347b49_0.conda sha256: 1a7539cfa7df00714e8943e18de0b06cceef6778e420a5ee3a2a145773758aee md5: db409b7c1720428638e7c0d509d3e1b5 @@ -15689,39 +15859,36 @@ packages: purls: [] size: 40311 timestamp: 1766271528534 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.328.1-h5279c79_0.conda - sha256: bbabc5c48b63ff03f440940a11d4648296f5af81bb7630d98485405cd32ac1ce - md5: 372a62464d47d9e966b630ffae3abe73 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libvulkan-loader-1.4.341.0-h5279c79_0.conda + sha256: a68280d57dfd29e3d53400409a39d67c4b9515097eba733aa6fe00c880620e2b + md5: 31ad065eda3c2d88f8215b1289df9c89 depends: - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - libgcc >=14 - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxrandr >=1.5.4,<2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 constrains: - - libvulkan-headers 1.4.328.1.* + - libvulkan-headers 1.4.341.0.* license: Apache-2.0 license_family: APACHE purls: [] - size: 197672 - timestamp: 1759972155030 -- conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.328.1-h477610d_0.conda - sha256: 934d676c445c1ea010753dfa98680b36a72f28bec87d15652f013c91a1d8d171 - md5: 4403eae6c81f448d63a7f66c0b330536 + size: 199795 + timestamp: 1770077125520 +- conda: https://conda.anaconda.org/conda-forge/win-64/libvulkan-loader-1.4.341.0-h477610d_0.conda + sha256: 0f0965edca8b255187604fc7712c53fe9064b31a1845a7dfb2b63bf660de84a7 + md5: 804880b2674119b84277d6c16b01677d depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 constrains: - - libvulkan-headers 1.4.328.1.* + - libvulkan-headers 1.4.341.0.* license: Apache-2.0 license_family: APACHE purls: [] - size: 280488 - timestamp: 1759972163692 + size: 282251 + timestamp: 1770077165680 - conda: https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.6.0-hd42ef1d_0.conda sha256: 3aed21ab28eddffdaf7f804f49be7a7d701e8f0e46c856d801270b470820a37b md5: aea31d2e5b1091feca96fcfe945c3cf9 @@ -16145,57 +16312,56 @@ packages: purls: [] size: 146856 timestamp: 1730442305774 -- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda - sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 - md5: edb0dca6bc32e4f4789199455a1dbeb8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + sha256: 55044c403570f0dc26e6364de4dc5368e5f3fc7ff103e867c487e2b5ab2bcda9 + md5: d87ff7921124eccd67248aa483c23fec depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 60963 - timestamp: 1727963148474 -- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.1-hd23fc13_2.conda - sha256: 8412f96504fc5993a63edf1e211d042a1fd5b1d51dedec755d2058948fcced09 - md5: 003a54a4e32b02f7355b50a837e699da + size: 63629 + timestamp: 1774072609062 +- conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + sha256: 4c6da089952b2d70150c74234679d6f7ac04f4a98f9432dec724968f912691e7 + md5: 30439ff30578e504ee5e0b390afc8c65 depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 57133 - timestamp: 1727963183990 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.1-h8359307_2.conda - sha256: ce34669eadaba351cd54910743e6a2261b67009624dbc7daeeafdef93616711b - md5: 369964e85dc26bfe78f41399b366c435 + size: 59000 + timestamp: 1774073052242 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + sha256: 361415a698514b19a852f5d1123c5da746d4642139904156ddfca7c922d23a05 + md5: bc5a5721b6439f2f62a84f2548136082 depends: - __osx >=11.0 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 46438 - timestamp: 1727963202283 -- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_2.conda - sha256: ba945c6493449bed0e6e29883c4943817f7c79cbff52b83360f7b341277c6402 - md5: 41fbfac52c601159df6c01f875de31b9 + size: 47759 + timestamp: 1774072956767 +- conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + sha256: 88609816e0cc7452bac637aaf65783e5edf4fee8a9f8e22bdc3a75882c536061 + md5: dbabbd6234dea34040e631f87676292f depends: - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 constrains: - - zlib 1.3.1 *_2 + - zlib 1.3.2 *_2 license: Zlib license_family: Other purls: [] - size: 55476 - timestamp: 1727963768015 + size: 58347 + timestamp: 1774072851498 - conda: https://conda.anaconda.org/conda-forge/linux-64/libzopfli-1.0.3-h9c3ff4c_0.tar.bz2 sha256: ff94f30b2e86cbad6296cf3e5804d442d9e881f7ba8080d92170981662528c6e md5: c66fe2d123249af7651ebde8984c51c2 @@ -16250,32 +16416,32 @@ packages: - pkg:pypi/linkify-it-py?source=hash-mapping size: 24154 timestamp: 1733781296133 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-21.1.8-h472b3d1_0.conda - sha256: 2a41885f44cbc1546ff26369924b981efa37a29d20dc5445b64539ba240739e6 - md5: e2d811e9f464dd67398b4ce1f9c7c872 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvm-openmp-22.1.3-h0d3cbff_0.conda + sha256: 58d10bd4638d0b3646389002cac57a46c578512b08ec20a3b2ea15f56b32d565 + md5: fbc27eb49069842d5335776d600856ff depends: - - __osx >=10.13 + - __osx >=11.0 constrains: - - openmp 21.1.8|21.1.8.* - intel-openmp <0.0a0 + - openmp 22.1.3|22.1.3.* license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 311405 - timestamp: 1765965194247 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-21.1.8-h4a912ad_0.conda - sha256: 56bcd20a0a44ddd143b6ce605700fdf876bcf5c509adc50bf27e76673407a070 - md5: 206ad2df1b5550526e386087bef543c7 + size: 311000 + timestamp: 1775712575099 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvm-openmp-22.1.3-hc7d1edf_0.conda + sha256: 71dcf9a9df103f57a0d5b0abc2594a15c2dd3afe52f07ac2d1c471552a61fb8d + md5: 086b00b77f5f0f7ef5c2a99855650df4 depends: - __osx >=11.0 constrains: - - openmp 21.1.8|21.1.8.* + - openmp 22.1.3|22.1.3.* - intel-openmp <0.0a0 license: Apache-2.0 WITH LLVM-exception license_family: APACHE purls: [] - size: 285974 - timestamp: 1765964756583 + size: 285886 + timestamp: 1775712563398 - conda: https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-21.1.8-h4fa8253_0.conda sha256: 145c4370abe870f10987efa9fc15a8383f1dab09abbc9ad4ff15a55d45658f7b md5: 0d8b425ac862bcf17e4b28802c9351cb @@ -16291,30 +16457,30 @@ packages: purls: [] size: 347566 timestamp: 1765964942856 -- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.46.0-py314h946fb2a_0.conda - sha256: 99f15d69f059aa9c7d06cc45a6519a2375cc7a93ca85127964d6325a89a2b519 - md5: 7ee180b967506bbd108ca9d5ff45eace +- conda: https://conda.anaconda.org/conda-forge/linux-64/llvmlite-0.47.0-py314h946fb2a_1.conda + sha256: e77292afb920e8b46f75c98a370d79aa4a922ff1ebed38c54381ad5d613c834e + md5: 22feb934c64b2d62b3b2b278eb40629e depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - zstd >=1.5.7,<1.6.0a0 license: BSD-2-Clause license_family: BSD purls: - - pkg:pypi/llvmlite?source=hash-mapping - size: 34123266 - timestamp: 1765279959565 -- conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.46.0-py314h85c3bf0_0.conda - sha256: 468f68ddfad77e92de45a9023e92c8cea13df253bd27861de7cd594bc13f5569 - md5: babaf455ce9be7d7001cf048eb80508b + - pkg:pypi/llvmlite?source=compressed-mapping + size: 34134565 + timestamp: 1776076748673 +- conda: https://conda.anaconda.org/conda-forge/osx-64/llvmlite-0.47.0-py314hf43a1d0_1.conda + sha256: 42f64fd8ad94981bdf8cef0a6897cb7ad7ed61baf9064d8a91e285e21e7ce780 + md5: 3184407147c2917aa4fbb7ce3848efd0 depends: - - __osx >=10.13 + - __osx >=11.0 - libcxx >=19 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - zstd >=1.5.7,<1.6.0a0 @@ -16322,15 +16488,15 @@ packages: license_family: BSD purls: - pkg:pypi/llvmlite?source=hash-mapping - size: 26019299 - timestamp: 1765280661650 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.46.0-py314ha398f32_0.conda - sha256: 10ee25664d790b117d84701506b60caba147f7bf599215cbd688037aaa42ff81 - md5: b9eefe6197dafc779b784731fa507f60 + size: 26003082 + timestamp: 1776077079350 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/llvmlite-0.47.0-py314hc7e35b3_1.conda + sha256: 54dbf3a5acc8eb4d0902345145bdf0a658a3ac118ab3d10424c899fb899cda46 + md5: c555bb3e65064bf7807d0419eb0ae120 depends: - __osx >=11.0 - libcxx >=19 - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 @@ -16339,13 +16505,13 @@ packages: license_family: BSD purls: - pkg:pypi/llvmlite?source=hash-mapping - size: 24330524 - timestamp: 1765280789928 -- conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.46.0-py314hb492ee6_0.conda - sha256: 8f8bb4cd5a93aaf576e6861846f09dcff8f37032b02704e830d9afd3e6676d6b - md5: de5f7e2de23118d72f43c99fe7f2a942 + size: 24327499 + timestamp: 1776077303342 +- conda: https://conda.anaconda.org/conda-forge/win-64/llvmlite-0.47.0-py314hb492ee6_1.conda + sha256: 9caf2c3ec4b747554421bbe0adb5e5dbfec45463638b7e3407d1ba02167bf472 + md5: ad66bb59a59cfa219311bf5072c1a087 depends: - - libzlib >=1.3.1,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - ucrt >=10.0.20348.0 @@ -16356,8 +16522,8 @@ packages: license_family: BSD purls: - pkg:pypi/llvmlite?source=hash-mapping - size: 22926897 - timestamp: 1765280131964 + size: 22909282 + timestamp: 1776076971549 - conda: https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2 sha256: 9afe0b5cfa418e8bdb30d8917c5a6cec10372b037924916f1f85b9f4899a67a6 md5: 91e27ef3d05cc772ce627e51cff111c4 @@ -16622,18 +16788,18 @@ packages: - pkg:pypi/markdown?source=hash-mapping size: 85401 timestamp: 1762856570927 -- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_1.conda - sha256: 0fbacdfb31e55964152b24d5567e9a9996e1e7902fb08eb7d91b5fd6ce60803a - md5: fee3164ac23dfca50cfcc8b85ddefb81 +- conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + md5: 5b5203189eb668f042ac2b0826244964 depends: - mdurl >=0.1,<1 - - python >=3.9 + - python >=3.10 license: MIT license_family: MIT purls: - pkg:pypi/markdown-it-py?source=hash-mapping - size: 64430 - timestamp: 1733250550053 + size: 64736 + timestamp: 1754951288511 - conda: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda sha256: e0cbfea51a19b3055ca19428bd9233a25adca956c208abb9d00b21e7259c7e03 md5: fab1be106a50e20f10fe5228fd1d1651 @@ -16831,62 +16997,62 @@ packages: - pkg:pypi/matplotlib-inline?source=hash-mapping size: 15175 timestamp: 1761214578417 -- conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.12.3-py310h2b5ca13_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/maturin-1.13.1-py310h2b5ca13_0.conda noarch: python - sha256: 434ee112cb10ce0bc9f6313e46f3231af2d7f027caa1bd4304e4f35485bff475 - md5: 33f10466141c570e7f9652b97141b066 + sha256: ff51099c31fcb1c4a42b2544243f9289e759b4e3f578a1f64652f26626c2f938 + md5: e1d2e0dd76c196b48e34b61ef5b65e9b depends: - python - tomli >=1.1.0 - - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - openssl >=3.5.5,<4.0a0 + - libgcc >=14 + - openssl >=3.5.6,<4.0a0 constrains: - __glibc >=2.17 license: MIT license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 8605434 - timestamp: 1771528140817 -- conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.12.3-py310h655e229_0.conda + size: 8938226 + timestamp: 1775757052305 +- conda: https://conda.anaconda.org/conda-forge/osx-64/maturin-1.13.1-py310h655e229_0.conda noarch: python - sha256: 3b20047c416eb80ce84e02a6a244e13c47f99770e5f021adbd89866d387bedc5 - md5: 48d0d1778ca6f6e16d91d28d83e1ff3a + sha256: 4eb0fae84d086d94d45baf2168c9242b4943fa2c121c6a8d3c0b354619e70b27 + md5: 0fe3a16db8d427affaa4a3444fe49a53 depends: - python - tomli >=1.1.0 - __osx >=11.0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 constrains: - __osx >=10.13 license: MIT license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 8231674 - timestamp: 1771528267602 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.12.3-py310hc7c2786_0.conda + size: 8535580 + timestamp: 1775757198049 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/maturin-1.13.1-py310hc7c2786_0.conda noarch: python - sha256: cc45dd6ee23310281a4314048d590083f242821ea39eef6aab5136ef9f589dae - md5: 34abd3558677a2f99abc99b20f68d400 + sha256: 223df8782bfe0d59924c1430e6715eda38a361f37b434f737443b9b9e9b9c746 + md5: 71eb5c18a03cf3a262c0a695920cfeed depends: - python - tomli >=1.1.0 - __osx >=11.0 - - openssl >=3.5.5,<4.0a0 + - openssl >=3.5.6,<4.0a0 constrains: - __osx >=11.0 license: MIT license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 7789445 - timestamp: 1771528328278 -- conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.12.3-py310h6f63dbe_0.conda + size: 8062956 + timestamp: 1775757236606 +- conda: https://conda.anaconda.org/conda-forge/win-64/maturin-1.13.1-py310h6f63dbe_0.conda noarch: python - sha256: 997095952a5e4caeecddff505908f091918ddfc40b5f7527ca14d2bd948628a9 - md5: 26f076bc8efbbcb0c2eda1e8d8f92140 + sha256: eef72f9b40aa3248dc584cdac52438175273839c0d7a9d3ee58b85e714e1eef9 + md5: 232d1bdbf2836ee985ea90be2352eb9a depends: - python - tomli >=1.1.0 @@ -16897,8 +17063,8 @@ packages: license_family: MIT purls: - pkg:pypi/maturin?source=hash-mapping - size: 7760558 - timestamp: 1771528161116 + size: 8069323 + timestamp: 1775757101466 - conda: https://conda.anaconda.org/conda-forge/noarch/mdit-py-plugins-0.5.0-pyhd8ed1ab_0.conda sha256: 123cc004e2946879708cdb6a9eff24acbbb054990d6131bb94bca7a374ebebfc md5: 1997a083ef0b4c9331f9191564be275e @@ -17200,23 +17366,23 @@ packages: purls: [] size: 148557 timestamp: 1747117340968 -- conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-4.0.1-pyhd8ed1ab_0.conda - sha256: f035d0ea623f63247f0f944eb080eaa2a45fb5b7fda8947f4ac94d381ef3bf33 - md5: b528795158847039003033ee0db20e9b +- conda: https://conda.anaconda.org/conda-forge/noarch/myst-parser-5.0.0-pyhd8ed1ab_0.conda + sha256: f352d594d968acd31052c5f894ae70718be56481ffa9c304fdfcbe78ddf66eb1 + md5: a65e2c3c764766f0b28a3ac5052502a6 depends: - - docutils >=0.19,<0.22 + - docutils >=0.20,<0.23 - jinja2 - - markdown-it-py >=3.0.0,<4.0.0 - - mdit-py-plugins >=0.4.1,<1 - - python >=3.10 + - markdown-it-py >=4.0.0,<4.1.0 + - mdit-py-plugins >=0.5,<0.6 + - python >=3.11 - pyyaml - - sphinx >=7,<9 + - sphinx >=8,<10 license: MIT license_family: MIT purls: - pkg:pypi/myst-parser?source=hash-mapping - size: 73074 - timestamp: 1739381945342 + size: 73535 + timestamp: 1768942892170 - conda: https://conda.anaconda.org/conda-forge/noarch/narwhals-2.15.0-pyhcf101f3_0.conda sha256: 2e64699401c6170ce9a0916461ff4686f8d10b076f6abe1d887cbcb7061c0e85 md5: 37926bb0db8b04b8b99945076e1442d0 @@ -17328,86 +17494,109 @@ packages: - pkg:pypi/nest-asyncio?source=hash-mapping size: 11543 timestamp: 1733325673691 -- conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.3-nompi_py314hed328fd_100.conda - sha256: 81efd0668389cdc7c5bb758baf71f369d81daeb9fad2ae3370b73beb8d535f22 - md5: d5cebea694ca987a64a93464ed7a844e +- conda: https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.4-nompi_py311h498b1eb_107.conda + noarch: python + sha256: 0757d67266b535ed36dbb74b2cd353ad042db5c9d2fd2d3b5a2aea133bed61ea + md5: 7f5488cf61943e6221325b454c2c2e9c depends: - - __glibc >=2.17,<3.0.a0 + - python - certifi - cftime - - hdf5 >=1.14.6,<1.14.7.0a0 + - numpy + - packaging + - hdf5 + - libnetcdf + - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - libnetcdf >=4.9.3,<4.9.4.0a0 - - libzlib >=1.3.1,<2.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 - numpy >=1.23,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - libzlib >=1.3.2,<2.0a0 + - hdf5 >=2.1.0,<3.0a0 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping - size: 1119160 - timestamp: 1760540716792 -- conda: https://conda.anaconda.org/conda-forge/osx-64/netcdf4-1.7.3-nompi_py314hf60e252_100.conda - sha256: e7b462ccdb9085d5d864eee2f4c4312dcb968d18de7a358da7421bd060e60d7d - md5: cb8267fd6b2719b8ac44fd810acbcc1c + size: 1095186 + timestamp: 1774640065682 +- conda: https://conda.anaconda.org/conda-forge/osx-64/netcdf4-1.7.4-nompi_py311h8ff4399_107.conda + noarch: python + sha256: 05fd7f61ed2f186b7545e715f1945b194aeb9c0c3e1c2c623eada9e3a03d7219 + md5: daec1e5e7e8b14259b83704c154c0d52 depends: - - __osx >=10.13 + - python - certifi - cftime - - hdf5 >=1.14.6,<1.14.7.0a0 - - libnetcdf >=4.9.3,<4.9.4.0a0 - - libzlib >=1.3.1,<2.0a0 + - numpy + - packaging + - hdf5 + - libnetcdf + - __osx >=11.0 + - _python_abi3_support 1.* + - cpython >=3.11 + - libzlib >=1.3.2,<2.0a0 + - hdf5 >=2.1.0,<3.0a0 - numpy >=1.23,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 + - libnetcdf >=4.10.0,<4.10.1.0a0 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping - size: 1019213 - timestamp: 1760540858549 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.3-nompi_py314ha229517_100.conda - sha256: feaf70a8a04a77898b6c00f494d2ea1a1a1a5f18b09cd337890ed0c023eb3aa9 - md5: c2e349b932ebd08123faef6e9ce2f2d7 + size: 1021233 + timestamp: 1774640164745 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/netcdf4-1.7.4-nompi_py311hfd37af6_107.conda + noarch: python + sha256: bafdd947b687d44eac9dbf16e5fdc4f988511295008b49e948cfa1d622f2117b + md5: 3f006c8c05961704e0b2a5fef4f51430 depends: - - __osx >=11.0 + - python - certifi - cftime - - hdf5 >=1.14.6,<1.14.7.0a0 - - libnetcdf >=4.9.3,<4.9.4.0a0 - - libzlib >=1.3.1,<2.0a0 + - numpy + - packaging + - hdf5 + - libnetcdf + - __osx >=11.0 - numpy >=1.23,<3 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 + - hdf5 >=2.1.0,<3.0a0 + - libzlib >=1.3.2,<2.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - _python_abi3_support 1.* + - cpython >=3.11 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping - size: 1007976 - timestamp: 1760542005639 -- conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.3-nompi_py314h640c526_100.conda - sha256: 557ccdaeb3b1d6e7494640cd9385af9c68be49872509b10eee7ee8d10ccc1343 - md5: 023232d6ee54492d56834004423912a6 + size: 997611 + timestamp: 1774640123378 +- conda: https://conda.anaconda.org/conda-forge/win-64/netcdf4-1.7.4-nompi_py311h5c67aab_107.conda + noarch: python + sha256: a126914260aee57c3a772cf6195ca0c400be9ae4bf7f95cb67ad415e07abb2ab + md5: a80b5c834127606dff3feb061541e763 depends: + - python - certifi - cftime - - hdf5 >=1.14.6,<1.14.7.0a0 - - libnetcdf >=4.9.3,<4.9.4.0a0 - - libzlib >=1.3.1,<2.0a0 - - numpy >=1.23,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 + - numpy + - packaging + - hdf5 + - libnetcdf - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - _python_abi3_support 1.* + - cpython >=3.11 + - libzlib >=1.3.2,<2.0a0 + - hdf5 >=2.1.0,<3.0a0 + - libnetcdf >=4.10.0,<4.10.1.0a0 + - numpy >=1.23,<3 license: MIT license_family: MIT purls: - pkg:pypi/netcdf4?source=hash-mapping - size: 978682 - timestamp: 1760541670772 + size: 955722 + timestamp: 1774640128662 - conda: https://conda.anaconda.org/conda-forge/noarch/networkx-3.6.1-pyhcf101f3_0.conda sha256: f6a82172afc50e54741f6f84527ef10424326611503c64e359e25a19a8e4c1c6 md5: a2c1eeadae7a309daed9d62c96012a2b @@ -17524,10 +17713,20 @@ packages: purls: [] size: 136912 timestamp: 1758194464430 -- pypi: https://files.pythonhosted.org/packages/6b/9a/0939d63f34f1f98db5adc0a2917b4313c27270192ca5e87ce75cd0238ceb/nlr_gaps-0.9.1-py3-none-any.whl +- conda: https://conda.anaconda.org/conda-forge/win-64/nlohmann_json-3.12.0-h5112557_1.conda + sha256: 045edd5d571c235de67472ad8fe03d9706b8426c4ba9a73f408f946034b6bc5e + md5: 24a9dde77833cc48289ef92b4e724da4 + constrains: + - nlohmann_json-abi ==3.12.0 + license: MIT + license_family: MIT + purls: [] + size: 134870 + timestamp: 1758194302226 +- pypi: https://files.pythonhosted.org/packages/99/af/6397859da006c64f2a152fffc3dbb621e275b50010ad934d87d944f48589/nlr_gaps-0.9.2-py3-none-any.whl name: nlr-gaps - version: 0.9.1 - sha256: 9cb7cd9ef6e3774aceb6978dc8f8fe0d0bb0f6d93fc8fd8832218aaa80c4a9e7 + version: 0.9.2 + sha256: c0e77c6d46f04d20251d3148f60bc075ac53188961a0f27ce2899a2c74b0b89c requires_dist: - click>=8.1.8 - colorama>=0.4.6 @@ -17571,60 +17770,60 @@ packages: - pypi: ./ name: nlr-revrt version: 0.6.0 - sha256: c0c2d72376d07134dbd2e63a8bad7cb1c487969f14655b2b49f9912866e2e128 + sha256: 962347cd337cd66a8d9b5f5dd20d8785bc83de178f301283da888b4082d4e4c7 requires_dist: - affine>=2.4.0,<3 - dask>=2026.3.0,<2027 - distributed>=2026.3.0,<2027 - fiona>=1.10.1,<2 - - geopandas>=1.0.1,<2 - - numpy>=2.2.4,<3 - - odc-geo>=0.5.0rc1,<0.6 - - pydantic>=2.11.7,<3 + - geopandas>=1.1.3,<2 + - numpy>=2.4.3,<3 + - odc-geo>=0.5.1,<0.6 + - pydantic>=2.13.3,<3 - python-slugify>=8.0.4,<9 - - nlr-gaps>=0.9.1,<0.10 - - rasterio>=1.4.3,<2 - - rioxarray>=0.18.2,<0.19 - - shapely>=2.1.1,<3 - - xarray>=2025.9.0,<2026 - - zarr>=3.0.7,<4 - - contextily>=1.6.2,<2 ; extra == 'dev' - - datashader>=0.18.2,<0.19 ; extra == 'dev' - - geoviews>=1.15.0,<2 ; extra == 'dev' + - nlr-gaps>=0.9.2,<0.10 + - rasterio>=1.5.0,<2 + - rioxarray>=0.22.0,<0.23 + - shapely>=2.1.2,<3 + - xarray>=2026.4.0,<2027 + - zarr>=3.1.6,<4 + - contextily>=1.7.0,<2 ; extra == 'dev' + - datashader>=0.19.0,<0.20 ; extra == 'dev' + - geoviews>=1.15.1,<2 ; extra == 'dev' - holoviews>=1.22.1,<2 ; extra == 'dev' - hvplot>=0.12.2,<0.13 ; extra == 'dev' - - ipython>=9.1.0,<10 ; extra == 'dev' + - ipython>=9.12.0,<10 ; extra == 'dev' - jupyter>=1.1.1,<2 ; extra == 'dev' - jupyter-bokeh>=4.0.5,<5 ; extra == 'dev' - - matplotlib>=3.10.1,<4 ; extra == 'dev' + - matplotlib>=3.10.8,<4 ; extra == 'dev' - maturin>=1.9.3,<2 ; extra == 'dev' - pipreqs>=0.4.13,<0.5 ; extra == 'dev' - ruff>=0.15.0 ; extra == 'dev' - ruff-lsp>=0.0.62 ; extra == 'dev' - - hypothesis>=6.0,<7 ; extra == 'test' - - pytest>=8.3.5,<9 ; extra == 'test' - - pytest-cases>=3.8.6,<4 ; extra == 'test' - - pytest-cov>=6.1.1,<7 ; extra == 'test' - - pytest-mock>=3.14.0,<4 ; extra == 'test' + - hypothesis>=6.152.1,<7 ; extra == 'test' + - pytest>=9.0.3,<10 ; extra == 'test' + - pytest-cases>=3.10.1,<4 ; extra == 'test' + - pytest-cov>=7.1.0,<8 ; extra == 'test' + - pytest-mock>=3.15.1,<4 ; extra == 'test' - pytest-profiling>=1.8.1,<2 ; extra == 'test' - - pytest-xdist>=3.6.1,<4 ; extra == 'test' + - pytest-xdist>=3.8.0,<4 ; extra == 'test' - rasterstats>=0.20.0,<0.21 ; extra == 'test' - - scikit-image>=0.25.2,<0.26 ; extra == 'test' + - scikit-image>=0.26.0,<0.27 ; extra == 'test' - snakeviz>=2.2.2,<3 ; extra == 'test' - - tox>=4.26.0,<5 ; extra == 'test' + - tox>=4.52.1,<5 ; extra == 'test' - ghp-import>=2.1.0,<3 ; extra == 'doc' - - myst-parser>=4.0.1,<5 ; extra == 'doc' - - numpydoc>=1.9.0,<2 ; extra == 'doc' - - pydata-sphinx-theme>=0.16.1,<0.17 ; extra == 'doc' + - myst-parser>=5.0.0,<6 ; extra == 'doc' + - numpydoc>=1.10.0,<2 ; extra == 'doc' + - pydata-sphinx-theme>=0.17.1,<0.18 ; extra == 'doc' - sphinx>=8.2.3,<9 ; extra == 'doc' - - sphinx-click>=6.1.0,<7 ; extra == 'doc' + - sphinx-click>=6.2.0,<7 ; extra == 'doc' - sphinx-copybutton>=0.5.2,<0.6 ; extra == 'doc' - sphinx-tabs>=3.4.1,<4 ; extra == 'doc' - - sphinxcontrib-mermaid>=1.2.3,<2 ; extra == 'doc' - - build>=1.2.2,<2 ; extra == 'build' + - sphinxcontrib-mermaid>=2.0.1,<3 ; extra == 'doc' + - build>=1.4.3,<2 ; extra == 'build' - pkginfo>=1.12.1.2,<2 ; extra == 'build' - - twine>=6.1.0,<7 ; extra == 'build' - requires_python: '>=3.11' + - twine>=6.2.0,<7 ; extra == 'build' + requires_python: '>=3.12' - pypi: https://files.pythonhosted.org/packages/0a/08/b83b94a2b10ee7d27dddff4812a188e6669e520dafccb590613a90fa9d76/nlr_rex-0.5.0-py3-none-any.whl name: nlr-rex version: 0.5.0 @@ -17687,91 +17886,91 @@ packages: - pkg:pypi/notebook-shim?source=hash-mapping size: 16817 timestamp: 1733408419340 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.63.1-py314h8169c2f_0.conda - sha256: 6ab91790aeee336cc4526b02b477eb0f261df6bd9645f44a138b1e8a3ccc5e60 - md5: 9dfbe6bd11b1c77f618b347ec654b37b +- conda: https://conda.anaconda.org/conda-forge/linux-64/numba-0.65.0-py314h8169c2f_1.conda + sha256: 250d3ccdf075fdaa1ddc94405c3601635a508c1a1f3bea891e579a5bdb2b2b3b + md5: 2bbe666b1a3093450e8c583951d736dd depends: - __glibc >=2.17,<3.0.a0 - _openmp_mutex >=4.5 - libgcc >=14 - libstdcxx >=14 - - llvmlite >=0.46.0,<0.47.0a0 - - numpy >=1.22.3,<2.4 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - - tbb >=2021.6.0 - - libopenblas !=0.3.6 - cuda-version >=11.2 - - cudatoolkit >=11.2 - cuda-python >=11.6 + - tbb >=2021.6.0 + - cudatoolkit >=11.2 - scipy >=1.0 + - libopenblas !=0.3.6 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping - size: 5797268 - timestamp: 1765466862046 -- conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.63.1-py314h385e359_0.conda - sha256: 509aa88417715824d67fb0d685ea26f0a401cb91021c090a59e08c41f595d5dd - md5: 5f3eba34afe3c828cde2576e12244982 + size: 5802328 + timestamp: 1776161998466 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numba-0.65.0-py314h34b395f_1.conda + sha256: 4e5e399579c1b0662590e510da41f11185764f81bcef686e2dc4a2a8c7d513c3 + md5: 35afd9923a5cc4e8367ae6a31e15b126 depends: - - __osx >=10.13 + - __osx >=11.0 - libcxx >=19 - llvm-openmp >=19.1.7 - - llvm-openmp >=21.1.7 - - llvmlite >=0.46.0,<0.47.0a0 - - numpy >=1.22.3,<2.4 + - llvm-openmp >=22.1.3 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 constrains: - cudatoolkit >=11.2 + - cuda-version >=11.2 - scipy >=1.0 - libopenblas !=0.3.6 - cuda-python >=11.6 - tbb >=2021.6.0 - - cuda-version >=11.2 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping - size: 5785538 - timestamp: 1765808633074 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.63.1-py314h945de62_0.conda - sha256: 4e6acf20fafec2b390e73c54bb348f71ef2fd0092e179e370fdf4ad4c2862baa - md5: 4f9128c2986d86725aa0dd5a5dfff168 + size: 5780921 + timestamp: 1776162421650 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numba-0.65.0-py314hb38061f_1.conda + sha256: 89a8b4f12475632cba87fcbf77a5aaee8418c10f7dfc00d99d568a1d762ff3e6 + md5: a60e347ab5d3e259ede61583ec396b10 depends: - __osx >=11.0 - libcxx >=19 - llvm-openmp >=19.1.7 - - llvm-openmp >=21.1.7 - - llvmlite >=0.46.0,<0.47.0a0 - - numpy >=1.22.3,<2.4 + - llvm-openmp >=22.1.3 + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python >=3.14,<3.15.0a0 *_cp314 - python_abi 3.14.* *_cp314 constrains: + - cuda-version >=11.2 - scipy >=1.0 - - libopenblas >=0.3.18,!=0.3.20 - cudatoolkit >=11.2 - - cuda-version >=11.2 - - cuda-python >=11.6 + - libopenblas >=0.3.18,!=0.3.20 - tbb >=2021.6.0 + - cuda-python >=11.6 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping - size: 5780959 - timestamp: 1765466926700 -- conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.63.1-py314h36f8cf2_0.conda - sha256: 1bbfc2793e04aaac5d289e6e5bec8b020b4419c4af1e161ab409c6995d1cc89d - md5: a77827229f4dfdbae9d503707d41a277 - depends: - - llvmlite >=0.46.0,<0.47.0a0 - - numpy >=1.22.3,<2.4 + size: 5775656 + timestamp: 1776162440925 +- conda: https://conda.anaconda.org/conda-forge/win-64/numba-0.65.0-py314h36f8cf2_1.conda + sha256: 40fdc0a8af22010645339296b42d192f6fac5b3222325a199ce593a751bc6031 + md5: 832f9bbad4f4816776f0274decd49efa + depends: + - llvmlite >=0.47.0,<0.48.0a0 + - numpy >=1.22.3,<2.5 - numpy >=1.23,<3 - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 @@ -17779,18 +17978,18 @@ packages: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 constrains: - - tbb >=2021.6.0 - - libopenblas !=0.3.6 - - cuda-version >=11.2 - cudatoolkit >=11.2 - - scipy >=1.0 - cuda-python >=11.6 + - scipy >=1.0 + - libopenblas !=0.3.6 + - tbb >=2021.6.0 + - cuda-version >=11.2 license: BSD-2-Clause license_family: BSD purls: - pkg:pypi/numba?source=hash-mapping - size: 5775759 - timestamp: 1765466860567 + size: 5778714 + timestamp: 1776162203696 - conda: https://conda.anaconda.org/conda-forge/linux-64/numcodecs-0.16.5-py314ha0b5721_0.conda sha256: d420e372ef39890bce10727892dcc7336716a3417d17bf0c47958645e20303d5 md5: 780127fd34cd3b3c320c8e8d22ff4b0e @@ -17870,85 +18069,85 @@ packages: - pkg:pypi/numcodecs?source=hash-mapping size: 519894 timestamp: 1764782737019 -- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.3.5-py314h2b28147_1.conda - sha256: 81425306df4f0ddba159e80c8d91323a34df335079ca93a194201e57b337231c - md5: ab17cb5f388fa17c08937cb9cc24e7b6 +- conda: https://conda.anaconda.org/conda-forge/linux-64/numpy-2.4.3-py314h2b28147_0.conda + sha256: f2ba8cb0d86a6461a6bcf0d315c80c7076083f72c6733c9290086640723f79ec + md5: 36f5b7eb328bdc204954a2225cf908e2 depends: - python - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - libstdcxx >=14 - - liblapack >=3.9.0,<4.0a0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 + - python_abi 3.14.* *_cp314 - libcblas >=3.9.0,<4.0a0 + - liblapack >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping - size: 8983076 - timestamp: 1766383421113 -- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.3.5-py314hfc4c462_1.conda - sha256: 48499b5ba2bcc93c58ef180ce49d5b2200ecc3bdc2fc7b3386d5c3d31634dfab - md5: beb25ac1bb46d5b7841f1a8c5f2d379a + size: 8927860 + timestamp: 1773839233468 +- conda: https://conda.anaconda.org/conda-forge/osx-64/numpy-2.4.3-py314h7b24d9b_0.conda + sha256: cbe5563bf8d7350647db7004871ebcdac38905f87dcdfc059ec5d73d1f27ddfd + md5: 3d8057ab97e4c8fd1f781356e7be9b40 depends: - python - - __osx >=10.13 - libcxx >=19 - - libblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - - libcblas >=3.9.0,<4.0a0 + - __osx >=11.0 - liblapack >=3.9.0,<4.0a0 + - libcblas >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping - size: 8142180 - timestamp: 1766383313292 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.3.5-py314hae46ccb_1.conda - sha256: bc9dfe41ba4898365a82c485416fd4a572f86d94e606d89379766de70d34fc79 - md5: d421394cf6758a6f27ead1530cfdfa6a + size: 8153757 + timestamp: 1773839141840 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/numpy-2.4.3-py314h1569ea8_0.conda + sha256: fe565b09011e8b8edb11bc20564ab130b107d4717590c2464d6d7c2a5a53c6da + md5: 0fab9cf4fc5163131387f36742b50c79 depends: - python - libcxx >=19 - - __osx >=11.0 - python 3.14.* *_cp314 - - libcblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 + - __osx >=11.0 - libblas >=3.9.0,<4.0a0 - liblapack >=3.9.0,<4.0a0 + - python_abi 3.14.* *_cp314 + - libcblas >=3.9.0,<4.0a0 constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/numpy?source=hash-mapping - size: 6861028 - timestamp: 1766383292611 -- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.3.5-py314h06c3c77_1.conda - sha256: 111a7af69521dce54ce6b4d89ef767ade9f3769576353a526174792de8702b5d - md5: 71dabea9914329c08b4864955c3793fc + size: 6993182 + timestamp: 1773839150339 +- conda: https://conda.anaconda.org/conda-forge/win-64/numpy-2.4.3-py314h02f10f6_0.conda + sha256: e4afa67a7350836a1d652f8e7351fe4cb853f8eb8b5c86c9203cefff67669083 + md5: 54355aaff5c94c602b7b9540fbc3ca1d depends: - python - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - liblapack >=3.9.0,<4.0a0 - libblas >=3.9.0,<4.0a0 - - python_abi 3.14.* *_cp314 - libcblas >=3.9.0,<4.0a0 - constrains: + - python_abi 3.14.* *_cp314 + - liblapack >=3.9.0,<4.0a0 + constrains: - numpy-base <0a0 license: BSD-3-Clause license_family: BSD purls: - - pkg:pypi/numpy?source=compressed-mapping - size: 7584934 - timestamp: 1766383321713 + - pkg:pypi/numpy?source=hash-mapping + size: 7311362 + timestamp: 1773839141373 - conda: https://conda.anaconda.org/conda-forge/noarch/numpydoc-1.10.0-pyhcf101f3_0.conda sha256: 482d94fce136c4352b18c6397b9faf0a3149bfb12499ab1ffebad8db0cb6678f md5: 3aa4b625f20f55cf68e92df5e5bf3c39 @@ -17963,9 +18162,9 @@ packages: - pkg:pypi/numpydoc?source=hash-mapping size: 65801 timestamp: 1764715638266 -- conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.0-pyhd8ed1ab_0.conda - sha256: 9b15e4fe5e04e15cf2e851aac0b7307046b90d088c00b1bc0ed3ce0a6f39a03d - md5: f2cd146b3824ff96ec1dd3f3d90d1188 +- conda: https://conda.anaconda.org/conda-forge/noarch/odc-geo-0.5.1-pyhd8ed1ab_0.conda + sha256: 699906c1a51bf9284ca7beba6b90801ec597fd9e435b9d861bb6935f6ab7c2de + md5: aa2d1433efd557e9f49fd3b06081721f depends: - affine - cachetools @@ -17978,8 +18177,8 @@ packages: license_family: APACHE purls: - pkg:pypi/odc-geo?source=hash-mapping - size: 133389 - timestamp: 1765323639464 + size: 133898 + timestamp: 1773198987797 - conda: https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.4-h55fea9a_0.conda sha256: 3900f9f2dbbf4129cf3ad6acf4e4b6f7101390b53843591c53b00f034343bc4d md5: 11b3379b191f63139e29c0d19dee24cd @@ -18088,21 +18287,21 @@ packages: purls: [] size: 215343 timestamp: 1766578421148 -- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.10-he970967_0.conda - sha256: cb0b07db15e303e6f0a19646807715d28f1264c6350309a559702f4f34f37892 - md5: 2e5bf4f1da39c0b32778561c3c4e5878 +- conda: https://conda.anaconda.org/conda-forge/linux-64/openldap-2.6.13-hbde042b_0.conda + sha256: 21c4f6c7f41dc9bec2ea2f9c80440d9a4d45a6f2ac13243e658f10dcf1044146 + md5: 680608784722880fbfe1745067570b00 depends: - __glibc >=2.17,<3.0.a0 - - cyrus-sasl >=2.1.27,<3.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libgcc >=13 - - libstdcxx >=13 - - openssl >=3.5.0,<4.0a0 + - cyrus-sasl >=2.1.28,<3.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libgcc >=14 + - libstdcxx >=14 + - openssl >=3.5.6,<4.0a0 license: OLDAP-2.8 license_family: BSD purls: [] - size: 780253 - timestamp: 1748010165522 + size: 786149 + timestamp: 1775741359582 - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.6.0-h26f9b46_0.conda sha256: a47271202f4518a484956968335b2521409c8173e123ab381e775c358c67fe6d md5: 9ee58d5c534af06558933af3c845a780 @@ -18150,76 +18349,84 @@ packages: purls: [] size: 9440812 timestamp: 1762841722179 -- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.2.1-hd747db4_0.conda - sha256: 8d91d6398fc63a94d238e64e4983d38f6f9555460f11bed00abb2da04dbadf7c - md5: ddab8b2af55b88d63469c040377bd37e +- conda: https://conda.anaconda.org/conda-forge/linux-64/orc-2.3.0-h21090e2_0.conda + sha256: a60c2578c8422e0c67206d269767feb4d3e627511558b6866e5daf2231d5214d + md5: 8027fce94fdfdf2e54f9d18cbae496df depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - tzdata - libstdcxx >=14 - - libzlib >=1.3.1,<2.0a0 + - libgcc >=14 + - __glibc >=2.17,<3.0.a0 - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.2,<1.3.0a0 - - tzdata + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 - zstd >=1.5.7,<1.6.0a0 + - libzlib >=1.3.1,<2.0a0 license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: [] - size: 1316445 - timestamp: 1759424644934 -- conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.2.1-hd1b02dc_0.conda - sha256: a00d48750d2140ea97d92b32c171480b76b2632dbb9d19d1ae423999efcc825f - md5: b4646b6ddcbcb3b10e9879900c66ed48 + size: 1468651 + timestamp: 1773230208923 +- conda: https://conda.anaconda.org/conda-forge/osx-64/orc-2.3.0-hb9b210e_0.conda + sha256: c4872822be78b2503bba06b906604c87000e3a63c7b7b8cb459463d46c55814b + md5: 292d30447800bc51a0d3e0e9738f5730 depends: - - __osx >=11.0 + - tzdata - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - __osx >=11.0 + - libprotobuf >=6.33.5,<6.33.6.0a0 - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.2,<1.3.0a0 - - tzdata - zstd >=1.5.7,<1.6.0a0 + - snappy >=1.2.2,<1.3.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: [] - size: 521463 - timestamp: 1759424838652 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.2.1-h4fd0076_0.conda - sha256: f0a31625a647cb8d55a7016950c11f8fabc394df5054d630e9c9b526bf573210 - md5: b5dea50c77ab3cc18df48bdc9994ac44 + size: 594601 + timestamp: 1773230256637 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/orc-2.3.0-hd11884d_0.conda + sha256: 8594f064828cca9b8d625e2ebe79436fd4ffc030c950573380c54a8f4329f955 + md5: 77bfe521901c1a247cc66c1276826a85 depends: - - __osx >=11.0 + - tzdata - libcxx >=19 - - libprotobuf >=6.31.1,<6.31.2.0a0 + - __osx >=11.0 + - zstd >=1.5.7,<1.6.0a0 - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - snappy >=1.2.2,<1.3.0a0 - - tzdata - - zstd >=1.5.7,<1.6.0a0 + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - lz4-c >=1.10.0,<1.11.0a0 license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: [] - size: 487298 - timestamp: 1759424875005 -- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.2.1-h7414dfc_0.conda - sha256: f28f8f2d743c2091f76161b8d59f82c4ba4970d03cb9900c52fb908fe5e8a7c4 - md5: a9b6ebf475194b0e5ad43168e9b936a7 + size: 548180 + timestamp: 1773230270828 +- conda: https://conda.anaconda.org/conda-forge/win-64/orc-2.3.0-h8fc0eb6_0.conda + sha256: f65b96be3790bdb90195226dfbcac2025b680bdffdbedc7e87d919161a63f8a7 + md5: 1e03f610c02a16fdd7fee7430ec23115 depends: - - libprotobuf >=6.31.1,<6.31.2.0a0 - - libzlib >=1.3.1,<2.0a0 - - lz4-c >=1.10.0,<1.11.0a0 - - snappy >=1.2.2,<1.3.0a0 - tzdata - - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - snappy >=1.2.2,<1.3.0a0 + - lz4-c >=1.10.0,<1.11.0a0 + - libabseil >=20260107.1,<20260108.0a0 + - libabseil * cxx17* + - libprotobuf >=6.33.5,<6.33.6.0a0 + - libzlib >=1.3.1,<2.0a0 - zstd >=1.5.7,<1.6.0a0 license: Apache-2.0 - license_family: Apache + license_family: APACHE purls: [] - size: 1064397 - timestamp: 1759424869069 + size: 1438607 + timestamp: 1773230254230 - conda: https://conda.anaconda.org/conda-forge/noarch/overrides-7.7.0-pyhd8ed1ab_1.conda sha256: 1840bd90d25d4930d60f57b4f38d4e0ae3f5b8db2819638709c36098c6ba770c md5: e51f1e4089cad105b6cac64bd8166587 @@ -18232,17 +18439,18 @@ packages: - pkg:pypi/overrides?source=hash-mapping size: 30139 timestamp: 1734587755455 -- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.2-pyhd8ed1ab_2.conda - sha256: da157b19bcd398b9804c5c52fc000fcb8ab0525bdb9c70f95beaa0bb42f85af1 - md5: 3bfed7e6228ebf2f7b9eaa47f1b4e2aa +- conda: https://conda.anaconda.org/conda-forge/noarch/packaging-26.1-pyhc364b38_0.conda + sha256: 171d977bc977fd80f2a05de3d4b7d571c4ec3cdea436ed364e5cd50547c50881 + md5: b8ae38639d323d808da535fb71e31be8 depends: - python >=3.8 + - python license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/packaging?source=hash-mapping - size: 60164 - timestamp: 1733203368787 + - pkg:pypi/packaging?source=compressed-mapping + size: 89360 + timestamp: 1776209387231 - conda: https://conda.anaconda.org/conda-forge/linux-64/pandas-2.3.3-py314ha0b5721_2.conda sha256: 0a86a582b906d9cfd4d2c59180898fe9d714b55eea7ced71630a1fedae206c62 md5: fe3a5c8be07a7b82058bdeb39d33d93b @@ -18450,38 +18658,38 @@ packages: - pkg:pypi/pandas?source=hash-mapping size: 14046781 timestamp: 1764615388271 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.8.3-ha770c72_0.conda - sha256: 87ec986d1e0d16d9d2aa149653abeb73d1ac4bd9e6d7dc13ba33ec00134c8a7a - md5: 0e4aa34e44a68aeb850349fe51a6a3d0 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.9.0.2-ha770c72_0.conda + sha256: d46f76ed09396e3bd1dc11030b3d0d222c25ba8d92f3cde08bc6fbd1eec4f9e0 + md5: de8ccf9ffba55bd20ee56301cfc7e6db license: GPL-2.0-or-later license_family: GPL purls: [] - size: 22458834 - timestamp: 1764589637843 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.8.3-h694c41f_0.conda - sha256: 763c07427762e3e1d524c4e4e7343225de6af2be432d1136a0fa26b863450c9e - md5: ea4f844424717e24a69c05f16ff30ffa + size: 22364689 + timestamp: 1773933354952 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pandoc-3.9.0.2-h694c41f_0.conda + sha256: b60882fbaee1a7dd4458253d9c335f9dc285bc4c672c9da28b80636736eda891 + md5: 4be84ca4d00187c49a3010ca30a34847 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 16948053 - timestamp: 1764589819568 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.8.3-hce30654_0.conda - sha256: 39af2080d16088c0b9c19db5d0f8b2c845e70c428126a4773d0e54b609d8af91 - md5: 68bc0f4209fe5cbb03a401177f3a36c2 + size: 16855452 + timestamp: 1773933667892 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pandoc-3.9.0.2-hce30654_0.conda + sha256: 2074598145bf286490d232c6f0a3d301403305d56f5c45a0170f44bc00fde8e5 + md5: 81203e2c973f049afba930cf6f79c695 license: GPL-2.0-or-later license_family: GPL purls: [] - size: 28522262 - timestamp: 1764589967786 -- conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.8.3-h57928b3_0.conda - sha256: b3d37c502e405e7d1997a028e7eae246acd52436eacdd4f053cb345bde0da8a9 - md5: 904ca93f4f00a75ee3c49147cb00f14d + size: 23192144 + timestamp: 1773933643305 +- conda: https://conda.anaconda.org/conda-forge/win-64/pandoc-3.9.0.2-h57928b3_0.conda + sha256: e7e19b88040df48b172eef8270e6ca55d93243635fb447527831974a0714b761 + md5: 1844e86a2fffbd77a99d03af217d9dfa license: GPL-2.0-or-later license_family: GPL purls: [] - size: 26699611 - timestamp: 1764589773519 + size: 26667130 + timestamp: 1773933498636 - conda: https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2 sha256: 2bb9ba9857f4774b85900c2562f7e711d08dd48e2add9bee4e1612fbee27e16f md5: 457c2c8c08e54905d6954e79cb5b5db9 @@ -18710,17 +18918,17 @@ packages: - pkg:pypi/pillow?source=hash-mapping size: 973387 timestamp: 1767353195064 -- conda: https://conda.anaconda.org/conda-forge/noarch/pip-25.3-pyh145f28c_0.conda - sha256: 4d5e2faca810459724f11f78d19a0feee27a7be2b3fc5f7abbbec4c9fdcae93d - md5: bf47878473e5ab9fdb4115735230e191 +- conda: https://conda.anaconda.org/conda-forge/noarch/pip-26.0.1-pyh145f28c_0.conda + sha256: 5f66ea31d62188c266c5a8752119b0cc90a5bf05963f665cf48a33e0ec58d39c + md5: 09a970fbf75e8ed1aa633827ded6aa4f depends: - python >=3.13.0a0 license: MIT license_family: MIT purls: - - pkg:pypi/pip?source=compressed-mapping - size: 1177084 - timestamp: 1762776338614 + - pkg:pypi/pip?source=hash-mapping + size: 1180743 + timestamp: 1770270312477 - conda: https://conda.anaconda.org/conda-forge/noarch/pipreqs-0.4.13-pyhd8ed1ab_0.conda sha256: 6b6abad23455a0809cd307d58a7162505bc3c5d2003635a61708b9eaf2c7383d md5: ea2c6f2c9f5e84772c41f7e2ab6012ff @@ -18773,18 +18981,18 @@ packages: - pkg:pypi/pkginfo?source=hash-mapping size: 30536 timestamp: 1739984682585 -- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.1-pyhcf101f3_0.conda - sha256: 04c64fb78c520e5c396b6e07bc9082735a5cc28175dbe23138201d0a9441800b - md5: 1bd2e65c8c7ef24f4639ae6e850dacc2 +- conda: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.9.6-pyhcf101f3_0.conda + sha256: 8f29915c172f1f7f4f7c9391cd5dac3ebf5d13745c8b7c8006032615246345a5 + md5: 89c0b6d1793601a2a3a3f7d2d3d8b937 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/platformdirs?source=hash-mapping - size: 23922 - timestamp: 1764950726246 + - pkg:pypi/platformdirs?source=compressed-mapping + size: 25862 + timestamp: 1775741140609 - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda sha256: e14aafa63efa0528ca99ba568eaf506eb55a0371d12e6250aaaa61718d2eb62e md5: d7585b6550ad04c8c5e21097ada2888e @@ -18910,6 +19118,21 @@ packages: purls: [] size: 173220 timestamp: 1730769371051 +- conda: https://conda.anaconda.org/conda-forge/win-64/prometheus-cpp-1.3.0-hcea2f5d_0.conda + sha256: ed08acd2ce6c69063693193450df89e8695e8b1251b399d34fb56ab45d900cbc + md5: 128297355faf0afcb84e22e43d472101 + depends: + - libcurl >=8.10.1,<9.0a0 + - libzlib >=1.3.1,<2.0a0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - zlib + license: MIT + license_family: MIT + purls: [] + size: 183665 + timestamp: 1730769570131 - conda: https://conda.anaconda.org/conda-forge/noarch/prometheus_client-0.23.1-pyhd8ed1ab_0.conda sha256: 13dc67de68db151ff909f2c1d2486fa7e2d51355b25cee08d26ede1b62d48d40 md5: a1e91db2d17fd258c64921cb38e6745a @@ -19260,31 +19483,30 @@ packages: - pkg:pypi/pyct?source=hash-mapping size: 22142 timestamp: 1759062813077 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.5-pyhcf101f3_1.conda - sha256: 868569d9505b7fe246c880c11e2c44924d7613a8cdcc1f6ef85d5375e892f13d - md5: c3946ed24acdb28db1b5d63321dbca7d +- conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.13.3-pyhcf101f3_0.conda + sha256: 12909d5c2bfb31492667dd4132ac900dd47f8162bd8b1dd9e5973ce8ea28ca1a + md5: f690e6f204efd2e5c06b57518a383d98 depends: - typing-inspection >=0.4.2 - typing_extensions >=4.14.1 - python >=3.10 - - typing-extensions >=4.6.1 - annotated-types >=0.6.0 - - pydantic-core ==2.41.5 + - pydantic-core ==2.46.3 - python license: MIT license_family: MIT purls: - - pkg:pypi/pydantic?source=hash-mapping - size: 340482 - timestamp: 1764434463101 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.5-py314h2e6c369_1.conda - sha256: 7e0ae379796e28a429f8e48f2fe22a0f232979d65ec455e91f8dac689247d39f - md5: 432b0716a1dfac69b86aa38fdd59b7e6 + - pkg:pypi/pydantic?source=compressed-mapping + size: 346352 + timestamp: 1776728341165 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.46.3-py314h2e6c369_0.conda + sha256: 686007c384679c7c3cd1b76f1b7429fb3ad1aca895ec84e51f5ffd63631b5bb1 + md5: 1f3fd537f929b8d3236f9f0f0e7f7a32 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - libgcc >=14 - __glibc >=2.17,<3.0.a0 + - libgcc >=14 - python_abi 3.14.* *_cp314 constrains: - __glibc >=2.17 @@ -19292,15 +19514,15 @@ packages: license_family: MIT purls: - pkg:pypi/pydantic-core?source=hash-mapping - size: 1943088 - timestamp: 1762988995556 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.41.5-py314ha7b6dee_1.conda - sha256: 7cb259e46ecb9f19eeea4d96035546376ce9370b51ffd18d57eb7170b08bbbf4 - md5: 8a9a08b79d530f482c9439790db774e1 + size: 1908522 + timestamp: 1776704321819 +- conda: https://conda.anaconda.org/conda-forge/osx-64/pydantic-core-2.46.3-py314h8916c15_0.conda + sha256: ea86291d31e46779eca82e48bda784e1e22ad73b61193fca8f6866e7774d3886 + md5: 2280b65e7bca27e9fd8d23309eda822b depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - __osx >=10.13 + - __osx >=11.0 - python_abi 3.14.* *_cp314 constrains: - __osx >=10.13 @@ -19308,16 +19530,16 @@ packages: license_family: MIT purls: - pkg:pypi/pydantic-core?source=hash-mapping - size: 1949458 - timestamp: 1762989007303 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.41.5-py314haad56a0_1.conda - sha256: dded9092d89f1d8c267d5ce8b5e21f935c51acb7a64330f507cdfb3b69a98116 - md5: 420a4b8024e9b22880f1e03b612afa7d + size: 1897408 + timestamp: 1776704436500 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.46.3-py314h54f3292_0.conda + sha256: fc262861a0c73b1aa95c17563bdf85e28f56cd999980515c5fdb5ee0ecfc2ade + md5: dca4fba919cbc8cf50045f474e90bd99 depends: - python - typing-extensions >=4.6.0,!=4.7.0 - - __osx >=11.0 - python 3.14.* *_cp314 + - __osx >=11.0 - python_abi 3.14.* *_cp314 constrains: - __osx >=11.0 @@ -19325,45 +19547,42 @@ packages: license_family: MIT purls: - pkg:pypi/pydantic-core?source=hash-mapping - size: 1784478 - timestamp: 1762989019956 -- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.41.5-py314h9f07db2_1.conda - sha256: 51773479d973c0b0b96cf581cb8444061eaac9b6c28f1cc6d33afc39201d5f13 - md5: c1f37669ed289c378f3193b35c9df2a7 + size: 1729029 + timestamp: 1776704375454 +- conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.46.3-py314h9f07db2_0.conda + sha256: 6f9b042f8ac5485ae8ebc08350087b8434588638d755d34b17cb24885524caf3 + md5: 4abc18339071a7caebb3b66a44fa405a depends: - python - typing-extensions >=4.6.0,!=4.7.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - python_abi 3.14.* *_cp314 license: MIT license_family: MIT purls: - pkg:pypi/pydantic-core?source=hash-mapping - size: 1971476 - timestamp: 1762989023313 -- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.16.1-pyhd8ed1ab_0.conda - sha256: 073473ba9c0cc3946026dde9112d2edb0ac52f6cc35d2126f4bff8bad1cc74a6 - md5: 837aaf71ddf3b27acae0e7e9015eebc6 + size: 1895483 + timestamp: 1776704357200 +- conda: https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.17.1-pyhcf101f3_0.conda + sha256: 71161705133df512054177ad03f394e073c39e369dda52fda8e8e0a5371df8c2 + md5: 620cee61c85cf6a407f80e8d502796ec depends: - accessible-pygments - babel - beautifulsoup4 - docutils !=0.17.0 - pygments >=2.7 - - python >=3.9 - - sphinx >=6.1 + - python >=3.10 + - sphinx >=7.0 - typing_extensions + - python license: BSD-3-Clause - license_family: BSD purls: - pkg:pypi/pydata-sphinx-theme?source=hash-mapping - size: 1547597 - timestamp: 1734446468767 + size: 1657335 + timestamp: 1776777605561 - conda: https://conda.anaconda.org/conda-forge/noarch/pygls-2.0.0-pyhcf101f3_0.conda sha256: 081f270a2a843af665bf8758c81e0f44478bed14b1f5037090906354c4566492 md5: 51d09cc7128cd09d2430d4be1bd90ac5 @@ -19621,20 +19840,20 @@ packages: - pkg:pypi/pyproj?source=hash-mapping size: 737081 timestamp: 1757955185265 -- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.9.0-pyh29332c3_0.conda - sha256: 618a7ce34a53f9fe818c8b30c04ad43db7ee8ef2a8007d895354c5be5a92188f - md5: 46276968030688a25257b08772c418fc +- conda: https://conda.anaconda.org/conda-forge/noarch/pyproject-api-1.10.0-pyhcf101f3_0.conda + sha256: 997ed634095ebda4090d78734becdd9799574371b1b8e182259cca9cc8f13f2b + md5: b706680f6701b9eea01702442c9bebc0 depends: - - python >=3.9 - - packaging >=24.2 - - tomli >=2.0.1 + - python >=3.10 + - packaging >=25 + - tomli >=2.3 - python license: MIT license_family: MIT purls: - pkg:pypi/pyproject-api?source=hash-mapping - size: 26323 - timestamp: 1737556652795 + size: 26643 + timestamp: 1760107122369 - conda: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 md5: d4582021af437c931d7d77ec39007845 @@ -19658,55 +19877,55 @@ packages: - pkg:pypi/pyshp?source=hash-mapping size: 454408 timestamp: 1764355333136 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.10.1-py314hf36963e_0.conda - sha256: 400bf53007d7fd70b4a7e060db51ebf42dbd93b7d0319944f69be6eb94b065da - md5: 7092c03811619ce1344ea40c31328264 +- conda: https://conda.anaconda.org/conda-forge/linux-64/pyside6-6.11.0-py314h3987850_2.conda + sha256: 7102df4eeb04fb8746b336ddd03d3f98a5c6d4742c173de582e609e2f92ffec8 + md5: c77e1fe23b6cf0b6077e5f924ac420c9 depends: - - __glibc >=2.17,<3.0.a0 - - libclang13 >=21.1.7 - - libegl >=1.7.0,<2.0a0 + - python + - qt6-main 6.11.0.* - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libopengl >=1.7.0,<2.0a0 + - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - - libvulkan-loader >=1.4.328.1,<2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - libxslt >=1.1.43,<2.0a0 - - python >=3.14,<3.15.0a0 - python_abi 3.14.* *_cp314 - - qt6-main 6.10.1.* - - qt6-main >=6.10.1,<6.11.0a0 + - libclang13 >=21.1.8 + - libgl >=1.7.0,<2.0a0 + - qt6-main >=6.11.0,<6.12.0a0 + - libxml2 + - libxml2-16 >=2.14.6 + - libegl >=1.7.0,<2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 + - libopengl >=1.7.0,<2.0a0 license: LGPL-3.0-only license_family: LGPL purls: - pkg:pypi/pyside6?source=hash-mapping - pkg:pypi/shiboken6?source=hash-mapping - size: 11719157 - timestamp: 1765812030250 -- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.10.1-py314h2c9462b_0.conda - sha256: 1439f051b7c5a0d7915552c13d786d9f96e915fcd96d4166d0bd88f9b1b91e44 - md5: b814621e074091a546da1dc32ab1b20a - depends: - - libclang13 >=21.1.7 - - libvulkan-loader >=1.4.328.1,<2.0a0 + size: 13376566 + timestamp: 1776276343130 +- conda: https://conda.anaconda.org/conda-forge/win-64/pyside6-6.10.2-py314h447aaf0_2.conda + sha256: 0b8f0f216c5158223b1434cad4cf7d73130010e1fea8e7c29b7f60a470c17eb2 + md5: b1e2034a5a7a1fbde8a499795b29d70b + depends: + - python + - qt6-main 6.10.2.* + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - libclang13 >=21.1.8 + - libxslt >=1.1.43,<2.0a0 - libxml2 - libxml2-16 >=2.14.6 - - libxslt >=1.1.43,<2.0a0 - - python >=3.14,<3.15.0a0 + - qt6-main >=6.10.2,<6.11.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - python_abi 3.14.* *_cp314 - - qt6-main 6.10.1.* - - qt6-main >=6.10.1,<6.11.0a0 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 license: LGPL-3.0-only license_family: LGPL purls: - pkg:pypi/pyside6?source=hash-mapping - pkg:pypi/shiboken6?source=hash-mapping - size: 8996723 - timestamp: 1765812737093 + size: 10990431 + timestamp: 1775062835839 - conda: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyh09c184e_7.conda sha256: d016e04b0e12063fbee4a2d5fbb9b39a8d191b5a0042f0b8459188aedeabb0ca md5: e2fd202833c4a981ce8a65974fe4abd1 @@ -19732,17 +19951,17 @@ packages: - pkg:pypi/pysocks?source=hash-mapping size: 21085 timestamp: 1733217331982 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda - sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 - md5: da0c42269086f5170e2b296878ec13a6 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-9.0.3-pyhc364b38_1.conda + sha256: 960f59442173eee0731906a9077bd5ccf60f4b4226f05a22d1728ab9a21a879c + md5: 6a991452eadf2771952f39d43615bb3e depends: + - colorama >=0.4 - pygments >=2.7.2 - python >=3.10 - - iniconfig >=1 - - packaging >=20 + - iniconfig >=1.0.1 + - packaging >=22 - pluggy >=1.5,<2 - tomli >=1 - - colorama >=0.4 - exceptiongroup >=1 - python constrains: @@ -19750,38 +19969,38 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/pytest?source=hash-mapping - size: 294852 - timestamp: 1762354779909 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.9.1-pyhd8ed1ab_0.conda - sha256: 926c5eab4aa526c9baba6dba62445fa506ae3c865148dcd74d6e00bdb6848bcc - md5: 16a55d900e8fd94c149510bca8296181 + - pkg:pypi/pytest?source=compressed-mapping + size: 299984 + timestamp: 1775644472530 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cases-3.10.1-pyhd8ed1ab_0.conda + sha256: 1b685d7bb59585807ef612cfc4d1be6a082326b1a1d445a0de893f3d2aa20c3d + md5: 315adb19d68b8a050f8f330cb8adfc24 depends: - decopatch >=1.4.8 - makefun >=1.9.5 - pytest >=2 - - python >=3.9 + - python >=3.10 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/pytest-cases?source=hash-mapping - size: 88561 - timestamp: 1749541521100 -- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-6.3.0-pyhd8ed1ab_0.conda - sha256: 5ba3e0955e473234fcc38cb4f0d893135710ec85ccb1dffdd73d9b213e99e8fb - md5: 50d191b852fccb4bf9ab7b59b030c99d + size: 89697 + timestamp: 1773089022843 +- conda: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda + sha256: 44e42919397bd00bfaa47358a6ca93d4c21493a8c18600176212ec21a8d25ca5 + md5: 67d1790eefa81ed305b89d8e314c7923 depends: - - coverage >=7.5 + - coverage >=7.10.6 - pluggy >=1.2 - - pytest >=6.2.5 + - pytest >=7 - python >=3.10 - - toml + - python license: MIT license_family: MIT purls: - - pkg:pypi/pytest-cov?source=hash-mapping - size: 28806 - timestamp: 1757200686993 + - pkg:pypi/pytest-cov?source=compressed-mapping + size: 29559 + timestamp: 1774139250481 - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.15.1-pyhd8ed1ab_0.conda sha256: 2936717381a2740c7bef3d96827c042a3bba3ba1496c59892989296591e3dabb md5: 0511afbe860b1a653125d77c719ece53 @@ -19926,24 +20145,25 @@ packages: size: 16833248 timestamp: 1765020224759 python_site_packages_path: Lib/site-packages -- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda - sha256: b2df2264f0936b9f95e13ac79b596fac86d3b649812da03a61543e11e669714c - md5: ed5d43e9ef92cc2a9872f9bdfe94b984 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-build-1.4.3-pyhc364b38_0.conda + sha256: f36faffa91fa8492b61ed68deae1a5a6e8e1efee808b5af2a971eeb0ca039719 + md5: d039729a4537b67fa7b4a9335abd5070 depends: + - python >=3.9 - colorama - importlib-metadata >=4.6 - - packaging >=19.0 + - packaging >=24.0 - pyproject_hooks - - python >=3.9 - tomli >=1.1.0 + - python constrains: - build <0 license: MIT license_family: MIT purls: - pkg:pypi/build?source=hash-mapping - size: 26074 - timestamp: 1754131610616 + size: 29272 + timestamp: 1775863949133 - conda: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 md5: 5b8d21249ff20967101ffa321cab24e8 @@ -19957,6 +20177,20 @@ packages: - pkg:pypi/python-dateutil?source=hash-mapping size: 233310 timestamp: 1751104122689 +- conda: https://conda.anaconda.org/conda-forge/noarch/python-discovery-1.2.2-pyhcf101f3_0.conda + sha256: 498ad019d75ba31c7891dc6d9efc8a7ed48cd5d5973f3a9377eb1b174577d3db + md5: feb2e11368da12d6ce473b6573efab41 + depends: + - python >=3.10 + - filelock >=3.15.4 + - platformdirs <5,>=4.3.6 + - python + license: MIT + license_family: MIT + purls: + - pkg:pypi/python-discovery?source=hash-mapping + size: 34341 + timestamp: 1775586706825 - conda: https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda sha256: df9aa74e9e28e8d1309274648aac08ec447a92512c33f61a8de0afa9ce32ebe8 md5: 23029aae904a2ba587daba708208012f @@ -20053,70 +20287,6 @@ packages: - pkg:pypi/pyviz-comms?source=hash-mapping size: 49425 timestamp: 1750669964512 -- conda: https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.9.0-py314hc02f841_2.conda - sha256: df4a7c8da55c64443ee0d23199e77f77e4d45a34bf2565ffcef1fb2a57ccca6b - md5: 5be92985870940eac3f3b8cda57002cc - depends: - - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - numpy >=1.23,<3 - - numpy >=1.25,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pywavelets?source=hash-mapping - size: 3694152 - timestamp: 1762595072736 -- conda: https://conda.anaconda.org/conda-forge/osx-64/pywavelets-1.9.0-py314hd1ec8a2_2.conda - sha256: f01d0d8055484fc963b4dacb3879d074683fd38decc8fc72d27b914a150a3496 - md5: a097e2c4ee683d8fa5466510d5e323df - depends: - - __osx >=10.13 - - numpy >=1.23,<3 - - numpy >=1.25,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pywavelets?source=hash-mapping - size: 3619744 - timestamp: 1762595247952 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/pywavelets-1.9.0-py314hdcf55e8_2.conda - sha256: 462afc9a600603bb0128ebbb23e0628bef5feb75b49f95f47bd8a7c489016851 - md5: cee9ba4ac48fe6405f6c3b098f441129 - depends: - - __osx >=11.0 - - numpy >=1.23,<3 - - numpy >=1.25,<3 - - python >=3.14,<3.15.0a0 - - python >=3.14,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pywavelets?source=hash-mapping - size: 3618379 - timestamp: 1762595928794 -- conda: https://conda.anaconda.org/conda-forge/win-64/pywavelets-1.9.0-py314h2dcd201_2.conda - sha256: cea9769671d14ce82d569b2cd554bf75f6fefc1ae2c3fa1eb5d44e8e9a2d0814 - md5: d35bebda20f0e86bcb69f28f68da6aa6 - depends: - - numpy >=1.23,<3 - - numpy >=1.25,<3 - - python >=3.14,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - license: MIT - license_family: MIT - purls: - - pkg:pypi/pywavelets?source=hash-mapping - size: 3584457 - timestamp: 1762595240957 - conda: https://conda.anaconda.org/conda-forge/win-64/pywin32-311-py314h8f8f202_1.conda sha256: 6918a8067f296f3c65d43e84558170c9e6c3f4dd735cfe041af41a7fdba7b171 md5: 2d7b7ba21e8a8ced0eca553d4d53f773 @@ -20292,100 +20462,114 @@ packages: purls: [] size: 1377020 timestamp: 1720814433486 -- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.10.1-hb82b983_4.conda - sha256: 9ff9eeae1f8331f04d6c19bbe53edd5ad10cc3f960376e3c35ad3875546569da - md5: f4dfd61ec958d420bebdcefeb805d658 - depends: - - __glibc >=2.17,<3.0.a0 - - alsa-lib >=1.2.15.1,<1.3.0a0 - - dbus >=1.16.2,<2.0a0 - - double-conversion >=3.4.0,<3.5.0a0 - - fontconfig >=2.15.0,<3.0a0 - - fonts-conda-ecosystem - - harfbuzz >=12.2.0 - - icu >=78.1,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang-cpp21.1 >=21.1.7,<21.2.0a0 - - libclang13 >=21.1.7 - - libcups >=2.3.3,<2.4.0a0 - - libdrm >=2.4.125,<2.5.0a0 - - libegl >=1.7.0,<2.0a0 - - libfreetype >=2.14.1 - - libfreetype6 >=2.14.1 +- conda: https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.11.0-pl5321h16c4a6b_4.conda + sha256: d2cb212a4abd66c13df44771c22ee23c0b013ba1d5dbb5e10e8a13e261a47c6b + md5: c81127acb50fdc7760682495fc9ab088 + depends: + - libxcb + - xcb-util + - xcb-util-wm + - xcb-util-keysyms + - xcb-util-image + - xcb-util-renderutil + - xcb-util-cursor + - libgl-devel + - libegl-devel - libgcc >=14 - - libgl >=1.7.0,<2.0a0 - - libglib >=2.86.3,<3.0a0 - - libjpeg-turbo >=3.1.2,<4.0a0 - - libllvm21 >=21.1.7,<21.2.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libpq >=18.1,<19.0a0 - - libsqlite >=3.51.1,<4.0a0 + - __glibc >=2.17,<3.0.a0 - libstdcxx >=14 - - libtiff >=4.7.1,<4.8.0a0 - - libvulkan-loader >=1.4.328.1,<2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - libwebp-base >=1.6.0,<2.0a0 - - libxcb >=1.17.0,<2.0a0 + - libgl >=1.7.0,<2.0a0 + - libegl >=1.7.0,<2.0a0 + - openssl >=3.5.6,<4.0a0 + - dbus >=1.16.2,<2.0a0 - libxkbcommon >=1.13.1,<2.0a0 - - libxml2 - - libxml2-16 >=2.14.6 - - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 - pcre2 >=10.47,<10.48.0a0 - - wayland >=1.24.0,<2.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - fontconfig >=2.17.1,<3.0a0 + - fonts-conda-ecosystem + - libxcb >=1.17.0,<2.0a0 + - zstd >=1.5.7,<1.6.0a0 - xcb-util >=0.4.1,<0.5.0a0 - - xcb-util-cursor >=0.1.6,<0.2.0a0 + - xorg-libxcomposite >=0.4.7,<1.0a0 + - xorg-libxxf86vm >=1.1.7,<2.0a0 + - icu >=78.3,<79.0a0 + - xorg-libxdamage >=1.1.6,<2.0a0 + - xcb-util-renderutil >=0.3.10,<0.4.0a0 - xcb-util-image >=0.4.0,<0.5.0a0 + - wayland >=1.25.0,<2.0a0 + - libzlib >=1.3.2,<2.0a0 - xcb-util-keysyms >=0.4.1,<0.5.0a0 - - xcb-util-renderutil >=0.3.10,<0.4.0a0 + - xorg-libxcursor >=1.2.3,<2.0a0 + - double-conversion >=3.4.0,<3.5.0a0 + - alsa-lib >=1.2.15.3,<1.3.0a0 + - xorg-libxext >=1.3.7,<2.0a0 + - harfbuzz >=14.1.0 + - libsqlite >=3.53.0,<4.0a0 + - libfreetype >=2.14.3 + - libfreetype6 >=2.14.3 + - libtiff >=4.7.1,<4.8.0a0 + - libdrm >=2.4.125,<2.5.0a0 + - libjpeg-turbo >=3.1.4.1,<4.0a0 - xcb-util-wm >=0.4.2,<0.5.0a0 + - libcups >=2.3.3,<2.4.0a0 + - xorg-libx11 >=1.8.13,<2.0a0 + - libpng >=1.6.58,<1.7.0a0 + - xorg-libxtst >=1.2.5,<2.0a0 - xorg-libice >=1.1.2,<2.0a0 + - xorg-libxrandr >=1.5.5,<2.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - xcb-util-cursor >=0.1.6,<0.2.0a0 + - libxml2 + - libxml2-16 >=2.14.6 - xorg-libsm >=1.2.6,<2.0a0 - - xorg-libx11 >=1.8.12,<2.0a0 - - xorg-libxcomposite >=0.4.6,<1.0a0 - - xorg-libxcursor >=1.2.3,<2.0a0 - - xorg-libxdamage >=1.1.6,<2.0a0 - - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrandr >=1.5.4,<2.0a0 - - xorg-libxtst >=1.2.5,<2.0a0 - - xorg-libxxf86vm >=1.1.6,<2.0a0 - - zstd >=1.5.7,<1.6.0a0 + - libpq >=18.3,<19.0a0 + - libglib >=2.86.4,<3.0a0 constrains: - - qt 6.10.1 + - qt ==6.11.0 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 57241105 - timestamp: 1766486406643 -- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.10.1-h68b6638_4.conda - sha256: d1f389aa0c0653d5af83e60da79ca6414d329707f236f110ff5e3329edb94f5a - md5: c4a3cf4e79a59cb46ad2d56b74c89e57 + size: 59928585 + timestamp: 1776322501700 +- conda: https://conda.anaconda.org/conda-forge/win-64/qt6-main-6.10.2-h35725d6_5.conda + sha256: 0c4dfea2b3dd9108ab08786092b373e089f34c17ec8f9c1f23da9917f9db3abe + md5: 193fcaa5c64aa817cd8cde92afbc9d4e depends: - double-conversion >=3.4.0,<3.5.0a0 - - harfbuzz >=12.2.0 - - icu >=78.1,<79.0a0 - - krb5 >=1.21.3,<1.22.0a0 - - libclang13 >=21.1.7 - - libglib >=2.86.3,<3.0a0 + - harfbuzz >=12.3.2 + - icu >=78.2,<79.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libbrotlicommon >=1.2.0,<1.3.0a0 + - libbrotlidec >=1.2.0,<1.3.0a0 + - libbrotlienc >=1.2.0,<1.3.0a0 + - libclang13 >=21.1.8 + - libfreetype >=2.14.1 + - libfreetype6 >=2.14.1 + - libglib >=2.86.4,<3.0a0 - libjpeg-turbo >=3.1.2,<4.0a0 - - libpng >=1.6.53,<1.7.0a0 - - libsqlite >=3.51.1,<4.0a0 + - libpng >=1.6.55,<1.7.0a0 + - libsqlite >=3.51.2,<4.0a0 - libtiff >=4.7.1,<4.8.0a0 - - libvulkan-loader >=1.4.328.1,<2.0a0 + - libvulkan-loader >=1.4.341.0,<2.0a0 - libwebp-base >=1.6.0,<2.0a0 - libzlib >=1.3.1,<2.0a0 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 - pcre2 >=10.47,<10.48.0a0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - zstd >=1.5.7,<1.6.0a0 constrains: - - qt 6.10.1 + - qt 6.10.2 license: LGPL-3.0-only license_family: LGPL purls: [] - size: 85571611 - timestamp: 1766493849766 + size: 86110363 + timestamp: 1772127760856 - conda: https://conda.anaconda.org/conda-forge/linux-64/rasterio-1.5.0-py314ha1f92a4_0.conda sha256: 399feb6f2fd60f54e4d7cb2351a7fb6dfb3f64d1e02457b6e396ba29f97cd9dd md5: 15b1e205270451c078c79d0480438e8e @@ -20557,46 +20741,46 @@ packages: purls: [] size: 4122383 timestamp: 1746622805379 -- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_0.conda - sha256: 2f225ddf4a274743045aded48053af65c31721e797a45beed6774fdc783febfb - md5: 0227d04521bc3d28c7995c7e1f99a721 +- conda: https://conda.anaconda.org/conda-forge/linux-64/re2-2025.11.05-h5301d42_1.conda + sha256: 3fc684b81631348540e9a42f6768b871dfeab532d3f47d5c341f1f83e2a2b2b2 + md5: 66a715bc01c77d43aca1f9fcb13dde3c depends: - - libre2-11 2025.11.05 h7b12aa8_0 + - libre2-11 2025.11.05 h0dc7533_1 license: BSD-3-Clause license_family: BSD purls: [] - size: 27316 - timestamp: 1762397780316 -- conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h7df6414_0.conda - sha256: cd892b6b571fc6aaf9132a859e5ef0fae9e9ff980337ce7284798fa1d24bee5d - md5: 13dc8eedbaa30b753546e3d716f51816 + size: 27469 + timestamp: 1768190052132 +- conda: https://conda.anaconda.org/conda-forge/osx-64/re2-2025.11.05-h77e0585_1.conda + sha256: 1aeb9a9554cc719d454ad6158afbb0c249973fa4ee1d782d7e40cbec1de9b061 + md5: b2cc31f114e4487d24e5617e62a24017 depends: - - libre2-11 2025.11.05 h554ac88_0 + - libre2-11 2025.11.05 h6e8c311_1 license: BSD-3-Clause license_family: BSD purls: [] - size: 27381 - timestamp: 1762398153069 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-h64b956e_0.conda - sha256: 29c4bceb6b4530bac6820c30ba5a2f53fd26ed3e7003831ecf394e915b975fbc - md5: 1b35e663ed321840af65e7c5cde419f2 + size: 27447 + timestamp: 1768190352348 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/re2-2025.11.05-ha480c28_1.conda + sha256: 5bab972e8f2bff1b5b3574ffec8ecb89f7937578bd107584ed3fde507ff132f9 + md5: a1ff22f664b0affa3de712749ccfbf04 depends: - - libre2-11 2025.11.05 h91c62da_0 + - libre2-11 2025.11.05 h4c27e2a_1 license: BSD-3-Clause license_family: BSD purls: [] - size: 27422 - timestamp: 1762398340843 -- conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_0.conda - sha256: 9d1bb3d15cdd3257baee5fc063221514482f91154cd1457af126e1ec460bbeac - md5: 50746f61f199c4c00d42e33f5d6cfd0b + size: 27445 + timestamp: 1768190259003 +- conda: https://conda.anaconda.org/conda-forge/win-64/re2-2025.11.05-ha104f34_1.conda + sha256: 345b1ed8288d81510101f886aaf547e3294370e5dab340c4c3fcb0b25e5d99e0 + md5: 6807f05dcf3f1736ad6cc9525b8b8725 depends: - - libre2-11 2025.11.05 h0eb2380_0 + - libre2-11 2025.11.05 h04e5de1_1 license: BSD-3-Clause license_family: BSD purls: [] - size: 216623 - timestamp: 1762397986736 + size: 220305 + timestamp: 1768190225351 - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.3-h853b02a_0.conda sha256: 12ffde5a6f958e285aa22c191ca01bbd3d6e710aa852e00618fa6ddc59149002 md5: d7d95fc8287ea7bf33e0e7116d2b95ec @@ -20760,23 +20944,23 @@ packages: - pkg:pypi/rich?source=compressed-mapping size: 200840 timestamp: 1760026188268 -- conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.18.2-pyhd8ed1ab_0.conda - sha256: 77ca13bbbd01c0649eeac57db35ddf511d16e09b53703cc28cffa0ee32bf3f25 - md5: daf05c3baaae11700637ab0e9c678c00 +- conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda + sha256: a95c313b27b440368be0bf16e0a30d8413f1722a74b99147e406317d5d7968fa + md5: 3b15f93fcd0f02b829596ade8b8f0d5a depends: - - numpy >=1.23 + - python >=3.12 - packaging + - rasterio >=1.4.3 + - xarray >=2026.2 - pyproj >=3.3 - - python >=3.10 - - rasterio >=1.3.7 - - scipy - - xarray >=2024.7.0 + - numpy >=2 + - python license: Apache-2.0 license_family: Apache purls: - pkg:pypi/rioxarray?source=hash-mapping - size: 52468 - timestamp: 1737141232838 + size: 65348 + timestamp: 1772826126034 - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda sha256: 30f3c04fcfb64c44d821d392a4a0b8915650dbd900c8befc20ade8fde8ec6aa2 md5: 0dc48b4b570931adc8641e55c6c17fe4 @@ -20860,10 +21044,10 @@ packages: - pkg:pypi/rpds-py?source=hash-mapping size: 235780 timestamp: 1764543046065 -- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.2-h40fa522_0.conda +- conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.11-h7805a7d_0.conda noarch: python - sha256: e0403324ac0de06f51c76ae2a4671255d48551a813d1f1dc03bd4db7364604f0 - md5: 8dec25bd8a94496202f6f3c9085f2ad3 + sha256: cdbe0e611cf6abfea4d0a8d31721cdd357987ebc4521392638d7b57169422968 + md5: 67a5122f008a689124eeb2075c1d92ab depends: - python - __glibc >=2.17,<3.0.a0 @@ -20873,13 +21057,13 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/ruff?source=hash-mapping - size: 9284016 - timestamp: 1771570005837 -- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.15.2-h8ee721d_0.conda + - pkg:pypi/ruff?source=compressed-mapping + size: 9327937 + timestamp: 1776378777189 +- conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.15.11-h16586dd_0.conda noarch: python - sha256: c304d1f678afaea00717bc052ecd17df415aefcfe6b9f6d08ca530ce8051e104 - md5: a94639422d80dfa08221193f95edc49a + sha256: 4b9adce4d8d99bf5f193a8bf3b2aaa91f3b65d88fd610f61a6330120704eacaf + md5: d2c7c98d69f8e0d9160257fb590ffe4f depends: - python - __osx >=11.0 @@ -20889,12 +21073,12 @@ packages: license_family: MIT purls: - pkg:pypi/ruff?source=hash-mapping - size: 9218376 - timestamp: 1771570119654 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.2-h279115b_0.conda + size: 9350619 + timestamp: 1776378920511 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.11-hc5c3a1d_0.conda noarch: python - sha256: 80f93811d26e58bf5a635d1034cba8497223c2bf9efa2a67776a18903e40944a - md5: a52cf978daa5290b1414d3bba6b6ea0b + sha256: 2c8d24c58059cc1ed590276591634482fe921d2542957323caaa21e053cf6971 + md5: 4fe5ced33c7d002ccdf4c49c754f45c1 depends: - python - __osx >=11.0 @@ -20903,13 +21087,13 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/ruff?source=hash-mapping - size: 8415205 - timestamp: 1771570140500 -- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.2-h213852a_0.conda + - pkg:pypi/ruff?source=compressed-mapping + size: 8510514 + timestamp: 1776378932502 +- conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.11-h02f8532_0.conda noarch: python - sha256: 985a1bd98bdaaccb36391016380cd81c037090d3084a34ef7df3ce6ec770ea34 - md5: 9428dc4da3d5a84eb3b1a2d8c06e3d3c + sha256: 29b1d24ad55d68abe04ff7911107344e63d3b76ae54f58c52a2a74fbf8a53c4c + md5: ce7fdb3d4e42746ae13703ae80176c75 depends: - python - vc >=14.3,<15 @@ -20918,9 +21102,9 @@ packages: license: MIT license_family: MIT purls: - - pkg:pypi/ruff?source=hash-mapping - size: 9699892 - timestamp: 1771570027913 + - pkg:pypi/ruff?source=compressed-mapping + size: 9828825 + timestamp: 1776378829267 - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda sha256: 2640f3ae1cd31209c26c70b0413730fb4e903aefc4649dc21f9dd28b08e97a61 md5: 5962a27993ab1b25dd2c8e87a3365753 @@ -21054,18 +21238,18 @@ packages: purls: [] size: 36890656 timestamp: 1773066787379 -- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.6.2-he8a4886_1.conda - sha256: dec76e9faa3173579d34d226dbc91892417a80784911daf8e3f0eb9bad19d7a6 - md5: bade189a194e66b93c03021bd36c337b +- conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda + sha256: dbbe4ab36b90427f12d69fc14a8b601b6bca4185c6c4dd67b8046a8da9daec03 + md5: 9d978822b57bafe72ebd3f8b527bba71 depends: - __glibc >=2.17,<3.0.a0 - libgcc >=14 - - openssl >=3.5.4,<4.0a0 + - openssl >=3.5.5,<4.0a0 license: Apache-2.0 license_family: Apache purls: [] - size: 394197 - timestamp: 1765160261434 + size: 395083 + timestamp: 1773251675551 - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl name: s3fs version: 2025.12.0 @@ -21075,141 +21259,133 @@ packages: - fsspec==2025.12.0 - aiohttp!=4.0.0a0,!=4.0.0a1 requires_python: '>=3.10' -- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.25.2-py314ha0b5721_2.conda - sha256: f259c16ce532b50f41ccd0ac3ec2a6194c5c2724d6a17721850f21e6ab5e182c - md5: b1055051e14d13b877243910c98531c2 +- conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-image-0.26.0-np2py314hda1ea4c_0.conda + sha256: c7a7bcb0e65082a5826d04df7b26f794daa2ea6fe44d1200f7fef58cbf2bb3b7 + md5: 50d6faa367ca045c438d3bb25315b476 depends: - - __glibc >=2.17,<3.0.a0 - imageio >=2.33,!=2.35.0 - lazy-loader >=0.4 - - libgcc >=14 - - libstdcxx >=14 - networkx >=3.0 - - numpy >=1.23,<3 - numpy >=1.24 - - packaging >=21 + - packaging >=21.0 - pillow >=10.1 - - python >=3.14.0rc2,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - pywavelets >=1.6 + - python - scipy >=1.11.4 - tifffile >=2022.8.12 + - libgcc >=14 + - libstdcxx >=14 + - __glibc >=2.17,<3.0.a0 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 constrains: - - numpy >=1.24 - - scikit-learn >=1.2 - astropy-base >=6.0 - - pywavelets >=1.6 - - pyamg >=5.2 - - matplotlib-base >=3.7 - dask-core >=2023.2.0,!=2024.8.0 + - matplotlib-base >=3.7 - pooch >=1.6.0 + - pyamg >=5.2 + - pywavelets >=1.6 + - scikit-learn >=1.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-image?source=hash-mapping - size: 10861481 - timestamp: 1757197359157 -- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.25.2-py314hc4308db_2.conda - sha256: 2604a294f1f6d3d492edfb96257b94ad8f2ff1f9014faf664eb96cc57ad54bb5 - md5: febb06533f3249d42345eafd3452f45a + size: 18627040 + timestamp: 1766684363597 +- conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.26.0-np2py314h08932fc_0.conda + sha256: 3326efc3d4596c55468d364543266af6f9800b03882ffcbd0d493a41e3228d8f + md5: b4ad67b817f5fcb1a6c80feac5a6c546 depends: - - __osx >=10.13 - imageio >=2.33,!=2.35.0 - lazy-loader >=0.4 - - libcxx >=19 - networkx >=3.0 - - numpy >=1.23,<3 - numpy >=1.24 - - packaging >=21 + - packaging >=21.0 - pillow >=10.1 - - python >=3.14.0rc2,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - pywavelets >=1.6 + - python - scipy >=1.11.4 - tifffile >=2022.8.12 + - libcxx >=19 + - __osx >=10.13 + - python_abi 3.14.* *_cp314 + - numpy >=1.23,<3 constrains: - - scikit-learn >=1.2 - - pywavelets >=1.6 - astropy-base >=6.0 - - numpy >=1.24 - - pooch >=1.6.0 + - dask-core >=2023.2.0,!=2024.8.0 - matplotlib-base >=3.7 + - pooch >=1.6.0 - pyamg >=5.2 - - dask-core >=2023.2.0,!=2024.8.0 + - pywavelets >=1.6 + - scikit-learn >=1.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-image?source=hash-mapping - size: 10372499 - timestamp: 1757197411665 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.25.2-py314ha3d490a_2.conda - sha256: 10c18e18f39b876d1e5e212dc3e06295cbda93cc434de62b5dd73c14b40aa424 - md5: 22e02a3473bb19c335d75ebd9817185a + size: 18154530 + timestamp: 1766684363132 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.26.0-np2py314hc49a259_0.conda + sha256: a52ff154b6761979aead2293f938e46db22b2b219d0545f5f3d22ba5f93a14db + md5: a9e8d641fa74e67f96713df35c448da5 depends: - - __osx >=11.0 - imageio >=2.33,!=2.35.0 - lazy-loader >=0.4 - - libcxx >=19 - networkx >=3.0 - - numpy >=1.23,<3 - numpy >=1.24 - - packaging >=21 + - packaging >=21.0 - pillow >=10.1 - - python >=3.14.0rc2,<3.15.0a0 - - python >=3.14.0rc2,<3.15.0a0 *_cp314 - - python_abi 3.14.* *_cp314 - - pywavelets >=1.6 + - python - scipy >=1.11.4 - tifffile >=2022.8.12 + - __osx >=11.0 + - python 3.14.* *_cp314 + - libcxx >=19 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 constrains: - - pywavelets >=1.6 - - scikit-learn >=1.2 - - matplotlib-base >=3.7 - - pyamg >=5.2 - astropy-base >=6.0 - - numpy >=1.24 - dask-core >=2023.2.0,!=2024.8.0 + - matplotlib-base >=3.7 - pooch >=1.6.0 + - pyamg >=5.2 + - pywavelets >=1.6 + - scikit-learn >=1.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-image?source=hash-mapping - size: 10337453 - timestamp: 1757197473648 -- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.25.2-py314hd8fd7ce_2.conda - sha256: fdb4c0ad0dfed41c8f4979f03c9eb8c7b4c957ff1423e0b096488110e33abcd5 - md5: 3f1909c9460540e89d55056ae7b2fca1 + size: 18049239 + timestamp: 1766684379132 +- conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.26.0-np2py314he3c5115_0.conda + sha256: d02db40fac98746b4e77c1134dc220fe0e675cb2929f40a36e9c7d18bba9cc60 + md5: 3badd4f993c4c073c2892b752bb56e39 depends: - imageio >=2.33,!=2.35.0 - lazy-loader >=0.4 - networkx >=3.0 - - numpy >=1.23,<3 - numpy >=1.24 - - packaging >=21 + - packaging >=21.0 - pillow >=10.1 - - python >=3.14.0rc2,<3.15.0a0 - - python_abi 3.14.* *_cp314 - - pywavelets >=1.6 + - python - scipy >=1.11.4 - tifffile >=2022.8.12 - - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + - numpy >=1.23,<3 + - python_abi 3.14.* *_cp314 constrains: - - pyamg >=5.2 - - pooch >=1.6.0 - - numpy >=1.24 - - matplotlib-base >=3.7 - - scikit-learn >=1.2 - astropy-base >=6.0 - - pywavelets >=1.6 - dask-core >=2023.2.0,!=2024.8.0 + - matplotlib-base >=3.7 + - pooch >=1.6.0 + - pyamg >=5.2 + - pywavelets >=1.6 + - scikit-learn >=1.2 license: BSD-3-Clause license_family: BSD purls: - pkg:pypi/scikit-image?source=hash-mapping - size: 10238321 - timestamp: 1757260168753 + size: 21122823 + timestamp: 1766684415235 - conda: https://conda.anaconda.org/conda-forge/linux-64/scikit-learn-1.8.0-np2py314hf09ca88_1.conda sha256: bcf374fe61712928c624f410a831e9f2a36ad13429f598e6028203588d24b914 md5: c9d90e43202c721281f3d74129223515 @@ -21815,9 +21991,9 @@ packages: - pkg:pypi/sphinxcontrib-jsmath?source=hash-mapping size: 10462 timestamp: 1733753857224 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-1.2.3-pyhd8ed1ab_0.conda - sha256: 93d91537dcf97b62550281558dd63e167db68fc28bc0e2e88bb68e79727ce828 - md5: a808762efe186f2a52909c7b3fde8f54 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-mermaid-2.0.1-pyhd8ed1ab_0.conda + sha256: 282edd719ea1b904aa5b10f3c45fd349400b30d9d06d4439bcd326cfe7701d39 + md5: 393bd25222decb075f05036fbdd5905d depends: - python >=3.10 - pyyaml @@ -21826,8 +22002,8 @@ packages: license_family: BSD purls: - pkg:pypi/sphinxcontrib-mermaid?source=hash-mapping - size: 18777 - timestamp: 1764159741884 + size: 19817 + timestamp: 1772753857998 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-2.0.0-pyhd8ed1ab_1.conda sha256: c664fefae4acdb5fae973bdde25836faf451f41d04342b64a358f9a7753c92ca md5: 00534ebcc0375929b45c3039b5ba7636 @@ -21852,21 +22028,21 @@ packages: - pkg:pypi/sphinxcontrib-serializinghtml?source=hash-mapping size: 28669 timestamp: 1733750596111 -- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.51.1-h04a0ce9_1.conda - sha256: 19b59d178bdeecf3fc6875c71370a32b544289a894f20a94abc13af5016af4c7 - md5: 941ee610ebf7a8047140831091dcb1f7 +- conda: https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.53.0-h04a0ce9_0.conda + sha256: a0e35087ebf0720fa758cb261583bee0a328143238524ea47625b37108280291 + md5: dc540e5bd5616d83a1ec46af8315ff98 depends: - __glibc >=2.17,<3.0.a0 - - icu >=78.1,<79.0a0 + - icu >=78.3,<79.0a0 - libgcc >=14 - - libsqlite 3.51.1 hf4e2dac_1 - - libzlib >=1.3.1,<2.0a0 + - libsqlite 3.53.0 hf4e2dac_0 + - libzlib >=1.3.2,<2.0a0 - ncurses >=6.5,<7.0a0 - readline >=8.3,<9.0a0 license: blessing purls: [] - size: 183246 - timestamp: 1766319695960 + size: 205091 + timestamp: 1775753763547 - conda: https://conda.anaconda.org/conda-forge/osx-64/sqlite-3.51.1-h4b4dc0b_1.conda sha256: e397ef434780179b32342907a8d5e7ac7aebf2f24cb3e431bedb039d3e47b457 md5: 30512570bd8f3328796b7ac3144916e7 @@ -21894,18 +22070,18 @@ packages: purls: [] size: 165748 timestamp: 1766319931535 -- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.51.1-hdb435a2_1.conda - sha256: 80b016323e9ceadf09af44a70d4c71ac852f02c6ef4202e16563065f2473258a - md5: b466331d8cba620e6b37f8790b6bd0a5 +- conda: https://conda.anaconda.org/conda-forge/win-64/sqlite-3.53.0-hdb435a2_0.conda + sha256: fe0cc13be5e2236bf0607e6cbe934856fef0fb91e49142c02f17062369f3e0b6 + md5: 7e0249e73d7d7299ecf9063c2f3ce54f depends: - - libsqlite 3.51.1 hf5d6505_1 + - libsqlite 3.53.0 hf5d6505_0 - ucrt >=10.0.20348.0 - vc >=14.3,<15 - vc14_runtime >=14.44.35208 license: blessing purls: [] - size: 400759 - timestamp: 1766319638434 + size: 425738 + timestamp: 1775753855837 - conda: https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.3-pyhd8ed1ab_1.conda sha256: 570da295d421661af487f1595045760526964f41471021056e993e73089e9c41 md5: b1b505328da7a6b246787df4b5a49fbc @@ -22138,30 +22314,34 @@ packages: purls: [] size: 3472313 timestamp: 1763055164278 -- conda: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhcf101f3_3.conda - sha256: fd30e43699cb22ab32ff3134d3acf12d6010b5bbaa63293c37076b50009b91f8 - md5: d0fc809fa4c4d85e959ce4ab6e1de800 +- pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl + name: toml + version: 0.10.2 + sha256: 806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b + requires_python: '>=2.6,!=3.0.*,!=3.1.*,!=3.2.*' +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda + sha256: 91cafdb64268e43e0e10d30bd1bef5af392e69f00edd34dfaf909f69ab2da6bd + md5: b5325cf06a000c5b14970462ff5e4d58 depends: - python >=3.10 - python license: MIT license_family: MIT purls: - - pkg:pypi/toml?source=hash-mapping - size: 24017 - timestamp: 1764486833072 -- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda - sha256: cb77c660b646c00a48ef942a9e1721ee46e90230c7c570cdeb5a893b5cce9bff - md5: d2732eb636c264dc9aa4cbee404b1a53 + - pkg:pypi/tomli?source=hash-mapping + size: 21561 + timestamp: 1774492402955 +- conda: https://conda.anaconda.org/conda-forge/noarch/tomli-w-1.2.0-pyhd8ed1ab_0.conda + sha256: 304834f2438017921d69f05b3f5a6394b42dc89a90a6128a46acbf8160d377f6 + md5: 32e37e8fe9ef45c637ee38ad51377769 depends: - - python >=3.10 - - python + - python >=3.9 license: MIT license_family: MIT purls: - - pkg:pypi/tomli?source=compressed-mapping - size: 20973 - timestamp: 1760014679845 + - pkg:pypi/tomli-w?source=hash-mapping + size: 12680 + timestamp: 1736962345843 - conda: https://conda.anaconda.org/conda-forge/noarch/toolz-1.1.0-pyhd8ed1ab_1.conda sha256: 4e379e1c18befb134247f56021fdf18e112fb35e64dd1691858b0a0f3bea9a45 md5: c07a6153f8306e45794774cf9b13bd32 @@ -22229,29 +22409,32 @@ packages: - pkg:pypi/tornado?source=hash-mapping size: 908399 timestamp: 1765836848636 -- conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.27.0-pyhe01879c_0.conda - sha256: d9d1aad94598ff528b3a95f9d3788512668cd2a925af65d349d49fd472dcb900 - md5: 54d53e668907a36833f7a5b91c01277c +- conda: https://conda.anaconda.org/conda-forge/noarch/tox-4.52.1-pyhcf101f3_0.conda + sha256: af1923dacf383ad12e8b89db8a6959b4d4b53881682cbebb09494a2c33e08a7f + md5: 4e613772846d96b2fe8793ffdacadbad depends: - - cachetools >=5.5.1 - - chardet >=5.2 + - cachetools >=7.0.3 - colorama >=0.4.6 - - filelock >=3.16.1 - - packaging >=24.2 - - platformdirs >=4.3.6 - - pluggy >=1.5 - - pyproject-api >=1.8 - - python >=3.9 - - tomli >=2.2.1 - - typing_extensions >=4.12.2 - - virtualenv >=20.29.1 + - filelock >=3.25 + - packaging >=26 + - platformdirs >=4.9.4 + - pluggy >=1.6 + - pyproject-api >=1.10 + - python >=3.10 + - python-discovery >=1.2.2 + - tomli >=2.4 + - tomli-w >=1.2 + - typing_extensions >=4.15 + - virtualenv >=21.1 - python + constrains: + - argcomplete >=3.6.3 license: MIT license_family: MIT purls: - pkg:pypi/tox?source=hash-mapping - size: 193138 - timestamp: 1750197982471 + size: 257021 + timestamp: 1775764749569 - conda: https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda sha256: 11e2c85468ae9902d24a27137b6b39b4a78099806e551d390e394a8c34b48e40 md5: 9efbfdc37242619130ea42b1cc4ed861 @@ -22533,21 +22716,24 @@ packages: purls: [] size: 115235 timestamp: 1767320173250 -- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.36.0-pyhd8ed1ab_0.conda - sha256: cbb40ae88ccc72e95ce00911a73d9175eead4fb4e74925b0e9557bb60737317e - md5: c9a9b6e144b880308f5eedc905fe503d +- conda: https://conda.anaconda.org/conda-forge/noarch/virtualenv-21.2.4-pyhcf101f3_0.conda + sha256: 9a07c52fd7fc0d187c53b527e54ea57d4f46302946fee2f9291d035f4f8984f9 + md5: 15be1b64e7a4501abb4f740c28ceadaf depends: + - python >=3.10 - distlib >=0.3.7,<1 - - filelock >=3.20.1,<4 + - filelock <4,>=3.24.2 + - importlib-metadata >=6.6 - platformdirs >=3.9.1,<5 - - python >=3.10 + - python-discovery >=1 - typing_extensions >=4.13.2 + - python license: MIT license_family: MIT purls: - pkg:pypi/virtualenv?source=hash-mapping - size: 4403353 - timestamp: 1767880093070 + size: 4659433 + timestamp: 1776247061232 - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.44.35208-h38c0c73_34.conda sha256: 63ff4ec6e5833f768d402f5e95e03497ce211ded5b6f492e660e2bfc726ad24d md5: f276d1de4553e8fca1dfb6988551ebb4 @@ -22558,20 +22744,20 @@ packages: purls: [] size: 19347 timestamp: 1767320221943 -- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.24.0-hd6090a7_1.conda - sha256: 3aa04ae8e9521d9b56b562376d944c3e52b69f9d2a0667f77b8953464822e125 - md5: 035da2e4f5770f036ff704fa17aace24 +- conda: https://conda.anaconda.org/conda-forge/linux-64/wayland-1.25.0-hd6090a7_0.conda + sha256: ea374d57a8fcda281a0a89af0ee49a2c2e99cc4ac97cf2e2db7064e74e764bdb + md5: 996583ea9c796e5b915f7d7580b51ea6 depends: - __glibc >=2.17,<3.0.a0 - - libexpat >=2.7.1,<3.0a0 + - libexpat >=2.7.4,<3.0a0 - libffi >=3.5.2,<3.6.0a0 - libgcc >=14 - libstdcxx >=14 license: MIT license_family: MIT purls: [] - size: 329779 - timestamp: 1761174273487 + size: 334139 + timestamp: 1773959575393 - conda: https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.14-pyhd8ed1ab_0.conda sha256: e311b64e46c6739e2a35ab8582c20fa30eb608da130625ed379f4467219d4813 md5: 7e1e5ff31239f9cd5855714df8a3783d @@ -22701,13 +22887,13 @@ packages: - pkg:pypi/wrapt?source=hash-mapping size: 63873 timestamp: 1756852097390 -- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2025.12.0-pyhcf101f3_0.conda - sha256: b35f6848f229d65dc6e6d58a232099a5e293405a5e3e369b15110ed255cf9872 - md5: efdb3ef0ff549959650ef070ba2c52d2 +- conda: https://conda.anaconda.org/conda-forge/noarch/xarray-2026.4.0-pyhc364b38_0.conda + sha256: 9f5f5905afea6e0188aa6887aed0809033143343a7af06983f4b390c2286d2d7 + md5: 099794df685f800c3f319ff4742dc1bb depends: - python >=3.11 - numpy >=1.26 - - packaging >=24.1 + - packaging >=24.2 - pandas >=2.2 - python constrains: @@ -22736,9 +22922,9 @@ packages: license: Apache-2.0 license_family: APACHE purls: - - pkg:pypi/xarray?source=hash-mapping - size: 994025 - timestamp: 1764974555156 + - pkg:pypi/xarray?source=compressed-mapping + size: 1017999 + timestamp: 1776122774298 - conda: https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.1-h4f16b4b_2.conda sha256: ad8cab7e07e2af268449c2ce855cbb51f43f4664936eff679b1f3862e6e4b01d md5: fdc27cb255a7a2cc73b7919a968b48f0 @@ -22897,18 +23083,18 @@ packages: purls: [] size: 27590 timestamp: 1741896361728 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.12-h4f16b4b_0.conda - sha256: 51909270b1a6c5474ed3978628b341b4d4472cd22610e5f22b506855a5e20f67 - md5: db038ce880f100acc74dba10302b5630 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.13-he1eb515_0.conda + sha256: 516d4060139dbb4de49a4dcdc6317a9353fb39ebd47789c14e6fe52de0deee42 + md5: 861fb6ccbc677bb9a9fb2468430b9c6a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 + - libgcc >=14 - libxcb >=1.17.0,<2.0a0 license: MIT license_family: MIT purls: [] - size: 835896 - timestamp: 1741901112627 + size: 839652 + timestamp: 1770819209719 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.12-hb03c661_1.conda sha256: 6bc6ab7a90a5d8ac94c7e300cc10beb0500eeba4b99822768ca2f2ef356f731b md5: b2895afaf55bf96a8c8282a2e47a5de0 @@ -22952,19 +23138,19 @@ packages: purls: [] size: 109246 timestamp: 1762977105140 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.6-hb9d3cd8_2.conda - sha256: 753f73e990c33366a91fd42cc17a3d19bb9444b9ca5ff983605fa9e953baf57f - md5: d3c295b50f092ab525ffe3c2aa4b7413 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcomposite-0.4.7-hb03c661_0.conda + sha256: 048c103000af9541c919deef03ae7c5e9c570ffb4024b42ecb58dbde402e373a + md5: f2ba4192d38b6cef2bb2c25029071d90 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 - - xorg-libxfixes >=6.0.1,<7.0a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 + - xorg-libxfixes >=6.0.2,<7.0a0 license: MIT license_family: MIT purls: [] - size: 13603 - timestamp: 1727884600744 + size: 14415 + timestamp: 1770044404696 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxcursor-1.2.3-hb9d3cd8_0.conda sha256: 832f538ade441b1eee863c8c91af9e69b356cd3e9e1350fff4fe36cc573fc91a md5: 2ccd714aa2242315acaf0a67faea780b @@ -23036,18 +23222,18 @@ packages: purls: [] size: 70691 timestamp: 1762977015220 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.6-hb9d3cd8_0.conda - sha256: da5dc921c017c05f38a38bd75245017463104457b63a1ce633ed41f214159c14 - md5: febbab7d15033c913d53c7a2c102309d +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.7-hb03c661_0.conda + sha256: 79c60fc6acfd3d713d6340d3b4e296836a0f8c51602327b32794625826bd052f + md5: 34e54f03dfea3e7a2dcf1453a85f1085 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 license: MIT license_family: MIT purls: [] - size: 50060 - timestamp: 1727752228921 + size: 50326 + timestamp: 1769445253162 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-6.0.2-hb03c661_0.conda sha256: 83c4c99d60b8784a611351220452a0a85b080668188dce5dfa394b723d7b64f4 md5: ba231da7fccf9ea1e768caf5c7099b84 @@ -23074,20 +23260,20 @@ packages: purls: [] size: 47179 timestamp: 1727799254088 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.4-hb9d3cd8_0.conda - sha256: ac0f037e0791a620a69980914a77cb6bb40308e26db11698029d6708f5aa8e0d - md5: 2de7f99d6581a4a7adbff607b5c278ca +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.5-hb03c661_0.conda + sha256: 80ed047a5cb30632c3dc5804c7716131d767089f65877813d4ae855ee5c9d343 + md5: e192019153591938acf7322b6459d36e depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 - xorg-libxext >=1.3.6,<2.0a0 - - xorg-libxrender >=0.9.11,<0.10.0a0 + - xorg-libxrender >=0.9.12,<0.10.0a0 license: MIT license_family: MIT purls: [] - size: 29599 - timestamp: 1727794874300 + size: 30456 + timestamp: 1769445263457 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.12-hb9d3cd8_0.conda sha256: 044c7b3153c224c6cedd4484dd91b389d2d7fd9c776ad0f4a34f099b3389f4a1 md5: 96d57aba173e878a2089d5638016dc5e @@ -23114,19 +23300,30 @@ packages: purls: [] size: 32808 timestamp: 1727964811275 -- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.6-hb9d3cd8_0.conda - sha256: 8a4e2ee642f884e6b78c20c0892b85dd9b2a6e64a6044e903297e616be6ca35b - md5: 5efa5fa6243a622445fdfd72aee15efa +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxxf86vm-1.1.7-hb03c661_0.conda + sha256: 64db17baaf36fa03ed8fae105e2e671a7383e22df4077486646f7dbf12842c9f + md5: 665d152b9c6e78da404086088077c844 depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - xorg-libx11 >=1.8.10,<2.0a0 + - libgcc >=14 + - xorg-libx11 >=1.8.12,<2.0a0 - xorg-libxext >=1.3.6,<2.0a0 license: MIT license_family: MIT purls: [] - size: 17819 - timestamp: 1734214575628 + size: 18701 + timestamp: 1769434732453 +- conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xorgproto-2025.1-hb03c661_0.conda + sha256: 7a8c64938428c2bfd016359f9cb3c44f94acc256c6167dbdade9f2a1f5ca7a36 + md5: aa8d21be4b461ce612d8f5fb791decae + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + license: MIT + license_family: MIT + purls: [] + size: 570010 + timestamp: 1766154256151 - conda: https://conda.anaconda.org/conda-forge/noarch/xyzservices-2025.11.0-pyhd8ed1ab_0.conda sha256: b194a1fbc38f29c563b102ece9d006f7a165bf9074cdfe50563d3bce8cae9f84 md5: 16933322051fa260285f1a44aae91dd6 @@ -23231,15 +23428,15 @@ packages: - multidict>=4.0 - propcache>=0.2.1 requires_python: '>=3.9' -- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.5-pyhcf101f3_0.conda - sha256: c36bec7d02d2f227409fcc4cf586cf3a658af068b58374de7f8f2d0b5c1c84f9 - md5: c1844a94b2be61bb03bbb71574a0abfc +- conda: https://conda.anaconda.org/conda-forge/noarch/zarr-3.1.6-pyhc364b38_0.conda + sha256: 5b75534de2d56706bb9905cf7230e60fe4d89dcaf19095822b084c84a64a8de1 + md5: bf5ed37ec39d366c0bc7633e1590fbdf depends: - python >=3.11 - packaging >=22.0 - - numpy >=1.26 + - numpy >=2.0 - numcodecs >=0.14 - - typing_extensions >=4.9 + - typing_extensions >=4.12 - donfig >=0.8 - google-crc32c >=1.5 - python @@ -23250,66 +23447,62 @@ packages: license_family: MIT purls: - pkg:pypi/zarr?source=hash-mapping - size: 305998 - timestamp: 1763742695201 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h387f397_9.conda - sha256: 47cfe31255b91b4a6fa0e9dbaf26baa60ac97e033402dbc8b90ba5fee5ffe184 - md5: 8035e5b54c08429354d5d64027041cad + size: 320675 + timestamp: 1775744500266 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h41580af_10.conda + sha256: 325d370b28e2b9cc1f765c5b4cdb394c91a5d958fbd15da1a14607a28fee09f6 + md5: 755b096086851e1193f3b10347415d7c depends: - - libstdcxx >=14 - libgcc >=14 - __glibc >=2.17,<3.0.a0 - - libgcc >=14 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - libstdcxx >=14 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 310648 - timestamp: 1757370847287 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h6c33b1e_9.conda - sha256: 30aa5a2e9c7b8dbf6659a2ccd8b74a9994cdf6f87591fcc592970daa6e7d3f3c - md5: d940d809c42fbf85b05814c3290660f5 + size: 311150 + timestamp: 1772476812121 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zeromq-4.3.5-h27d9b8f_10.conda + sha256: c7265cc5184897358af8b87c614288bc79645ef4340e01c2cd8469078dc56007 + md5: 1a774dcaff94c2dd98451a26a46714b8 depends: - - __osx >=10.13 - libcxx >=19 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - __osx >=11.0 + - libsodium >=1.0.21,<1.0.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 259628 - timestamp: 1757371000392 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h888dc83_9.conda - sha256: b6f9c130646e5971f6cad708e1eee278f5c7eea3ca97ec2fdd36e7abb764a7b8 - md5: 26f39dfe38a2a65437c29d69906a0f68 + size: 260841 + timestamp: 1772476936933 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zeromq-4.3.5-h4818236_10.conda + sha256: 2705360c72d4db8de34291493379ffd13b09fd594d0af20c9eefa8a3f060d868 + md5: e85dcd3bde2b10081cdcaeae15797506 depends: - __osx >=11.0 - libcxx >=19 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 244772 - timestamp: 1757371008525 -- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h5bddc39_9.conda - sha256: 690cf749692c8ea556646d1a47b5824ad41b2f6dfd949e4cdb6c44a352fcb1aa - md5: a6c8f8ee856f7c3c1576e14b86cd8038 + size: 245246 + timestamp: 1772476886668 +- conda: https://conda.anaconda.org/conda-forge/win-64/zeromq-4.3.5-h507cc87_10.conda + sha256: b8568dfde46edf3455458912ea6ffb760e4456db8230a0cf34ecbc557d3c275f + md5: 1ab0237036bfb14e923d6107473b0021 depends: - vc >=14.3,<15 - vc14_runtime >=14.44.35208 - ucrt >=10.0.20348.0 - - vc >=14.3,<15 - - vc14_runtime >=14.44.35208 - - ucrt >=10.0.20348.0 - - libsodium >=1.0.20,<1.0.21.0a0 - - krb5 >=1.21.3,<1.22.0a0 + - libsodium >=1.0.21,<1.0.22.0a0 + - krb5 >=1.22.2,<1.23.0a0 license: MPL-2.0 license_family: MOZILLA purls: [] - size: 265212 - timestamp: 1757370864284 + size: 265665 + timestamp: 1772476832995 - conda: https://conda.anaconda.org/conda-forge/linux-64/zfp-1.0.1-h909a3a2_5.conda sha256: 5fabe6cccbafc1193038862b0b0d784df3dae84bc48f12cac268479935f9c8b7 md5: 6a0eb48e58684cca4d7acc8b7a0fd3c7 @@ -23382,53 +23575,52 @@ packages: - pkg:pypi/zipp?source=compressed-mapping size: 24194 timestamp: 1764460141901 -- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-hb9d3cd8_2.conda - sha256: 5d7c0e5f0005f74112a34a7425179f4eb6e73c92f5d109e6af4ddeca407c92ab - md5: c9f075ab2f33b3bbee9e62d4ad0a6cd8 +- conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.2-h25fd6f3_2.conda + sha256: 245c9ee8d688e23661b95e3c6dd7272ca936fabc03d423cdb3cdee1bbcf9f2f2 + md5: c2a01a08fc991620a74b32420e97868a depends: - __glibc >=2.17,<3.0.a0 - - libgcc >=13 - - libzlib 1.3.1 hb9d3cd8_2 + - libzlib 1.3.2 h25fd6f3_2 license: Zlib license_family: Other purls: [] - size: 92286 - timestamp: 1727963153079 -- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.1-hd23fc13_2.conda - sha256: 219edbdfe7f073564375819732cbf7cc0d7c7c18d3f546a09c2dfaf26e4d69f3 - md5: c989e0295dcbdc08106fe5d9e935f0b9 + size: 95931 + timestamp: 1774072620848 +- conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.3.2-hbb4bfdb_2.conda + sha256: 5dd728cebca2e96fa48d41661f1a35ed0ee3cb722669eee4e2d854c6745655eb + md5: 6276aa61ffc361cbf130d78cfb88a237 depends: - - __osx >=10.13 - - libzlib 1.3.1 hd23fc13_2 + - __osx >=11.0 + - libzlib 1.3.2 hbb4bfdb_2 license: Zlib license_family: Other purls: [] - size: 88544 - timestamp: 1727963189976 -- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.1-h8359307_2.conda - sha256: 58f8860756680a4831c1bf4f294e2354d187f2e999791d53b1941834c4b37430 - md5: e3170d898ca6cb48f1bb567afb92f775 + size: 92411 + timestamp: 1774073075482 +- conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.3.2-h8088a28_2.conda + sha256: 8dd2ac25f0ba714263aac5832d46985648f4bfb9b305b5021d702079badc08d2 + md5: f1c0bce276210bed45a04949cfe8dc20 depends: - __osx >=11.0 - - libzlib 1.3.1 h8359307_2 + - libzlib 1.3.2 h8088a28_2 license: Zlib license_family: Other purls: [] - size: 77606 - timestamp: 1727963209370 -- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.1-h2466b09_2.conda - sha256: 8c688797ba23b9ab50cef404eca4d004a948941b6ee533ead0ff3bf52012528c - md5: be60c4e8efa55fddc17b4131aa47acbd + size: 81123 + timestamp: 1774072974535 +- conda: https://conda.anaconda.org/conda-forge/win-64/zlib-1.3.2-hfd05255_2.conda + sha256: ef408f85f664a4b9c9dac3cb2e36154d9baa15a88984ea800e11060e0f2394a1 + md5: 5187ecf958be3c39110fe691cbd6873e depends: - - libzlib 1.3.1 h2466b09_2 + - libzlib 1.3.2 hfd05255_2 - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 license: Zlib license_family: Other purls: [] - size: 107439 - timestamp: 1727963788936 + size: 850351 + timestamp: 1774072891049 - conda: https://conda.anaconda.org/conda-forge/linux-64/zlib-ng-2.3.2-hceb46e0_1.conda sha256: f2b6a175677701a0b6ce556b3bd362dc94a4e36ffcd10e3860e52ca036b4ad96 md5: 40feea2979654ed579f1cda7c63ccb94 From 4a2aab890d0d7fe3f19d97f3dbe53813f2543ad1 Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Tue, 21 Apr 2026 17:26:06 -0600 Subject: [PATCH 69/71] Add labels --- .github/workflows/bench.yml | 6 ++-- .github/workflows/ci-python.yml | 20 +++++------ .github/workflows/ci-rust.yml | 14 ++++---- .github/workflows/codecov.yml | 4 +-- .github/workflows/codeql.yml | 6 ++-- .github/workflows/docs.yml | 4 +-- .github/workflows/release-python.yml | 50 ++++++++++++++-------------- .github/workflows/release-rust.yml | 20 +++++------ 8 files changed, 62 insertions(+), 62 deletions(-) diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index 17a2b0df..0778b4fc 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -19,7 +19,7 @@ jobs: name: Run Rust benchmark with criterion runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -29,7 +29,7 @@ jobs: cache-write: false environments: dev - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" save-if: false @@ -40,7 +40,7 @@ jobs: pixi r -e dev cargo --locked criterion --output-format bencher --benches 2>&1 | tee output.txt - name: Store benchmark result - uses: benchmark-action/github-action-benchmark@a60cea5bc7b49e15c1f58f411161f99e0df48372 + uses: benchmark-action/github-action-benchmark@a60cea5bc7b49e15c1f58f411161f99e0df48372 # v1.22.0 if: ${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} with: name: Rust Benchmark diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 728839b9..5fb8a951 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -15,13 +15,13 @@ jobs: name: Lint Python Code Base with Ruff runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd - - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 with: version: "latest" args: "check" src: "./revrt" - - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 with: version: "latest" args: "format --check" @@ -37,7 +37,7 @@ jobs: steps: - name: Checkout Repo - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true @@ -65,7 +65,7 @@ jobs: steps: - name: Checkout Repo - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true @@ -94,7 +94,7 @@ jobs: steps: - name: Checkout Repo - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true @@ -126,13 +126,13 @@ jobs: python-version: ['3.13', '3.12',] steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: ${{ matrix.python-version }} cache: 'pip' @@ -143,7 +143,7 @@ jobs: python -m pip install tox tox-gh-actions>=2.0 - name: Load tox cache - uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae + uses: actions/cache/restore@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: path: .tox/ key: ${{ runner.os }}-${{ matrix.python-version }}-tox-v1-${{ hashFiles('**/pyproject.toml') }} @@ -158,7 +158,7 @@ jobs: - name: Save tox cache only on main if: github.ref == 'refs/heads/main' - uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae + uses: actions/cache/save@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5 with: path: .tox/ key: ${{ runner.os }}-${{ matrix.python-version }}-tox-v1-${{ hashFiles('**/pyproject.toml') }} diff --git a/.github/workflows/ci-rust.yml b/.github/workflows/ci-rust.yml index c29aed70..c51d9fd7 100644 --- a/.github/workflows/ci-rust.yml +++ b/.github/workflows/ci-rust.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -26,7 +26,7 @@ jobs: cache-write: ${{ github.ref == 'refs/heads/main' }} environments: dev - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" # Don't cache for cargo check @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout sources - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -53,7 +53,7 @@ jobs: cache-write: ${{ github.ref == 'refs/heads/main' }} environments: dev - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" # Don't cache for cargo fmt/clippy @@ -78,9 +78,9 @@ jobs: os: [ubuntu-latest, macos-latest, windows-latest] steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af + - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.6 with: toolchain: 1.87.0 override: true @@ -94,7 +94,7 @@ jobs: cache-write: ${{ github.ref == 'refs/heads/main' }} environments: dev - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" save-if: ${{ github.ref == 'refs/heads/main' }} diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index 502f3e8b..a5c32017 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -13,7 +13,7 @@ jobs: permissions: contents: read steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true @@ -32,7 +32,7 @@ jobs: pixi run -e dev --locked tests - name: Upload coverage to Codecov - uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 + uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0 with: token: ${{ secrets.CODECOV_TOKEN }} files: ./coverage.xml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a5c22c9e..7055aec1 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -32,15 +32,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Initialize CodeQL - uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 + uses: github/codeql-action/init@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 + uses: github/codeql-action/analyze@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # v4 with: category: "/language:${{matrix.language}}" \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 13aa8a62..c25fa8fc 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Pull Repo - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true @@ -34,7 +34,7 @@ jobs: run: pixi run -e dev python-docs # This errors on warnings - name: deploy - uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e + uses: peaceiris/actions-gh-pages@4f9cc6602d3f66b9c108549d475ec49e8ef4d45e # v4.0.0 if: startsWith(github.ref, 'refs/tags/v') with: github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release-python.yml b/.github/workflows/release-python.yml index 6d6adc6e..ed5225a4 100644 --- a/.github/workflows/release-python.yml +++ b/.github/workflows/release-python.yml @@ -30,29 +30,29 @@ jobs: # - runner: ubuntu-22.04 # target: ppc64le steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.x - name: Build wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Build free-threaded wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.13t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: auto - name: Upload wheels - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wheels-linux-${{ matrix.platform.target }} path: dist @@ -71,29 +71,29 @@ jobs: - runner: ubuntu-22.04 target: armv7 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.x - name: Build wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Build free-threaded wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.13t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} manylinux: musllinux_1_2 - name: Upload wheels - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wheels-musllinux-${{ matrix.platform.target }} path: dist @@ -108,32 +108,32 @@ jobs: - runner: windows-latest target: x86 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.x architecture: ${{ matrix.platform.target }} - name: Build wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.13t architecture: ${{ matrix.platform.target }} - name: Build free-threaded wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.13t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wheels-windows-${{ matrix.platform.target }} path: dist @@ -148,27 +148,27 @@ jobs: - runner: macos-14 target: aarch64 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 + - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 with: python-version: 3.x - name: Build wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Build free-threaded wheels - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: ${{ matrix.platform.target }} args: --release --out dist -i python3.13t sccache: ${{ !startsWith(github.ref, 'refs/tags/') }} - name: Upload wheels - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wheels-macos-${{ matrix.platform.target }} path: dist @@ -176,17 +176,17 @@ jobs: sdist: runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 fetch-tags: true - name: Build sdist - uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: command: sdist args: --out dist - name: Upload sdist - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: wheels-sdist path: dist @@ -216,6 +216,6 @@ jobs: find wheels-* -type f \( -name "*.whl" -o -name "*.tar.gz" \) -exec cp {} dist/ \; - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/v') }} - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.14.0 with: packages-dir: dist diff --git a/.github/workflows/release-rust.yml b/.github/workflows/release-rust.yml index 562bff05..fa0e5aa3 100644 --- a/.github/workflows/release-rust.yml +++ b/.github/workflows/release-rust.yml @@ -17,7 +17,7 @@ jobs: name: Verify publish runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -26,7 +26,7 @@ jobs: frozen: true cache-write: ${{ github.ref == 'refs/heads/main' }} - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" save-if: ${{ github.ref == 'refs/heads/main' }} @@ -41,7 +41,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/r') runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -50,7 +50,7 @@ jobs: frozen: true cache-write: ${{ github.ref == 'refs/heads/main' }} - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" save-if: false @@ -67,7 +67,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/c') runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - uses: prefix-dev/setup-pixi@1b2de7f3351f171c8b4dfeb558c639cb58ed4ec0 # v0.9.5 with: @@ -76,7 +76,7 @@ jobs: frozen: true cache-write: ${{ github.ref == 'refs/heads/main' }} - - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 + - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: shared-key: "gha" save-if: false @@ -121,10 +121,10 @@ jobs: strip: strip steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Rust - uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af + uses: actions-rs/toolchain@16499b5e05bf2e26879000db0c1d13f7e13fa3af # v1.0.6 with: toolchain: stable profile: minimal @@ -148,7 +148,7 @@ jobs: fi - name: Build - uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 + uses: actions-rs/cargo@844f36862e911db73fe0815f00a4a2602c279505 # v1.0.6 with: use-cross: ${{ matrix.use-cross }} command: build @@ -159,7 +159,7 @@ jobs: run: ${{ matrix.strip }} target/${{ matrix.target }}/release/revrt-cli${{ matrix.binary_ext }} - name: Upload binaries to release - uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de + uses: svenstaro/upload-release-action@29e53e917877a24fad85510ded594ab3c9ca12de # v2.11.5 with: repo_token: ${{ secrets.GITHUB_TOKEN }} file: target/${{ matrix.target }}/release/revrt-cli${{ matrix.binary_ext }} From ec5aa775cb1b26541a5a1be0614531cbc0f7068f Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Tue, 21 Apr 2026 17:31:14 -0600 Subject: [PATCH 70/71] Fix tags --- .github/workflows/ci-python.yml | 4 ++-- .github/workflows/release-python.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-python.yml b/.github/workflows/ci-python.yml index 5fb8a951..c1911f64 100644 --- a/.github/workflows/ci-python.yml +++ b/.github/workflows/ci-python.yml @@ -16,12 +16,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v3.6.1 with: version: "latest" args: "check" src: "./revrt" - - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v4.0.0 + - uses: astral-sh/ruff-action@0ce1b0bf8b818ef400413f810f8a11cdbda0034b # v3.6.1 with: version: "latest" args: "format --check" diff --git a/.github/workflows/release-python.yml b/.github/workflows/release-python.yml index ed5225a4..1c835aab 100644 --- a/.github/workflows/release-python.yml +++ b/.github/workflows/release-python.yml @@ -216,6 +216,6 @@ jobs: find wheels-* -type f \( -name "*.whl" -o -name "*.tar.gz" \) -exec cp {} dist/ \; - name: Publish to PyPI if: ${{ startsWith(github.ref, 'refs/tags/v') }} - uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.14.0 + uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0 with: packages-dir: dist From 88e5e3127c27475d87d520eb8396cd19afd039bf Mon Sep 17 00:00:00 2001 From: ppinchuk Date: Tue, 21 Apr 2026 17:32:14 -0600 Subject: [PATCH 71/71] Fix docs --- docs/source/conf.py | 1 - docs/source/pkg_resources.py | 8 -- pixi.lock | 162 +++++++++++++++-------------------- pyproject.toml | 7 +- 4 files changed, 70 insertions(+), 108 deletions(-) delete mode 100644 docs/source/pkg_resources.py diff --git a/docs/source/conf.py b/docs/source/conf.py index 1a68226e..2ea193cb 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -15,7 +15,6 @@ import os import sys -sys.path.insert(0, os.path.abspath(".")) sys.path.insert(0, os.path.abspath("../../")) # -- Project information ----------------------------------------------------- diff --git a/docs/source/pkg_resources.py b/docs/source/pkg_resources.py deleted file mode 100644 index 82268d00..00000000 --- a/docs/source/pkg_resources.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Compatibility shim for extensions that still import pkg_resources. - -This docs build only needs ``declare_namespace`` for ``sphinx_tabs``. -""" - - -def declare_namespace(_name): - """No-op namespace declaration for legacy setuptools consumers.""" diff --git a/pixi.lock b/pixi.lock index af235df7..553ed981 100644 --- a/pixi.lock +++ b/pixi.lock @@ -244,7 +244,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda @@ -258,10 +257,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -316,6 +314,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -539,7 +538,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py314he40e093_1.conda @@ -551,10 +549,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -608,6 +605,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl @@ -831,7 +829,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda @@ -843,10 +840,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -900,6 +896,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl @@ -1115,7 +1112,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda @@ -1127,10 +1123,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -1191,6 +1186,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl @@ -1409,7 +1405,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda @@ -1422,10 +1417,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -1479,6 +1473,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -1676,7 +1671,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py314he40e093_1.conda @@ -1688,10 +1682,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -1744,6 +1737,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl @@ -1941,7 +1935,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda @@ -1953,10 +1946,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -2009,6 +2001,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl @@ -2197,7 +2190,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda @@ -2209,10 +2201,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -2272,6 +2263,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl @@ -2702,7 +2694,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.15.11-h7805a7d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda @@ -2726,10 +2717,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -2827,6 +2817,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -3199,7 +3190,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rpds-py-0.30.0-py314ha7b6dee_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ruff-0.15.11-h16586dd_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda @@ -3221,10 +3211,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -3299,6 +3288,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl @@ -3671,7 +3661,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rpds-py-0.30.0-py314haad56a0_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.15.11-hc5c3a1d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda @@ -3693,10 +3682,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -3771,6 +3759,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl @@ -4152,7 +4141,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rpds-py-0.30.0-py314h9f07db2_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.15.11-h02f8532_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/ruff-lsp-0.0.62-pyhd8ed1ab_0.conda @@ -4174,10 +4162,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -4260,6 +4247,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl @@ -4488,7 +4476,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda @@ -4502,10 +4489,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -4559,6 +4545,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -4766,7 +4753,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-learn-1.8.0-np2py314he40e093_1.conda @@ -4779,10 +4765,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -4835,6 +4820,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl @@ -5042,7 +5028,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-learn-1.8.0-np2py314h15f0f0f_1.conda @@ -5055,10 +5040,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -5111,6 +5095,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl @@ -5309,7 +5294,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-learn-1.8.0-np2py314h1b5b07a_1.conda @@ -5322,10 +5306,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.8.1-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -5385,6 +5368,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl @@ -5638,7 +5622,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rust-1.94.0-h53717f1_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-unknown-linux-gnu-1.94.0-h2c6d0dc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/s2n-1.7.1-h1cbb8d7_1.conda @@ -5654,10 +5637,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -5717,6 +5699,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/7c/a3/8ffe10a49652bfd769348c6eca577463c2b3938baab5e62f3896fc5da0b7/pyjson5-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl @@ -5949,7 +5932,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rust-1.94.0-h5655b98_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-apple-darwin-1.94.0-h38e4360_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/scikit-image-0.26.0-np2py314h08932fc_0.conda @@ -5964,10 +5946,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -6026,6 +6007,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/a6/f4/8c948e8a8b1a518fe87a114df1d58ab5f80b55b6601b64f8649438293bfd/pyjson5-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl @@ -6258,7 +6240,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rust-1.94.0-h4ff7c5d_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-aarch64-apple-darwin-1.94.0-hf6ec828_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/scikit-image-0.26.0-np2py314hc49a259_0.conda @@ -6273,10 +6254,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -6335,6 +6315,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/39/1b/9cd7acea4c0e5a4ed44a79b99fc7e3a50b69639ea9f926efc35d660bef04/pyjson5-2.0.0-cp314-cp314-macosx_11_0_arm64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl @@ -6559,7 +6540,6 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhcf101f3_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rioxarray-0.22.0-pyhc364b38_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-4.1.0-pyhd8ed1ab_0.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/rust-1.94.0-hf8d6059_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/rust-std-x86_64-pc-windows-msvc-1.94.0-h17fc481_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/scikit-image-0.26.0-np2py314he3c5115_0.conda @@ -6574,10 +6554,9 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-3.0.1-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/snuggs-1.4.7-pyhd8ed1ab_2.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_1.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-2.0.0-pyhd8ed1ab_1.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.1.0-pyhd8ed1ab_1.conda @@ -6643,6 +6622,7 @@ environments: - pypi: https://files.pythonhosted.org/packages/52/8c/1bb60288c4d480a0b51e376a17d6c4d932dc8420989d1db440e3b284aad5/pyjson5-2.0.0-cp314-cp314-win_amd64.whl - pypi: https://files.pythonhosted.org/packages/63/86/df4771915e64a564c577ea2573956861c9c9f6c79450b172c5f9277cc48a/requests_unixsocket-0.4.1-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/8c/04797ebb53748b4d594d4c334b2d9a99f2d2e06e19ad505f1313ca5d56eb/s3fs-2025.12.0-py3-none-any.whl + - pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl - pypi: https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl @@ -17770,7 +17750,7 @@ packages: - pypi: ./ name: nlr-revrt version: 0.6.0 - sha256: 962347cd337cd66a8d9b5f5dd20d8785bc83de178f301283da888b4082d4e4c7 + sha256: baecd2f9be960ad588d73743dd1c1f508aaac09e18a042e8015227e428ba0ef3 requires_dist: - affine>=2.4.0,<3 - dask>=2026.3.0,<2027 @@ -17815,10 +17795,10 @@ packages: - myst-parser>=5.0.0,<6 ; extra == 'doc' - numpydoc>=1.10.0,<2 ; extra == 'doc' - pydata-sphinx-theme>=0.17.1,<0.18 ; extra == 'doc' - - sphinx>=8.2.3,<9 ; extra == 'doc' + - sphinx>=9.1.0,<10 ; extra == 'doc' - sphinx-click>=6.2.0,<7 ; extra == 'doc' - sphinx-copybutton>=0.5.2,<0.6 ; extra == 'doc' - - sphinx-tabs>=3.4.1,<4 ; extra == 'doc' + - sphinx-tabs>=3.5,<4 ; extra == 'doc' - sphinxcontrib-mermaid>=2.0.1,<3 ; extra == 'doc' - build>=1.4.3,<2 ; extra == 'build' - pkginfo>=1.12.1.2,<2 ; extra == 'build' @@ -20971,17 +20951,6 @@ packages: - pkg:pypi/roman-numerals?source=compressed-mapping size: 13814 timestamp: 1766003022813 -- conda: https://conda.anaconda.org/conda-forge/noarch/roman-numerals-py-4.1.0-pyhd8ed1ab_0.conda - sha256: ce21b50a412b87b388db9e8dfbf8eb16fc436c23750b29bf612ee1a74dd0beb2 - md5: 28687768633154993d521aecfa4a56ac - depends: - - python >=3.10 - - roman-numerals 4.1.0 - license: 0BSD OR CC0-1.0 - purls: - - pkg:pypi/roman-numerals-py?source=compressed-mapping - size: 11074 - timestamp: 1766025162370 - conda: https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.30.0-py314h2e6c369_0.conda sha256: e53b0cbf3b324eaa03ca1fe1a688fdf4ab42cea9c25270b0a7307d8aaaa4f446 md5: c1c368b5437b0d1a68f372ccf01cb133 @@ -21875,21 +21844,21 @@ packages: - pkg:pypi/soupsieve?source=compressed-mapping size: 37951 timestamp: 1766075884412 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-8.2.3-pyhd8ed1ab_0.conda - sha256: 995f58c662db0197d681fa345522fd9e7ac5f05330d3dff095ab2f102e260ab0 - md5: f7af826063ed569bb13f7207d6f949b0 +- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-9.1.0-pyhd8ed1ab_0.conda + sha256: 035ca4b17afca3d53650380dd94c564555b7ec2b4f8818111f98c15c7a991b7b + md5: aabfbc2813712b71ba8beb217a978498 depends: - alabaster >=0.7.14 - babel >=2.13 - colorama >=0.4.6 - - docutils >=0.20,<0.22 + - docutils >=0.21,<0.23 - imagesize >=1.3 - jinja2 >=3.1 - packaging >=23.0 - pygments >=2.17 - - python >=3.11 + - python >=3.12 - requests >=2.30.0 - - roman-numerals-py >=1.0.0 + - roman-numerals >=1.0.0 - snowballstemmer >=2.2 - sphinxcontrib-applehelp >=1.0.7 - sphinxcontrib-devhelp >=1.0.6 @@ -21901,8 +21870,8 @@ packages: license_family: BSD purls: - pkg:pypi/sphinx?source=hash-mapping - size: 1424416 - timestamp: 1740956642838 + size: 1584836 + timestamp: 1767271941650 - conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-click-6.2.0-pyhcf101f3_0.conda sha256: 06b0f716b80b504e1f5a50ad6be3e3faaabc0c398e779a8253baf5c0e6aef6e2 md5: bad3e6be48f688549fc0129e3a8866d7 @@ -21930,20 +21899,23 @@ packages: - pkg:pypi/sphinx-copybutton?source=hash-mapping size: 17893 timestamp: 1734573117732 -- conda: https://conda.anaconda.org/conda-forge/noarch/sphinx-tabs-3.4.1-pyhd8ed1ab_1.conda - sha256: 43c343edc9ea11ffd947d97fa60bf6347a404700e2cde81fb954e60b7e6a42c1 - md5: 8b8362d876396fd967cbb5f404def907 - depends: - - docutils >=0.18.0 +- pypi: https://files.pythonhosted.org/packages/2e/45/6adc5efeb19fd5fed4027e520b5c668ce58236a2b271ade5533c4c116276/sphinx_tabs-3.5.0-py3-none-any.whl + name: sphinx-tabs + version: 3.5.0 + sha256: 154be49de4d5c8249ea08c5d9bf88ca8f9c31e00a178305a93cbc33e000339e5 + requires_dist: + - sphinx>=7 - pygments - - python >=3.6 - - sphinx >=2 - license: MIT - license_family: MIT - purls: - - pkg:pypi/sphinx-tabs?source=hash-mapping - size: 15026 - timestamp: 1675342588275 + - docutils + - coverage ; extra == 'testing' + - pytest>=7.1 ; extra == 'testing' + - pytest-cov ; extra == 'testing' + - pytest-regressions ; extra == 'testing' + - pygments ; extra == 'testing' + - bs4 ; extra == 'testing' + - rinohtype ; extra == 'testing' + - pre-commit==2.13.0 ; extra == 'code-style' + requires_python: '>=3.10' - conda: https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-2.0.0-pyhd8ed1ab_1.conda sha256: d7433a344a9ad32a680b881c81b0034bc61618d12c39dd6e3309abeffa9577ba md5: 16e3f039c0aa6446513e94ab18a8784b diff --git a/pyproject.toml b/pyproject.toml index af3fdfaa..b6a72628 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,10 +83,10 @@ doc = [ "myst-parser>=5.0.0,<6", "numpydoc>=1.10.0,<2", "pydata-sphinx-theme>=0.17.1,<0.18", - "sphinx>=8.2.3,<9", + "sphinx>=9.1.0,<10", "sphinx-click>=6.2.0,<7", "sphinx-copybutton>=0.5.2,<0.6", - "sphinx-tabs>=3.4.1,<4", + "sphinx-tabs>=3.5,<4", "sphinxcontrib-mermaid>=2.0.1,<3", ] build = [ @@ -312,10 +312,9 @@ myst-parser = ">=5.0.0,<6" numpydoc = ">=1.10.0,<2" pandoc = ">=3.9.0.2,<4" pydata-sphinx-theme = ">=0.17.1,<0.18" -sphinx = ">=8.2.3,<9" # v9+ not yet compatible with sphinx-tabs +sphinx = ">=9.1.0,<10" sphinx-click = ">=6.2.0,<7" sphinx-copybutton = ">=0.5.2,<0.6" -sphinx-tabs = ">=3.4.1,<4" sphinxcontrib-mermaid = ">=2.0.1,<3" [tool.pixi.feature.build.dependencies]