From e07247515b440dc1ef2b3214038004f44517c62e Mon Sep 17 00:00:00 2001 From: Volt Date: Sun, 15 Nov 2026 11:25:45 +0100 Subject: [PATCH] feat: EAGLE3 speculative decoding, hybrid N-gram cascade, and RDNA3.5 Vulkan optimizations --- src/config.rs | 19 + src/cpu_worker.rs | 4 +- src/expert_cache.rs | 23 +- src/gguf.rs | 245 +++++ src/gpu_model.rs | 688 ++++++++++-- src/gpu_model/prefill.rs | 74 +- src/lib.rs | 1 + src/main.rs | 163 ++- src/model.rs | 284 ++++- src/ngram.rs | 1247 ++++++++++++++++++++++ src/vulkan/mod.rs | 120 ++- src/vulkan/preflight.rs | 25 + src/vulkan/shaders/attn_merge.comp | 4 +- src/vulkan/shaders/common.glsl | 6 +- src/vulkan/shaders/deq.glsl | 74 +- src/vulkan/shaders/gemv_q.comp | 7 +- src/vulkan/shaders/moe_down_combine.comp | 34 +- src/vulkan/shaders/moe_gemv_q.comp | 73 +- src/vulkan/spv/attn_merge.spv | Bin 9700 -> 8816 bytes src/vulkan/spv/dequant.spv | Bin 55240 -> 55080 bytes src/vulkan/spv/gemm_f.spv | Bin 124560 -> 124452 bytes src/vulkan/spv/gemm_f_dp.spv | Bin 127760 -> 127612 bytes src/vulkan/spv/gemm_fs.spv | Bin 116524 -> 116416 bytes src/vulkan/spv/gemmi.spv | Bin 225580 -> 225260 bytes src/vulkan/spv/gemmi_dp.spv | Bin 223220 -> 222900 bytes src/vulkan/spv/gemmi_s.spv | Bin 225476 -> 225156 bytes src/vulkan/spv/gemv_f.spv | Bin 155844 -> 155364 bytes src/vulkan/spv/gemv_q.spv | Bin 170396 -> 259960 bytes src/vulkan/spv/kv_store.spv | Bin 10184 -> 7732 bytes src/vulkan/spv/moe_down_combine.spv | Bin 281828 -> 574148 bytes src/vulkan/spv/moe_gemv_f.spv | Bin 57244 -> 57084 bytes src/vulkan/spv/moe_gemv_q.spv | Bin 327876 -> 693980 bytes src/vulkan/spv/norm_gate.spv | Bin 29672 -> 27184 bytes src/vulkan/spv/quant_q8.spv | Bin 8132 -> 5584 bytes src/vulkan/spv/quant_xq.spv | Bin 22716 -> 20168 bytes src/vulkan/spv/rms_norm.spv | Bin 45280 -> 40400 bytes src/weights.rs | 50 +- tests/gpu_model.rs | 53 + tests/kernels.rs | 4 +- tests/serve.rs | 4 +- 40 files changed, 3029 insertions(+), 173 deletions(-) create mode 100644 src/ngram.rs diff --git a/src/config.rs b/src/config.rs index dde95cce..24345202 100644 --- a/src/config.rs +++ b/src/config.rs @@ -6,6 +6,23 @@ use anyhow::{Context, bail}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum LayerKind { Delta, Attn } +/// Standalone EAGLE3 1-layer draft head parameters. +#[derive(Clone, Debug)] +pub struct Eagle3Config { + pub extract_layers: [usize; 3], + pub n_ff: usize, + pub n_head: usize, + pub n_head_kv: usize, + pub head_dim: usize, + pub n_rot: usize, + pub rope_base: f32, + pub eps: f32, + pub draft_vocab: usize, + pub norm_before_residual: bool, + pub rope_neox: bool, + pub d2t: Vec, +} + /// What differs between the supported architectures; everything else comes from GGUF metadata. struct Arch { /// DeltaNet layers with full attention every `full_attention_interval` layers; otherwise all attention. @@ -88,6 +105,7 @@ pub struct ModelConfig { pub q_gate: bool, pub k_interleave: bool, pub aliases: &'static [(&'static str, &'static str)], + pub eagle3: Option, } impl ModelConfig { @@ -175,6 +193,7 @@ impl ModelConfig { k_interleave: a.k_interleave, aliases: a.aliases, arch, + eagle3: None, }; // Kernels divide by these and index value heads by nv / nk key heads. let (nk, nv) = (c.ssm_n_group, c.ssm_dt_rank); diff --git a/src/cpu_worker.rs b/src/cpu_worker.rs index 142d6117..4c89e139 100644 --- a/src/cpu_worker.rs +++ b/src/cpu_worker.rs @@ -22,8 +22,8 @@ pub const VERDICT: usize = 8; pub const DONE: usize = 16; pub const IDS: usize = 32; -/// Most tokens one request may carry. -pub const TMAX: usize = 4; +/// Most tokens one request may carry (1 current + up to 16 speculative draft tokens). +pub const TMAX: usize = 17; /// Per layer: ids, weights and slots for up to TMAX tokens of `k` entries (token t at t * k; the three arrays are /// each NTOK * k long), then TMAX activations of `n` floats at `h` and TMAX results at `y`. diff --git a/src/expert_cache.rs b/src/expert_cache.rs index fcb559d7..de22cdb4 100644 --- a/src/expert_cache.rs +++ b/src/expert_cache.rs @@ -5,7 +5,6 @@ use crate::backend::{Backend, Buf}; use crate::model::Model; use crate::quant::GgmlType; -use std::collections::BTreeMap; use std::path::PathBuf; /// Share of each count kept per `adapt` (every 8 tokens by default): `counts` and `long`. @@ -63,8 +62,9 @@ impl ExpertCache { let n_layers = range.end; let c = &m.cfg; let n = c.n_expert; + const MAX_POOL_FULL_BYTES: usize = 8192 << 20; let mut layers: Vec> = Vec::new(); - let mut classes = BTreeMap::::new(); // slot bytes -> experts of that size + let mut pool_specs: Vec<(usize, usize)> = Vec::new(); // (slot_bytes, experts in pool) for il in 0..n_layers { if !c.is_moe_layer(il) || !range.contains(&il) { layers.push(None); continue; } let mut off = 0; @@ -74,10 +74,17 @@ impl ExpertCache { mats[i] = Mat { ty: t.ty, rows: t.rows, cols: t.cols, off, bytes: t.data.len() }; off = (off + t.data.len()).next_multiple_of(16); // GEMV kernels read 8-byte words } - *classes.entry(off).or_default() += n; - layers.push(Some((off, mats))); + let pid = pool_specs + .iter() + .position(|&(sb, cnt)| sb == off && (cnt + n) * off <= MAX_POOL_FULL_BYTES) + .unwrap_or_else(|| { + pool_specs.push((off, 0)); + pool_specs.len() - 1 + }); + pool_specs[pid].1 += n; + layers.push(Some((pid, mats))); } - let total: usize = classes.iter().map(|(b, k)| b * k).sum(); + let total: usize = pool_specs.iter().map(|(b, k)| b * k).sum(); let mut frac = (budget as f64 / total.max(1) as f64).min(1.0); let profile = std::env::var_os("STRATA_FIXED_EXPERTS").is_none().then(|| profile_path(m)); let counts = profile.as_ref().and_then(|p| std::fs::read(p).ok()) @@ -94,7 +101,7 @@ impl ExpertCache { // The budget comes from the driver's free-memory estimate, which can be more than it will allocate (AMD's // Windows driver): on a failed allocation, free the pools and try a tenth less. let pools = loop { - let r = classes.iter().map(|(&slot_bytes, &k)| { + let r = pool_specs.iter().map(|&(slot_bytes, k)| { let slots = (frac * k as f64) as usize; Ok(Pool { buf: gpu.zeros::(slots * slot_bytes)?, slot_bytes, owner: Vec::with_capacity(slots) }) }).collect::>>(); @@ -111,8 +118,8 @@ impl ExpertCache { for l in &layers { out.push(match l { None => None, - Some((sb, mats)) => Some(LayerExperts { - pool: classes.keys().position(|k| k == sb).unwrap(), mats: *mats, table: vec![-1; n], + Some((pid, mats)) => Some(LayerExperts { + pool: *pid, mats: *mats, table: vec![-1; n], table_dev: { let b = gpu.zeros::(n)?; gpu.put(&vec![-1i32; n], &b, 0)?; b }, }), }); diff --git a/src/gguf.rs b/src/gguf.rs index cc867493..69a60e39 100644 --- a/src/gguf.rs +++ b/src/gguf.rs @@ -153,4 +153,249 @@ impl Gguf { let o = data_offset + t.offset as usize; &mmap[o..o + n] } + + /// Raw bytes for auxiliary metadata tensors whose GGML type is not in `GgmlType` (e.g. EAGLE3 `d2t` I32/I64). + pub fn raw_bytes(&self, t: &TensorInfo, byte_len: usize) -> anyhow::Result<&[u8]> { + let (mmap, data_offset) = &self.files[t.file]; + let o = data_offset + t.offset as usize; + mmap.get(o..o + byte_len).context("GGUF tensor bytes out of range") + } +} + +/// Convert a HuggingFace EAGLE3 `.safetensors` checkpoint + `config.json` into a GGUF v3 draft model. +/// +/// Mirrors `tools/convert_eagle3_to_gguf.py` natively in Rust: 2D linear weights stay in BF16 (or convert from +/// F32/F16), 1D RMS norms convert to F32, NeoX RoPE is preserved (`eagle3.rope.neox = true`), and `d2t` relative +/// offsets are stored as absolute target vocabulary IDs (`I32`). +pub fn convert_safetensors_eagle3_to_gguf( + st_path: &Path, + cfg_path: &Path, + out_gguf: &Path, + target_layers_default: usize, +) -> anyhow::Result<()> { + use half::{bf16, f16}; + use std::borrow::Cow; + use std::io::{BufWriter, Write}; + + const GGUF_VERSION: u32 = 3; + const ALIGNMENT: usize = 32; + const GGUF_TYPE_UINT32: u32 = 4; + const GGUF_TYPE_INT32: u32 = 5; + const GGUF_TYPE_FLOAT32: u32 = 6; + const GGUF_TYPE_BOOL: u32 = 7; + const GGUF_TYPE_STRING: u32 = 8; + const GGUF_TYPE_ARRAY: u32 = 9; + const GGML_TYPE_F32: u32 = 0; + const GGML_TYPE_I32: u32 = 26; + const GGML_TYPE_BF16: u32 = 30; + + const TENSOR_MAP: [(&str, &str, u32); 13] = [ + ("fc.weight", "fc.weight", GGML_TYPE_BF16), + ("midlayer.input_layernorm.weight", "blk.0.attn_norm.weight", GGML_TYPE_F32), + ("midlayer.hidden_norm.weight", "blk.0.attn_norm_2.weight", GGML_TYPE_F32), + ("midlayer.self_attn.q_proj.weight", "blk.0.attn_q.weight", GGML_TYPE_BF16), + ("midlayer.self_attn.k_proj.weight", "blk.0.attn_k.weight", GGML_TYPE_BF16), + ("midlayer.self_attn.v_proj.weight", "blk.0.attn_v.weight", GGML_TYPE_BF16), + ("midlayer.self_attn.o_proj.weight", "blk.0.attn_output.weight", GGML_TYPE_BF16), + ("midlayer.post_attention_layernorm.weight", "blk.0.ffn_norm.weight", GGML_TYPE_F32), + ("midlayer.mlp.gate_proj.weight", "blk.0.ffn_gate.weight", GGML_TYPE_BF16), + ("midlayer.mlp.up_proj.weight", "blk.0.ffn_up.weight", GGML_TYPE_BF16), + ("midlayer.mlp.down_proj.weight", "blk.0.ffn_down.weight", GGML_TYPE_BF16), + ("norm.weight", "output_norm.weight", GGML_TYPE_F32), + ("lm_head.weight", "output.weight", GGML_TYPE_BF16), + ]; + + let cfg_str = std::fs::read_to_string(cfg_path).with_context(|| format!("read {}", cfg_path.display()))?; + let cfg: serde_json::Value = serde_json::from_str(&cfg_str).with_context(|| format!("parse {}", cfg_path.display()))?; + let layer_cfg = cfg.get("transformer_layer_config").unwrap_or(&cfg); + + let req_u64 = |k: &str| -> anyhow::Result { + layer_cfg.get(k).or_else(|| cfg.get(k)).and_then(|v| v.as_u64()) + .with_context(|| format!("{}: missing integer key {k}", cfg_path.display())) + }; + let n_embd = req_u64("hidden_size")? as u32; + let n_ff = req_u64("intermediate_size")? as u32; + let n_head = req_u64("num_attention_heads")? as u32; + let n_head_kv = req_u64("num_key_value_heads")? as u32; + let head_dim = layer_cfg.get("head_dim").or_else(|| cfg.get("head_dim")).and_then(|v| v.as_u64()).map(|v| v as u32).unwrap_or_else(|| n_embd / n_head.max(1)); + let eps = layer_cfg.get("rms_norm_eps").or_else(|| cfg.get("rms_norm_eps")).and_then(|v| v.as_f64()).unwrap_or(1e-6) as f32; + let rope_theta = layer_cfg.get("rope_theta").or_else(|| cfg.get("rope_theta")).and_then(|v| v.as_f64()).unwrap_or(1_000_000.0) as f32; + let norm_before_residual = cfg.get("norm_before_residual").and_then(|v| v.as_bool()).unwrap_or(false); + + let st_file = std::fs::File::open(st_path).with_context(|| format!("open {}", st_path.display()))?; + let mmap = unsafe { Mmap::map(&st_file)? }; + anyhow::ensure!(mmap.len() >= 8, "{}: safetensors file truncated", st_path.display()); + let hdr_len = usize::try_from(u64::from_le_bytes(mmap[0..8].try_into()?)).context("safetensors header length out of range")?; + let data_off = 8usize.checked_add(hdr_len).context("safetensors header overflow")?; + anyhow::ensure!(data_off <= mmap.len(), "{}: safetensors header past EOF", st_path.display()); + let hdr: serde_json::Map = + serde_json::from_slice(&mmap[8..data_off]).with_context(|| format!("parse safetensors header {}", st_path.display()))?; + + struct StTensor<'a> { + shape: Vec, + dtype: String, + raw: &'a [u8], + } + let mut tensors: BTreeMap> = BTreeMap::new(); + for (name, val) in hdr { + if name == "__metadata__" { continue; } + let obj = val.as_object().with_context(|| format!("tensor {name} entry is not an object"))?; + let dtype = obj.get("dtype").and_then(|v| v.as_str()).with_context(|| format!("tensor {name} missing dtype"))?.to_string(); + let shape = obj.get("shape").and_then(|v| v.as_array()).with_context(|| format!("tensor {name} missing shape"))? + .iter().map(|d| d.as_u64().context("bad tensor dim")).collect::>>()?; + let offs = obj.get("data_offsets").and_then(|v| v.as_array()).with_context(|| format!("tensor {name} missing data_offsets"))?; + anyhow::ensure!(offs.len() == 2, "tensor {name}: expected 2 data_offsets"); + let start = usize::try_from(offs[0].as_u64().context("bad start offset")?)?; + let end = usize::try_from(offs[1].as_u64().context("bad end offset")?)?; + let raw = mmap.get(data_off + start..data_off + end).with_context(|| format!("tensor {name} offsets out of range"))?; + tensors.insert(name, StTensor { shape, dtype, raw }); + } + + let draft_vocab = cfg.get("draft_vocab_size").and_then(|v| v.as_u64()).map(|v| v as usize) + .or_else(|| tensors.get("d2t").and_then(|t| t.shape.first().copied()).map(|v| v as usize)) + .unwrap_or(32000); + let extract_layers: Vec = match cfg.get("eagle_aux_hidden_state_layer_ids").and_then(|v| v.as_array()) { + Some(arr) if !arr.is_empty() => arr.iter().map(|v| v.as_i64().map(|x| x as i32).context("bad extract layer")).collect::>()?, + _ => { + let n = target_layers_default as i32; + vec![2, n / 2, (n - 3).max(0)] + } + }; + anyhow::ensure!(extract_layers.len() == 3, "expected 3 EAGLE3 extract_layers, got {extract_layers:?}"); + + let mut prepared: Vec<(String, Vec, u32, Cow<'_, [u8]>)> = Vec::with_capacity(TENSOR_MAP.len() + 1); + for &(hf_name, gguf_name, dst_ty) in &TENSOR_MAP { + let st = tensors.get(hf_name) + .or_else(|| hf_name.strip_prefix("midlayer.").and_then(|rest| tensors.get(&format!("layers.0.{rest}")))) + .with_context(|| format!("{}: missing EAGLE3 tensor {hf_name}", st_path.display()))?; + let gguf_dims: Vec = st.shape.iter().copied().rev().collect(); + let bytes: Cow<'_, [u8]> = match (dst_ty, st.dtype.as_str()) { + (GGML_TYPE_BF16, "BF16") | (GGML_TYPE_F32, "F32") => Cow::Borrowed(st.raw), + (GGML_TYPE_BF16, "F32") => Cow::Owned( + st.raw.chunks_exact(4).flat_map(|b| bf16::from_f32(f32::from_le_bytes(b.try_into().unwrap())).to_le_bytes()).collect(), + ), + (GGML_TYPE_BF16, "F16") => Cow::Owned( + st.raw.chunks_exact(2).flat_map(|b| bf16::from_f32(f16::from_le_bytes(b.try_into().unwrap()).to_f32()).to_le_bytes()).collect(), + ), + (GGML_TYPE_F32, "BF16") => Cow::Owned( + st.raw.chunks_exact(2).flat_map(|b| bf16::from_le_bytes(b.try_into().unwrap()).to_f32().to_le_bytes()).collect(), + ), + (GGML_TYPE_F32, "F16") => Cow::Owned( + st.raw.chunks_exact(2).flat_map(|b| f16::from_le_bytes(b.try_into().unwrap()).to_f32().to_le_bytes()).collect(), + ), + (_, dt) => bail!("{hf_name}: unsupported dtype {dt} for GGUF target type {dst_ty}"), + }; + prepared.push((gguf_name.to_string(), gguf_dims, dst_ty, bytes)); + } + + let d2t = tensors.get("d2t").with_context(|| format!("{}: missing EAGLE3 d2t tensor", st_path.display()))?; + anyhow::ensure!(d2t.shape.len() == 1 && d2t.shape[0] as usize == draft_vocab, "unexpected d2t shape {:?} (draft_vocab={draft_vocab})", d2t.shape); + let abs_d2t: Vec = match d2t.dtype.as_str() { + "I64" => d2t.raw.chunks_exact(8).enumerate().flat_map(|(i, b)| ((i as i64 + i64::from_le_bytes(b.try_into().unwrap())) as i32).to_le_bytes()).collect(), + "I32" => d2t.raw.chunks_exact(4).enumerate().flat_map(|(i, b)| (i as i32 + i32::from_le_bytes(b.try_into().unwrap())).to_le_bytes()).collect(), + dt => bail!("unexpected d2t dtype {dt}"), + }; + prepared.push(("d2t".to_string(), vec![draft_vocab as u64], GGML_TYPE_I32, Cow::Owned(abs_d2t))); + + let w_str = |buf: &mut Vec, s: &str| { + buf.extend_from_slice(&(s.len() as u64).to_le_bytes()); + buf.extend_from_slice(s.as_bytes()); + }; + let w_kv = |buf: &mut Vec, k: &str, ty: u32, payload: &[u8]| { + w_str(buf, k); + buf.extend_from_slice(&ty.to_le_bytes()); + buf.extend_from_slice(payload); + }; + + let mut kvs = Vec::new(); + let mut nkv = 0u64; + let push_str_kv = |buf: &mut Vec, n: &mut u64, k: &str, v: &str| { + let mut p = Vec::with_capacity(8 + v.len()); + w_str(&mut p, v); + w_kv(buf, k, GGUF_TYPE_STRING, &p); + *n += 1; + }; + let push_u32_kv = |buf: &mut Vec, n: &mut u64, k: &str, v: u32| { + w_kv(buf, k, GGUF_TYPE_UINT32, &v.to_le_bytes()); + *n += 1; + }; + let push_f32_kv = |buf: &mut Vec, n: &mut u64, k: &str, v: f32| { + w_kv(buf, k, GGUF_TYPE_FLOAT32, &v.to_le_bytes()); + *n += 1; + }; + let push_bool_kv = |buf: &mut Vec, n: &mut u64, k: &str, v: bool| { + w_kv(buf, k, GGUF_TYPE_BOOL, &[u8::from(v)]); + *n += 1; + }; + + push_str_kv(&mut kvs, &mut nkv, "general.architecture", "eagle3"); + push_u32_kv(&mut kvs, &mut nkv, "general.alignment", ALIGNMENT as u32); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.block_count", 1); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.embedding_length", n_embd); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.feed_forward_length", n_ff); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.attention.head_count", n_head); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.attention.head_count_kv", n_head_kv); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.attention.key_length", head_dim); + push_f32_kv(&mut kvs, &mut nkv, "eagle3.attention.layer_norm_rms_epsilon", eps); + push_u32_kv(&mut kvs, &mut nkv, "eagle3.rope.dimension_count", head_dim); + push_f32_kv(&mut kvs, &mut nkv, "eagle3.rope.freq_base", rope_theta); + push_bool_kv(&mut kvs, &mut nkv, "eagle3.rope.neox", true); + push_bool_kv(&mut kvs, &mut nkv, "eagle3.norm_before_residual", norm_before_residual); + let mut tl_payload = Vec::with_capacity(12 + extract_layers.len() * 4); + tl_payload.extend_from_slice(&GGUF_TYPE_INT32.to_le_bytes()); + tl_payload.extend_from_slice(&(extract_layers.len() as u64).to_le_bytes()); + for &v in &extract_layers { tl_payload.extend_from_slice(&v.to_le_bytes()); } + w_kv(&mut kvs, "eagle3.target_layers", GGUF_TYPE_ARRAY, &tl_payload); + nkv += 1; + + let mut tensor_infos = Vec::new(); + let mut cur_off = 0usize; + for (name, dims, ty, data) in &prepared { + cur_off = cur_off.next_multiple_of(ALIGNMENT); + w_str(&mut tensor_infos, name); + tensor_infos.extend_from_slice(&(dims.len() as u32).to_le_bytes()); + for &d in dims { tensor_infos.extend_from_slice(&d.to_le_bytes()); } + tensor_infos.extend_from_slice(&ty.to_le_bytes()); + tensor_infos.extend_from_slice(&(cur_off as u64).to_le_bytes()); + cur_off += data.len(); + } + + let mut meta_block = Vec::with_capacity(24 + kvs.len() + tensor_infos.len()); + meta_block.extend_from_slice(b"GGUF"); + meta_block.extend_from_slice(&GGUF_VERSION.to_le_bytes()); + meta_block.extend_from_slice(&(prepared.len() as u64).to_le_bytes()); + meta_block.extend_from_slice(&nkv.to_le_bytes()); + meta_block.extend_from_slice(&kvs); + meta_block.extend_from_slice(&tensor_infos); + let hdr_pad = (ALIGNMENT - (meta_block.len() % ALIGNMENT)) % ALIGNMENT; + + if let Some(parent) = out_gguf.parent().filter(|p| !p.as_os_str().is_empty()) { + std::fs::create_dir_all(parent)?; + } + let tmp_out = out_gguf.with_extension("gguf.tmp"); + { + let f = std::fs::File::create(&tmp_out).with_context(|| format!("create {}", tmp_out.display()))?; + let mut w = BufWriter::new(f); + w.write_all(&meta_block)?; + let zeros = [0u8; ALIGNMENT]; + if hdr_pad > 0 { w.write_all(&zeros[..hdr_pad])?; } + let mut written = 0usize; + for (_, _, _, data) in &prepared { + let tpad = (ALIGNMENT - (written % ALIGNMENT)) % ALIGNMENT; + if tpad > 0 { + w.write_all(&zeros[..tpad])?; + written += tpad; + } + w.write_all(data)?; + written += data.len(); + } + w.flush()?; + } + std::fs::rename(&tmp_out, out_gguf).with_context(|| format!("rename {} -> {}", tmp_out.display(), out_gguf.display()))?; + eprintln!( + "converted EAGLE3 safetensors -> {} ({:.1} MiB, extract_layers={extract_layers:?}, heads={n_head}x{head_dim}, kv={n_head_kv}, ff={n_ff}, draft_vocab={draft_vocab})", + out_gguf.display(), + std::fs::metadata(out_gguf).map(|m| m.len() as f64 / 1048576.0).unwrap_or(0.0), + ); + Ok(()) } diff --git a/src/gpu_model.rs b/src/gpu_model.rs index bb5d4a90..50958381 100644 --- a/src/gpu_model.rs +++ b/src/gpu_model.rs @@ -120,14 +120,37 @@ impl Parked { fn bytes(&self) -> usize { self.parts.iter().flat_map(|p| p.slot.iter().chain(&p.kv)).map(Vec::len).sum() } } +/// Standalone EAGLE3 1-layer GPU weights and scratch buffers. +struct Eagle3Gpu { + cfg: crate::config::Eagle3Config, + fc: GpuTensor, + output: GpuTensor, + /// `[TMAX, 3 * n_embd]` concatenated hidden states extracted before `extract_layers`. + feat: Buf, + /// `[TMAX, n_embd]` output of `fc` for the last target forward. + cur_g: Buf, + q: Buf, + k: Buf, + v: Buf, + att: Buf, + attp: Buf, + ge: Buf, + ue: Buf, +} + struct MtpHead { - layer: Layer, eh_proj: GpuTensor, enorm: GpuTensor, hnorm: GpuTensor, head_norm: GpuTensor, - worker: CpuWorker, step_buf: Buf, emb: Buf, eh: Buf, x: Buf, pos: usize, - /// Row 0 of the main model's `x` at `save_state` (the hidden state the next entry pairs with). + layer: Layer, eh_proj: Option, enorm: GpuTensor, hnorm: GpuTensor, head_norm: GpuTensor, + worker: Option, step_buf: Buf, emb: Buf, eh: Buf, x: Buf, pos: usize, + eagle: Option, + /// Row 0 of the main model's `x` (or `eagle.cur_g`) at `save_state`. saved_x: Buf, /// Accepted drafts of the last `spec_step` whose draft head entries (from the main model's hidden rows 0..) are /// still to be written; the next `spec_step` writes them in its first draft pass. pend: Vec, + /// 12-step rolling window of draft acceptance bits (LSB = latest step), used for adaptive speculative depth. + adapt_window: u16, + /// Remaining 1-token bypass steps before probing EAGLE3/MTP again on partially-resident MoE runs. + adapt_skip: u8, } /// What a slot keeps while another slot is current (`use_slot`): the `GpuModel` fields of the same names. @@ -137,6 +160,11 @@ struct Seq { pos: usize, saved: Vec<(Buf, Buf)>, saved_pos: usize, saved_ids: Ve /// See `GpuModel::sys`. type Stash = (Vec>, usize, [i64; 2], Vec); +/// Maximum number of intermediate DeltaNet + conv state snapshots written during a multi-token verify pass. +/// Any rollback with `keep <= SNAP_MAX` restores directly via `dtod`; `keep > SNAP_MAX` restores `snap[SNAP_MAX - 1]` +/// and replays the remaining `keep - SNAP_MAX` accepted tokens in one batch pass. +pub const SNAP_MAX: usize = 8; + pub struct GpuModel<'a> { m: &'a Model<'a>, pub gpu: Box, @@ -186,6 +214,8 @@ pub struct GpuModel<'a> { sys_owner: u64, /// Host memory for `parked`, in bytes (0 = keep none). pub cache_ram: usize, + /// Optional disk path for persisting `parked` / `saved` conversation states across restarts (Warm Start). + pub prompt_cache_path: Option, ctx: usize, pub pos: usize, pub cache: Option, @@ -223,6 +253,8 @@ pub struct GpuModel<'a> { /// Prefill scratch (None: prompts go through `step`). pf: Option, mtp: Option, + /// Speculative N-gram / lookup cache drafter (standalone or combined with `mtp` via `hybrid_spec_step`). + pub ngram: Option, /// The layers of this part are `first..first + layers.len()`. first: usize, /// The part on the next device of a model split by layers (`load_split`): this part's hidden state goes to it @@ -315,8 +347,9 @@ impl<'a> GpuModel<'a> { let ring = gpu.zeros::(if qsa_on { c.n_layer * QSA_RING } else { 1 })?; // ponytail: no MTP or batched prefill with hyper-connections yet (their state and row layouts assume one stream). - let k = if c.n_nextn > 0 && c.hc_n == 0 { k.min(TMAX - 1) } else { 0 }; - let mtp = k > 0; + let k = if c.hc_n == 0 { k.min(TMAX - 1) } else { 0 }; + let mtp = k > 0 && c.n_nextn > 0; + let nsnap = k.min(SNAP_MAX); let load_layer = |il: usize, kind: LayerKind| -> anyhow::Result { let mixer = if kind == LayerKind::Delta { Mixer::Delta { @@ -325,7 +358,7 @@ impl<'a> GpuModel<'a> { conv_w: lt(il, "ssm_conv1d.weight")?, norm: lt(il, "ssm_norm.weight")?, out: lt(il, "ssm_out.weight")?, conv: (0..ns).map(|_| gpu.zeros::((c.ssm_conv - 1) * channels)).collect::>()?, s: (0..ns).map(|_| gpu.zeros::(nv * c.ssm_dv() * dk)).collect::>()?, - snap: if mtp { Some((gpu.zeros::(k * (c.ssm_conv - 1) * channels)?, gpu.zeros::(k * c.ssm_d_inner * dk)?)) } else { None }, + snap: if nsnap > 0 { Some((gpu.zeros::(nsnap * (c.ssm_conv - 1) * channels)?, gpu.zeros::(nsnap * c.ssm_d_inner * dk)?)) } else { None }, } } else { Mixer::Attn { @@ -370,11 +403,86 @@ impl<'a> GpuModel<'a> { Ok(Layer { attn_norm, post_norm, hc, ple, mixer, ffn }) }; let layers = range.clone().map(|il| load_layer(il, c.layers[il])).collect::>>()?; - let mtp_parts = if mtp { + let mtp_head = if mtp { let il = c.n_layer; - Some((load_layer(il, LayerKind::Attn)?, lt(il, "nextn.eh_proj.weight")?, lt(il, "nextn.enorm.weight")?, - lt(il, "nextn.hnorm.weight")?, lt(il, "nextn.shared_head_norm.weight")?, - gpu.zeros::(2 * TMAX)?, gpu.zeros::(TMAX * c.n_embd)?, gpu.zeros::(TMAX * 2 * c.n_embd)?, gpu.zeros::(TMAX * c.n_embd)?)) + if let Some(ec) = c.eagle3.clone() { + let eg_kv = ec.n_head_kv * ec.head_dim; + let layer = Layer { + attn_norm: None, + post_norm: Some(lt(il, "post_attention_norm.weight")?), + hc: None, + ple: None, + mixer: Mixer::Attn { + q: lt(il, "attn_q.weight")?, + k: lt(il, "attn_k.weight")?, + v: lt(il, "attn_v.weight")?, + qn: lt(il, "nextn.enorm.weight")?, + kn: lt(il, "nextn.hnorm.weight")?, + o: lt(il, "attn_output.weight")?, + kc: (0..ns).map(|_| gpu.zeros::(gpu.kv_words(ctx * eg_kv))).collect::>()?, + vc: (0..ns).map(|_| gpu.zeros::(gpu.kv_words(ctx * eg_kv))).collect::>()?, + qsa: None, + sink: None, + }, + ffn: Ffn::Dense { + gate: lt(il, "ffn_gate.weight")?, + up: lt(il, "ffn_up.weight")?, + down: lt(il, "ffn_down.weight")?, + }, + }; + let attp_len = ec.n_head * ATT_SPLITS * (ec.head_dim + 2); + let eg = Eagle3Gpu { + fc: lt(il, "eagle3.fc.weight")?, + output: lt(il, "eagle3.output.weight")?, + feat: gpu.zeros::(TMAX * 3 * c.n_embd)?, + cur_g: gpu.zeros::(TMAX * c.n_embd)?, + q: gpu.zeros::(TMAX * ec.n_head * ec.head_dim)?, + k: gpu.zeros::(TMAX * eg_kv)?, + v: gpu.zeros::(TMAX * eg_kv)?, + att: gpu.zeros::(TMAX * ec.n_head * ec.head_dim)?, + attp: gpu.zeros::(TMAX * attp_len)?, + ge: gpu.zeros::(TMAX * ec.n_ff)?, + ue: gpu.zeros::(TMAX * ec.n_ff)?, + cfg: ec, + }; + Some(MtpHead { + layer, + eh_proj: None, + enorm: lt(il, "nextn.enorm.weight")?, + hnorm: lt(il, "nextn.hnorm.weight")?, + head_norm: lt(il, "nextn.shared_head_norm.weight")?, + worker: None, + step_buf: gpu.zeros::(2 * TMAX)?, + emb: gpu.zeros::(TMAX * c.n_embd)?, + eh: gpu.zeros::(TMAX * 2 * c.n_embd)?, + x: gpu.zeros::(TMAX * c.n_embd)?, + pos: 0, + eagle: Some(eg), + saved_x: gpu.zeros::(c.n_embd)?, + pend: vec![], + adapt_window: 0x0FFF, + adapt_skip: 0, + }) + } else { + Some(MtpHead { + layer: load_layer(il, LayerKind::Attn)?, + eh_proj: Some(lt(il, "nextn.eh_proj.weight")?), + enorm: lt(il, "nextn.enorm.weight")?, + hnorm: lt(il, "nextn.hnorm.weight")?, + head_norm: lt(il, "nextn.shared_head_norm.weight")?, + worker: Some(CpuWorker::new(m, &*gpu, vec![c.n_layer])?), + step_buf: gpu.zeros::(2 * TMAX)?, + emb: gpu.zeros::(TMAX * c.n_embd)?, + eh: gpu.zeros::(TMAX * 2 * c.n_embd)?, + x: gpu.zeros::(TMAX * c.n_embd)?, + pos: 0, + eagle: None, + saved_x: gpu.zeros::(c.n_embd)?, + pend: vec![], + adapt_window: 0x0FFF, + adapt_skip: 0, + }) + } } else { None }; let (output_norm, output_hc) = if !last { (None, None) } else if c.hc_n > 0 { (None, Some(hc_read("output_hc_")?)) } else { (Some(up("output_norm.weight")?), None) }; let ple_ring = if c.n_embd_ple > 0 { Some((gpu.zeros::(16 * hcn * c.n_embd)?, gpu.zeros::(16 * hcn * c.n_embd)?)) } else { None }; @@ -426,19 +534,29 @@ impl<'a> GpuModel<'a> { margin: lower --ctx or --parallel, use --kv q8 or a smaller --chunk (--vram-margin 0 skips this check)", free1 >> 20, floor >> 20); let cache = if c.is_moe() { - // STRATA_EXPERT_MB caps the expert slots, so that runs place the same experts whatever VRAM is free (a - // backend comparison, or other programs holding VRAM). - let cap = std::env::var("STRATA_EXPERT_MB").ok().and_then(|v| v.parse::().ok()).map_or(usize::MAX, |v| v << 20); - let budget = free1.saturating_sub(vram_margin).min(cap); - Some(ExpertCache::new(m, &*gpu, budget, range.start..range.end + mtp as usize)?) + // STRATA_EXPERT_MB sets the expert slot budget explicitly when > 0; otherwise use free VRAM minus margin. + let budget = match std::env::var("STRATA_EXPERT_MB") + .ok() + .and_then(|v| v.parse::().ok()) + .filter(|&v| v > 0) + { + Some(mb) => { + eprintln!("note: STRATA_EXPERT_MB={mb} override active (reported free device heap: {} MB)", free1 >> 20); + mb << 20 + } + None => free1.saturating_sub(vram_margin), + }; + Some(ExpertCache::new(m, &*gpu, budget, range.start..range.end + (mtp && c.eagle3.is_none()) as usize)?) } else { None }; let moe_layers: Vec = range.clone().filter(|&il| c.is_moe_layer(il)).collect(); let worker = if !moe_layers.is_empty() { Some(CpuWorker::new(m, &*gpu, moe_layers)?) } else { None }; - // R3a: prefetch the next layer's experts predicted by the previous token's routing there. Default off; the GPU - // window of issue #34 measures it and accepts or rejects it. CUDA has the kernel, Vulkan's `moe_prefetch` is a - // no-op. - let prefetch = c.is_moe() && gpu.moe_prefetch_supported() - && std::env::var("STRATA_MOE_PREFETCH").is_ok_and(|v| v != "0"); + // R3a: prefetch the next layer's experts predicted by the previous token's routing there. Disabled on gfx11xx/iGPU + // where the small L2 cache causes prefetching to evict active lines and hurt decode throughput. + let want_prefetch = std::env::var("STRATA_MOE_PREFETCH").is_ok_and(|v| v != "0"); + if c.is_moe() && want_prefetch && !gpu.moe_prefetch_supported() { + eprintln!("note: STRATA_MOE_PREFETCH ignored on {} (gfx11xx/iGPU L2 cache too small for MoE expert prefetch)", gpu.device()); + } + let prefetch = c.is_moe() && gpu.moe_prefetch_supported() && want_prefetch; let pids = if prefetch { Some(gpu.zeros::((c.n_layer + 1) * c.n_expert_used)?) } else { None }; let mb = |b: usize| b as f64 / 1048576.0; eprintln!( @@ -457,17 +575,11 @@ impl<'a> GpuModel<'a> { mb(per), mb(ca.token_bytes(k)), ca.total_experts() / c.n_expert.max(1), if prefetch { ", next-layer L2 prefetch on (STRATA_MOE_PREFETCH)" } else { "" }); } - let mtp = match mtp_parts { - Some((layer, eh_proj, enorm, hnorm, head_norm, step_buf, emb, eh, x)) => Some(MtpHead { - layer, eh_proj, enorm, hnorm, head_norm, worker: CpuWorker::new(m, &*gpu, vec![c.n_layer])?, - step_buf, emb, eh, x, pos: 0, pend: vec![], saved_x: gpu.zeros::(c.n_embd)?, - }), - None => None, - }; + let mtp = mtp_head; let adapt_every = std::env::var("STRATA_ADAPT_EVERY").ok().and_then(|v| v.parse().ok()).unwrap_or(8); let adapt_swaps = std::env::var("STRATA_ADAPT_SWAPS").ok().and_then(|v| v.parse().ok()).unwrap_or(64); let reset_counts_after_prefill = std::env::var_os("STRATA_RESET_COUNTS").is_some(); - Ok(GpuModel { m, gpu, layers, output_norm, output_hc, output, ple_ring, qsa, ple_prev: [-1, -1], saved_ple_prev: [-1, -1], bufs, x, worker, logits, amax, ids, slots, step_buf, rope_buf, rope_offset: 0, ctx, pos: 0, saved, saved_pos: 0, saved_ids: vec![], sys: None, parked: vec![], owner: 0, saved_owner: 0, sys_owner: 0, cache_ram: 0, cache, adapt_every, adapt_swaps, reset_counts_after_prefill, hits: 0, misses: 0, tokens: 0, mailbox_writes: Default::default(), mailbox_reads: Default::default(), pids, cpu_time: Duration::ZERO, resumed: Default::default(), lora_applied: Default::default(), drafts: (0, 0), split_time: Default::default(), k, short: 32, pf, mtp, first: range.start, next: None, + Ok(GpuModel { m, gpu, layers, output_norm, output_hc, output, ple_ring, qsa, ple_prev: [-1, -1], saved_ple_prev: [-1, -1], bufs, x, worker, logits, amax, ids, slots, step_buf, rope_buf, rope_offset: 0, ctx, pos: 0, saved, saved_pos: 0, saved_ids: vec![], sys: None, parked: vec![], owner: 0, saved_owner: 0, sys_owner: 0, cache_ram: 0, prompt_cache_path: None, cache, adapt_every, adapt_swaps, reset_counts_after_prefill, hits: 0, misses: 0, tokens: 0, mailbox_writes: Default::default(), mailbox_reads: Default::default(), pids, cpu_time: Duration::ZERO, resumed: Default::default(), lora_applied: Default::default(), drafts: (0, 0), split_time: Default::default(), k, short: 32, pf, mtp, ngram: None, first: range.start, next: None, cur: 0, seqs, rows: vec![], row_tokens: 0 }) } @@ -475,7 +587,8 @@ impl<'a> GpuModel<'a> { pub fn reset(&mut self) -> anyhow::Result<()> { self.saved_ids.clear(); self.sys = None; - if let Some(h) = self.mtp.as_mut() { h.pos = 0; h.pend.clear(); } + if let Some(h) = self.mtp.as_mut() { h.pos = 0; h.pend.clear(); h.adapt_window = 0x0FFF; h.adapt_skip = 0; } + if let Some(ng) = self.ngram.as_mut() { ng.reset(); } for l in self.layers.iter().chain(self.mtp.as_ref().map(|h| &h.layer)) { match &l.mixer { Mixer::Delta { conv, s, .. } => { self.gpu.memset(&conv[self.cur])?; self.gpu.memset(&s[self.cur])?; } @@ -567,7 +680,7 @@ impl<'a> GpuModel<'a> { /// and attention regimes, so keep the rows in slot order. pub fn step_rows(&mut self, rows: &[(usize, u32, bool)]) -> anyhow::Result)>> { let (nt, nvoc) = (rows.len(), self.m.cfg.n_vocab); - ensure!((1..=TMAX).contains(&nt) && self.mtp.is_none(), "step_rows: {nt} rows"); + ensure!((1..=4).contains(&nt) && self.mtp.is_none(), "step_rows: {nt} rows"); let pos: Vec = rows.iter().map(|&(s, ..)| *self.slot_pos(s)).collect(); if pos.iter().any(|&p| p >= self.ctx) { bail!("context full ({} tokens; raise --ctx)", self.ctx); } self.put_embed(&rows.iter().map(|r| r.1).collect::>())?; @@ -610,7 +723,6 @@ impl<'a> GpuModel<'a> { self.gpu.put(&pos.iter().flat_map(|&p| [p as i32, seq as i32]).collect::>(), &self.step_buf, 0)?; self.gpu.put(&pos.iter().flat_map(|&p| [p as i32 + self.rope_offset, seq as i32]).collect::>(), &self.rope_buf, 0)?; self.rows = rows.iter().zip(pos).map(|(r, &p)| (r.0, p)).collect(); - const _: () = assert!(TMAX <= 4, "step_rows graph key"); let mut key = 1 << 63 | nt as u64; for (r, &(sl, p)) in self.rows.iter().enumerate() { key |= (sl as u64) << (8 + 8 * r) | ((gq_min(p, 1) == 0) as u64) << (48 + r); } if self.m.loras.is_empty() { self.gpu.graph(key, &mut || self.forward(nt, 0, None))?; } else { self.forward(nt, 0, None)?; } @@ -667,15 +779,25 @@ impl<'a> GpuModel<'a> { /// Run one token; returns logits over the vocabulary. pub fn step(&mut self, token: u32) -> anyhow::Result> { if self.pos >= self.ctx { bail!("context full ({} tokens; raise --ctx)", self.ctx); } + let prof = std::env::var_os("STRATA_VK_PROF").is_some(); + let t0 = prof.then(std::time::Instant::now); let seq = self.begin_seq(); self.put_embed(&[token])?; self.gpu.put(&[self.pos as i32, seq as i32], &self.step_buf, 0)?; self.gpu.put(&[self.pos as i32 + self.rope_offset, seq as i32], &self.rope_buf, 0)?; + let t1 = prof.then(std::time::Instant::now); self.pass(1)?; + let t2 = prof.then(std::time::Instant::now); let t = self.tail(); let mut logits = t.gpu.get::(&t.logits, 0, self.m.cfg.n_vocab)?; if t.finish(1, gq_min(self.pos, 1), None)? { logits = t.gpu.get::(&t.logits, 0, self.m.cfg.n_vocab)?; } + let t3 = prof.then(std::time::Instant::now); self.after_forward(1)?; + if let (Some(t0), Some(t1), Some(t2), Some(t3)) = (t0, t1, t2, t3) { + let t4 = std::time::Instant::now(); + eprintln!("step_prof pos={}: embed_htod={:.1}us pass_submit={:.1}us gpu_wait_dtoh={:.1}us after_experts={:.1}us total={:.1}us", + self.pos, (t1 - t0).as_secs_f64() * 1e6, (t2 - t1).as_secs_f64() * 1e6, (t3 - t2).as_secs_f64() * 1e6, (t4 - t3).as_secs_f64() * 1e6, (t4 - t0).as_secs_f64() * 1e6); + } Ok(logits) } @@ -699,7 +821,15 @@ impl<'a> GpuModel<'a> { /// `verify` for greedy speculation: `keep` gets the argmax of every row; returns its row n and that row's argmax. fn verify_greedy(&mut self, tokens: &[u32], keep: impl FnOnce(&[u32]) -> usize) -> anyhow::Result<(usize, u32)> { let (nt, nvoc) = (tokens.len(), self.m.cfg.n_vocab); - self.verify_run(tokens)?; + let prof = std::env::var_os("STRATA_VK_PROF").is_some(); + let t0 = prof.then(std::time::Instant::now); + let seq = self.begin_seq(); + self.put_embed(tokens)?; + let steps: Vec = (0..nt).flat_map(|t| [(self.pos + t) as i32, seq as i32]).collect(); + self.gpu.put(&steps, &self.step_buf, 0)?; + let t1 = prof.then(std::time::Instant::now); + self.pass(nt)?; + let t2 = prof.then(std::time::Instant::now); let t = self.tail(); let g = &t.gpu; g.argmax_rows(t.logits.addr(), nvoc, nt, t.amax.addr())?; @@ -709,7 +839,13 @@ impl<'a> GpuModel<'a> { am = g.get::(&t.amax, 0, nt)?.into_iter().map(|x| x as u32).collect(); } let n = keep(&am); + let t3 = prof.then(std::time::Instant::now); self.after_forward(nt)?; + if let (Some(t0), Some(t1), Some(t2), Some(t3)) = (t0, t1, t2, t3) { + let t4 = std::time::Instant::now(); + eprintln!("greedy_prof pos={}: embed_htod={:.1}us pass_submit={:.1}us gpu_wait_dtoh={:.1}us after_experts={:.1}us total={:.1}us", + self.pos, (t1 - t0).as_secs_f64() * 1e6, (t2 - t1).as_secs_f64() * 1e6, (t3 - t2).as_secs_f64() * 1e6, (t4 - t3).as_secs_f64() * 1e6, (t4 - t0).as_secs_f64() * 1e6); + } Ok((n, am[n])) } @@ -740,7 +876,10 @@ impl<'a> GpuModel<'a> { g.dtod(s, 0, bs, 0, s.len())?; } } - if let Some(h) = &self.mtp { g.dtod(&self.x, 0, &h.saved_x, 0, 4 * self.m.cfg.n_embd)?; } + if let Some(h) = &self.mtp { + let src = h.eagle.as_ref().map_or(&self.x, |e| &e.cur_g); + g.dtod(src, 0, &h.saved_x, 0, 4 * self.m.cfg.n_embd)?; + } if let Some((r, sr)) = &self.ple_ring { g.dtod(r, 0, sr, 0, r.len())?; } if let Some(q) = &self.qsa { g.dtod(&q.ring, 0, &q.saved, 0, q.ring.len())?; } self.saved_ple_prev = self.ple_prev; @@ -782,20 +921,19 @@ impl<'a> GpuModel<'a> { }).collect() } - /// Copy the saved state to host memory, so a later request that continues it can take it back (`unpark`); the - /// least recently parked states go when they exceed `cache_ram`. - fn park(&mut self) -> anyhow::Result<()> { + /// Snapshot the current saved GPU state into a host-memory `Parked` record if it fits in `cache_ram`. + fn snapshot_saved(&self) -> anyhow::Result> { let n = self.saved_ids.len(); - if n == 0 { return Ok(()) } + if n == 0 { return Ok(None) } let mut size = 0; - let mut p = Some(&*self); + let mut p = Some(self); while let Some(q) = p { size += q.kv_bufs().iter().map(|b| b.len() / q.ctx * n).sum::() + q.slot().iter().map(|b| b.len()).sum::(); p = q.next.as_deref(); } - if size > self.cache_ram { return Ok(()) } + if size > self.cache_ram { return Ok(None) } let mut parts = vec![]; - let mut p = Some(&*self); + let mut p = Some(self); while let Some(q) = p { let g = &q.gpu; let slot = q.slot().iter().map(|b| g.get::(b, 0, b.len())).collect::>()?; @@ -803,8 +941,189 @@ impl<'a> GpuModel<'a> { parts.push(PartCopy { ple_prev: q.saved_ple_prev, slot, kv }); p = q.next.as_deref(); } - self.parked.insert(0, Parked { ids: self.saved_ids.clone(), owner: self.saved_owner, parts }); + Ok(Some(Parked { ids: self.saved_ids.clone(), owner: self.saved_owner, parts })) + } + + fn insert_parked(&mut self, pk: Parked) { + self.parked.retain(|old| !(old.owner == pk.owner && (pk.ids.starts_with(&old.ids) || old.ids == pk.ids))); + self.parked.insert(0, pk); while self.parked.iter().map(Parked::bytes).sum::() > self.cache_ram { self.parked.pop(); } + } + + /// Copy the saved state to host memory, so a later request that continues it can take it back (`unpark`); the + /// least recently parked states go when they exceed `cache_ram`. + fn park(&mut self) -> anyhow::Result<()> { + if let Some(pk) = self.snapshot_saved()? { + self.insert_parked(pk); + if self.prompt_cache_path.is_some() { + if let Err(e) = self.save_prompt_cache() { + eprintln!("warning: could not save prompt cache: {e:#}"); + } + } + } + Ok(()) + } + + /// Snapshot the current saved state into `parked` and persist to `prompt_cache_path` (Warm Start). + pub(crate) fn sync_saved_to_prompt_cache(&mut self) -> anyhow::Result<()> { + if self.prompt_cache_path.is_none() { return Ok(()) } + if let Some(pk) = self.snapshot_saved()? { + self.insert_parked(pk); + self.save_prompt_cache()?; + } + Ok(()) + } + + fn prompt_cache_fingerprint(&self) -> u64 { + let mut h = std::collections::hash_map::DefaultHasher::new(); + self.m.cfg.n_layer.hash(&mut h); + self.m.cfg.n_embd.hash(&mut h); + self.m.cfg.n_vocab.hash(&mut h); + self.m.cfg.n_head.hash(&mut h); + self.m.cfg.n_head_kv.hash(&mut h); + self.m.cfg.head_dim.hash(&mut h); + self.m.cfg.ssm_d_inner.hash(&mut h); + self.m.cfg.ssm_d_state.hash(&mut h); + let mut p = Some(self); + while let Some(q) = p { + q.layers.len().hash(&mut h); + q.kv_bufs().len().hash(&mut h); + for b in q.kv_bufs() { (b.len() / q.ctx).hash(&mut h); } + p = q.next.as_deref(); + } + h.finish() + } + + /// Save up to 4 most recent `Parked` states to `self.prompt_cache_path` atomically. + pub fn save_prompt_cache(&self) -> anyhow::Result<()> { + use std::io::Write; + let Some(path) = &self.prompt_cache_path else { return Ok(()) }; + if self.parked.is_empty() { return Ok(()) } + if let Some(parent) = path.parent() && !parent.as_os_str().is_empty() { + std::fs::create_dir_all(parent)?; + } + let tmp = path.with_extension("tmp"); + let f = std::fs::File::create(&tmp)?; + let mut w = std::io::BufWriter::with_capacity(8 << 20, f); + w.write_all(b"STRATAPC")?; + w.write_all(&1u32.to_le_bytes())?; + w.write_all(&self.prompt_cache_fingerprint().to_le_bytes())?; + let entries: Vec<&Parked> = self.parked.iter().take(4).collect(); + w.write_all(&(entries.len() as u32).to_le_bytes())?; + for pk in entries { + w.write_all(&pk.owner.to_le_bytes())?; + w.write_all(&(pk.ids.len() as u32).to_le_bytes())?; + for &id in &pk.ids { + w.write_all(&id.to_le_bytes())?; + } + w.write_all(&(pk.parts.len() as u32).to_le_bytes())?; + for part in &pk.parts { + w.write_all(&part.ple_prev[0].to_le_bytes())?; + w.write_all(&part.ple_prev[1].to_le_bytes())?; + w.write_all(&(part.slot.len() as u32).to_le_bytes())?; + for s in &part.slot { + w.write_all(&(s.len() as u64).to_le_bytes())?; + w.write_all(s)?; + } + w.write_all(&(part.kv.len() as u32).to_le_bytes())?; + for k in &part.kv { + w.write_all(&(k.len() as u64).to_le_bytes())?; + w.write_all(k)?; + } + } + } + w.flush()?; + drop(w); + std::fs::rename(&tmp, path)?; + Ok(()) + } + + /// Enable Warm Start persistence at `path` and load any existing compatible states into `self.parked`. + pub fn load_prompt_cache(&mut self, path: &std::path::Path) -> anyhow::Result<()> { + use std::io::Read; + self.prompt_cache_path = Some(path.to_path_buf()); + if !path.exists() { + return Ok(()); + } + let f = std::fs::File::open(path)?; + let mut r = std::io::BufReader::with_capacity(8 << 20, f); + let mut magic = [0u8; 8]; + r.read_exact(&mut magic)?; + ensure!(&magic == b"STRATAPC", "invalid magic in prompt cache {}", path.display()); + let mut u4 = [0u8; 4]; + let mut u8b = [0u8; 8]; + r.read_exact(&mut u4)?; + let ver = u32::from_le_bytes(u4); + ensure!(ver == 1, "unsupported prompt cache version {ver}"); + r.read_exact(&mut u8b)?; + let fp = u64::from_le_bytes(u8b); + let expected_fp = self.prompt_cache_fingerprint(); + ensure!(fp == expected_fp, "prompt cache fingerprint mismatch (model or --kv changed)"); + r.read_exact(&mut u4)?; + let n_entries = u32::from_le_bytes(u4) as usize; + let n_parts_expected = self.parts().count(); + let mut loaded = Vec::new(); + for _ in 0..n_entries { + r.read_exact(&mut u8b)?; + let owner = u64::from_le_bytes(u8b); + r.read_exact(&mut u4)?; + let n_ids = u32::from_le_bytes(u4) as usize; + if n_ids == 0 || n_ids > self.ctx { + bail!("cached sequence length {n_ids} exceeds --ctx {}", self.ctx); + } + let mut ids = Vec::with_capacity(n_ids); + for _ in 0..n_ids { + r.read_exact(&mut u4)?; + ids.push(u32::from_le_bytes(u4)); + } + r.read_exact(&mut u4)?; + let n_parts = u32::from_le_bytes(u4) as usize; + ensure!(n_parts == n_parts_expected, "prompt cache part count {n_parts} != {n_parts_expected}"); + let mut parts = Vec::with_capacity(n_parts); + for _ in 0..n_parts { + r.read_exact(&mut u8b)?; + let p0 = i64::from_le_bytes(u8b); + r.read_exact(&mut u8b)?; + let p1 = i64::from_le_bytes(u8b); + r.read_exact(&mut u4)?; + let n_slot = u32::from_le_bytes(u4) as usize; + let mut slot = Vec::with_capacity(n_slot); + for _ in 0..n_slot { + r.read_exact(&mut u8b)?; + let len = u64::from_le_bytes(u8b) as usize; + let mut buf = vec![0u8; len]; + r.read_exact(&mut buf)?; + slot.push(buf); + } + r.read_exact(&mut u4)?; + let n_kv = u32::from_le_bytes(u4) as usize; + let mut kv = Vec::with_capacity(n_kv); + for _ in 0..n_kv { + r.read_exact(&mut u8b)?; + let len = u64::from_le_bytes(u8b) as usize; + let mut buf = vec![0u8; len]; + r.read_exact(&mut buf)?; + kv.push(buf); + } + parts.push(PartCopy { ple_prev: [p0, p1], slot, kv }); + } + loaded.push(Parked { ids, owner, parts }); + } + let mut total_toks = 0usize; + let mut total_bytes = 0usize; + for pk in loaded.into_iter().rev() { + total_toks += pk.ids.len(); + total_bytes += pk.bytes(); + self.insert_parked(pk); + } + if !self.parked.is_empty() { + eprintln!( + "warm start: loaded {} cached prefix state(s) ({total_toks} tokens, {:.1} MB) from {}", + self.parked.len(), + total_bytes as f64 / 1048576.0, + path.display() + ); + } Ok(()) } @@ -837,10 +1156,21 @@ impl<'a> GpuModel<'a> { self.restore_state() } + fn has_delta(&self) -> bool { + self.parts().any(|p| p.layers.iter().any(|l| matches!(l.mixer, Mixer::Delta { .. }))) + } + /// Keep only the first `keep` tokens of the last `verify`, which started at position `start` (1 <= keep <= `k`): /// recurrent states come from the snapshots it wrote, KV entries past them are dropped by rewinding `pos`. pub fn rollback(&mut self, start: usize, keep: usize) -> anyhow::Result<()> { - if !(1..=self.k).contains(&keep) || start + keep > self.pos { bail!("rollback: keep {keep} of verify at {start}"); } + if !self.has_delta() { + ensure!((1..=TMAX).contains(&keep) && start + keep <= self.pos, "rollback: keep {keep} of verify at {start}"); + self.pos = start + keep; + if let Some(n) = self.next.as_mut() { n.rollback(start, keep)?; } + return Ok(()); + } + let nsnap = self.k.min(SNAP_MAX); + if !(1..=nsnap).contains(&keep) || start + keep > self.pos { bail!("rollback: keep {keep} of verify at {start}"); } let g = &self.gpu; for l in &self.layers { if let Mixer::Delta { conv, s, snap: Some((sc, ss)), .. } = &l.mixer { @@ -852,9 +1182,29 @@ impl<'a> GpuModel<'a> { } } self.pos = start + keep; + if let Some(n) = self.next.as_mut() { n.rollback(start, keep)?; } Ok(()) } + /// Keep the first `keep` tokens (`1 <= keep < toks.len()`) of a `verify` that started at `start`. + /// Pure-attention models only rewind `pos`; DeltaNet models restore up to `SNAP_MAX` snapshots and replay any remainder. + pub fn rollback_tokens(&mut self, start: usize, keep: usize, toks: &[u32]) -> anyhow::Result<()> { + if !self.has_delta() { + return self.rollback(start, keep); + } + let nsnap = self.k.min(SNAP_MAX); + if keep <= nsnap { + return self.rollback(start, keep); + } + self.rollback(start, nsnap)?; + let rem = &toks[nsnap..keep]; + self.verify_run(rem)?; + let t = self.tail(); + let _ = t.finish(rem.len(), gq_min(self.pos, rem.len()), None)?; + t.gpu.sync()?; + self.after_forward(rem.len()) + } + /// Return to the state of the last `save_state`. pub fn restore_state(&mut self) -> anyhow::Result<()> { let g = &self.gpu; @@ -873,9 +1223,12 @@ impl<'a> GpuModel<'a> { self.ple_prev = self.saved_ple_prev; // The draft head's entries before the saved position are still the ones its prompt fill wrote (see `mtp_synced`). if let Some(h) = self.mtp.as_mut() { - g.dtod(&h.saved_x, 0, &self.x, 0, 4 * self.m.cfg.n_embd)?; + let dst = h.eagle.as_ref().map_or(&self.x, |e| &e.cur_g); + g.dtod(&h.saved_x, 0, dst, 0, 4 * self.m.cfg.n_embd)?; h.pos = self.pos.saturating_sub(1); h.pend.clear(); + h.adapt_window = 0x0FFF; + h.adapt_skip = 0; } if let Some(n) = self.next.as_mut() { n.restore_state()?; } Ok(()) @@ -905,6 +1258,16 @@ impl<'a> GpuModel<'a> { let mut res = 0; for (i, l) in self.layers.iter().enumerate().skip(from.map_or(0, |il| il - self.first)) { let il = self.first + i; + if from != Some(il) { + if let Some(eg) = self.mtp.as_ref().and_then(|h| h.eagle.as_ref()) { + if let Some(idx) = eg.cfg.extract_layers.iter().position(|&el| el == il) { + if res != 0 { g.add(x, res, nt * ne)?; res = 0; } + for r in 0..nt { + g.dtod(&self.x, 4 * r * ne, &eg.feat, 4 * (r * 3 + idx) * ne, 4 * ne)?; + } + } + } + } res = self.layer(il, l, x, step, self.worker.as_ref(), nt, res, gq, from == Some(il))?; } if self.next.is_some() { return if res != 0 { g.add(x, res, nt * ne) } else { Ok(()) }; } @@ -913,6 +1276,9 @@ impl<'a> GpuModel<'a> { (None, Some(hr)) => self.hc_read(hr, x, nt, &self.hc_at())?, _ => unreachable!(), } + if let Some(eg) = self.mtp.as_ref().and_then(|h| h.eagle.as_ref()) { + self.mv(&eg.fc, eg.feat.addr(), 3 * ne, eg.cur_g.addr(), ne, nt)?; + } g.gemvq(self.output.as_ref().unwrap(), p("h"), ne, p("hq"), self.logits.addr(), c.n_vocab, nt) } @@ -991,43 +1357,174 @@ impl<'a> GpuModel<'a> { pub fn spec_step(&mut self, t: u32, row: usize, smp: &mut Sampler) -> anyhow::Result<(Vec, u32, usize)> { let k = self.k; if self.pos + k + 1 > self.ctx { return Ok((vec![t], smp.pick(&self.step(t)?)? as u32, 0)); } + let partial_moe = self.cache.as_ref().is_some_and(|c| !c.fully_resident()) + && std::env::var_os("STRATA_MTP_ADAPT").is_none_or(|v| v != "0"); let h = self.mtp.as_mut().unwrap(); let mut first = std::mem::take(&mut h.pend); if first.len() != row { first.clear(); } first.push(t); let nf = first.len(); let hp = h.pos + nf - 1; + let hits12 = (h.adapt_window & 0x0FFF).count_ones(); + let hits6 = (h.adapt_window & 0x3F).count_ones(); + if partial_moe && h.adapt_skip > 0 { + h.adapt_skip -= 1; + let hid = self.row_ptr(row + 1 - nf); + self.mtp_run(&first, hid, false)?; + self.mtp.as_mut().unwrap().pos = hp + 1; + let next = if smp.temp <= 0.0 { + self.step_greedy(t)? + } else { + smp.pick(&self.step(t)?)? as u32 + }; + return Ok((vec![t], next, 0)); + } + let is_eagle = h.eagle.is_some(); + let k_eff = if partial_moe && k > 1 && hits12 < if is_eagle { 7 } else { 11 } { 1 } else { k }; let mut toks = vec![t]; let mut hid = self.row_ptr(row + 1 - nf); - for i in 0..k { + for i in 0..k_eff { let d = if i == 0 { self.mtp_run(&first, hid, true)? } else { self.mtp_run(&toks[i..=i], hid, true)? }; hid = self.mtp.as_ref().unwrap().x.addr() + 4 * ((if i == 0 { nf } else { 1 } - 1) * self.m.cfg.n_embd) as u64; toks.push(d); } let start = self.pos; let (n, next) = if smp.temp <= 0.0 { - self.verify_greedy(&toks, |am| (0..k).take_while(|&i| am[i] == toks[i + 1]).count())? + self.verify_greedy(&toks, |am| (0..k_eff).take_while(|&i| am[i] == toks[i + 1]).count())? } else { let l = self.verify(&toks)?; let mut n = 0; loop { - if n == k { break (n, smp.pick(&l[n])? as u32); } + if n == k_eff { break (n, smp.pick(&l[n])? as u32); } match smp.accept(&l[n], toks[n + 1] as usize)? { None => n += 1, Some(x) => break (n, x as u32) } } }; - self.drafts.0 += k; + self.drafts.0 += k_eff; self.drafts.1 += n; - if n < k { self.rollback(start, n + 1)?; } + if n < k_eff { self.rollback(start, n + 1)?; } // Draft head entries past t were made from draft hidden states: the next call redoes them from main rows. let h = self.mtp.as_mut().unwrap(); h.pos = hp + 1; h.pend = toks[1..=n].to_vec(); + h.adapt_window = ((h.adapt_window << 1) | u16::from(n > 0)) & 0x0FFF; + if partial_moe && n == 0 && (if is_eagle { hits12 <= 3 && hits6 <= 1 } else { hits12 <= 8 || hits6 <= 3 }) { + h.adapt_skip = if is_eagle { 2 } else { 3 }; + } + toks.truncate(n + 1); + Ok((toks, next, n)) + } + + /// Hybrid speculative decode combining context N-gram / lookup bursts (`NgramDrafter`) with MTP / EAGLE3 drafting: + /// uses zero-cost N-gram chains when matched, falls back to `spec_step` (EAGLE3/MTP) on a miss, keeps `MtpHead` + /// synchronized across N-gram steps, and feeds verified tokens back into `NgramDrafter`. + pub fn hybrid_spec_step(&mut self, t: u32, row: usize, smp: &mut Sampler) -> anyhow::Result<(Vec, u32, usize)> { + let max_draft = if self.has_delta() { + self.k.min(SNAP_MAX) + } else { + self.ngram.as_ref().map_or(self.k, |ng| ng.cfg.draft_max).min(TMAX - 1) + }; + let room = self.ctx.saturating_sub(self.pos + 1).min(max_draft); + let draft = match self.ngram.as_mut() { + Some(ng) if room > 0 => ng.draft(t, room), + _ => Vec::new(), + }; + if draft.is_empty() { + let (toks, next, rw) = self.spec_step(t, row, smp)?; + if let Some(ng) = self.ngram.as_mut() { ng.accept(&toks); } + return Ok((toks, next, rw)); + } + // Advance the draft head over [pend.., t] using previous main hidden states before `verify` overwrites them. + let h = self.mtp.as_mut().unwrap(); + let mut first = std::mem::take(&mut h.pend); + if first.len() != row { first.clear(); } + first.push(t); + let nf = first.len(); + let hp = h.pos + nf - 1; + let hid = self.row_ptr(row + 1 - nf); + self.mtp_run(&first, hid, false)?; + + let m = draft.len(); + let mut toks = Vec::with_capacity(1 + m); + toks.push(t); + toks.extend_from_slice(&draft); + let start = self.pos; + let (n, next) = if smp.temp <= 0.0 { + self.verify_greedy(&toks, |am| (0..m).take_while(|&i| am[i] == toks[i + 1]).count())? + } else { + let l = self.verify(&toks)?; + let mut n = 0; + loop { + if n == m { break (n, smp.pick(&l[n])? as u32); } + match smp.accept(&l[n], toks[n + 1] as usize)? { None => n += 1, Some(x) => break (n, x as u32) } + } + }; + self.drafts.0 += m; + self.drafts.1 += n; + if n < m { self.rollback(start, n + 1)?; } + let h = self.mtp.as_mut().unwrap(); + h.pos = hp + 1; + h.pend = toks[1..=n].to_vec(); + if n > 0 { + h.adapt_window = ((h.adapt_window << 1) | 1) & 0x0FFF; + h.adapt_skip = 0; + } toks.truncate(n + 1); + if let Some(ng) = self.ngram.as_mut() { ng.accept(&toks); } Ok((toks, next, n)) } + /// Speculative decode with context N-gram / lookup cache drafting (`NgramDrafter`). + /// When no N-gram match is found (`draft.is_empty()`), executes a normal 1-token decode step (`step_greedy` or `step`) + /// with zero GPU overhead. When `m > 0` draft tokens are proposed, verifies `[t, draft..]` in a single pass and + /// rolls back any rejected suffix via `rollback_tokens`. + pub fn ngram_spec_step(&mut self, t: u32, smp: &mut Sampler) -> anyhow::Result<(Vec, u32)> { + let max_draft = self.ngram.as_ref().map_or(self.k, |ng| ng.cfg.draft_max.max(self.k)).min(TMAX - 1); + let room = self.ctx.saturating_sub(self.pos + 1).min(max_draft); + let draft = match self.ngram.as_mut() { + Some(ng) if room > 0 => ng.draft(t, room), + _ => Vec::new(), + }; + if draft.is_empty() { + if let Some(ng) = self.ngram.as_mut() { ng.accept(&[t]); } + let next = if smp.temp <= 0.0 { + self.step_greedy(t)? + } else { + smp.pick(&self.step(t)?)? as u32 + }; + return Ok((vec![t], next)); + } + let m = draft.len(); + let mut toks = Vec::with_capacity(1 + m); + toks.push(t); + toks.extend_from_slice(&draft); + let start = self.pos; + let (n, next) = if smp.temp <= 0.0 { + self.verify_greedy(&toks, |am| (0..m).take_while(|&i| am[i] == toks[i + 1]).count())? + } else { + let l = self.verify(&toks)?; + let mut n = 0; + loop { + if n == m { break (n, smp.pick(&l[n])? as u32); } + match smp.accept(&l[n], toks[n + 1] as usize)? { None => n += 1, Some(x) => break (n, x as u32) } + } + }; + self.drafts.0 += m; + self.drafts.1 += n; + if n < m { + self.rollback_tokens(start, n + 1, &toks)?; + } + toks.truncate(n + 1); + if let Some(ng) = self.ngram.as_mut() { + ng.accept(&toks); + } + Ok((toks, next)) + } + /// Address of hidden row `row` of the last `step` or `verify`. - fn row_ptr(&self, row: usize) -> u64 { self.x.addr() + 4 * (row * self.m.cfg.n_embd) as u64 } + fn row_ptr(&self, row: usize) -> u64 { + let base = self.mtp.as_ref().and_then(|h| h.eagle.as_ref()).map_or_else(|| self.x.addr(), |e| e.cur_g.addr()); + base + 4 * (row * self.m.cfg.n_embd) as u64 + } /// Draft head on `tokens` with hidden states at `hid` (rows of n_embd), as one batch at the next draft positions; /// returns the argmax of the last token's logits (left in `logits` row 0), or 0 when `head` = false skips the head. @@ -1036,8 +1533,8 @@ impl<'a> GpuModel<'a> { let c = &self.m.cfg; let Some(h) = self.mtp.as_mut() else { bail!("MTP head not loaded") }; if h.pos + nt > self.ctx { bail!("context full ({} tokens; raise --ctx)", self.ctx); } - let fast = self.cache.as_ref().is_some_and(|c| c.fully_resident()) && self.gpu.moe_mailbox_optional(); - let seq = if fast { 0 } else { h.worker.begin() }; + let fast = h.eagle.is_some() || (self.cache.as_ref().is_some_and(|c| c.fully_resident()) && self.gpu.moe_mailbox_optional()); + let seq = if fast { 0 } else { h.worker.as_mut().unwrap().begin() }; let g = &self.gpu; let emb: Vec = tokens.iter().flat_map(|&t| self.m.embed(t)).collect(); g.put(&emb, &h.emb, 0)?; @@ -1045,19 +1542,24 @@ impl<'a> GpuModel<'a> { g.put(&steps, &h.step_buf, 0)?; // `run` keys are token counts (below 8); the top bit keeps these keys apart from them. let gq = gq_min(h.pos, nt); - let key = { let mut s = std::hash::DefaultHasher::new(); (hid, nt, head, gq).hash(&mut s); s.finish() | 1 << 63 }; + let key = { let mut s = std::hash::DefaultHasher::new(); (hid, nt, head, gq, self.cur).hash(&mut s); s.finish() | 1 << 63 }; if self.m.loras.is_empty() { g.graph(key, &mut || self.mtp_forward(hid, nt, head, gq, false))?; } else { self.mtp_forward(hid, nt, head, gq, false)?; } - let mut d = if head { g.get::(&self.amax, 0, 1)?[0] as u32 } else { g.sync()?; 0 }; + let is_eagle = self.mtp.as_ref().is_some_and(|h| h.eagle.is_some()); + let mut d = if head { g.get::(&self.amax, 0, 1)?[0] as u32 } else { if !is_eagle { g.sync()?; } 0 }; if self.finish(nt, gq, Some((hid, head)))? && head { d = self.gpu.get::(&self.amax, 0, 1)?[0] as u32; } let h = self.mtp.as_mut().unwrap(); h.pos += nt; + if let Some(eg) = &h.eagle { + if head { d = eg.cfg.d2t.get(d as usize).copied().unwrap_or(d as i32) as u32; } + return Ok(d); + } // Fast path: every expert of the draft layer is resident, so nothing can miss and there is nothing to record // (R2). The routing counters keep the head's share of the hit rate. if fast { self.hits += c.n_expert_used * nt; } else if let Some(cache) = self.cache.as_mut() { // One mailbox read per layer, as in `after_experts` (each is a bulk copy of the routing words). - let r = h.worker.routing(c.n_layer); + let r = h.worker.as_mut().unwrap().routing(c.n_layer); self.mailbox_reads.set(self.mailbox_reads.get() + 1); let (hits, misses) = tally(&r); self.hits += hits; @@ -1076,7 +1578,7 @@ impl<'a> GpuModel<'a> { let mut again = false; let mut last = None; while self.gpu.stalled() { - let w = match mtp { Some(_) => &self.mtp.as_ref().unwrap().worker, None => self.worker.as_ref().unwrap() }; + let w = match mtp { Some(_) => self.mtp.as_ref().unwrap().worker.as_ref().unwrap(), None => self.worker.as_ref().unwrap() }; let il = w.stalled_layer().context("a MoE combine gave up waiting, but no layer says so")?; // The worker had answered the last time: the GPU does not see the mailbox. ensure!(last != Some(il), "moe_combine: the GPU does not see the CPU expert worker's answers. On an AMD RX 9000 \ @@ -1097,14 +1599,58 @@ impl<'a> GpuModel<'a> { /// Enqueue the draft head (see `mtp_run`). fn mtp_forward(&self, hid: u64, nt: usize, head: bool, gq: i32, resume: bool) -> anyhow::Result<()> { let (c, g, h) = (&self.m.cfg, &self.gpu, self.mtp.as_ref().unwrap()); + if let Some(eg) = &h.eagle { + let ec = &eg.cfg; + let (eps, ne, hp) = (ec.eps, c.n_embd, self.bufs["h"].addr()); + let (eh, x) = (h.eh.addr(), h.x.addr()); + let (nh, nkv, hd) = (ec.n_head, ec.n_head_kv, ec.head_dim); + let kv = nkv * hd; + g.rms_norm(h.emb.addr(), ne, h.enorm.ptr, eh, 2 * ne, ne, nt, eps)?; + g.rms_norm(hid, ne, h.hnorm.ptr, eh + 4 * ne as u64, 2 * ne, ne, nt, eps)?; + if ec.norm_before_residual { + g.rms_norm(hid, ne, h.hnorm.ptr, x, ne, ne, nt, eps)?; + } else if hid != x { + g.memset(&h.x)?; + g.add(x, hid, nt * ne)?; + } + let Mixer::Attn { q, k, v, o, kc, vc, .. } = &h.layer.mixer else { unreachable!() }; + let Ffn::Dense { gate, up, down } = &h.layer.ffn else { unreachable!() }; + g.batch(&mut || { + self.mv(q, eh, 2 * ne, eg.q.addr(), nh * hd, nt)?; + self.mv(k, eh, 2 * ne, eg.k.addr(), kv, nt)?; + self.mv(v, eh, 2 * ne, eg.v.addr(), kv, nt) + })?; + g.batch(&mut || { + g.rope_neox(eg.q.addr(), hd, nt * nh, nh, ec.n_rot, h.step_buf.addr(), ec.rope_base)?; + g.rope_neox(eg.k.addr(), hd, nt * nkv, nkv, ec.n_rot, h.step_buf.addr(), ec.rope_base) + })?; + g.kv_store(eg.k.addr(), eg.v.addr(), kc[self.cur].addr(), vc[self.cur].addr(), kv, nt, h.step_buf.addr(), hd)?; + g.attn_decode_q(eg.q.addr(), kc[self.cur].addr(), vc[self.cur].addr(), 0, eg.att.addr(), + eg.attp.addr(), h.step_buf.addr(), nh, nkv, hd, 1.0 / (hd as f32).sqrt(), gq, nt, 0, 0, 0, 0, 0)?; + self.mv(o, eg.att.addr(), nh * hd, self.bufs["mix"].addr(), ne, nt)?; + g.rms_norm_q(x, ne, h.layer.post_norm.as_ref().unwrap().ptr, hp, ne, ne, nt, eps, 0, self.bufs["mix"].addr())?; + g.batch(&mut || { + self.mv(gate, hp, ne, eg.ge.addr(), ec.n_ff, nt)?; + self.mv(up, hp, ne, eg.ue.addr(), ec.n_ff, nt) + })?; + g.swiglu(eg.ge.addr(), eg.ue.addr(), nt * ec.n_ff)?; + self.mv(down, eg.ge.addr(), ec.n_ff, self.bufs["ye"].addr(), ne, nt)?; + g.add(x, self.bufs["ye"].addr(), nt * ne)?; + if head { + g.rms_norm(x + 4 * ((nt - 1) * ne) as u64, 0, h.head_norm.ptr, hp, 0, ne, 1, eps)?; + g.gemv(&eg.output, hp, self.logits.addr())?; + g.argmax_rows(self.logits.addr(), ec.draft_vocab, 1, self.amax.addr())?; + } + return Ok(()); + } let (eps, ne, hp) = (c.eps, c.n_embd, self.bufs["h"].addr()); let (eh, x) = (h.eh.addr(), h.x.addr()); if !resume { g.rms_norm(h.emb.addr(), ne, h.enorm.ptr, eh, 2 * ne, ne, nt, eps)?; g.rms_norm(hid, ne, h.hnorm.ptr, eh + 4 * ne as u64, 2 * ne, ne, nt, eps)?; - self.mv(&h.eh_proj, eh, 2 * ne, x, ne, nt)?; + self.mv(h.eh_proj.as_ref().unwrap(), eh, 2 * ne, x, ne, nt)?; } - let res = self.layer(c.n_layer, &h.layer, x, h.step_buf.addr(), Some(&h.worker), nt, 0, gq, resume)?; + let res = self.layer(c.n_layer, &h.layer, x, h.step_buf.addr(), h.worker.as_ref(), nt, 0, gq, resume)?; if res != 0 { g.add(x, res, nt * ne)?; } if head { g.rms_norm(x + 4 * ((nt - 1) * ne) as u64, 0, h.head_norm.ptr, hp, 0, ne, 1, eps)?; @@ -1149,28 +1695,26 @@ impl<'a> GpuModel<'a> { } match &l.mixer { Mixer::Delta { qkv, gate, beta, alpha, dt_bias, a, conv_w, norm, out, conv, s, snap } => { - let (sc, ss, ns) = snap.as_ref().map_or((0, 0, 0), |(a, b)| (a.addr(), b.addr(), self.k)); - g.batch(&mut || { - mv2(qkv, gate, "qkv", "z")?; - mv2(beta, alpha, "beta", "g") - })?; + let (sc, ss, ns) = snap.as_ref().map_or((0, 0, 0), |(a, b)| (a.addr(), b.addr(), self.k.min(SNAP_MAX))); + mv(qkv, "h", ne, "qkv", channels)?; // One token with 128-wide heads: conv_silu also does the q and k l2 norms. + // Overlap conv_silu/conv_seq (reads "qkv", writes "y") with gate/beta/alpha GEMVs (read "hq", write "z"/"beta"/"g"). let rows = !self.rows.is_empty(); let nn = if (nt == 1 || rows) && dk == 128 { 2 * nk } else { 0 }; let at = |n: &str, r: usize, w: usize| p(n) + (4 * r * w) as u64; - if rows { - // One token per slot (`step_rows`): each row has its own conv and recurrent state. - g.batch(&mut || { + g.batch(&mut || { + if rows { for (r, &(sl, _)) in self.rows.iter().enumerate() { g.conv_silu(at("qkv", r, channels), conv[sl].addr(), conv_w.ptr, at("y", r, channels), channels, c.ssm_conv, nn, eps)?; } - Ok(()) - })?; - } else if nt == 1 { - g.conv_silu(p("qkv"), conv[self.cur].addr(), conv_w.ptr, p("y"), channels, c.ssm_conv, nn, eps)?; - } else { - g.conv_seq(p("qkv"), conv[self.cur].addr(), conv_w.ptr, p("y"), channels, c.ssm_conv, nt, sc, ns)?; - } + } else if nt == 1 { + g.conv_silu(p("qkv"), conv[self.cur].addr(), conv_w.ptr, p("y"), channels, c.ssm_conv, nn, eps)?; + } else { + g.conv_seq(p("qkv"), conv[self.cur].addr(), conv_w.ptr, p("y"), channels, c.ssm_conv, nt, sc, ns)?; + } + mv(gate, "h", ne, "z", c.ssm_d_inner)?; + mv2(beta, alpha, "beta", "g") + })?; if nn == 0 { g.l2_norm(p("y"), dk, 2 * nk, channels, nt * 2 * nk, eps)?; } let scale = 1.0 / (dk as f32).sqrt(); if rows { diff --git a/src/gpu_model/prefill.rs b/src/gpu_model/prefill.rs index 8a39a9c1..4341a3f4 100644 --- a/src/gpu_model/prefill.rs +++ b/src/gpu_model/prefill.rs @@ -20,6 +20,8 @@ pub(super) struct Scratch { pub chunk: usize, lay: Lay, slab: Buf, + /// `[chunk, 3 * n_embd]` hidden states captured before EAGLE3 `extract_layers`. + feat: Option, /// ids | xrow | inv, `chunk * k` each. ints: Buf, tiles: Buf, @@ -63,19 +65,37 @@ impl Scratch { let n_tiles = 3 * (chunk * k / GEMM_BM + 2 * c.n_expert); Ok(Scratch { chunk, lay: Lay { h, a, b, c: c2, d, e, rl, wts, ge, ye, shg, shy, sg, xn, lo, hg, pk, pq, pg, pn, pv, inj, mix, mo, emb }, - slab: gpu.zeros::(total)?, ints: gpu.zeros::(3 * chunk * k)?, tiles: gpu.zeros::(2 * n_tiles)?, + slab: gpu.zeros::(total)?, + feat: if c.eagle3.is_some() { Some(gpu.zeros::(3 * ne * chunk)?) } else { None }, + ints: gpu.zeros::(3 * chunk * k)?, tiles: gpu.zeros::(2 * n_tiles)?, staging: gpu.zeros::(if c.is_moe() { 3 * STAGE * stage_bytes } else { 0 })?, }) } /// Bytes of VRAM this scratch takes. - pub fn bytes(&self) -> usize { self.slab.len() + self.ints.len() + self.tiles.len() + self.staging.len() } + pub fn bytes(&self) -> usize { self.slab.len() + self.feat.as_ref().map_or(0, Buf::len) + self.ints.len() + self.tiles.len() + self.staging.len() } } impl GpuModel<'_> { /// Run `tokens` from the current position; returns the logits after the last one. Short prompts (and models /// loaded without a prefill chunk) go through the decode step. - pub fn prefill(&mut self, tokens: &[u32]) -> anyhow::Result> { self.prefill_with(tokens, &mut |_| Ok(())) } + pub fn prefill(&mut self, tokens: &[u32]) -> anyhow::Result> { + if self.prompt_cache_path.is_some() && self.pos == 0 && tokens.len() > 1 { + let t0 = std::time::Instant::now(); + let (logits, reused) = self.prefill_cached(tokens, 0, tokens.len() - 1)?; + if reused > 0 { + eprintln!( + "warm start: reused {reused}/{} prompt tokens from cache (TTFT {:.1} ms)", + tokens.len(), + t0.elapsed().as_secs_f64() * 1e3 + ); + } + return Ok(logits); + } + let r = self.prefill_with(tokens, &mut |_| Ok(()))?; + if let Some(ng) = self.ngram.as_mut() { ng.begin(tokens); } + Ok(r) + } /// `prefill`, calling `between` between two chunks (`serve --parallel` decodes the other slots there; it must /// leave the current slot's state alone). @@ -172,8 +192,13 @@ impl GpuModel<'_> { self.prefill_with(&tokens[from..keep], between)?; self.save_state()?; (self.saved_ids, self.saved_owner) = (tokens[..keep].to_vec(), own); + if let Err(e) = self.sync_saved_to_prompt_cache() { + eprintln!("warning: could not save prompt cache: {e:#}"); + } } - Ok((self.prefill_with(&tokens[keep..], between)?, reused)) + let logits = self.prefill_with(&tokens[keep..], between)?; + if let Some(ng) = self.ngram.as_mut() { ng.begin(tokens); } + Ok((logits, reused)) } fn step_all(&mut self, tokens: &[u32]) -> anyhow::Result> { @@ -229,7 +254,8 @@ impl GpuModel<'_> { let kv = nkv * hd; // The draft head runs as one more layer on the chunk while it is in step with the main model. let fill = self.mtp_synced(); - let mtp = self.mtp.as_ref().filter(|_| fill); + let is_eagle = self.mtp.as_ref().is_some_and(|mh| mh.eagle.is_some()); + let mtp = self.mtp.as_ref().filter(|mh| fill && mh.eagle.is_none()); // STRATA_NAN_TRACE[=N]: from position N (default 0), one line per layer with the largest magnitude of each intermediate buffer, and the first // row of one holding a non-finite value. Each probe waits for the GPU: diagnostic runs only. let trace = std::env::var("STRATA_NAN_TRACE").is_ok_and(|v| self.pos >= v.parse::().unwrap_or(0)); @@ -243,6 +269,15 @@ impl GpuModel<'_> { Ok(()) }; for (il, ly) in self.layers.iter().enumerate().map(|(i, ly)| (self.first + i, ly)).chain(mtp.map(|mh| (c.n_layer, &mh.layer))) { + if il < c.n_layer { + if let (Some(pff), Some(eg)) = (&pf.feat, self.mtp.as_ref().and_then(|mh| mh.eagle.as_ref()).filter(|_| fill)) { + if let Some(idx) = eg.cfg.extract_layers.iter().position(|&el| el == il) { + for r in 0..t { + g.dtod(&pf.slab, 4 * r * ne, pff, 4 * (r * 3 + idx) * ne, 4 * ne)?; + } + } + } + } if let Some(mh) = mtp.filter(|_| il == c.n_layer) { // Its entry for token i pairs the token with the hidden state before it (`mtp_run`): h gets the last // hidden state of the previous chunk, then rows 0..t - 1; the first token of the sequence has none. @@ -255,7 +290,7 @@ impl GpuModel<'_> { t -= skip; g.rms_norm(x, ne, mh.enorm.ptr, at(l.a), 2 * ne, ne, t, eps)?; g.rms_norm(h, ne, mh.hnorm.ptr, at(l.a + ne), 2 * ne, ne, t, eps)?; - g.gemm_dense(&mh.eh_proj, t, at(l.a), 2 * ne, x, ne, 0)?; + g.gemm_dense(mh.eh_proj.as_ref().unwrap(), t, at(l.a), 2 * ne, x, ne, 0)?; g.put(&[mh.pos as i32, 0], &self.step_buf, 2)?; g.put(&[mh.pos as i32 + self.rope_offset, 0], &self.rope_buf, 2)?; step += 8; @@ -517,10 +552,29 @@ impl GpuModel<'_> { if trace { eprintln!("nan-trace pos {} layer {il}:{tr}", self.pos); tr.clear(); } g.kick()?; } - match self.mtp.as_mut() { - Some(mh) if fill => mh.pos += t, - // Row 0 of `x` gets the last hidden state (with the draft head, the copy above did it). - _ => g.dtod(&pf.slab, 4 * (t - 1) * d, &self.x, 0, 4 * d)?, + if fill && is_eagle { + g.dtod(&pf.slab, 4 * (t - 1) * d, &self.x, 0, 4 * d)?; + let (lh, slab_h, old_cur_g) = { + let pf = self.pf.as_ref().unwrap(); + let eg = self.mtp.as_ref().unwrap().eagle.as_ref().unwrap(); + self.gpu.gemm_dense(&eg.fc, t, pf.feat.as_ref().unwrap().addr(), 3 * ne, pf.slab.addr() + 4 * l.h as u64, ne, 0)?; + (l.h, pf.slab.addr() + 4 * l.h as u64, eg.cur_g.addr()) + }; + if self.pos > 0 { + self.mtp_run(&toks[..1], old_cur_g, false)?; + } + for (off, ch) in toks[1..].chunks(crate::cpu_worker::TMAX).enumerate() { + self.mtp_run(ch, slab_h + 4 * (off * crate::cpu_worker::TMAX * ne) as u64, false)?; + } + let pf = self.pf.as_ref().unwrap(); + let eg = self.mtp.as_ref().unwrap().eagle.as_ref().unwrap(); + self.gpu.dtod(&pf.slab, 4 * (lh + (t - 1) * ne), &eg.cur_g, 0, 4 * ne)?; + } else { + match self.mtp.as_mut() { + Some(mh) if fill => mh.pos += t, + // Row 0 of `x` gets the last hidden state (with the draft head, the copy above did it). + _ => g.dtod(&pf.slab, 4 * (t - 1) * d, &self.x, 0, 4 * d)?, + } } self.pos += toks.len(); let Some(nx) = self.next.as_deref_mut() else { return Ok(()) }; diff --git a/src/lib.rs b/src/lib.rs index ebb33e24..96f17186 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,3 +20,4 @@ pub mod hf; pub mod deepseek; pub mod gemma4; pub mod glm; +pub mod ngram; diff --git a/src/main.rs b/src/main.rs index 8973856d..d084ad71 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,6 +38,37 @@ struct Engine { /// [default: calibrated, else 0]. #[arg(long, value_name = "N", default_missing_value = "1", num_args = 0..=1)] mtp: Option, + /// Standalone MTP draft head GGUF (e.g. ~/models-local/mtp-Q8_0.gguf). + #[arg(long)] + mtp_model: Option, + /// External speculative draft model GGUF socket (e.g. future DFlash/EAGLE draft). + #[arg(long)] + draft_model: Option, + /// Speculative context-lookup drafter type(s), comma-separated: none, ngram-simple, ngram-map-k, ngram-map-k4v, + /// ngram-mod, ngram-cache (combines with --mtp/--mtp-model in hybrid cascade). + #[arg(long, default_value = "none")] + spec_type: String, + /// Maximum number of speculative draft tokens verified per step (1..=16). + #[arg(long, default_value_t = 16)] + spec_draft_n_max: usize, + /// N-gram lookup key length in tokens (for ngram-simple, ngram-map-k, ngram-map-k4v, ngram-mod). + #[arg(long, default_value_t = 12)] + spec_ngram_size_n: usize, + /// N-gram draft window length in tokens (for ngram-simple, ngram-map-k, ngram-map-k4v). + #[arg(long, default_value_t = 48)] + spec_ngram_size_m: usize, + /// Minimum hit count before drafting (for ngram-map-k, ngram-map-k4v). + #[arg(long, default_value_t = 1)] + spec_ngram_min_hits: u16, + /// Static lookup cache file (llama.cpp binary ngram cache or UTF-8 text scaffold corpus). + #[arg(long)] + lookup_cache_static: Option, + /// Dynamic lookup cache file loaded at startup and updated/saved across requests. + #[arg(long)] + lookup_cache_dynamic: Option, + /// Persistent disk cache file for KV and recurrent prefix states (Warm Start across requests and restarts). + #[arg(long)] + prompt_cache: Option, /// Sampling temperature; 0 is greedy. #[arg(long, default_value_t = 0.0)] temp: f32, @@ -231,7 +262,10 @@ impl Runner<'_> { if let Runner::Gpu(g) = self { let sum = |f: &dyn Fn(&GpuModel) -> usize| g.parts().map(f).sum::(); let st = self.expert_stats().expect("Runner::Gpu has expert stats"); - if g.drafts.0 > 0 { eprintln!("MTP drafts accepted {}/{} ({:.1}%)", g.drafts.1, g.drafts.0, 100.0 * g.drafts.1 as f64 / g.drafts.0 as f64); } + if g.drafts.0 > 0 { + let kind = if g.ngram.is_some() { "speculative ngram" } else { "MTP" }; + eprintln!("{kind} drafts accepted {}/{} ({:.1}%)", g.drafts.1, g.drafts.0, 100.0 * g.drafts.1 as f64 / g.drafts.0 as f64); + } eprintln!("expert hit rate {:.1}% ({} misses), cache swaps {}", 100.0 * st.hits as f64 / (st.hits + st.misses).max(1) as f64, st.misses, st.swaps); // Issue #34 R1: printed on every run, so a fully resident run reads as a measured 0 in the log instead of // an absent line. `tokens` counts the token forwards the worker could have been asked about. @@ -281,8 +315,20 @@ impl Engine { let v: serde_json::Value = std::fs::read(&path).ok().and_then(|b| serde_json::from_slice(&b).ok()).unwrap_or_default(); if !v.is_null() { eprintln!("calibration: {}", path.display()); } let get = |k: &str| v[k].as_u64().map(|x| x as usize); + if let Some(dp) = &self.draft_model { + anyhow::ensure!(dp.exists(), "draft model path does not exist: {}", dp.display()); + eprintln!("draft model socket: registered candidate {}", dp.display()); + } + let mut ngram_cfg = self.ngram_config()?; + ngram_cfg.n_vocab = m.cfg.n_vocab; self.chunk.get_or_insert(get("chunk").unwrap_or(4096)); - self.mtp.get_or_insert(get("mtp").unwrap_or(0)); + if self.mtp_model.is_some() && self.mtp.is_none() { + self.mtp = Some(1); + } else if ngram_cfg.is_enabled() && self.mtp.is_none() { + self.mtp = Some(0); + } else { + self.mtp.get_or_insert(get("mtp").unwrap_or(0)); + } self.short = get("short").unwrap_or(32); // The global pool can be built once; a model loaded later by `serve` keeps the first one's threads. // GPU expert work is memory-bound, so SMT siblings only add contention (6 threads beat 12 on the reference @@ -307,15 +353,45 @@ impl Engine { let types = rusting_strata::gpu_model::gpu_weight_types(&m.w.g); for b in &bk { b.preflight(&types, false)?; } let margins = vram_margins(&self.vram_margin, &self.device)?.into_iter().map(|mb| mb << 20).collect::>(); + let spec_k = if mtp > 0 { mtp } else if ngram_cfg.is_enabled() && self.parallel <= 1 { ngram_cfg.draft_max } else { 0 }; let mut g = if self.parallel > 1 { GpuModel::load_split_margins(m, bk, self.ctx, self.chunk(), &margins, 0, self.parallel).context(LOAD_HINT)? } else { - GpuModel::load_split_margins(m, bk, self.ctx, self.chunk(), &margins, self.mtp(), 1).context(LOAD_HINT)? + GpuModel::load_split_margins(m, bk, self.ctx, self.chunk(), &margins, spec_k, 1).context(LOAD_HINT)? }; + if ngram_cfg.is_enabled() && self.parallel <= 1 { + let tok = Tokenizer::from_gguf(&m.w.g).ok(); + g.ngram = Some(rusting_strata::ngram::NgramDrafter::new(ngram_cfg, tok.as_ref())?); + } g.short = self.short; g.cache_ram = self.cache_ram << 20; + if let Some(p) = &self.prompt_cache { + if g.cache_ram == 0 { + g.cache_ram = 2048 << 20; + } + if let Err(e) = g.load_prompt_cache(p) { + eprintln!("warning: could not load prompt cache {}: {e:#}", p.display()); + } + } Ok(Runner::Gpu(Box::new(g))) } + fn ngram_config(&self) -> anyhow::Result { + let types = rusting_strata::ngram::SpecType::parse_list(&self.spec_type)?; + anyhow::ensure!((1..=rusting_strata::cpu_worker::TMAX - 1).contains(&self.spec_draft_n_max), + "--spec-draft-n-max {}: must be between 1 and {}", self.spec_draft_n_max, rusting_strata::cpu_worker::TMAX - 1); + Ok(rusting_strata::ngram::NgramConfig { + types, + draft_max: self.spec_draft_n_max, + size_n: self.spec_ngram_size_n.max(1), + size_m: self.spec_ngram_size_m.max(1), + min_hits: self.spec_ngram_min_hits.max(1), + mod_n_match: self.spec_ngram_size_n.max(1), + mod_n_min: 2, + lookup_cache_static: self.lookup_cache_static.clone(), + lookup_cache_dynamic: self.lookup_cache_dynamic.clone(), + n_vocab: 0, + }) + } fn sampler(&self) -> Sampler { Sampler { temp: self.temp, top_k: self.top_k, top_p: self.top_p, rng: seed(self.seed) } } @@ -820,8 +896,8 @@ fn run(cmd: Cmd) -> anyhow::Result<()> { let (prompt, cont) = (ids("prompt")?, ids("continuation")?); anyhow::ensure!(!prompt.is_empty() && !cont.is_empty(), "empty prompt or continuation"); let g = Gguf::open(&model)?; - let mut m = Model::load(&g)?; - if !engine.lora.is_empty() { m.apply_lora(&engine.lora_specs())?; } + let aux_g = open_mtp_gguf(engine.mtp_model.as_deref())?; + let m = Model::load_with_aux(&g, aux_g.as_ref(), &engine.lora_specs())?; if let Some(&t) = prompt.iter().chain(&cont).find(|&&t| t as usize >= m.cfg.n_vocab) { anyhow::bail!("token id {t} out of range (vocabulary has {} tokens)", m.cfg.n_vocab); } @@ -860,8 +936,8 @@ fn run(cmd: Cmd) -> anyhow::Result<()> { let prompt = if prompt == "-" { let mut s = String::new(); std::io::stdin().read_to_string(&mut s)?; s } else { prompt }; return rusting_strata::deepseek::chat::generate(&g, &prompt, n); } - let mut m = Model::load(&g)?; - if !engine.lora.is_empty() { m.apply_lora(&engine.lora_specs())?; } + let aux_g = open_mtp_gguf(engine.mtp_model.as_deref())?; + let m = Model::load_with_aux(&g, aux_g.as_ref(), &engine.lora_specs())?; let tok = Tokenizer::from_gguf(&g)?; let prompt = if prompt == "-" { let mut s = String::new(); @@ -901,8 +977,8 @@ fn run(cmd: Cmd) -> anyhow::Result<()> { } Cmd::Perplexity { model, file, ctx_len: n, chunks, kld_base, mut engine } => { let g = Gguf::open(&model)?; - let mut m = Model::load(&g)?; - if !engine.lora.is_empty() { m.apply_lora(&engine.lora_specs())?; } + let aux_g = open_mtp_gguf(engine.mtp_model.as_deref())?; + let m = Model::load_with_aux(&g, aux_g.as_ref(), &engine.lora_specs())?; let tok = Tokenizer::from_gguf(&g)?; // ponytail: no BOS at chunk starts (llama-perplexity adds one where the vocabulary asks for it; Qwen does not) let ids = tok.encode(&std::fs::read_to_string(&file)?)?; @@ -948,8 +1024,8 @@ fn run(cmd: Cmd) -> anyhow::Result<()> { }; } } - let mut m = Model::load(&g)?; - if !engine.lora.is_empty() { m.apply_lora(&engine.lora_specs())?; } + let aux_g = open_mtp_gguf(engine.mtp_model.as_deref())?; + let m = Model::load_with_aux(&g, aux_g.as_ref(), &engine.lora_specs())?; let tok = Tokenizer::from_gguf(&g)?; let mut r = engine.runner(&m, &model)?; let mut results = Vec::with_capacity(pp.len()); @@ -1056,8 +1132,8 @@ fn run(cmd: Cmd) -> anyhow::Result<()> { anyhow::ensure!(image.is_empty(), "--image is not supported for deepseek41"); return rusting_strata::deepseek::chat::chat(&g, system, n, think); } - let mut m = Model::load(&g)?; - if !engine.lora.is_empty() { m.apply_lora(&engine.lora_specs())?; } + let aux_g = open_mtp_gguf(engine.mtp_model.as_deref())?; + let m = Model::load_with_aux(&g, aux_g.as_ref(), &engine.lora_specs())?; let tok = Tokenizer::from_gguf(&g)?; let image_input = if image.is_empty() { None } else { let mmproj = engine.mmproj.clone().or_else(|| vision::find_sibling(&model)); @@ -1524,33 +1600,46 @@ fn decode(r: &mut Runner, tok: &Tokenizer, mtp: bool, smp: &mut Sampler, mut log let eos = tok.eos_ids(); // `ahead`: the next token when `spec_step` or `step_greedy` already picked it. // `start`: the first token whose text is not emitted yet (the text before it ends on a whole character). - let (mut out, mut start, mut row, mut ahead) = (Vec::new(), 0, 0, None); - while out.len() < n { + let (mut out, mut start, mut row, mut ahead, mut stopped) = (Vec::new(), 0, 0, None, false); + 'outer: while out.len() < n { let next = match ahead.take() { Some(t) => t, None => smp.pick(&logits)? as u32 }; - if eos.contains(&next) { return Ok((out, true)); } + if eos.contains(&next) { stopped = true; break; } let toks = match r { + Runner::Gpu(g) if mtp && g.ngram.is_some() => { + let (toks, nx, rw) = g.hybrid_spec_step(next, row, smp)?; + (ahead, row) = (Some(nx), rw); + toks + } Runner::Gpu(g) if mtp => { let (toks, nx, rw) = g.spec_step(next, row, smp)?; (ahead, row) = (Some(nx), rw); toks } + Runner::Gpu(g) if g.ngram.is_some() => { + let (toks, nx) = g.ngram_spec_step(next, smp)?; + ahead = Some(nx); + toks + } // Greedy without MTP: the argmax on the GPU, so only the token id is copied back, not the logits. Runner::Gpu(g) if smp.temp <= 0.0 => { ahead = Some(g.step_greedy(next)?); vec![next] } Runner::Slot(c) if smp.temp <= 0.0 => { ahead = Some(c.step(next, false)?.0); vec![next] } _ => { logits = r.step(next)?; vec![next] } }; for t in toks { - if eos.contains(&t) { return Ok((out, true)); } + if eos.contains(&t) { stopped = true; break 'outer; } if out.len() == n { break; } out.push(t); let s = tok.decode(&out[start..])?; if !s.ends_with('\u{fffd}') { - if emit(&s)? { return Ok((out, true)); } + if emit(&s)? { stopped = true; break 'outer; } start = out.len(); } } } - Ok((out, false)) + if let Runner::Gpu(g) = r && let Some(ng) = g.ngram.as_mut() { + let _ = ng.save_dynamic(); + } + Ok((out, stopped)) } /// Tokens left for a reply: `n`, capped by the context after a `used`-token prompt. @@ -1746,7 +1835,7 @@ impl Sched { /// One forward over the oldest steps (with more than `TMAX` slots decoding, each waits its turn), in slot order /// (fewer graphs to capture). fn run(&mut self, g: &mut GpuModel) { - let mut batch: Vec<_> = self.steps.drain(..self.steps.len().min(rusting_strata::cpu_worker::TMAX)).collect(); + let mut batch: Vec<_> = self.steps.drain(..self.steps.len().min(4)).collect(); batch.sort_by_key(|s| s.0); self.since = if self.steps.is_empty() { None } else { Some(Instant::now() - Self::GATHER) }; match g.step_rows(&batch.iter().map(|b| (b.0, b.1, b.2)).collect::>()) { @@ -1841,6 +1930,37 @@ impl Serving { } } +/// Resolve `--mtp-model` (`.gguf` file, HF `.safetensors` file, or directory containing either `model.gguf` or +/// `model.safetensors` + `config.json`) and open it as a companion GGUF. If `.gguf` is missing (or +/// `STRATA_EAGLE3_RECONVERT` is set) and `.safetensors` + `config.json` are present, converts natively in Rust. +fn open_mtp_gguf(path: Option<&Path>) -> anyhow::Result> { + let Some(p) = path else { return Ok(None) }; + let reconvert = std::env::var_os("STRATA_EAGLE3_RECONVERT").is_some(); + let (gguf, st_cfg) = if p.is_dir() { + (p.join("model.gguf"), Some((p.join("model.safetensors"), p.join("config.json")))) + } else if p.extension().and_then(|e| e.to_str()) == Some("safetensors") { + (p.with_extension("gguf"), Some((p.to_path_buf(), p.with_file_name("config.json")))) + } else if p.extension().and_then(|e| e.to_str()) == Some("bin") { + (p.with_file_name("model.gguf"), None) + } else { + (p.to_path_buf(), None) + }; + if let Some((st, cfg)) = st_cfg + && (!gguf.exists() || reconvert) + && st.exists() + && cfg.exists() + { + eprintln!("note: native Rust EAGLE3 conversion {} -> {}", st.display(), gguf.display()); + rusting_strata::gguf::convert_safetensors_eagle3_to_gguf(&st, &cfg, &gguf, 48)?; + } + anyhow::ensure!( + gguf.exists(), + "{}: not found (for PyTorch .bin EAGLE3 checkpoints, convert first via tools/convert_eagle3_to_gguf.py)", + gguf.display() + ); + Ok(Some(Gguf::open(&gguf)?)) +} + /// Loads `model`, answers `w` (the /api/load request that asked for it) and serves until another model is asked /// for. The model and its GPU memory are freed on return. fn serve_model(model: &Path, mut engine: Engine, s: &Serving, w: &mut Option) -> anyhow::Result> { @@ -1855,7 +1975,8 @@ fn serve_model(model: &Path, mut engine: Engine, s: &Serving, w: &mut Option Vec { impl<'a> Model<'a> { pub fn load(g: &'a Gguf) -> anyhow::Result> { Self::load_with_lora(g, &[]) } pub fn load_with_lora(g: &'a Gguf, loras: &[(String, f32)]) -> anyhow::Result> { + Self::load_with_aux(g, None, loras) + } + pub fn load_with_aux(g: &'a Gguf, aux: Option<&'a Gguf>, loras: &[(String, f32)]) -> anyhow::Result> { let mut cfg = ModelConfig::from_gguf(g)?; - let w = Weights::new(g)?; + let w = Weights::new_with_aux(g, aux)?; + if cfg.n_nextn == 0 { + if let Some(ag) = aux.filter(|_| w.layer(cfg.n_layer, "eagle3.fc.weight").is_ok()) { + let il = cfg.n_layer; + let wq = w.layer(il, "attn_q.weight")?; + let wk = w.layer(il, "attn_k.weight")?; + let gate = w.layer(il, "ffn_gate.weight")?; + let out = w.layer(il, "eagle3.output.weight")?; + let n_head = ag.meta.get("eagle3.attention.head_count").and_then(|v| v.as_u64()).map(|v| v as usize).unwrap_or(cfg.n_head); + let head_dim = wq.rows / n_head.max(1); + let n_head_kv = (wk.rows / head_dim.max(1)).max(1); + let n_ff = gate.rows; + let draft_vocab = out.rows; + let n_rot = ag.meta.get("eagle3.rope.dimension_count").and_then(|v| v.as_u64()).map(|v| v as usize).unwrap_or(head_dim); + let rope_base = ag.meta.get("eagle3.rope.freq_base").and_then(|v| v.as_f32()).unwrap_or(cfg.rope_base); + let eps = ag.meta.get("eagle3.attention.layer_norm_rms_epsilon").and_then(|v| v.as_f32()).unwrap_or(cfg.eps); + let norm_before_residual = matches!(ag.meta.get("eagle3.norm_before_residual"), Some(crate::gguf::Value::Bool(true))); + let rope_neox = !matches!(ag.meta.get("eagle3.rope.neox"), Some(crate::gguf::Value::Bool(false))); + let extract_layers = match ag.meta.get("eagle3.target_layers").or_else(|| ag.meta.get("eagle3.extract_layers")).and_then(|v| v.as_arr()) { + Some(arr) if arr.len() == 3 => { + let mut ls = [0usize; 3]; + for (i, v) in arr.iter().enumerate() { + ls[i] = v.as_u64().context("bad eagle3 extract layer")? as usize; + } + ls + } + _ => [2, cfg.n_layer / 2, cfg.n_layer.saturating_sub(3)], + }; + let d2t = if let Some(t) = ag.tensors.get("d2t") { + let n = t.dims[0] as usize; + anyhow::ensure!(n == draft_vocab, "d2t len {n} != draft_vocab {draft_vocab}"); + let mut ids: Vec = match t.ty { + 26 => ag.raw_bytes(t, 4 * n)?.chunks_exact(4).map(|b| i32::from_le_bytes(b.try_into().unwrap())).collect(), + 27 => ag.raw_bytes(t, 8 * n)?.chunks_exact(8).map(|b| i64::from_le_bytes(b.try_into().unwrap()) as i32).collect(), + ty => anyhow::bail!("unsupported EAGLE3 d2t tensor type {ty}"), + }; + if ids.windows(2).any(|w| w[0] >= w[1]) { + for (i, v) in ids.iter_mut().enumerate() { *v += i as i32; } + } + ids + } else { + (0..draft_vocab as i32).collect() + }; + cfg.n_nextn = 1; + cfg.eagle3 = Some(Eagle3Config { + extract_layers, n_ff, n_head, n_head_kv, head_dim, n_rot, rope_base, eps, + draft_vocab, norm_before_residual, rope_neox, d2t, + }); + eprintln!( + "note: loaded standalone EAGLE3 draft head (extract_layers={extract_layers:?}, heads={n_head}x{head_dim}, kv={n_head_kv}, ff={n_ff}, draft_vocab={draft_vocab})" + ); + } else if aux.is_some_and(|ag| ag.tensors.contains_key(&format!("blk.{}.nextn.eh_proj.weight", cfg.n_layer))) { + cfg.n_nextn = 1; + eprintln!("note: loaded standalone MTP draft head from companion GGUF (layer {})", cfg.n_layer); + } + } if !w.validate(cfg.n_layer)? && cfg.n_nextn > 0 { eprintln!("note: the MTP (nextn) layer has a quant type this engine does not support; loading without MTP"); cfg.n_nextn = 0; } - w.get("token_embd.weight")?; + let emb_t = w.get("token_embd.weight")?; + // Pre-touch mmap pages of token_embd.weight so decode step put_embed() never stalls on SSD page faults. + let mut _touch = 0u8; + for off in (0..emb_t.data.len()).step_by(4096) { + _touch ^= unsafe { std::ptr::read_volatile(&emb_t.data[off]) }; + } + std::hint::black_box(_touch); let ple = if cfg.n_embd_ple > 0 { let p = |k: &str| format!("{}.ple.{k}", cfg.arch); let arr = |k: &str| -> anyhow::Result> { @@ -175,7 +239,8 @@ impl<'a> Model<'a> { pub fn embed(&self, token: u32) -> Vec { let mut x = vec![0f32; self.cfg.n_embd]; - self.w.get("token_embd.weight").unwrap().row(token as usize, &mut x); + let idx = (token as usize).min(self.cfg.n_vocab.saturating_sub(1)); + self.w.get("token_embd.weight").unwrap().row(idx, &mut x); x } @@ -665,4 +730,215 @@ mod tests { assert_eq!(e.a[0], (0..8).map(|i| i as f32).collect::>()); assert_eq!(e.b[0], (0..6).map(|i| 10.0 + i as f32).collect::>()); } + + #[test] + fn load_eagle3_aux_config() { + let (mut hdr, mut off) = (Vec::new(), 0u64); + let push_tensor = |h: &mut Vec, body: &mut Vec, off: &mut u64, name: &str, dims: &[u64], ty: u32, data: &[u8]| { + w_str(h, name); + h.extend((dims.len() as u32).to_le_bytes()); + for &d in dims { h.extend(d.to_le_bytes()); } + h.extend(ty.to_le_bytes()); + h.extend((*off).to_le_bytes()); + body.extend_from_slice(data); + let pad = (32 - data.len() % 32) % 32; + body.extend(std::iter::repeat_n(0u8, pad)); + *off += (data.len() + pad) as u64; + }; + let mut body = Vec::new(); + let mut kvs = Vec::new(); + let add_u32 = |b: &mut Vec, k: &str, v: u32| { w_str(b, k); b.extend(4u32.to_le_bytes()); b.extend(v.to_le_bytes()); }; + let add_f32 = |b: &mut Vec, k: &str, v: f32| { w_str(b, k); b.extend(6u32.to_le_bytes()); b.extend(v.to_le_bytes()); }; + let add_str = |b: &mut Vec, k: &str, v: &str| { w_str(b, k); b.extend(8u32.to_le_bytes()); w_str(b, v); }; + // Build tiny target GGUF (`qwen3moe` with 1 layer, embd=4, n_vocab=8, nh=2, nkv=1, hd=2) + add_str(&mut kvs, "general.architecture", "qwen3moe"); + add_u32(&mut kvs, "qwen3moe.block_count", 1); + add_u32(&mut kvs, "qwen3moe.embedding_length", 4); + add_u32(&mut kvs, "qwen3moe.attention.head_count", 2); + add_u32(&mut kvs, "qwen3moe.attention.head_count_kv", 1); + add_f32(&mut kvs, "qwen3moe.attention.layer_norm_rms_epsilon", 1e-6); + let z4 = vec![0u8; 4 * 4]; + let z4x8 = vec![0u8; 32 * 4]; + push_tensor(&mut hdr, &mut body, &mut off, "token_embd.weight", &[4, 8], 0, &z4x8); + push_tensor(&mut hdr, &mut body, &mut off, "output_norm.weight", &[4], 0, &z4); + push_tensor(&mut hdr, &mut body, &mut off, "blk.0.attn_norm.weight", &[4], 0, &z4); + let mut tgt = Vec::new(); + tgt.extend(b"GGUF"); + tgt.extend(3u32.to_le_bytes()); + tgt.extend(3u64.to_le_bytes()); + tgt.extend(6u64.to_le_bytes()); + tgt.extend(kvs); + tgt.extend(hdr); + while tgt.len() % 32 != 0 { tgt.push(0); } + tgt.extend(body); + + // Build tiny EAGLE3 aux GGUF (`draft_vocab=3`, draft `heads=2x4`, `kv=1`, `ff=6`, `d2t` relative `[0, 0, 5]` -> abs `[0, 1, 7]`) + let (mut ahdr, mut abody, mut aoff) = (Vec::new(), Vec::new(), 0u64); + let mut akvs = Vec::new(); + add_str(&mut akvs, "general.architecture", "eagle3"); + add_u32(&mut akvs, "eagle3.attention.head_count", 2); + add_f32(&mut akvs, "eagle3.rope.freq_base", 1000000.0); + w_str(&mut akvs, "eagle3.target_layers"); + akvs.extend(9u32.to_le_bytes()); + akvs.extend(5u32.to_le_bytes()); + akvs.extend(3u64.to_le_bytes()); + for v in [0i32, 0, 0] { akvs.extend(v.to_le_bytes()); } + let fc_d = vec![0u8; 12 * 4 * 4]; + let norm_d = vec![0u8; 4 * 4]; + let qk_d = vec![0u8; 8 * 8 * 4]; + let kv_d = vec![0u8; 8 * 4 * 4]; + let o_d = vec![0u8; 8 * 4 * 4]; + let ff_d = vec![0u8; 4 * 6 * 4]; + let out_d = vec![0u8; 4 * 3 * 4]; + let d2t_d: Vec = [0i64, 0, 5].into_iter().flat_map(|v| v.to_le_bytes()).collect(); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "fc.weight", &[12, 4], 0, &fc_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "output.weight", &[4, 3], 0, &out_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "output_norm.weight", &[4], 0, &norm_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_norm.weight", &[4], 0, &norm_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_norm_2.weight", &[4], 0, &norm_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.ffn_norm.weight", &[4], 0, &norm_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_q.weight", &[8, 8], 0, &qk_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_k.weight", &[8, 4], 0, &kv_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_v.weight", &[8, 4], 0, &kv_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.attn_output.weight", &[8, 4], 0, &o_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.ffn_gate.weight", &[4, 6], 0, &ff_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.ffn_up.weight", &[4, 6], 0, &ff_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "blk.0.ffn_down.weight", &[6, 4], 0, &ff_d); + push_tensor(&mut ahdr, &mut abody, &mut aoff, "d2t", &[3], 27, &d2t_d); + let mut aux = Vec::new(); + aux.extend(b"GGUF"); + aux.extend(3u32.to_le_bytes()); + aux.extend(14u64.to_le_bytes()); + aux.extend(4u64.to_le_bytes()); + aux.extend(akvs); + aux.extend(ahdr); + while aux.len() % 32 != 0 { aux.push(0); } + aux.extend(abody); + + let pt = std::env::temp_dir().join(format!("strata-e3-tgt-{}.gguf", std::process::id())); + let pa = std::env::temp_dir().join(format!("strata-e3-aux-{}.gguf", std::process::id())); + std::fs::write(&pt, &tgt).unwrap(); + std::fs::write(&pa, &aux).unwrap(); + let gt = Gguf::open(&pt).unwrap(); + let ga = Gguf::open(&pa).unwrap(); + let m = Model::load_with_aux(>, Some(&ga), &[]).unwrap(); + std::fs::remove_file(&pt).ok(); + std::fs::remove_file(&pa).ok(); + let ec = m.cfg.eagle3.as_ref().expect("eagle3 config loaded"); + assert_eq!(m.cfg.n_nextn, 1); + assert_eq!((ec.n_head, ec.head_dim, ec.n_head_kv, ec.n_ff, ec.draft_vocab), (2, 4, 1, 6, 3)); + assert_eq!(ec.d2t, vec![0, 1, 7]); + } + + #[test] + fn eagle3_safetensors_auto_converts_and_loads() { + let dir = std::env::temp_dir().join(format!("strata-e3-st-{}", std::process::id())); + std::fs::create_dir_all(&dir).unwrap(); + + // Build tiny target GGUF (`qwen3moe` 1 layer, embd=4, n_vocab=8, nh=2, nkv=1, hd=2) + let (mut hdr, mut body, mut off) = (Vec::new(), Vec::new(), 0u64); + let push_tensor = |h: &mut Vec, b: &mut Vec, o: &mut u64, name: &str, dims: &[u64], ty: u32, data: &[u8]| { + w_str(h, name); + h.extend((dims.len() as u32).to_le_bytes()); + for &d in dims { h.extend(d.to_le_bytes()); } + h.extend(ty.to_le_bytes()); + h.extend((*o).to_le_bytes()); + b.extend_from_slice(data); + let pad = (32 - data.len() % 32) % 32; + b.extend(std::iter::repeat_n(0u8, pad)); + *o += (data.len() + pad) as u64; + }; + let mut kvs = Vec::new(); + let add_u32 = |b: &mut Vec, k: &str, v: u32| { w_str(b, k); b.extend(4u32.to_le_bytes()); b.extend(v.to_le_bytes()); }; + let add_f32 = |b: &mut Vec, k: &str, v: f32| { w_str(b, k); b.extend(6u32.to_le_bytes()); b.extend(v.to_le_bytes()); }; + let add_str = |b: &mut Vec, k: &str, v: &str| { w_str(b, k); b.extend(8u32.to_le_bytes()); w_str(b, v); }; + add_str(&mut kvs, "general.architecture", "qwen3moe"); + add_u32(&mut kvs, "qwen3moe.block_count", 1); + add_u32(&mut kvs, "qwen3moe.embedding_length", 4); + add_u32(&mut kvs, "qwen3moe.attention.head_count", 2); + add_u32(&mut kvs, "qwen3moe.attention.head_count_kv", 1); + add_f32(&mut kvs, "qwen3moe.attention.layer_norm_rms_epsilon", 1e-6); + let z4 = vec![0u8; 4 * 4]; + let z4x8 = vec![0u8; 32 * 4]; + push_tensor(&mut hdr, &mut body, &mut off, "token_embd.weight", &[4, 8], 0, &z4x8); + push_tensor(&mut hdr, &mut body, &mut off, "output_norm.weight", &[4], 0, &z4); + push_tensor(&mut hdr, &mut body, &mut off, "blk.0.attn_norm.weight", &[4], 0, &z4); + let mut tgt = Vec::new(); + tgt.extend(b"GGUF"); + tgt.extend(3u32.to_le_bytes()); + tgt.extend(3u64.to_le_bytes()); + tgt.extend(6u64.to_le_bytes()); + tgt.extend(kvs); + tgt.extend(hdr); + while tgt.len() % 32 != 0 { tgt.push(0); } + tgt.extend(body); + let pt = dir.join("target.gguf"); + std::fs::write(&pt, &tgt).unwrap(); + + // Build synthetic HuggingFace EAGLE3 `config.json` + `model.safetensors` + let cfg_path = dir.join("config.json"); + std::fs::write( + &cfg_path, + r#"{ + "hidden_size": 4, + "intermediate_size": 6, + "num_attention_heads": 2, + "num_key_value_heads": 1, + "head_dim": 4, + "rms_norm_eps": 1e-6, + "rope_theta": 1000000.0, + "norm_before_residual": false, + "draft_vocab_size": 3, + "eagle_aux_hidden_state_layer_ids": [0, 0, 0] + }"#, + ).unwrap(); + + let d2t_bytes: Vec = [0i64, 0, 5].into_iter().flat_map(|v| v.to_le_bytes()).collect(); + let st_specs: Vec<(&str, &str, Vec, Vec)> = vec![ + ("fc.weight", "BF16", vec![4, 12], vec![0u8; 4 * 12 * 2]), + ("midlayer.input_layernorm.weight", "BF16", vec![4], vec![0u8; 4 * 2]), + ("midlayer.hidden_norm.weight", "F32", vec![4], vec![0u8; 4 * 4]), + ("midlayer.self_attn.q_proj.weight", "BF16", vec![8, 8], vec![0u8; 8 * 8 * 2]), + ("midlayer.self_attn.k_proj.weight", "BF16", vec![4, 8], vec![0u8; 4 * 8 * 2]), + ("midlayer.self_attn.v_proj.weight", "BF16", vec![4, 8], vec![0u8; 4 * 8 * 2]), + ("midlayer.self_attn.o_proj.weight", "BF16", vec![4, 8], vec![0u8; 4 * 8 * 2]), + ("midlayer.post_attention_layernorm.weight", "F32", vec![4], vec![0u8; 4 * 4]), + ("midlayer.mlp.gate_proj.weight", "BF16", vec![6, 4], vec![0u8; 6 * 4 * 2]), + ("midlayer.mlp.up_proj.weight", "BF16", vec![6, 4], vec![0u8; 6 * 4 * 2]), + ("midlayer.mlp.down_proj.weight", "BF16", vec![4, 6], vec![0u8; 4 * 6 * 2]), + ("norm.weight", "F32", vec![4], vec![0u8; 4 * 4]), + ("lm_head.weight", "BF16", vec![3, 4], vec![0u8; 3 * 4 * 2]), + ("d2t", "I64", vec![3], d2t_bytes), + ]; + let mut st_hdr = serde_json::Map::new(); + let mut st_body = Vec::new(); + for (name, dt, shape, data) in st_specs { + let start = st_body.len(); + st_body.extend_from_slice(&data); + let end = st_body.len(); + st_hdr.insert( + name.to_string(), + serde_json::json!({"dtype": dt, "shape": shape, "data_offsets": [start, end]}), + ); + } + let hdr_bytes = serde_json::to_vec(&st_hdr).unwrap(); + let mut st_file = Vec::with_capacity(8 + hdr_bytes.len() + st_body.len()); + st_file.extend_from_slice(&(hdr_bytes.len() as u64).to_le_bytes()); + st_file.extend_from_slice(&hdr_bytes); + st_file.extend_from_slice(&st_body); + let st_path = dir.join("model.safetensors"); + std::fs::write(&st_path, &st_file).unwrap(); + + let aux_gguf = dir.join("model.gguf"); + crate::gguf::convert_safetensors_eagle3_to_gguf(&st_path, &cfg_path, &aux_gguf, 48).unwrap(); + + let gt = Gguf::open(&pt).unwrap(); + let ga = Gguf::open(&aux_gguf).unwrap(); + let m = Model::load_with_aux(>, Some(&ga), &[]).unwrap(); + std::fs::remove_dir_all(&dir).ok(); + let ec = m.cfg.eagle3.as_ref().expect("eagle3 config loaded from converted safetensors"); + assert_eq!(m.cfg.n_nextn, 1); + assert_eq!((ec.n_head, ec.head_dim, ec.n_head_kv, ec.n_ff, ec.draft_vocab), (2, 4, 1, 6, 3)); + assert_eq!(ec.d2t, vec![0, 1, 7]); + } } diff --git a/src/ngram.rs b/src/ngram.rs new file mode 100644 index 00000000..6d0707a2 --- /dev/null +++ b/src/ngram.rs @@ -0,0 +1,1247 @@ +//! Context-lookup speculative decoding (port of `llama.cpp` `ngram-simple`, `ngram-map-k`, `ngram-map-k4v`, +//! `ngram-mod`, and `ngram-cache` with static/dynamic lookup caches). +//! +//! All drafting runs on the CPU in microseconds with zero VRAM overhead, producing draft token sequences that +//! `GpuModel::ngram_spec_step` verifies in a single batched forward pass on the GPU. + +use std::collections::HashMap; +use std::fs::File; +use std::io::{BufWriter, Read, Write}; +use std::path::{Path, PathBuf}; + +pub const LLAMA_TOKEN_NULL: i32 = -1; +pub const LLAMA_NGRAM_MIN: usize = 1; +pub const LLAMA_NGRAM_MAX: usize = 4; +pub const LLAMA_NGRAM_STATIC: usize = 2; + +const LCG_FACTOR: u32 = 2654435761; +const COMMON_NGRAM_MAX_VALUES: usize = 4; +const COMMON_NGRAM_HASH_MAP_SIZE: usize = 262_144; +const COMMON_NGRAM_MAX_VALUE_COUNT: u16 = 16_380; + +const DRAFT_MIN_SAMPLE_SIZE_LAX: [i32; LLAMA_NGRAM_MAX] = [2, 2, 1, 1]; +const DRAFT_MIN_PERCENT_LAX: [i32; LLAMA_NGRAM_MAX] = [66, 50, 50, 50]; +const DRAFT_MIN_SAMPLE_SIZE_STRICT: [i32; LLAMA_NGRAM_MAX] = [4, 3, 2, 2]; +const DRAFT_MIN_PERCENT_STRICT: [i32; LLAMA_NGRAM_MAX] = [75, 66, 66, 66]; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum SpecType { + None, + NgramSimple, + NgramMapK, + NgramMapK4v, + NgramMod, + NgramCache, +} + +impl SpecType { + pub fn parse_list(s: &str) -> anyhow::Result> { + let mut out = Vec::new(); + for part in s.split(',').map(str::trim).filter(|p| !p.is_empty()) { + let ty = match part { + "none" => return Ok(vec![]), + "ngram-simple" => SpecType::NgramSimple, + "ngram-map-k" => SpecType::NgramMapK, + "ngram-map-k4v" => SpecType::NgramMapK4v, + "ngram-mod" => SpecType::NgramMod, + "ngram-cache" => SpecType::NgramCache, + other => anyhow::bail!( + "unknown --spec-type {other:?} (expected: none, ngram-simple, ngram-map-k, ngram-map-k4v, ngram-mod, ngram-cache)" + ), + }; + if !out.contains(&ty) { + out.push(ty); + } + } + Ok(out) + } + + pub fn as_str(self) -> &'static str { + match self { + SpecType::None => "none", + SpecType::NgramSimple => "ngram-simple", + SpecType::NgramMapK => "ngram-map-k", + SpecType::NgramMapK4v => "ngram-map-k4v", + SpecType::NgramMod => "ngram-mod", + SpecType::NgramCache => "ngram-cache", + } + } +} + +#[derive(Debug, Clone)] +pub struct NgramConfig { + pub types: Vec, + pub draft_max: usize, + pub size_n: usize, + pub size_m: usize, + pub min_hits: u16, + pub mod_n_match: usize, + pub mod_n_min: usize, + pub lookup_cache_static: Option, + pub lookup_cache_dynamic: Option, + /// Target model vocabulary size (0 = unchecked). Tokens >= `n_vocab` are filtered from caches and drafts. + pub n_vocab: usize, +} + +impl Default for NgramConfig { + fn default() -> Self { + Self { + types: Vec::new(), + draft_max: 16, + size_n: 12, + size_m: 48, + min_hits: 1, + mod_n_match: 24, + mod_n_min: 4, + lookup_cache_static: None, + lookup_cache_dynamic: None, + n_vocab: 0, + } + } +} + +impl NgramConfig { + pub fn is_enabled(&self) -> bool { + !self.types.is_empty() && self.draft_max > 0 + } +} + +// --------------------------------------------------------------------------- +// 1. N-gram Simple (`common_ngram_simple_draft` in `llama.cpp`) +// --------------------------------------------------------------------------- + +pub fn ngram_simple_draft(tokens: &[u32], sampled: u32, size_n: usize, size_m: usize, draft_max: usize) -> Vec { + ngram_simple_draft_eos(tokens, sampled, size_n, size_m, draft_max, &[]) +} + +pub fn ngram_simple_draft_eos( + tokens: &[u32], + sampled: u32, + size_n: usize, + size_m: usize, + draft_max: usize, + eos: &[u32], +) -> Vec { + let cur_len = tokens.len(); + let n = size_n.max(1); + let m = size_m.max(1); + if cur_len <= n + 1 || draft_max == 0 { + return Vec::new(); + } + let pat_prefix = &tokens[cur_len + 1 - n..cur_len]; + let first_tok = if n == 1 { sampled } else { pat_prefix[0] }; + + // Search backwards from `cur_len - n - 1` down to `1` (matching llama.cpp's `j > 0` loop). + // If a candidate window crosses an EOS/turn token (such as `<|im_end|>` at the end of a user turn), + // remember it as a fallback and keep searching for an earlier clean match. + let Some(start_j) = cur_len.checked_sub(n + 1) else { + return Vec::new(); + }; + let mut match_pos = 0usize; + let mut fallback_pos = 0usize; + for j in (1..=start_j).rev() { + if tokens[j + n - 1] == sampled && tokens[j] == first_tok && tokens[j..j + n - 1] == *pat_prefix { + let avail = cur_len.saturating_sub(j + n); + let take = m.min(avail).min(draft_max); + if !eos.is_empty() && tokens[j + n..j + n + take].iter().any(|t| eos.contains(t)) { + if fallback_pos == 0 { + fallback_pos = j; + } + continue; + } + match_pos = j; + break; + } + } + if match_pos == 0 { + match_pos = fallback_pos; + } + if match_pos == 0 { + return Vec::new(); + } + let avail = cur_len.saturating_sub(match_pos + n); + let copy_max = m.min(avail); + if copy_max < n.min(draft_max) { + return Vec::new(); + } + let take = copy_max.min(draft_max); + tokens[match_pos + n..match_pos + n + take].to_vec() +} + +// --------------------------------------------------------------------------- +// 2. N-gram Map (`common_ngram_map` in `llama.cpp`: `ngram-map-k` & `ngram-map-k4v`) +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Copy, Default)] +struct NgramMapValue { + value_idx: usize, + value_num: u16, + n_accepted: i16, +} + +#[derive(Debug, Clone)] +struct NgramMapKey { + key_idx: usize, + stat_idx: usize, + key_num: u16, + values: [NgramMapValue; COMMON_NGRAM_MAX_VALUES], +} + +#[derive(Debug, Clone)] +pub struct NgramMap { + size_key: usize, + size_value: usize, + key_only: bool, + min_hits: u16, + keys: Vec, + size_last_begin: usize, + last_draft_created: bool, + last_draft_key_idx: usize, + last_draft_value_idx: usize, + idx_last_check: usize, + key_map: Vec, + key_map_last_idx: usize, +} + +fn ngram_map_hash(tokens: &[u32]) -> u32 { + let mut hash = 0u32; + for &t in tokens { + hash = hash.wrapping_mul(LCG_FACTOR).wrapping_add(t); + } + hash +} + +impl NgramMap { + pub fn new(size_key: usize, size_value: usize, key_only: bool, min_hits: u16) -> Self { + Self { + size_key: size_key.max(1), + size_value: size_value.max(1), + key_only, + min_hits: min_hits.max(1), + keys: Vec::new(), + size_last_begin: 0, + last_draft_created: false, + last_draft_key_idx: 0, + last_draft_value_idx: 0, + idx_last_check: 0, + key_map: vec![0; COMMON_NGRAM_HASH_MAP_SIZE], + key_map_last_idx: 0, + } + } + + pub fn begin(&mut self, tokens: &[u32]) { + let size_begin = tokens.len(); + let mut idx_begin_cleanup = self.size_last_begin; + if idx_begin_cleanup > size_begin { + idx_begin_cleanup = size_begin.saturating_sub(self.size_key + self.size_value); + } + if !self.key_map.is_empty() && size_begin < self.idx_last_check { + for entry in &mut self.key_map { + if *entry != 0 && (*entry as usize) >= idx_begin_cleanup { + *entry = 0; + } + } + self.key_map_last_idx = idx_begin_cleanup.saturating_sub(1); + } + if size_begin < self.idx_last_check && !self.keys.is_empty() { + let key_only = self.key_only; + self.keys.retain_mut(|key| { + if key.key_idx >= idx_begin_cleanup { + return false; + } + if key_only { + return true; + } + for j in (0..COMMON_NGRAM_MAX_VALUES).rev() { + if key.values[j].value_idx != 0 && key.values[j].value_idx >= idx_begin_cleanup { + for k in j..COMMON_NGRAM_MAX_VALUES - 1 { + key.values[k] = key.values[k + 1]; + } + key.values[COMMON_NGRAM_MAX_VALUES - 1] = NgramMapValue::default(); + } + } + key.values[0].value_idx != 0 + }); + } + self.idx_last_check = size_begin; + self.size_last_begin = size_begin; + } + + pub fn draft(&mut self, inp: &[u32], sampled: u32, draft_max: usize) -> Vec { + self.last_draft_created = false; + self.last_draft_key_idx = 0; + self.last_draft_value_idx = 0; + + let cur_len = inp.len(); + let n = self.size_key; + let m = self.size_value; + if cur_len < 2 * n + m || draft_max == 0 { + return Vec::new(); + } + if self.idx_last_check > cur_len || self.size_last_begin > cur_len { + self.begin(inp); + } + self.idx_last_check = cur_len; + + let mut key_tokens = Vec::with_capacity(n); + key_tokens.extend_from_slice(&inp[cur_len + 1 - n..cur_len]); + key_tokens.push(sampled); + + let mut match_pos = 0usize; + if !self.key_map.is_empty() { + let idx_hash = (ngram_map_hash(&key_tokens) as usize) % self.key_map.len(); + let idx_key = self.key_map[idx_hash] as usize; + if idx_key != 0 && idx_key + n + m + 1 < cur_len && inp[idx_key..idx_key + n] == key_tokens[..] { + match_pos = idx_key; + } + } + if match_pos == 0 && self.size_last_begin > n + m + 1 { + let hi = self.size_last_begin - n - m - 1; + for j in (self.key_map_last_idx + 1..=hi).rev() { + if inp[j..j + n] == key_tokens[..] { + match_pos = j; + break; + } + } + } + if match_pos == 0 && cur_len > n + m + 1 { + let hi = cur_len - n - m - 1; + let lo = self.size_last_begin.max(self.key_map_last_idx); + if hi > lo { + for j in (lo + 1..=hi).rev() { + if inp[j..j + n] == key_tokens[..] { + match_pos = j; + break; + } + } + } + } + + if !self.key_map.is_empty() { + if self.size_last_begin > n + m + 1 { + let hi = self.size_last_begin - n - m - 1; + for j in (self.key_map_last_idx + 1..=hi).rev() { + let idx_hash = (ngram_map_hash(&inp[j..j + n]) as usize) % self.key_map.len(); + if self.key_map[idx_hash] == 0 { + self.key_map[idx_hash] = j as u32; + } + } + } + if cur_len > n + m + 1 { + let hi = cur_len - n - m - 1; + let lo = self.size_last_begin.max(self.key_map_last_idx); + if hi > lo { + for j in (lo + 1..=hi).rev() { + let idx_hash = (ngram_map_hash(&inp[j..j + n]) as usize) % self.key_map.len(); + if self.key_map[idx_hash] == 0 { + self.key_map[idx_hash] = j as u32; + } + } + } + self.key_map_last_idx = self.key_map_last_idx.max(hi); + } + } + + if match_pos == 0 { + return Vec::new(); + } + + let mut key_offset = self.keys.len(); + for (i, k) in self.keys.iter().enumerate() { + if k.key_idx + n <= inp.len() && inp[k.key_idx..k.key_idx + n] == key_tokens[..] { + key_offset = i; + break; + } + } + if key_offset == self.keys.len() { + let mut values = [NgramMapValue::default(); COMMON_NGRAM_MAX_VALUES]; + for v in &mut values { + v.n_accepted = m as i16; + } + self.keys.push(NgramMapKey { + key_idx: match_pos, + stat_idx: 0, + key_num: 0, + values, + }); + } + + let curr_key = &mut self.keys[key_offset]; + curr_key.key_num = (curr_key.key_num + 1).min(COMMON_NGRAM_MAX_VALUE_COUNT); + + if self.key_only { + let n_draft = m + .min(curr_key.values[0].n_accepted.max(0) as usize) + .min(draft_max) + .min(cur_len.saturating_sub(match_pos + n)); + self.last_draft_created = n_draft > 0; + self.last_draft_key_idx = key_offset; + self.last_draft_value_idx = 0; + return inp[match_pos + n..match_pos + n + n_draft].to_vec(); + } + + if curr_key.key_num < self.min_hits { + return Vec::new(); + } + + for i in curr_key.stat_idx..=match_pos { + if i + n + m > cur_len || inp[i..i + n] != key_tokens[..] { + continue; + } + let idx_begin_value_key = i + n; + let mut idx_value = None; + for v in 0..COMMON_NGRAM_MAX_VALUES { + let idx_v = curr_key.values[v].value_idx; + if idx_v == 0 { + curr_key.values[v].value_idx = idx_begin_value_key; + curr_key.values[v].value_num = 0; + curr_key.values[v].n_accepted = m as i16; + idx_value = Some(v); + break; + } + if idx_v + m <= cur_len && inp[idx_begin_value_key..idx_begin_value_key + m] == inp[idx_v..idx_v + m] { + idx_value = Some(v); + break; + } + } + if let Some(v) = idx_value { + curr_key.values[v].value_num = (curr_key.values[v].value_num + 1).min(COMMON_NGRAM_MAX_VALUE_COUNT); + } + } + curr_key.stat_idx = match_pos; + + let mut max_occur = 0u16; + let mut slot_max = 0usize; + for v in 0..COMMON_NGRAM_MAX_VALUES { + if curr_key.values[v].value_num > max_occur { + max_occur = curr_key.values[v].value_num; + slot_max = v; + } + } + let sum_occur: u32 = (0..COMMON_NGRAM_MAX_VALUES) + .filter(|&v| v != slot_max) + .map(|v| curr_key.values[v].value_num as u32) + .sum(); + if sum_occur > 0 && (max_occur as u32) < 2 * sum_occur { + return Vec::new(); + } + + let n_draft = m + .min(curr_key.values[slot_max].n_accepted.max(0) as usize) + .min(draft_max) + .min(cur_len.saturating_sub(match_pos + n)); + self.last_draft_created = n_draft > 0; + self.last_draft_key_idx = key_offset; + self.last_draft_value_idx = slot_max; + inp[match_pos + n..match_pos + n + n_draft].to_vec() + } + + pub fn accept(&mut self, n_accepted: usize) { + if !self.last_draft_created { + return; + } + if let Some(key) = self.keys.get_mut(self.last_draft_key_idx) { + if let Some(val) = key.values.get_mut(self.last_draft_value_idx) { + val.n_accepted = n_accepted as i16; + } + } + } +} + +// --------------------------------------------------------------------------- +// 3. N-gram Mod (`common_ngram_mod` in `llama.cpp`) +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone)] +pub struct NgramMod { + n: usize, + n_min: usize, + n_max: usize, + entries: Vec, + used: usize, + i_last: usize, + n_draft_last: usize, + n_low: usize, +} + +impl NgramMod { + pub const EMPTY: i32 = -1; + pub const DEFAULT_SIZE: usize = 4 * 1024 * 1024; + + pub fn new(n: usize, n_min: usize, n_max: usize) -> Self { + Self { + n: n.max(1), + n_min, + n_max, + entries: vec![Self::EMPTY; Self::DEFAULT_SIZE], + used: 0, + i_last: 0, + n_draft_last: 0, + n_low: 0, + } + } + + fn idx(&self, tokens: &[u32]) -> usize { + let mut res = 0u64; + for &t in &tokens[..self.n] { + res = res.wrapping_mul(6364136223846793005u64).wrapping_add(t as u64); + } + (res as usize) % self.entries.len() + } + + fn add(&mut self, window: &[u32]) { + let i = self.idx(window); + if self.entries[i] == Self::EMPTY { + self.used += 1; + } + self.entries[i] = window[self.n] as i32; + } + + fn get(&self, window: &[u32]) -> i32 { + self.entries[self.idx(window)] + } + + pub fn reset_table(&mut self) { + self.entries.fill(Self::EMPTY); + self.used = 0; + } + + pub fn begin(&mut self, prompt: &[u32]) { + self.i_last = 0; + self.n_draft_last = 0; + let n = self.n; + if prompt.len() <= n { + return; + } + for i in 0..prompt.len() - n { + self.add(&prompt[i..=i + n]); + } + self.i_last = prompt.len() - n; + if (self.used as f64) / (self.entries.len() as f64) > 0.25 { + self.reset_table(); + } + } + + pub fn draft(&mut self, prompt: &[u32], sampled: u32, draft_max: usize) -> Vec { + self.n_draft_last = 0; + let cur_len = prompt.len(); + let n = self.n; + let max_len = self.n_max.min(draft_max); + if cur_len < n || max_len == 0 { + return Vec::new(); + } + if self.i_last + 32 < cur_len && cur_len > n { + for i in self.i_last..cur_len - n { + self.add(&prompt[i..=i + n]); + } + self.i_last = cur_len - n; + } + let mut buf = Vec::with_capacity(n + max_len); + buf.extend_from_slice(&prompt[cur_len + 1 - n..cur_len]); + buf.push(sampled); + for i in 0..max_len { + let tok = self.get(&buf[i..i + n]); + if tok == Self::EMPTY { + if i < self.n_min.min(max_len) { + return Vec::new(); + } + break; + } + buf.push(tok as u32); + } + let out = buf[n..].to_vec(); + self.n_draft_last = out.len(); + out + } + + pub fn accept(&mut self, n_accepted: usize) { + if self.n_draft_last > 0 { + let f_acc = (n_accepted as f64) / (self.n_draft_last as f64); + if f_acc < 0.25 { + self.n_low += 1; + if self.n_low >= 5 { + self.reset_table(); + self.n_low = 0; + self.i_last = 0; + } + } else { + self.n_low = 0; + } + } + } +} + +// --------------------------------------------------------------------------- +// 4. N-gram Cache (`common_ngram_cache` in `llama.cpp`) +// --------------------------------------------------------------------------- + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct NgramKey(pub [i32; LLAMA_NGRAM_MAX]); + +impl Default for NgramKey { + fn default() -> Self { + Self([LLAMA_TOKEN_NULL; LLAMA_NGRAM_MAX]) + } +} + +impl NgramKey { + pub fn from_slice(tokens: &[u32]) -> Self { + let mut k = [LLAMA_TOKEN_NULL; LLAMA_NGRAM_MAX]; + for (i, &t) in tokens.iter().take(LLAMA_NGRAM_MAX).enumerate() { + k[i] = t as i32; + } + Self(k) + } +} + +impl std::hash::Hash for NgramKey { + fn hash(&self, state: &mut H) { + let mut h = (self.0[0] as u64).wrapping_mul(11400714819323198485u64); + for i in 1..LLAMA_NGRAM_MAX { + h ^= (self.0[i] as u64).wrapping_mul(11400714819323198485u64); + } + state.write_u64(h); + } +} + +pub type NgramCachePart = HashMap; +pub type NgramCacheMap = HashMap; + +pub fn ngram_cache_update(cache: &mut NgramCacheMap, ngram_min: usize, ngram_max: usize, inp: &[u32], nnew: usize) { + let inp_size = inp.len(); + if inp_size < 2 || nnew == 0 { + return; + } + let nmin = ngram_min.clamp(1, LLAMA_NGRAM_MAX); + let nmax = ngram_max.clamp(nmin, LLAMA_NGRAM_MAX); + for ngram_size in nmin..=nmax { + let i_start = inp_size.saturating_sub(nnew).max(ngram_size); + for i in i_start..inp_size { + let ngram = NgramKey::from_slice(&inp[i - ngram_size..i]); + let token = inp[i]; + let part = cache.entry(ngram).or_default(); + *part.entry(token).or_insert(0) += 1; + } + } +} + +fn get_seq_token(inp: &[u32], draft: &[u32], i: usize) -> u32 { + if i < inp.len() { + inp[i] + } else { + draft[1 + i - inp.len()] + } +} + +fn try_draft_static(nc_static: &NgramCacheMap, ngram_static: NgramKey) -> Option { + let part = nc_static.get(&ngram_static)?; + let mut max_count = 0i32; + let mut sum_count = 0i32; + let mut max_token = None; + for (&tok, &cnt) in part { + if cnt > max_count { + max_count = cnt; + max_token = Some(tok); + } + sum_count += cnt; + } + if sum_count < DRAFT_MIN_SAMPLE_SIZE_LAX[LLAMA_NGRAM_STATIC - 1] { + return None; + } + if 100 * max_count < DRAFT_MIN_PERCENT_LAX[LLAMA_NGRAM_STATIC - 1] * sum_count { + return None; + } + max_token +} + +fn try_draft_primary( + nc_primary: &NgramCacheMap, + ngrams_primary: &[NgramKey], + part_static: Option<&NgramCachePart>, + min_sample_size: &[i32; LLAMA_NGRAM_MAX], + min_percent: &[i32; LLAMA_NGRAM_MAX], +) -> Option { + for &ngram in ngrams_primary.iter().rev() { + let Some(part_primary) = nc_primary.get(&ngram) else { + continue; + }; + let idx = ngram + .0 + .iter() + .take_while(|&&t| t != LLAMA_TOKEN_NULL) + .count() + .saturating_sub(1) + .min(LLAMA_NGRAM_MAX - 1); + let mut max_count_primary = 0i64; + let mut max_count_static = 0i64; + let mut sum_count_primary = 0i32; + let mut max_token = None; + + for (&token, &count_primary) in part_primary { + let count_static = part_static + .and_then(|ps| ps.get(&token)) + .map_or(1i64, |&c| 100 * (c as i64)); + let cp = count_primary as i64; + if cp * count_static > max_count_primary * max_count_static { + max_token = Some(token); + max_count_primary = cp; + max_count_static = count_static; + } + sum_count_primary += count_primary; + } + if sum_count_primary < min_sample_size[idx] { + continue; + } + if 100 * (max_count_primary as i32) < min_percent[idx] * sum_count_primary { + continue; + } + if max_token.is_some() { + return max_token; + } + } + None +} + +pub fn ngram_cache_draft( + inp: &[u32], + sampled: u32, + n_draft: usize, + ngram_min: usize, + ngram_max: usize, + nc_context: &NgramCacheMap, + nc_dynamic: &NgramCacheMap, + nc_static: &NgramCacheMap, +) -> Vec { + if inp.len() + 1 < LLAMA_NGRAM_STATIC || n_draft == 0 { + return Vec::new(); + } + let mut full_inp = Vec::with_capacity(inp.len() + 1); + full_inp.extend_from_slice(inp); + full_inp.push(sampled); + let inp_size = full_inp.len(); + + let mut draft = vec![sampled]; + let nmin = ngram_min.clamp(1, LLAMA_NGRAM_MAX); + let nmax = ngram_max.clamp(nmin, LLAMA_NGRAM_MAX); + + while draft.len() - 1 < n_draft { + let total_len = inp_size + draft.len() - 1; + let ngram_static = if total_len >= LLAMA_NGRAM_STATIC { + let ngram_start_static = total_len - LLAMA_NGRAM_STATIC; + let mut k = NgramKey::default(); + for j in 0..LLAMA_NGRAM_STATIC { + k.0[j] = get_seq_token(&full_inp, &draft, ngram_start_static + j) as i32; + } + Some(k) + } else { + None + }; + let part_static = ngram_static.as_ref().and_then(|k| nc_static.get(k)); + + let mut ngrams_cd = Vec::with_capacity(nmax - nmin + 1); + for ngram_size_cd in nmin..=nmax { + if total_len < ngram_size_cd { + break; + } + let start_cd = total_len - ngram_size_cd; + let mut key = NgramKey::default(); + for j in 0..ngram_size_cd { + key.0[j] = get_seq_token(&full_inp, &draft, start_cd + j) as i32; + } + ngrams_cd.push(key); + } + + let drafted = try_draft_primary( + nc_context, + &ngrams_cd, + part_static, + &DRAFT_MIN_SAMPLE_SIZE_LAX, + &DRAFT_MIN_PERCENT_LAX, + ) + .or_else(|| { + try_draft_primary( + nc_dynamic, + &ngrams_cd, + part_static, + &DRAFT_MIN_SAMPLE_SIZE_STRICT, + &DRAFT_MIN_PERCENT_STRICT, + ) + }) + .or_else(|| ngram_static.and_then(|k| try_draft_static(nc_static, k))); + + match drafted { + Some(tok) => draft.push(tok), + None => break, + } + } + draft.into_iter().skip(1).collect() +} + +pub fn ngram_cache_merge(target: &mut NgramCacheMap, add: &NgramCacheMap) { + for (&ngram, part) in add { + let dst = target.entry(ngram).or_default(); + for (&tok, &cnt) in part { + *dst.entry(tok).or_insert(0) += cnt; + } + } +} + +/// Save `cache` in `llama.cpp`'s `common_ngram_cache_save` binary format. +pub fn ngram_cache_save(cache: &NgramCacheMap, path: &Path) -> anyhow::Result<()> { + if let Some(parent) = path.parent() && !parent.as_os_str().is_empty() { + std::fs::create_dir_all(parent)?; + } + let mut out = BufWriter::new(File::create(path)?); + for (ngram, part) in cache { + if part.is_empty() { + continue; + } + for &t in &ngram.0 { + out.write_all(&t.to_le_bytes())?; + } + let ntokens = part.len() as i32; + out.write_all(&ntokens.to_le_bytes())?; + for (&tok, &cnt) in part { + out.write_all(&(tok as i32).to_le_bytes())?; + out.write_all(&cnt.to_le_bytes())?; + } + } + out.flush()?; + Ok(()) +} + +/// Load a lookup cache in `llama.cpp`'s binary format (`common_ngram_cache_load`). +pub fn ngram_cache_load_binary(bytes: &[u8]) -> anyhow::Result { + let mut r = std::io::Cursor::new(bytes); + let mut cache = NgramCacheMap::new(); + let mut buf4 = [0u8; 4]; + while (r.position() as usize) < bytes.len() { + let mut key = [LLAMA_TOKEN_NULL; LLAMA_NGRAM_MAX]; + for k in &mut key { + r.read_exact(&mut buf4)?; + *k = i32::from_le_bytes(buf4); + } + r.read_exact(&mut buf4)?; + let ntokens = i32::from_le_bytes(buf4); + anyhow::ensure!(ntokens > 0 && ntokens <= 1_000_000, "invalid ntokens {ntokens} in binary ngram cache"); + let mut part = NgramCachePart::with_capacity(ntokens as usize); + for _ in 0..ntokens { + r.read_exact(&mut buf4)?; + let tok = i32::from_le_bytes(buf4); + r.read_exact(&mut buf4)?; + let cnt = i32::from_le_bytes(buf4); + anyhow::ensure!(tok >= 0 && cnt > 0, "invalid token/count ({tok}, {cnt}) in binary ngram cache"); + part.insert(tok as u32, cnt); + } + cache.insert(NgramKey(key), part); + } + Ok(cache) +} + +/// Load a lookup cache from `path`: tries `llama.cpp` binary format first, or if the file is valid UTF-8 text and a +/// tokenizer is supplied, tokenizes the text corpus and extracts 1..=4 n-grams into the cache. +pub fn ngram_cache_load(path: &Path, tok: Option<&crate::tokenizer::Tokenizer>) -> anyhow::Result { + let bytes = std::fs::read(path)?; + if bytes.is_empty() { + return Ok(NgramCacheMap::new()); + } + if let Ok(cache) = ngram_cache_load_binary(&bytes) && !cache.is_empty() { + return Ok(cache); + } + if let (Ok(text), Some(tok)) = (std::str::from_utf8(&bytes), tok) { + let ids = tok.encode(text)?; + let mut cache = NgramCacheMap::new(); + ngram_cache_update(&mut cache, LLAMA_NGRAM_MIN, LLAMA_NGRAM_MAX, &ids, ids.len()); + return Ok(cache); + } + ngram_cache_load_binary(&bytes) +} + +/// Drop cache entries whose key or candidate tokens exceed `n_vocab` (e.g. a cache saved by a larger-vocab model). +pub fn ngram_cache_filter_vocab(cache: &mut NgramCacheMap, n_vocab: usize) -> usize { + if n_vocab == 0 { + return 0; + } + let mut pruned = 0usize; + cache.retain(|key, part| { + let key_ok = key.0.iter().all(|&t| t == LLAMA_TOKEN_NULL || (t >= 0 && (t as usize) < n_vocab)); + if !key_ok { + pruned += part.len().max(1); + return false; + } + let before = part.len(); + part.retain(|&tok, _| (tok as usize) < n_vocab); + pruned += before - part.len(); + !part.is_empty() + }); + pruned +} + +// --------------------------------------------------------------------------- +// Unified Drafter (`NgramDrafter`) owned by `GpuModel` +// --------------------------------------------------------------------------- + +pub struct NgramDrafter { + pub cfg: NgramConfig, + pub history: Vec, + eos: Vec, + map_k: Option, + map_k4v: Option, + mod_state: Option, + cache_size: usize, + nc_context: NgramCacheMap, + nc_dynamic: NgramCacheMap, + nc_static: NgramCacheMap, + last_used: Option, + last_draft_len: usize, + short_cooldown: usize, +} + +impl NgramDrafter { + pub fn new(cfg: NgramConfig, tok: Option<&crate::tokenizer::Tokenizer>) -> anyhow::Result { + let eos = tok.map(|t| t.eos_ids()).unwrap_or_default(); + let mut nc_static = match &cfg.lookup_cache_static { + Some(p) => ngram_cache_load(p, tok)?, + None => NgramCacheMap::new(), + }; + let mut nc_dynamic = match &cfg.lookup_cache_dynamic { + Some(p) if p.exists() => ngram_cache_load(p, tok).unwrap_or_default(), + _ => NgramCacheMap::new(), + }; + let pruned = ngram_cache_filter_vocab(&mut nc_static, cfg.n_vocab) + + ngram_cache_filter_vocab(&mut nc_dynamic, cfg.n_vocab); + if pruned > 0 { + eprintln!( + "note: pruned {pruned} out-of-vocabulary entries (n_vocab={}) from ngram lookup cache", + cfg.n_vocab + ); + } + let map_k = cfg + .types + .contains(&SpecType::NgramMapK) + .then(|| NgramMap::new(cfg.size_n, cfg.size_m, true, cfg.min_hits)); + let map_k4v = cfg + .types + .contains(&SpecType::NgramMapK4v) + .then(|| NgramMap::new(cfg.size_n, cfg.size_m, false, cfg.min_hits)); + let mod_state = cfg + .types + .contains(&SpecType::NgramMod) + .then(|| NgramMod::new(cfg.mod_n_match, cfg.mod_n_min, cfg.draft_max)); + + Ok(Self { + cfg, + history: Vec::new(), + eos, + map_k, + map_k4v, + mod_state, + cache_size: 0, + nc_context: NgramCacheMap::new(), + nc_dynamic, + nc_static, + last_used: None, + last_draft_len: 0, + short_cooldown: 0, + }) + } + + fn flush_dynamic_context(&mut self) { + if self.cfg.lookup_cache_dynamic.is_some() { + if self.cache_size < self.history.len() { + let nnew = self.history.len() - self.cache_size; + ngram_cache_update(&mut self.nc_context, LLAMA_NGRAM_MIN, LLAMA_NGRAM_MAX, &self.history, nnew); + self.cache_size = self.history.len(); + } + if !self.nc_context.is_empty() { + ngram_cache_merge(&mut self.nc_dynamic, &self.nc_context); + } + } + } + + pub fn reset(&mut self) { + self.flush_dynamic_context(); + self.history.clear(); + self.nc_context.clear(); + self.cache_size = 0; + self.last_used = None; + self.last_draft_len = 0; + self.short_cooldown = 0; + if let Some(m) = &mut self.map_k { + m.begin(&[]); + } + if let Some(m) = &mut self.map_k4v { + m.begin(&[]); + } + } + + /// Initialize or replace history with `prompt` (called by `prefill` and `prefill_cached`). + pub fn begin(&mut self, prompt: &[u32]) { + if !prompt.starts_with(&self.history) { + self.flush_dynamic_context(); + self.nc_context.clear(); + self.cache_size = 0; + } + self.history.clear(); + self.history.extend_from_slice(prompt); + self.last_used = None; + self.last_draft_len = 0; + self.short_cooldown = 0; + if let Some(m) = &mut self.map_k { + m.begin(&self.history); + } + if let Some(m) = &mut self.map_k4v { + m.begin(&self.history); + } + if let Some(m) = &mut self.mod_state { + m.begin(&self.history); + } + } + + /// Propose up to `max_draft` tokens following `sampled` (which is not yet in `self.history`). + pub fn draft(&mut self, sampled: u32, max_draft: usize) -> Vec { + let cap = max_draft.min(self.cfg.draft_max); + self.last_used = None; + self.last_draft_len = 0; + if cap == 0 { + return Vec::new(); + } + let mut out = Vec::new(); + for &ty in &self.cfg.types { + let res = match ty { + SpecType::None => Vec::new(), + SpecType::NgramSimple => { + let mut r = ngram_simple_draft_eos(&self.history, sampled, self.cfg.size_n, self.cfg.size_m, cap, &self.eos); + if r.is_empty() && self.short_cooldown == 0 { + if self.cfg.size_n > 6 { + r = ngram_simple_draft_eos(&self.history, sampled, 6, self.cfg.size_m, cap, &self.eos); + } + if r.is_empty() && self.cfg.size_n > 4 { + r = ngram_simple_draft_eos(&self.history, sampled, 4, self.cfg.size_m, cap.min(8), &self.eos); + } + } + r + } + SpecType::NgramMapK => self.map_k.as_mut().map_or_else(Vec::new, |m| m.draft(&self.history, sampled, cap)), + SpecType::NgramMapK4v => self.map_k4v.as_mut().map_or_else(Vec::new, |m| m.draft(&self.history, sampled, cap)), + SpecType::NgramMod => self.mod_state.as_mut().map_or_else(Vec::new, |m| m.draft(&self.history, sampled, cap)), + SpecType::NgramCache => { + let mut inp = self.history.clone(); + inp.push(sampled); + if self.cache_size < inp.len() { + let nnew = inp.len() - self.cache_size; + ngram_cache_update(&mut self.nc_context, LLAMA_NGRAM_MIN, LLAMA_NGRAM_MAX, &inp, nnew); + self.cache_size = inp.len(); + } + let exact = if self.short_cooldown == 0 { + ngram_simple_draft_eos(&self.history, sampled, 6, self.cfg.size_m, cap, &self.eos) + } else { + Vec::new() + }; + if !exact.is_empty() { + exact + } else if self.short_cooldown == 0 || !self.nc_static.is_empty() || !self.nc_dynamic.is_empty() { + let cache_cap = if self.nc_static.is_empty() && self.nc_dynamic.is_empty() { + cap.min(6) + } else { + cap + }; + ngram_cache_draft( + &self.history, + sampled, + cache_cap, + 2, + LLAMA_NGRAM_MAX, + &self.nc_context, + &self.nc_dynamic, + &self.nc_static, + ) + } else { + Vec::new() + } + } + }; + if !res.is_empty() { + self.last_used = Some(ty); + out = res; + break; + } + } + if out.is_empty() + && !self.cfg.types.contains(&SpecType::NgramCache) + && (!self.nc_static.is_empty() || !self.nc_dynamic.is_empty()) + { + let res = ngram_cache_draft( + &self.history, + sampled, + cap, + 3, + LLAMA_NGRAM_MAX, + &NgramCacheMap::new(), + &self.nc_dynamic, + &self.nc_static, + ); + if !res.is_empty() { + self.last_used = Some(SpecType::NgramCache); + out = res; + } + } + if let Some(pos) = out.iter().position(|t| self.eos.contains(t)) { + out.truncate(pos + 1); + } + if self.cfg.n_vocab > 0 { + if let Some(pos) = out.iter().position(|&t| (t as usize) >= self.cfg.n_vocab) { + out.truncate(pos); + } + } + self.last_draft_len = out.len(); + out + } + + /// Record the tokens accepted in this step (`[sampled, accepted_drafts..]`) and notify the active drafter. + pub fn accept(&mut self, accepted_tokens: &[u32]) { + let n_accepted_drafts = accepted_tokens.len().saturating_sub(1); + if self.short_cooldown > 0 { + self.short_cooldown -= 1; + } + if self.last_draft_len > 0 && n_accepted_drafts == 0 { + self.short_cooldown = 8; + } + match self.last_used { + Some(SpecType::NgramMapK) => { + if let Some(m) = &mut self.map_k { + m.accept(n_accepted_drafts); + } + } + Some(SpecType::NgramMapK4v) => { + if let Some(m) = &mut self.map_k4v { + m.accept(n_accepted_drafts); + } + } + Some(SpecType::NgramMod) => { + if let Some(m) = &mut self.mod_state { + m.accept(n_accepted_drafts); + } + } + _ => {} + } + self.history.extend_from_slice(accepted_tokens); + } + + /// Persist the dynamic lookup cache to disk if configured. + pub fn save_dynamic(&mut self) -> anyhow::Result<()> { + self.flush_dynamic_context(); + let Some(path) = &self.cfg.lookup_cache_dynamic else { + return Ok(()); + }; + if !self.nc_dynamic.is_empty() { + ngram_cache_save(&self.nc_dynamic, path)?; + } + Ok(()) + } +} + +impl Drop for NgramDrafter { + fn drop(&mut self) { + let _ = self.save_dynamic(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn ngram_simple_finds_exact_match_and_respects_draft_max() { + // Build a 100-token sequence with a repeated 30-token block. + let mut tokens: Vec = (1..=80).collect(); + // Repeat tokens 20..32 (12 tokens) at the end: 20..31 in history, 31 as `sampled`. + tokens.extend(20..31); + let draft = ngram_simple_draft(&tokens, 31, 12, 48, 16); + assert_eq!(draft, (32..48).collect::>()); + } + + #[test] + fn ngram_map_k_and_k4v_draft_and_adapt_acceptance() { + let mut tokens: Vec = (1..=100).collect(); + tokens.extend(10..21); + let mut map = NgramMap::new(12, 16, true, 1); + map.begin(&tokens); + let d1 = map.draft(&tokens, 21, 16); + assert_eq!(d1, (22..38).collect::>()); + map.accept(5); + let d2 = map.draft(&tokens, 21, 16); + assert_eq!(d2.len(), 5); + } + + #[test] + fn ngram_mod_hashes_and_drafts_long_sequences() { + let mut mod_drafter = NgramMod::new(8, 2, 16); + let prompt: Vec = (100..200).collect(); + mod_drafter.begin(&prompt); + let mut ctx = prompt.clone(); + ctx.extend_from_slice(&prompt[10..17]); + let draft = mod_drafter.draft(&ctx, prompt[17], 12); + assert_eq!(draft, prompt[18..30].to_vec()); + } + + #[test] + fn ngram_cache_roundtrip_and_draft() { + let mut cache = NgramCacheMap::new(); + let seq = vec![10u32, 20, 30, 40, 50, 10, 20, 30, 40, 50, 10, 20, 30, 40, 50]; + ngram_cache_update(&mut cache, 1, 4, &seq, seq.len()); + let tmp = std::env::temp_dir().join("strata_test_ngram_cache.bin"); + ngram_cache_save(&cache, &tmp).unwrap(); + let loaded = ngram_cache_load(&tmp, None).unwrap(); + let _ = std::fs::remove_file(&tmp); + assert_eq!(cache.len(), loaded.len()); + let draft = ngram_cache_draft(&[10, 20], 30, 4, 1, 4, &loaded, &NgramCacheMap::new(), &NgramCacheMap::new()); + assert_eq!(draft, vec![40, 50, 10, 20]); + } + + #[test] + fn test_ngram_cache_draft_short_history() { + let empty = NgramCacheMap::new(); + let draft = ngram_cache_draft(&[], 42, 4, 1, 4, &empty, &empty, &empty); + assert!(draft.is_empty()); + let mut c = NgramCacheMap::new(); + ngram_cache_update(&mut c, 1, 4, &[], 1); + ngram_cache_update(&mut c, 1, 4, &[42], 1); + assert!(c.is_empty()); + } + + #[test] + fn test_ngram_cache_vocab_filter() { + let mut cache = NgramCacheMap::new(); + // Token ID 231622 comes from a 248320-vocab model; target is 151936-vocab Qwen3-30B-A3B. + let cross_seq = vec![10u32, 20, 231_622, 10, 20, 231_622, 10, 20, 231_622]; + ngram_cache_update(&mut cache, 1, 4, &cross_seq, cross_seq.len()); + let valid_seq = vec![10u32, 20, 30, 10, 20, 30, 10, 20, 30]; + ngram_cache_update(&mut cache, 1, 4, &valid_seq, valid_seq.len()); + let tmp = std::env::temp_dir().join("strata_test_ngram_vocab_filter.bin"); + ngram_cache_save(&cache, &tmp).unwrap(); + let cfg = NgramConfig { + types: vec![SpecType::NgramCache], + n_vocab: 151_936, + lookup_cache_static: Some(tmp.clone()), + ..Default::default() + }; + let mut drafter = NgramDrafter::new(cfg, None).unwrap(); + let _ = std::fs::remove_file(&tmp); + drafter.begin(&[10]); + let drafted = drafter.draft(20, 8); + assert!(drafted.iter().all(|&t| (t as usize) < 151_936)); + assert_eq!(drafted.first().copied(), Some(30)); + } + + #[test] + fn test_ngram_cache_try_draft_primary_indexes_by_ngram_len() { + let mut cache = NgramCacheMap::new(); + // Single occurrence of [10, 20, 30] -> 40. With nmin=2, a 3-token context key must consult + // DRAFT_MIN_SAMPLE_SIZE_LAX[2] (= 1), not index [1] (= 2). + let seq = vec![10u32, 20, 30, 40]; + ngram_cache_update(&mut cache, 2, 4, &seq, seq.len()); + let draft = ngram_cache_draft(&[10, 20], 30, 2, 2, 4, &cache, &NgramCacheMap::new(), &NgramCacheMap::new()); + assert_eq!(draft, vec![40]); + } +} diff --git a/src/vulkan/mod.rs b/src/vulkan/mod.rs index 010ecdbf..f7790733 100644 --- a/src/vulkan/mod.rs +++ b/src/vulkan/mod.rs @@ -141,6 +141,10 @@ struct Inner { tsem: vk::Semaphore, mem: vk::PhysicalDeviceMemoryProperties, budget: bool, + /// Integrated GPU (APU sharing unified system LPDDR memory between device and host heaps). + igpu: bool, + /// AMD RDNA3 / RDNA3.5 (gfx11xx) or iGPU whose small L2 cache hurts from next-layer MoE prefetch. + gfx11: bool, /// The device runs fixed 64-lane subgroups, split into logical 32-lane warps. wave64: bool, /// VK_KHR_cooperative_matrix with the 16 x 16 x 16 f16 / f32 shape is enabled (`gemm_f`, `attn_prefill`). @@ -164,6 +168,8 @@ struct Inner { /// `maxComputeSharedMemorySize` of the device (or STRATA_VK_SMEM_LIMIT, a test hook): no pipeline may need more /// `Workgroup` bytes than this (`Vk::pipeline`), or the driver accepts it and faults at dispatch (Xid 13 on Volta). smem_limit: u32, + /// Nanoseconds per GPU timestamp tick (`VkPhysicalDeviceLimits::timestampPeriod`). + ts_period: f32, /// STRATA_VK_STATS: print the driver's statistics (registers, ...) of each pipeline as it is created. stats: bool, /// The one pipeline layout: a 128-byte push constant range (the Vulkan minimum), no descriptor sets. @@ -177,12 +183,16 @@ struct State { spare: Vec, /// Submitted since the last wait. used: Vec, + /// Closed command buffers and graph replays queued in execution order for the next `submit`. + queued: Vec, /// The open command buffer. cur: Option, /// The command buffer with conditional rendering on (`cond_on`), ended before the buffer is. cond: Option, /// Conditional rendering failed the self-test in `Vk::new`: not used. no_cond: bool, + /// Set by `skip_rest` when a non-fast-path MoE combine (`mb != 0`) uses conditional rendering. + need_cond: bool, /// A MoE combine gave up waiting for the CPU worker since the last `stalled` (see `Backend::stalled`). stalled: bool, /// Work was submitted since the last wait. @@ -260,9 +270,14 @@ impl Drop for Inner { fn drop(&mut self) { let st = self.st.get_mut().unwrap_or_else(|e| e.into_inner()); if let Some((_, _, tot)) = &st.prof { + let scale = self.ts_period as f64; let mut v: Vec<_> = tot.iter().collect(); v.sort_by_key(|x| std::cmp::Reverse(x.1.0)); - let all: u64 = v.iter().map(|x| x.1.0).sum(); - for (n, (ns, c)) in v { eprintln!("prof {n:16} {:9.1} ms {:5.1}% {c:7} calls {:8.2} us", *ns as f64 / 1e6, *ns as f64 * 100.0 / all as f64, *ns as f64 / 1e3 / *c as f64); } + let all: f64 = v.iter().filter(|(k, _)| **k != "_barrier_gap").map(|x| x.1.0 as f64 * scale).sum(); + eprintln!("vulkan prof (timestampPeriod = {:.2} ns, active kernel sum = {:.2} ms):", self.ts_period, all / 1e6); + for (n, (ticks, c)) in v { + let ns = *ticks as f64 * scale; + eprintln!("prof {n:24} {:9.2} ms {:5.1}% {c:7} calls {:8.2} us", ns / 1e6, ns * 100.0 / all.max(1.0), ns / 1e3 / (*c).max(1) as f64); + } } unsafe { let _ = self.dev.device_wait_idle(); @@ -369,7 +384,13 @@ impl Vk { && std::env::var_os("STRATA_VK_NO_COOP").is_none(); // STRATA_VK_NO_COOP: run the kernels for devices without them let coop_i8 = coop && shape(32, vk::ComponentTypeKHR::SINT8, vk::ComponentTypeKHR::SINT32); // The tiled fallback needs a 1024-thread workgroup and 32 KB of shared memory (see attn_prefill_tile.comp). - let limits = unsafe { instance.get_physical_device_properties(pd) }.limits; + let dev_props = unsafe { instance.get_physical_device_properties(pd) }; + let limits = dev_props.limits; + let igpu = dev_props.device_type == vk::PhysicalDeviceType::INTEGRATED_GPU; + let name_up = name.to_ascii_uppercase(); + let gfx11 = dev_props.vendor_id == 0x1002 && (igpu || (coop && !coop_i8) + || ["GFX11", "STRIX", "PHOENIX", "KRACKAN", "NAVI3", "RADEON 8", "RADEON 7", "RX 7"] + .iter().any(|k| name_up.contains(k))); let dp_tile = !coop && limits.max_compute_work_group_invocations >= 1024 && limits.max_compute_shared_memory_size >= 32 << 10 && std::env::var_os("STRATA_VK_DP_OLD").is_none(); if coop { exts.push(ash::khr::cooperative_matrix::NAME.as_ptr()) } @@ -437,12 +458,13 @@ impl Vk { let fence = unsafe { dev.create_fence(&vk::FenceCreateInfo::default(), None) }?; let pc = [vk::PushConstantRange::default().stage_flags(vk::ShaderStageFlags::COMPUTE).size(128)]; let layout = unsafe { dev.create_pipeline_layout(&vk::PipelineLayoutCreateInfo::default().push_constant_ranges(&pc), None) }?; - let st = State { pool, spare: vec![], used: vec![], cur: None, cond: None, no_cond: false, stalled: false, busy: false, gpool, graphs: HashMap::new(), rec: None, batch: false, beside: false, tpool, tcur: None, + let st = State { pool, spare: vec![], used: vec![], queued: vec![], cur: None, cond: None, no_cond: false, need_cond: false, stalled: false, busy: false, gpool, graphs: HashMap::new(), rec: None, batch: false, beside: false, tpool, tcur: None, tspare: vec![], tused: vec![], tbytes: 0, tstart: 0, tring: Default::default(), cstaged: false, cval: 0, tval: 0, bwait: 0, twait: 0, tlag: 0, pipes: HashMap::new(), fence, staging: Default::default(), map: 0, staged: 0, ops: 0, copied: (0, 0), bufs: BTreeMap::new(), err: Default::default(), prof: if std::env::var_os("STRATA_VK_PROF").is_some() { Some((unsafe { dev.create_query_pool(&vk::QueryPoolCreateInfo::default().query_type(vk::QueryType::TIMESTAMP).query_count(65536), None) }?, vec![], HashMap::new())) } else { None }, step_pos: None }; let cr = cond.then(|| ash::ext::conditional_rendering::Device::new(&instance, &dev)); - let inner = Inner { _entry: entry, instance, pd, dev, queue, tq, qfs: [qf, tf.unwrap_or(qf)], csem, tsem, mem, budget, wave64, coop, dp_tile, coop_i8, amd_coherent, amd_plain, cr, llama: crate::cuda::llama_numerics() as u32, kv_q8: crate::cuda::kv_q8(), smem_limit, stats, layout, st: Mutex::new(st) }; + let ts_period = limits.timestamp_period; + let inner = Inner { _entry: entry, instance, pd, dev, queue, tq, qfs: [qf, tf.unwrap_or(qf)], csem, tsem, mem, budget, igpu, gfx11, wave64, coop, dp_tile, coop_i8, amd_coherent, amd_plain, cr, llama: crate::cuda::llama_numerics() as u32, kv_q8: crate::cuda::kv_q8(), smem_limit, ts_period, stats, layout, st: Mutex::new(st) }; let staging = inner.buffer(STAGING, HOST)?; let map = unsafe { inner.dev.map_memory(staging.1, 0, vk::WHOLE_SIZE, vk::MemoryMapFlags::empty()) }; let mut st = inner.st(); @@ -511,13 +533,31 @@ impl Inner { let req = unsafe { self.dev.get_buffer_memory_requirements(buf) }; // Memory the GPU does not cache (AMD flags 0xc0) only when asked for: it would be slow for anything else. let ok = |f: vk::MemoryPropertyFlags, want| f.contains(want) && (f & vk::MemoryPropertyFlags::from_raw(0xc0) & !want).is_empty(); - let ty = wants.iter().find_map(|&want| (0..self.mem.memory_type_count).find(|&i| req.memory_type_bits & (1 << i) != 0 - && ok(self.mem.memory_types[i as usize].property_flags, want))); + // On an iGPU, device-local and GTT heaps live in the same LPDDR: fall back to HOST if DEVICE heap is full. + let candidates: Vec = if wants == DEVICE && self.igpu { + wants.iter().chain(HOST.iter()).copied().collect() + } else { + wants.to_vec() + }; let mut flags = vk::MemoryAllocateFlagsInfo::default().flags(vk::MemoryAllocateFlags::DEVICE_ADDRESS); - let r = ty.context("no memory type").and_then(|ty| Ok(unsafe { self.dev.allocate_memory(&vk::MemoryAllocateInfo::default() - .allocation_size(req.size).memory_type_index(ty).push_next(&mut flags), None) } - .with_context(|| format!("allocate {bytes} bytes"))?)); - let mem = match r { Ok(m) => m, Err(e) => { unsafe { self.dev.destroy_buffer(buf, None) }; return Err(e) } }; + let mut last_err = anyhow::anyhow!("no matching memory type for {bytes} bytes"); + let mut mem_ok = None; + 'outer: for want in candidates { + for i in 0..self.mem.memory_type_count { + if req.memory_type_bits & (1 << i) != 0 && ok(self.mem.memory_types[i as usize].property_flags, want) { + match unsafe { + self.dev.allocate_memory( + &vk::MemoryAllocateInfo::default().allocation_size(req.size).memory_type_index(i).push_next(&mut flags), + None, + ) + } { + Ok(m) => { mem_ok = Some(m); break 'outer; } + Err(e) => last_err = anyhow::Error::from(e).context(format!("allocate {bytes} bytes")), + } + } + } + } + let mem = match mem_ok { Some(m) => m, None => { unsafe { self.dev.destroy_buffer(buf, None) }; return Err(last_err); } }; unsafe { self.dev.bind_buffer_memory(buf, mem, 0) }?; Ok((buf, mem)) } @@ -536,7 +576,7 @@ impl Inner { unsafe { self.dev.begin_command_buffer(c, &vk::CommandBufferBeginInfo::default() .flags(vk::CommandBufferUsageFlags::ONE_TIME_SUBMIT)) }?; st.cur = Some(c); - self.cond_on(st, c); + if st.need_cond { self.cond_on(st, c); } Ok(c) } @@ -555,6 +595,7 @@ impl Inner { /// while the error word is 0, so nothing after a combine that gave up runs until the host has seen it (no-op /// without conditional rendering). Every compute command buffer starts this way too, for the submissions after. fn skip_rest(&self, st: &mut State) -> anyhow::Result<()> { + st.need_cond = true; let cb = self.cb(st)?; self.end_cond(st, cb); self.cond_on(st, cb); @@ -581,17 +622,23 @@ impl Inner { } } - /// Submit the open command buffer, then `graph`; with `wait`, wait for all submitted work. - fn submit(&self, st: &mut State, graph: Option, wait: bool) -> anyhow::Result<()> { - let mut cbs = vec![]; + /// Close `st.cur` if open and append it (plus `graph` if given) to `st.queued` in order. + fn enqueue_cb(&self, st: &mut State, graph: Option) -> anyhow::Result<()> { if let Some(c) = st.cur.take() { st.copied.1 = 0; self.end_cond(st, c); unsafe { self.dev.end_command_buffer(c) }?; st.used.push(c); - cbs.push(c); + st.queued.push(c); } - cbs.extend(graph); + st.queued.extend(graph); + Ok(()) + } + + /// Submit the open command buffer, then `graph`; with `wait`, wait for all submitted work. + fn submit(&self, st: &mut State, graph: Option, wait: bool) -> anyhow::Result<()> { + self.enqueue_cb(st, graph)?; + let cbs = std::mem::take(&mut st.queued); if cbs.is_empty() && !(wait && st.busy) { return Ok(()); } let fence = if wait { st.fence } else { vk::Fence::null() }; st.cval += 1; @@ -634,11 +681,21 @@ impl Inner { if let Some((qp, names, tot)) = &mut st.prof { if !names.is_empty() { let mut t = vec![0u64; 2 * names.len()]; unsafe { self.dev.get_query_pool_results(*qp, 0, &mut t, vk::QueryResultFlags::TYPE_64 | vk::QueryResultFlags::WAIT) }?; - for (i, n) in names.drain(..).enumerate() { let e = tot.entry(n).or_default(); e.0 += t[2 * i + 1] - t[2 * i]; e.1 += 1; } + for (i, n) in names.drain(..).enumerate() { + let e = tot.entry(n).or_default(); + e.0 += t[2 * i + 1].saturating_sub(t[2 * i]); + e.1 += 1; + if i > 0 && t[2 * i] >= t[2 * i - 1] { + let g = tot.entry("_barrier_gap").or_default(); + g.0 += t[2 * i] - t[2 * i - 1]; + g.1 += 1; + } + } } } let used = std::mem::take(&mut st.used); st.spare.extend(used); st.busy = false; + st.need_cond = false; st.staged = 0; if !e.is_null() { unsafe { e.add(1).write_volatile(0) }; } if !e.is_null() && unsafe { e.read_volatile() } != 0 { @@ -797,7 +854,19 @@ impl Vk { } if !st.batch || name == "quant_xq" { self.0.barrier(cb, false); } if st.rec.is_none() { if let Some((qp, names, _)) = &mut st.prof { if names.len() < 32767 { - unsafe { d.cmd_write_timestamp(cb, vk::PipelineStageFlags::BOTTOM_OF_PIPE, *qp, 2 * names.len() as u32 + 1) }; names.push(name); } } } + let label = match (name, spec.get(1).copied()) { + ("gemv_q", Some(11)) => "gemv_q:Q3_K", + ("gemv_q", Some(13)) => "gemv_q:Q5_K", + ("gemv_q", Some(14)) => "gemv_q:Q6_K", + ("gemv_q", Some(8)) => "gemv_q:Q8_0", + ("gemv_q", Some(18)) => "gemv_q:IQ3_XXS", + ("moe_gemv_q", Some(18)) => "moe_gemv_q:IQ3_XXS", + ("moe_gemv_q", Some(11)) => "moe_gemv_q:Q3_K", + ("moe_down_combine", Some(18)) => "moe_down_combine:IQ3_XXS", + ("moe_down_combine", Some(11)) => "moe_down_combine:Q3_K", + _ => name, + }; + unsafe { d.cmd_write_timestamp(cb, vk::PipelineStageFlags::BOTTOM_OF_PIPE, *qp, 2 * names.len() as u32 + 1) }; names.push(label); } } } Ok(()) } @@ -1073,14 +1142,14 @@ impl Backend for Vk { } fn graph(&self, key: u64, f: &mut dyn FnMut() -> anyhow::Result<()>) -> anyhow::Result<()> { let mut st = self.0.st(); - if let Some(&g) = st.graphs.get(&key) { return self.0.submit(&mut st, Some(g), false); } + if let Some(&g) = st.graphs.get(&key) { return self.0.enqueue_cb(&mut st, Some(g)); } if std::env::var_os("STRATA_NO_GRAPH").is_some() { drop(st); return f(); } let c = unsafe { self.0.dev.allocate_command_buffers(&vk::CommandBufferAllocateInfo::default().command_pool(st.gpool) .command_buffer_count(1)) }?[0]; unsafe { self.0.dev.begin_command_buffer(c, &vk::CommandBufferBeginInfo::default() .flags(vk::CommandBufferUsageFlags::SIMULTANEOUS_USE)) }?; st.rec = Some(c); - self.0.cond_on(&mut st, c); + if st.need_cond { self.0.cond_on(&mut st, c); } drop(st); let r = f(); let mut st = self.0.st(); @@ -1089,9 +1158,11 @@ impl Backend for Vk { unsafe { self.0.dev.end_command_buffer(c) }?; if let Err(e) = r { unsafe { self.0.dev.free_command_buffers(st.gpool, &[c]) }; return Err(e); } st.graphs.insert(key, c); - self.0.submit(&mut st, Some(c), false) + self.0.enqueue_cb(&mut st, Some(c)) } + fn moe_mailbox_optional(&self) -> bool { true } + /// Device memory mapped through the BAR (`BAR`, or `BAR_AMD`). fn host_mailbox(&self, words: usize) -> anyhow::Result<(Buf, *mut u32)> { let (b, p) = self.buf(4 * words.max(1), if self.0.amd_coherent { BAR_AMD } else { BAR })?; @@ -1118,7 +1189,7 @@ impl Backend for Vk { self.gemvq(w, x, x_stride, 0, y, y_stride, nt) } fn gemvq(&self, w: &GpuTensor, x: u64, x_stride: usize, xq: u64, y: u64, y_stride: usize, nt: usize) -> anyhow::Result<()> { - ensure!((1..=4).contains(&nt), "gemvn: {nt} inputs (1 to 4)"); + ensure!((1..=crate::cpu_worker::TMAX).contains(&nt), "gemvn: {nt} inputs (1 to {})", crate::cpu_worker::TMAX); let (nc, spec) = (gemv_cols(self.0.llama, w.ty, w.cols)?, [&self.wspec(w.ty)[..], &[nt as u32]].concat()); if matches!(w.ty, GgmlType::F32 | GgmlType::BF16) { // Rows per workgroup as CUDA gemv_cfg: 8 for tall matrices, else 1 (hc_attn_up 10240 x 320). @@ -1315,6 +1386,7 @@ impl Backend for Vk { ensure!(n <= 512 && k <= 32, "moe_route: {n} experts, top {k}"); self.run("moe_route", &[], [1, 1, 1], &[&p, &table, &ids, &wts, &slots, &wh, &h, &mb, &step, &(n as u32), &(k as u32), &extra_scale, &(nh as u32), &(h_off as u32), &(t as u32), &(sigmoid as u32)]) } + fn moe_prefetch_supported(&self) -> bool { !self.0.gfx11 && !self.0.igpu } fn moe_combine(&self, x: u64, ye: u64, w: u64, k: usize, sh: u64, sg: u64, mb: u64, y_off: usize, step: u64, slots: u64, n: usize, t: usize) -> anyhow::Result<()> { let err = self.0.st().err.3; self.run("moe_combine", &[], [n.div_ceil(256), t, 1], &[&x, &ye, &w, &sh, &sg, &mb, &step, &slots, &err, &(k as u32), &(y_off as u32), &(n as u32)])?; @@ -1323,7 +1395,7 @@ impl Backend for Vk { } fn moe_down_combine(&self, ty: GgmlType, rows: usize, cols: usize, w: u64, stride: usize, slots: u64, k: usize, h: u64, ye: u64, xq: u64, x: u64, wh: u64, sh: u64, sg: u64, mb: u64, y_off: usize, step: u64, t: usize) -> anyhow::Result<()> { - if xq == 0 || cols % 256 != 0 || k > 32 { // the shader keeps up to 32 slots in shared memory + if t > 1 || xq == 0 || cols % 256 != 0 || k > 32 { // t > 1 deduplicates shared experts across tokens in moe_gemv self.moe_gemv(ty, rows, cols, w, stride, slots, t * k, h, cols, 1, ye, None, xq)?; return self.moe_combine(x, ye, wh, k, sh, sg, mb, y_off, step, slots, rows, t); } diff --git a/src/vulkan/preflight.rs b/src/vulkan/preflight.rs index 4feeac84..43e69a6e 100644 --- a/src/vulkan/preflight.rs +++ b/src/vulkan/preflight.rs @@ -37,6 +37,31 @@ impl Vk { } eprintln!("vulkan: shared-memory preflight: {n} (kernel, specialization) pairs checked, largest {} bytes \ ({}) of {} allowed, {:.1} ms", worst.0, worst.1, self.0.smem_limit, t0.elapsed().as_secs_f64() * 1e3); + if !verbose { + let mut st = self.0.st(); + for &ty in types { + let ws = self.wspec(ty); + if !matches!(ty, GgmlType::F32 | GgmlType::BF16) { + for nt in [1u32, 3, 5, 9, 17] { + let _ = self.0.pipeline(&mut st, "gemv_q", &[&ws[..], &[nt]].concat()); + } + let _ = self.0.pipeline(&mut st, "moe_gemv_q", &ws); + let _ = self.0.pipeline(&mut st, "moe_down_combine", &ws); + } else { + for nt in [1u32, 3, 5, 9, 17] { + for wpb in [1u32, 8] { + let _ = self.0.pipeline(&mut st, "gemv_f", &[&ws[..], &[nt, 32 * wpb]].concat()); + } + } + } + } + for name in ["moe_combine", "deltanet", "conv_silu", "conv_seq", "conv_state", "l2_norm", "norm_gate", "moe_route", "argmax_rows", "attn_merge"] { + let _ = self.0.pipeline(&mut st, name, &[]); + } + for name in ["rms_norm", "swiglu_q", "quant_xq"] { + let _ = self.0.pipeline(&mut st, name, &[self.0.llama]); + } + } Ok(()) } diff --git a/src/vulkan/shaders/attn_merge.comp b/src/vulkan/shaders/attn_merge.comp index c98bfd1f..f40baa46 100644 --- a/src/vulkan/shaders/attn_merge.comp +++ b/src/vulkan/shaders/attn_merge.comp @@ -29,10 +29,10 @@ void main() { float v = fdiv(o, L) * gate; p.out_.v[(z * nh + h) * hd + d] = v; if (uint64_t(p.xq) != 0) { - float mx = warp_max(abs(v)), id = mx > 0.0 ? fdiv(127.0, mx) : 0.0; + float mx = warp_max(abs(v)), id = mx > 0.0 ? rcp_d(127.0, mx) : 0.0; uint n = nh * hd, i = z * n + h * hd + d; p.xq.v[i] = uint8_t(int(roundEven(v * id)) & 255); - if ((tid & 31) == 0) F32(uint64_t(p.xq) + gl_NumWorkGroups.z * n).v[i / 32] = fdiv(mx, 127.0); + if ((tid & 31) == 0) F32(uint64_t(p.xq) + gl_NumWorkGroups.z * n).v[i / 32] = rcp_d(mx, 127.0); } } } diff --git a/src/vulkan/shaders/common.glsl b/src/vulkan/shaders/common.glsl index 6ee5af76..af0e68a8 100644 --- a/src/vulkan/shaders/common.glsl +++ b/src/vulkan/shaders/common.glsl @@ -29,9 +29,9 @@ float fdiv(float a, float b) { // An infinite operand or b = 0 makes the steps inf * 0 = NaN (sigmoid(-100): 1 / inf); a / b is exact there. return isinf(a) || isinf(b) || b == 0.0 ? a / b : r; } -// Quantizer reciprocals on wave64: a correctly rounded double division keeps values on a roundEven() tie -// from moving by one int8 step. Wave32 keeps the fdiv path that its kernels were tuned with. -float rcp_d(float a, float b) { return W64 ? float(double(a) / double(b)) : fdiv(a, b); } +// Quantizer reciprocals: a correctly rounded double division keeps values on a roundEven() tie +// from moving by one int8 step across both wave64 and wave32 devices. +float rcp_d(float a, float b) { return float(double(a) / double(b)); } float sqrt_(float x) { float s = sqrt(x); precise float r = fma(fma(-s, s, x), fdiv(0.5, s), s); return x > 0.0 && !isinf(x) ? r : s; } // expf as CUDA compiles it (its PTX): x = j ln2 + r with j from a rounded-down fma, then ex2.approx(r) * 2^j. diff --git a/src/vulkan/shaders/deq.glsl b/src/vulkan/shaders/deq.glsl index 3b8c52ea..acd55f8c 100644 --- a/src/vulkan/shaders/deq.glsl +++ b/src/vulkan/shaders/deq.glsl @@ -9,14 +9,16 @@ layout(constant_id = 2) const uint SBB = 1024; #ifdef SHARED_TABLES // Sized by T (1 entry for the other types), so only the table in use takes shared memory. shared int s_kv[T == 20 || T == 23 ? 16 : 1]; -shared uint s_g3[T == 21 ? 512 : 1]; +shared uint s_g3[T == 21 ? 512 : (T == 18 ? 256 : 1)]; shared uint64_t s_g2[T == 22 ? 1024 : 1]; #define KV_IQ4NL s_kv #define IQ3S_GRID s_g3 +#define IQ3XXS_GRID s_g3 #define IQ2S_GRID s_g2 #else #define KV_IQ4NL kvalues_iq4nl #define IQ3S_GRID iq3s_grid +#define IQ3XXS_GRID iq3xxs_grid #define IQ2S_GRID iq2s_grid void load_tables() {} // the tables come from the buffer #endif @@ -72,6 +74,7 @@ uvec2 ld8(U8 w, uint o) { void load_tables() { uint li = gl_LocalInvocationIndex, n = gl_WorkGroupSize.x * gl_WorkGroupSize.y * gl_WorkGroupSize.z; if (T == 20 || T == 23) { if (li < 16) s_kv[li] = kvalues_iq4nl[li]; barrier(); } + if (T == 18) { for (uint i = li; i < 256; i += n) s_g3[i] = iq3xxs_grid[i]; barrier(); } if (T == 21) { for (uint i = li; i < 512; i += n) s_g3[i] = iq3s_grid[i]; barrier(); } if (T == 22) { for (uint i = li; i < 1024; i += n) s_g2[i] = iq2s_grid[i]; barrier(); } } @@ -99,7 +102,7 @@ void qw_k(U8 w, uint b, uint sub, out uint lo, out uint hi, out float d, out flo lo = (v.x >> (2 * j)) & 0x03030303u; hi = (v.y >> (2 * j)) & 0x03030303u; } else if (T == 11) { // Q3_K: value = 2 low bits + 4 * high bit - 4 uint e = sub * 8, n = e >> 7, r = e & 127, j = r >> 5, i0 = r & 31, is = n * 8 + j * 2 + (i0 >> 4), sc = b + 96; - uint low = is < 8 ? u8_(w, sc + is) & 15 : u8_(w, sc + is - 8) >> 4; + uint low = (u8_(w, sc + (is & 7)) >> ((is & 8) >> 1)) & 15; uint hs = (u8_(w, sc + 8 + (is & 3)) >> (2 * (is >> 2))) & 3, hb = 4 * n + j; d = ldh(w, b + 108) * float(int(low | hs << 4) - 32); uvec2 h = ld8(w, b + i0); @@ -181,7 +184,7 @@ void iq_grid(U8 w, uint b, uint ib, uint l, out uint g0, out uint g1, out uint s uint aux = ld32(w, b + 66 + 4 * ib); d = ldh(w, b) * (0.5 + float(aux >> 28)) * 0.5; sg = ksign((aux >> (7 * l)) & 127); - g0 = iq3xxs_grid[qq & 255]; g1 = iq3xxs_grid[qq >> 8]; + g0 = IQ3XXS_GRID[qq & 255]; g1 = IQ3XXS_GRID[qq >> 8]; } else { uint hb = u8_(w, b + 66 + ib); sg = u8_(w, b + 74 + 4 * ib + l); @@ -274,6 +277,71 @@ void qw(U8 w, uint b, uint sub, out uint lo, out uint hi, out float d, out float lo = pack4(q[0], q[1], q[2], q[3]); hi = pack4(q[4], q[5], q[6], q[7]); } +// Shuffle within a logical 32-lane warp (works on both wave32 and wave64). +uint shfl32(uint v, uint src) { return subgroupShuffle(v, W64 ? ((gl_SubgroupInvocationID & ~31u) | src) : src); } + +// Warp-cooperative super-block dequantization for GEMV (all 32 lanes of the logical warp pass the same w and b, with sub = LANE). +void qw_sb(U8 w, uint b, uint sub, out uint lo, out uint hi, out float d, out float m) { + if (T == 11) { // Q3_K (110 bytes = 28 uint32 words from 4-aligned base): 1 coalesced U32 load per lane + register shuffles + m = 0.0; + uint64_t addr = uint64_t(w) + b, base4 = addr & ~3ul; + uint align_sh = uint(addr & 2ul) * 8u; + uint raw = U32(base4).v[min(sub, 27u)]; + uint next_raw = shfl32(raw, min(sub + 1u, 27u)); + uint w32 = align_sh == 0u ? raw : ((raw >> 16) | (next_raw << 16)); + uint n = sub >> 4, j = (sub >> 2) & 3u, hw = (sub & 3u) * 2u, is = sub >> 1, hb = 4u * n + j; + uint sc_lo_w = shfl32(w32, 24u + ((is >> 2) & 1u)), sc_hi_w = shfl32(w32, 26u); + uint low = (sc_lo_w >> (8u * (is & 3u) + ((is & 8u) >> 1))) & 15u; + uint hs = (sc_hi_w >> (8u * (is & 3u) + 2u * (is >> 2))) & 3u; + d = h2f(shfl32(w32, 27u) & 0xFFFFu) * float(int(low | (hs << 4)) - 32); + uvec2 h = uvec2(shfl32(w32, hw), shfl32(w32, hw + 1u)); + uint vw = 8u + 8u * n + hw; + uvec2 v = uvec2(shfl32(w32, vw), shfl32(w32, vw + 1u)); + lo = vsub4(((v.x >> (2u * j)) & 0x03030303u) | ((h.x >> hb) & 0x01010101u) << 2, 0x04040404u); + hi = vsub4(((v.y >> (2u * j)) & 0x03030303u) | ((h.y >> hb) & 0x01010101u) << 2, 0x04040404u); + return; + } + if (T == 14) { // Q6_K (210 bytes = 53 uint32 words from 4-aligned base): 2 coalesced U32 loads per lane + register shuffles + m = 0.0; + uint64_t addr = uint64_t(w) + b, base4 = addr & ~3ul; + uint align_sh = uint(addr & 2ul) * 8u; + uint raw0 = U32(base4).v[sub], raw1 = U32(base4).v[min(sub + 32u, 52u)]; + uint s0 = shfl32(raw0, min(sub + 1u, 31u)), s1 = shfl32(raw1, 0u); + uint next0 = sub < 31u ? s0 : s1; + uint next1 = shfl32(raw1, min(sub + 1u, 20u)); + uint w0 = align_sh == 0u ? raw0 : ((raw0 >> 16) | (next0 << 16)); + uint w1 = align_sh == 0u ? raw1 : ((raw1 >> 16) | (next1 << 16)); + uint n = sub >> 4, qt = (sub >> 2) & 3u, kw = (sub & 3u) * 2u, ns = 4u * (qt >> 1), hs = 2u * qt; + uint sc_idx = 8u * n + ((sub >> 1) & 1u) + 2u * qt; + uint sc_w = shfl32(w1, 16u + (sc_idx >> 2)); + d = h2f(shfl32(w1, 20u) & 0xFFFFu) * float(sb(sc_w >> (8u * (sc_idx & 3u)))); + uint lw = 16u * n + (qt & 1u) * 8u + kw, hw = 8u * n + kw; + uvec2 l = uvec2(shfl32(w0, lw), shfl32(w0, lw + 1u)); + uvec2 h = uvec2(shfl32(w1, hw), shfl32(w1, hw + 1u)); + lo = vsub4(((l.x >> ns) & 0x0F0F0F0Fu) | ((h.x >> hs) & 0x03030303u) << 4, 0x20202020u); + hi = vsub4(((l.y >> ns) & 0x0F0F0F0Fu) | ((h.y >> hs) & 0x03030303u) << 4, 0x20202020u); + return; + } + if (T == 18) { // IQ3_XXS (98 bytes = 25 uint32 words from 4-aligned base): 1 coalesced U32 load per lane + LDS grid + m = 0.0; + uint64_t addr = uint64_t(w) + b, base4 = addr & ~3ul; + uint align_sh = uint(addr & 2ul) * 8u; + uint raw = U32(base4).v[min(sub, 24u)]; + uint next_raw = shfl32(raw, min(sub + 1u, 24u)); + float d0 = h2f((shfl32(raw, 0u) >> align_sh) & 0xFFFFu); + uint w32 = align_sh == 0u ? ((raw >> 16) | (next_raw << 16)) : next_raw; + uint ib = sub >> 2, l = sub & 3u; + uint qq = (shfl32(w32, sub >> 1) >> ((sub & 1u) * 16u)) & 0xFFFFu; + uint aux = shfl32(w32, 16u + ib); + d = d0 * (0.5 + float(aux >> 28)) * 0.5; + uint sg = ksign((aux >> (7u * l)) & 127u); + uint g0 = IQ3XXS_GRID[qq & 255u], g1 = IQ3XXS_GRID[qq >> 8]; + lo = apply_signs(g0, sg & 15u); hi = apply_signs(g1, sg >> 4); + return; + } + qw(w, b, sub, lo, hi, d, m); +} + // Values [8 sub, 8 sub + 8) of the super-block at byte b (deq8 in kernels.cu; d * q - m is the same float). void deq8(U8 w, uint b, uint sub, out float o[8]) { if (T == 0) { // F32 diff --git a/src/vulkan/shaders/gemv_q.comp b/src/vulkan/shaders/gemv_q.comp index 10842a00..6d6a28e5 100644 --- a/src/vulkan/shaders/gemv_q.comp +++ b/src/vulkan/shaders/gemv_q.comp @@ -15,7 +15,7 @@ layout(constant_id = 5) const uint NT = 1; void sb_step(F32 xd, uint row, uint lane, uint s, inout precise float acc[NT]) { uint lo, hi; float d, m; - qw(p.w, row * rowb(p.cols) + s * SBB, lane, lo, hi, d, m); + qw_sb(p.w, row * rowb(p.cols) + s * SBB, lane, lo, hi, d, m); [[unroll]] for (uint t = 0; t < NT; t++) { uint o = (t * p.cols + s * 256) / 4 + lane * 2, a = p.xq.v[o], c = p.xq.v[o + 1]; int dot = dotPacked4x8EXT(int(lo), int(a)) + dotPacked4x8EXT(int(hi), int(c)); @@ -36,7 +36,10 @@ void main() { [[unroll]] for (uint t = 0; t < NT; t++) acc[t] = 0.0; // Four super-blocks per iteration so their loads overlap (kernels.cu: unroll 4); the sums keep their order. uint s = 0; - for (; s + 4 <= nsb; s += 4) [[unroll]] for (uint j = 0; j < 4; j++) sb_step(xd, row, lane, s + j, acc); + if (NT <= 4) { + for (; s + 4 <= nsb; s += 4) [[unroll]] for (uint j = 0; j < 4; j++) sb_step(xd, row, lane, s + j, acc); + } + for (; s + 2 <= nsb; s += 2) [[unroll]] for (uint j = 0; j < 2; j++) sb_step(xd, row, lane, s + j, acc); for (; s < nsb; s++) sb_step(xd, row, lane, s, acc); if ((p.cols & 255) > lane * 8) sb_step(xd, row, lane, nsb, acc); [[unroll]] for (uint t = 0; t < NT; t++) { diff --git a/src/vulkan/shaders/moe_down_combine.comp b/src/vulkan/shaders/moe_down_combine.comp index 155c8853..8a7e8b46 100644 --- a/src/vulkan/shaders/moe_down_combine.comp +++ b/src/vulkan/shaders/moe_down_combine.comp @@ -6,6 +6,7 @@ // sums in shared memory, then invocation i combines row r0 + i as moe_combine does (same order, same result). layout(local_size_x = 256) in; #include "common.glsl" +#define SHARED_TABLES #include "deq.glsl" #extension GL_EXT_integer_dot_product : require #extension GL_EXT_control_flow_attributes : require @@ -15,7 +16,7 @@ layout(push_constant) uniform P { U8 w; I32 slots; U32 xq; uint64_t stride; F32 void sb_step(U8 w, F32 xd, uint row, uint lane, uint t, uint s, inout precise float acc) { uint lo, hi; float d, m; - qw(w, (row * p.nsb + s) * SBB, lane, lo, hi, d, m); + qw_sb(w, (row * p.nsb + s) * SBB, lane, lo, hi, d, m); uint o = (t * p.nsb + s) * 64 + lane * 2, a = p.xq.v[o], c = p.xq.v[o + 1]; int dot = dotPacked4x8EXT(int(lo), int(a)) + dotPacked4x8EXT(int(hi), int(c)); int sx = dotPacked4x8EXT(0x01010101, int(a)) + dotPacked4x8EXT(0x01010101, int(c)); @@ -24,11 +25,29 @@ void sb_step(U8 w, F32 xd, uint row, uint lane, uint t, uint s, inout precise fl if (MIN) acc = fma(-(m * dx), float(sx), acc); // types with a min } +void sb_step2(U8 w, F32 xd, uint row0, uint row1, uint lane, uint t, uint s, inout precise float acc0, inout precise float acc1) { + uint lo0, hi0, lo1, hi1; float d0, m0, d1, m1; + qw_sb(w, (row0 * p.nsb + s) * SBB, lane, lo0, hi0, d0, m0); + qw_sb(w, (row1 * p.nsb + s) * SBB, lane, lo1, hi1, d1, m1); + uint o = (t * p.nsb + s) * 64 + lane * 2, a = p.xq.v[o], c = p.xq.v[o + 1]; + float dx = xd.v[(t * p.nsb + s) * 8 + (lane >> 2)]; + int dot0 = dotPacked4x8EXT(int(lo0), int(a)) + dotPacked4x8EXT(int(hi0), int(c)); + int dot1 = dotPacked4x8EXT(int(lo1), int(a)) + dotPacked4x8EXT(int(hi1), int(c)); + acc0 = fma(d0 * dx, float(dot0), acc0); + acc1 = fma(d1 * dx, float(dot1), acc1); + if (MIN) { + int sx = dotPacked4x8EXT(0x01010101, int(a)) + dotPacked4x8EXT(0x01010101, int(c)); + acc0 = fma(-(m0 * dx), float(sx), acc0); + acc1 = fma(-(m1 * dx), float(sx), acc1); + } +} + #include "mb_wait.glsl" const uint RPW = 8; // rows per workgroup (rpw) at most shared float part[32 * RPW]; shared bool miss, ok; void main() { + load_tables(); uint tk = gl_WorkGroupID.y, k = p.k, lane = LANE, n = p.rows; uint rpw = p.rpw, r0 = gl_WorkGroupID.x * rpw; F32 xd = F32(uint64_t(p.xq) + p.ntok * p.nsb * 256); @@ -37,10 +56,19 @@ void main() { int e = p.slots.v[t]; if (e < 0) continue; // a miss: weight 0, the CPU's result is added below U8 w = U8(uint64_t(p.w) + uint64_t(e) * p.stride); - for (uint i = 0; i < rpw && r0 + i < n; i++) { + uint i = 0; + for (; i + 1 < rpw && r0 + i + 1 < n; i += 2) { + precise float acc0 = 0.0, acc1 = 0.0; + uint s = 0; + for (; s + 2 <= p.nsb; s += 2) [[unroll]] for (uint q = 0; q < 2; q++) sb_step2(w, xd, r0 + i, r0 + i + 1, lane, t, s + q, acc0, acc1); + for (; s < p.nsb; s++) sb_step2(w, xd, r0 + i, r0 + i + 1, lane, t, s, acc0, acc1); + acc0 = warp_sum(acc0); acc1 = warp_sum(acc1); + if (lane == 0) { part[j * RPW + i] = acc0; part[j * RPW + i + 1] = acc1; } + } + for (; i < rpw && r0 + i < n; i++) { precise float acc = 0.0; uint s = 0; - for (; s + 4 <= p.nsb; s += 4) [[unroll]] for (uint q = 0; q < 4; q++) sb_step(w, xd, r0 + i, lane, t, s + q, acc); + for (; s + 2 <= p.nsb; s += 2) [[unroll]] for (uint q = 0; q < 2; q++) sb_step(w, xd, r0 + i, lane, t, s + q, acc); for (; s < p.nsb; s++) sb_step(w, xd, r0 + i, lane, t, s, acc); acc = warp_sum(acc); if (lane == 0) part[j * RPW + i] = acc; diff --git a/src/vulkan/shaders/moe_gemv_q.comp b/src/vulkan/shaders/moe_gemv_q.comp index 958f0f2a..ed0b0826 100644 --- a/src/vulkan/shaders/moe_gemv_q.comp +++ b/src/vulkan/shaders/moe_gemv_q.comp @@ -12,9 +12,13 @@ layout(local_size_x = 256) in; layout(push_constant) uniform P { U8 w; I32 ids; U32 xq; F32 y; uint64_t stride; uint64_t w2; uint64_t y2; uint rows; uint cols; uint xg; uint ntok; uint rpw; } p; +shared uint s_slots[18]; +shared uint s_nm; +shared bool s_dup; + void sb_step(U8 w, F32 xd, uint row, uint lane, uint t, uint s, inout precise float acc) { uint lo, hi; float d, m; - qw(w, row * rowb(p.cols) + s * SBB, lane, lo, hi, d, m); + qw_sb(w, row * rowb(p.cols) + s * SBB, lane, lo, hi, d, m); uint o = (t * p.cols + s * 256) / 4 + lane * 2, a = p.xq.v[o], c = p.xq.v[o + 1]; int dot = dotPacked4x8EXT(int(lo), int(a)) + dotPacked4x8EXT(int(hi), int(c)); int sx = dotPacked4x8EXT(0x01010101, int(a)) + dotPacked4x8EXT(0x01010101, int(c)); @@ -23,23 +27,70 @@ void sb_step(U8 w, F32 xd, uint row, uint lane, uint t, uint s, inout precise fl if (MIN) acc = fma(-(m * dx), float(sx), acc); // types with a min } +void sb_step_multi(U8 w, F32 xd, uint row, uint lane, uint nm, uint s, inout precise float acc[17]) { + uint lo, hi; float d, m; + qw_sb(w, row * rowb(p.cols) + s * SBB, lane, lo, hi, d, m); + for (uint u = 0; u < nm; u++) { + uint t = s_slots[u] / p.xg; + uint o = (t * p.cols + s * 256) / 4 + lane * 2, a = p.xq.v[o], c = p.xq.v[o + 1]; + int dot = dotPacked4x8EXT(int(lo), int(a)) + dotPacked4x8EXT(int(hi), int(c)); + int sx = dotPacked4x8EXT(0x01010101, int(a)) + dotPacked4x8EXT(0x01010101, int(c)); + float dx = xd.v[(t * p.cols + s * 256) / 32 + (lane >> 2)]; + acc[u] = fma(d * dx, float(dot), acc[u]); + if (MIN) acc[u] = fma(-(m * dx), float(sx), acc[u]); + } +} + void main() { - uint k = gl_WorkGroupID.y, lane = LANE; + uint k = gl_WorkGroupID.y, lane = LANE, nslots = gl_NumWorkGroups.y; int e = p.ids.v[k]; if (e < 0) return; // the whole workgroup + uint nm = 1; + if (nslots > 8 && nslots <= 256) { + uint tid = gl_LocalInvocationID.x; + if (tid == 0) { s_nm = 0; s_dup = false; } + barrier(); + if (tid < nslots && p.ids.v[tid] == e) { + if (tid < k) { + s_dup = true; + } else { + uint idx = atomicAdd(s_nm, 1u); + if (idx < 17u) s_slots[idx] = tid; + } + } + barrier(); + if (s_dup) return; + nm = min(s_nm, 17u); + } load_tables(); U8 w = U8(uint64_t(p.w) + uint64_t(e) * p.stride + gl_WorkGroupID.z * p.w2); F32 y = F32(uint64_t(p.y) + gl_WorkGroupID.z * p.y2); F32 xd = F32(uint64_t(p.xq) + p.ntok * p.cols); uint t = k / p.xg, nsb = p.cols >> 8, r0 = gl_WorkGroupID.x * 8 * p.rpw, r1 = min(p.rows, r0 + 8 * p.rpw); - for (uint row = r0 + WARP; row < r1; row += 8) { - precise float acc = 0.0; - // Four super-blocks per iteration so their loads overlap (kernels.cu: unroll 4); the sums keep their order. - uint s = 0; - for (; s + 4 <= nsb; s += 4) [[unroll]] for (uint j = 0; j < 4; j++) sb_step(w, xd, row, lane, t, s + j, acc); - for (; s < nsb; s++) sb_step(w, xd, row, lane, t, s, acc); - if ((p.cols & 255) > lane * 8) sb_step(w, xd, row, lane, t, nsb, acc); // partial last super-block - acc = warp_sum(acc); - if (lane == 0) y.v[k * p.rows + row] = acc; + if (nm <= 1) { + for (uint row = r0 + WARP; row < r1; row += 8) { + precise float acc = 0.0; + // Four super-blocks per iteration so their loads overlap (kernels.cu: unroll 4); the sums keep their order. + uint s = 0; + for (; s + 4 <= nsb; s += 4) [[unroll]] for (uint j = 0; j < 4; j++) sb_step(w, xd, row, lane, t, s + j, acc); + for (; s + 2 <= nsb; s += 2) [[unroll]] for (uint j = 0; j < 2; j++) sb_step(w, xd, row, lane, t, s + j, acc); + for (; s < nsb; s++) sb_step(w, xd, row, lane, t, s, acc); + if ((p.cols & 255) > lane * 8) sb_step(w, xd, row, lane, t, nsb, acc); // partial last super-block + acc = warp_sum(acc); + if (lane == 0) y.v[k * p.rows + row] = acc; + } + } else { + for (uint row = r0 + WARP; row < r1; row += 8) { + precise float acc[17]; + for (uint u = 0; u < nm; u++) acc[u] = 0.0; + uint s = 0; + for (; s + 2 <= nsb; s += 2) [[unroll]] for (uint j = 0; j < 2; j++) sb_step_multi(w, xd, row, lane, nm, s + j, acc); + for (; s < nsb; s++) sb_step_multi(w, xd, row, lane, nm, s, acc); + if ((p.cols & 255) > lane * 8) sb_step_multi(w, xd, row, lane, nm, nsb, acc); + for (uint u = 0; u < nm; u++) { + float a = warp_sum(acc[u]); + if (lane == 0) y.v[s_slots[u] * p.rows + row] = a; + } + } } } diff --git a/src/vulkan/spv/attn_merge.spv b/src/vulkan/spv/attn_merge.spv index 42adf215dd3f3243152c584c071f61fa21da1b03..9e7c9f80c1aacd1d2fae0c6be6d99b62b17eeec0 100644 GIT binary patch literal 8816 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 O?~8uF+s-OYME(x|vco6< literal 9700 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 diff --git a/src/vulkan/spv/dequant.spv b/src/vulkan/spv/dequant.spv index d2391723ec1cf287f80f2c0853f6f63eb8a06e26..a207e30efbf63c940ff06c787590fe25c76af8c7 100644 GIT binary patch literal 55080 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 literal 55240 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 diff --git a/src/vulkan/spv/gemm_f.spv b/src/vulkan/spv/gemm_f.spv index 207b23639ebcffc9a668ba88fc77b143cf0b2cdf..981e103d24be94b3c2ca8eecff82cd2b72b68398 100644 GIT binary patch literal 124452 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 P{Jp8;{X1sqid_E>Ug0jW diff --git a/src/vulkan/spv/gemm_f_dp.spv b/src/vulkan/spv/gemm_f_dp.spv index a0c876b408ed4dd2464ba50598c1ae7fb6af692f..7a03d767aa14a1d809bad178095da3a2345ed409 100644 GIT binary patch literal 127612 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μptmi({LMT5?$e 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 I%GJ33AN{FXC;$Ke literal 127760 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 a&gM;nXY5nsXAurn5E;=!5y8i z-W^kSOoilqhUPv~bDy)hYbw7*@2>lZ=KjVUUHY5N{p5Zf9W!=J-?7#3ZFk#vgDrR4 z{eS}w-1Fd(hwd|a&)xPLdFa9W9MM7F({}c^{w7;(vfLqu?y=m!l?ULyW7duy9dF^M z2l8wkvv*9xy(iaxBlp>#TgRzWcXV9L^$^#;y%X#lGj?Rdy(hH;(GwL3}l zqAz_AZik(kr`P(R<~D7&-lK!i$*`ki1A12WwMf^k)4n$iwby2SqMRK)_R7Ah{hDCH zUG_aYe$?n<_P;uW{-*ELdvpv!k3VH!)!#;qz4_Sx#>HOQSGBiZj^q4X_IC-oefMbe zOB=n*U(b$f(2Xble~Zrls7KEZWnXh~S)b^&zo%O5pDyi{eWiW$+WzyVed_U_(q6f? zk6zm^!+famFN z?5vr6h|90siFb|b97MGydOz?j8XM#6-}o7gYz*_EpVRPS_B)Qde#NynhY4IA9b?vv zeqX2lU;a<%7oUIkpzwe0;=Api@6?Z8C;Z#!BM!WB#pwS)AN1Qhy6xZTwEt#pdGq?1 z%Q{5wIaQ}YXS_U$o7#5OVHWhYy6Dc@&(_WN?C6EeRO)Y?zThKxzg7#WYa9ZhZ?B=VtgV(Pt?7R_N{p;kQP2o-D(x(Em1E`qYnYwb#blY{%XCpSemQjGPo0)WPo3oAX8`gn#cqXSCztjsB434_ezZyZm5^Ouu^Wh< ze&m9$jBI=TXye|t8h6)%>&f$&^T_q&`Agk76B{x0!Q5@5ZDJS-He-olZS=$-ml)P5 zxbrjky5PoUJ8gomSL_{+;KLew+i7Di8*)!Bo)ukZ=Hl5<-PmIzroIJt+i2ULRqFn; z6Bz&Nd<7c`@XeI2SFnA+oIk#T9SG)}@umNtq2sdC|DZ-cwZT%mGtdd4JGV2@Q#-lj zd{)8hxSkDe?QEw_{GN;K9+vj!p?{y>^9x@6UI4CN+i5e9%v_hhLcWH(y!)hkt9#pp z=;6)%B6RB`Ztm*7e-X>x;+fpnz^3*S&<{cvkIkhmo68y-adWlL%aIrA^fPVe7+!%s z8C_dBYv9;kiTohA{b-YMy9&AEWG-H@y&7x`x^3j0W53~^Id%=QeLKf|KcH^ju@O_h zp1W<~?+c%?yA?fSCl|XvAUj!Oci;Ee+0Xsmc3orm0J>wS zyxZmi;tp}Oxs#WH4(pl8g2J=$Q7QR?|ei=%A)b|7QcFjL* zuv+tvz$W8MuGaixbZf33ZBp}3kUI}A+*0#T!N#E5M&6o##yvIneXH@i4t!s#ZXU4_ zQ~!#)ZM0SY7TrA6Q`;UKe8%ufZD&N!7H-(Jf<;Xwy>;)fC@IK(~?Y7fKzt(kLn-barw^Gdy@fFHlsLfw7N%0!Qy?{^Z* zYz3cG@Lu57#dg}ne(qwgpVVa@@Y%7CJ}-LLe%h7WeCXz8du`=Yr}>e`z-d!+TN1s- zoZOZIpPpCrrO|uwa(;F0>FD-ldu`e{n4&zJXxIr%jD-ef0RU zc8O;!_|w=&KOKEi(I=p^U_}`Ho zOZ{jQ{2$2i>oYF+JB_{VvqnbB zkG@6Dn|@>PS@9j%7+~ATTVwaCd8YLo+NC3QEa?Arj2V*H7e%kRrrl!T8#V3pvpD+N z+%qqhKzCl)UR!y6TK^@H$8guC&Wi!)>8ooTy53u?1>UaH&<3k@S{uwd$<;cogZ?16 zezZxQ)44`e~GZ!~No>JEBrsy+Z7k*cC^N+qSx(|Wqm!iAQQ`gJTldD|j z#C^!^T<>qNn(G5#<|18Jz8YLV+NAvm%Q#CKSBx`}{t_ z?5`;HU2D9n-zyt?+i4T~tBUPxK&UVNd)8~+vCeE~fzOt*QH-CN^T~ zt2AvK+r%~)jITSoV;F*-zU2Jee<*kNkDgriy(xP7_Io>d`}TV}b^D5qnEDpnZKG}a z-WS;!WgizH``I>WclL2tV{dUVu+2{hm%c=dd<%=4`Crclo)Z-=}GByncVC zZhYxa%y=eow@&74yZg|^Z0GlA>b6U4V%qtAnrlTnzduvgE^&*gKggZ`b>`6dSq6&V zp^M2s+{osUdi9DcKW=ED2)4mUPV-?q*y5Gl(rTskUi=vy~a>%y#{gmyON1qB= z-1h2z*C)0DR_?2Q*C+Qg2FdUFjrV|qppebdi44|(~ao8sX_RO=(897CiFfza2jG;_JGZXoh1Tx)ab$9vkWgY16rCAe+m zwGF>o!$q3E`itMM4u zXH?7ne!CR!L(t7Zdt*&a)<<@)sx{dFT|BXEh%7dNNn<=FMWxcmY_GP{0w&OaO%X)gZFZaqrx$Mi&Z0$?mhc);S=zbnF z8eJ@T9gb{XuJP3K2z2q}btJNw^|YPOpr4}Km!D0h-BDoTCtzbek3kl*{me~`k445! z$KqW2)5h^INAoea#I`eXJGNcG#1q@D$nMeN8SCAU#m#9bJHDUkjzG7@j)VMQaO*P? zSBeJz}Ima`AJ%(df@>s&hlT`Y5LEV3`>n%s$8VvddS zb>!n5{TZ_TIEKa_8}G)b&8f)xFemM8?|eR;yD$6D<}@xb`%u=O`;@x4`q>TdJ@vVc z{#QiTW&+naToar4#v{x7yNA!|XI#UlUwQ4t?MFHL$A!qY^?Yz3Z9Oww1Sam>yqNp1 zxz6X(ZU~sVHa=^dkC}_cWenP#ik;(gS<|lizZ^_F{;xpRzwPy}u1);cnwUe@;AhnB zRN}VIQ~8BGFYA0Z*ynI!=Bu1qeSvH{R?8>(3+34Ogm#$}gj6<8*xu)kzeWpW}_uT1R>eKM)M_zkz`%$(=exElZ zvfl?C+lHCuRYY!-SSyHS+tvS;71+Q(J4Ku5D_Rd1lPoIM-^9#`Jx4 zOHI66wt@W_q;AR4 zn7*%WsfqW8@$1;#%lh-|;PWQWr9XhVp5%N6Xm@{O=kqys4>Wdi*7!m0*1~&gd?UU+ zci86};E!;n#*ZP(yC$sh!wsJr%Rj^=u3u&Qd7{z1r=QRIclD#qYg|uqrJrZCgHJzC zHGKM!*IwLylpVX5xxd2o0+(^>V+iw2>?N+uU;C4@HZ?x|shhKYy{C<}&}Z7DcIKL~ zc?;QRgx`s#=5M2m``fCF&4-QMc(COB6_~isIoHUy$jMjk8?L!$>Wa&|acX0na_;5d zai7BFS!rDsw)?d23H`!VJkRB+(8Y2FoEljy&*f?4dAUC2dUDOmWnbP?litXl8;sj{ zY^RO(v6->hWbd8{%>G?p^4Ys*MwWAZ5k5b4=sMrb0w!1cu&>OekNWdI58c?bwSVj3 z*|86@_3*o^Jh$cm6VDj+Mb?LS;_inm?)c?dJr}yTV_EC(I3$*j`**$fc8s()&iFi= z_kY&PwVH812TVNUel@Z$YcKb6u5nz})w}&_qb`?mKNq<@?!N#N&$y3A7R$K*5?L(c zJ^?v>%U!^A9+!Q2PafwZJMPA9JhszD``BDmY%=Z_gW131E}wD#HL_fL+%Ex>t9{s4 zYJDlPu^5}S_MdUT47ok-mxGCC+^;~^hj`+?5?Q>C`&H=T8TZuRdt&(wvY)v)M%o*v zaSvi2wKm>kdk?j9kG1_#;74+0J`6#Y&)#=*!(-k#C*;@U64$SC=I2mk_aDEXNRI1( zd2ZHca$FZoTe+MQhasnJ>^2135PzNa&3f7h%({-iXV%lkVB*PP6Wei#yO)jN?#nqX zw<(vH@hfM{wm{am-@nE8mSEz^XDei}3B2zOHU?dMO=3zdjz<^wSsS};(2YyZxcdbHdhoIzpojCzI|ikU7O>Ijo&MbLf@gW@vhCt zV&iuTL(q3@Y`kkTxY+pp!fW6=H8$S0d6j!&_Pd1J(06WZyr<^7B3lRNr0vc@PCLJA z_zC)MT;}RM?M5N{y^3|seB2$`F_g=m_6)K5{?xOazjOZ!x>&~LIb_@U+;$)Gx9-n_ zY3Dv9?>^KE`2}P-_aU#mcm6AwoVs?eAdC5Y8i4*Pve+T$zJGfSSuAnyP5;K=n$FzV z7v0);R*2n?(Y2Lx@32vUJ?e{4@XF(T_&smYh+CFCklWY6z4Q8ANLL~Ot!NhCqebB|z&m72N z?SA@#$)%svdM+^YG7i^~wVfMT+_kGdFS3~ROs(fb7LT6=k@aCe@v{)Jc>FAkELQz2 zf-W9Eiz4e=ypFwd;4{97aDMdb-!;Eo7tR&us_mQ~TM)Bz>mb&uc7)$O9}WTY?BHIO zed$nSZRN5j9EL3Jo)CYBqwCLC=GT#6?j?0^{3)2{O1boL6teB*(#O%r;y#lmH!&ZB zF7Er02OI2IbmNgr+vAb-=WiUd7cNci;@J!Pql;xPTn1T8-p^;oVyo{H=tun|WHCRh zJOCT_&y&%`Pr^q16lDE~XRkaJ*?p~^bxsGf2DL6{fN3k2JkCOH@4aV(X)9OvUiVy=0?}&`E$X!f6M7h&b{tn?!K~TuZr$I=RJG&YRGlZ9)zyHtn)R{ zwGr3n+T49*&mN2}reEdk*=r)()-~#$y%w@qU8BzHp}l&Er%(6b_0h#@pRSV)z~t<+?%5j^`?_au3@#V@tlLe%^d;}OC2nJLyxm7O zM>eLqXAegg&zjl-S*-5aTcO*o?t5FKi)Y{423f3~-?m_Ki8o`p1DNgWp1mWwczo`J zEY|k9Gnic4=dNJJS@-PS(8X))Bhbau&q!pkc0Z%QgPao@%T9iS>NJy?41MIv*%_VIlo;O&K2jX z?VKOkV=raBYUgVrbH;P}Z@}Cm+)q5ayH{Or*^?&h^OR z?(M$c@iXZg(EUtWF7JhJL>3=_U-$UzcfTM2=cYc>&v-EVkxM_nL>908oQG~da_Q%M zWbt-C*MpgJ?dJwC`;kjOHzJGIekP*Zk6ik>30b_|&qH8-Utjxq7|ed;($6ExT(zG^ z(d|br{rnMGJpE*Bp9OPlDP?!vUI!De&!dZ5g)CO%+Z$cH)^8tl@x-?;vRI98G`jKmUMBG!4wm@j6WM*wukjs&E}r;~MHZ{^orZ3F{w;yTcRE<&lTUnSAj`GmI}=PU z@tutGN$G&p&!Sw}`v+k9f1J38FoH>Wz!oppB(_>8;)Ogo=D z^3DODkyj$iIS0J*jJyg=F3-r{B8%l2c`dS7o{`rfi{Ws^gjt*d<0mY|M#JbTQjD4$Nk7+b^myP`D-2h z-EI1O5KO$*>>+e(CYPE$jGUUur)G~J%e8CvD41Mg{v)#e{I8ll24~H*OU)if7Edjn zK-RB#;(roZyw>a~bn#lVr_sf0&HjWgo|^p`S*+IVC3I`%Z>YIRTC;zmi>GGqB8%0UeS&Vy{QY+N{0vOI*6ee1YbKYP{RcTUlTXdQK$dIQ>`O4Y z)a)x{`}tor`x?%gX_uOPgDjq!eT%GL@x=cfvUsi86m;=gvyN3+_h7YVQ-O)6W>X`J z)tb$OZq59Sdvfjt_I>+NZ*aNfJUg=O|5wg^;LKUO%RE^EIrBt5HCqx{u02nd z0+UP4mPWRp|5da8aMnz_)NC1K@ziWtWc`XK{^gLxYt5EN7q2xNfG%EZwgS3%YPKS> zSgqM0bZh2+>ySPNgNfIg4MDeNa;e#x$f=opYPJ@#T)SpN!Q@i2wUO=Tf7NUqIBTX| zYPK%2cxtvDvVO%A|1f0nTC?@h#cRzrKo_qy+YntmHQNYTtk!HRbZh2+50XB&0TZt^ z+ZNrL$)#r7A*W{YsoD0(a_yS!04A53?TBnY|Ep#@!C5oyQnQ_r#Z$9gko7B`_;*DX zuQl5ZUA)$81iE;w*+_M+)NB;8m^JhK>bcA_nCCHVJcCV-Yz;m0CAS&D#K+Svan0P= z`B_!YU~_14E7lJZSbEn*wg4@#+bVP z30*vO{WG#Y#1sEB$l|rG&!UUhx;}?4UhDcix_IjP0<^Z_<&*aT z$a3wx4+N8|c_*hsz~yUBhoXzuoDM@5uQ`oI7q2-TjxL^@jzAWxIh}}ZPW5w}v0%wb zJ~^F)EZ5HIWH7n!%jr~b`I^&d=;Ae})6vCiPG_Kt*PPBo7f()SA&b?VE&oE`y_`@WnW1DCHkJ&rD3b9w?@yyo;Ix_Hg$DRlAV^faBAFQ@;2%h#N~Ko_q$eTgn!bNUKhyyo;Z zx_EN>23gFU>NC=3Wj@n7j?apG-|c4??)^SL!|e;_`%Aea@Kd?%;Cvq?=U!B~VQ^D} z$+@O0w<_E`4d>dZ+|qC>Hk@;;atp$FPSU4iRk=CgMm3x{%bBmA@pvZivz_~!Gr?lW zo(byrLrXMR{Vr$#n9qN??4_?zpNzeH#{N}sx%Sw<1}5j&zrlT*@~r<6?8G&-&@WlDB;F zo*r4Qo%al2ay9SdG&8t-&1n{N@tV`D=;Ae}+0eynPQB2@lT&YGv6|Do=;l|zAvXAfXmmM7DgAZIW2-NUUOO$UA*SB7`k|JS{zxd<}?7^ob;9X zxdK>nl21-6BFnXNS_w?<`*Kh>4)gzHK*0k#cNKhql+h}LC9h?r}fay zsXpt6fh8yTi`SesMHjC*ZH6vhbJ`qTJUI2P%Mn$r>J;x(ru(Z!R~ zPm#rHPGix{sXpsZ0!vQv$?0Tdxpq#cfXRJdPN#v(*PKpA7q2;;fi7NiIul*I=5!Xi zcyc-$Sp6AE%ob-9`^WVMS=VG{hzh zwp#_<=e?Y3qjF1u`@ENPj#X{}aG&>bj#cIQg8RIeGiN#T&G%Q{lha|?jpp+EJ#(+M z7>Vxpd2;4nxy{l2K2OfvE4L>4S`BCJm0JPb@AGVD?v+~%-S6|{%)N5+qWgWGoVi!7 z54zvy$(eh&&fm21J>Dr?a(>?>XD$5iF+BGS;eLN}?iq^gcX{jf{O|c)#JHIcKcP;vT;eU|jT#H`$zVHh$x%4?r@BiQDwCG~#b9!WRtbNV^rk#Dt zr_ULY<=TDD1SXg7C}%?!%XgH$kj3&HWp8A$)N}{>H*VK{z9ZWaOg!s+CuA|>Ozao1 z4s2J)=T~6j)z^jS;_-D6vRL(X6}rBB1}Cno!NjYt-=K@f*EPsu)z>ZP`tmsuU$=sZ zS6{cGi^tdRkj1L6N$C0-%^1hmePH6%*Zt_?@$~?*SoQS;y1s@ofbsPtn0WQ|6uNkP zJ&i0@eZ7dTFaI8Je7yuFUVXicE*@X6Ad6LB|3KH5f1fYD-T@P@zW#|W9$)Vwi|MPb zfA@jxg@>|txF5PdI)~gF!i@lTKa_J$RBkhH_d_|yxN<|l-4Ep)v&szscR!SK3@W!M zxci};HLct{;O>WV)~Ir`gS#KfnR7Vz!jsqsPv(+yUCCLC-A9PJ+e_I>O`B(p2fOWvMm5bea$hPypQH#G}VA{%MPg;;z z>OQy-y4d~Ap1m-#?Ht$agNuM^=bj{=J!w&7x%Qs47?_;7Uyd(d=I-AUJpp|~E_3&u zST{yCcmGCduuZ|l%{}iomd0<+NAfuz^#_+T7Q*b@5B)rT88Er{^xt{2pEu|ywc85J zy{FcAYy0JrOWSRc#jSDTSpnaPM?Uea2rk!-XC*MXjK^BYbv%Zmi)B34K{nnx9_xZ> z=Xl6xJk~>&Ymdh;Fu6P)ti)dQY9lB4>?fJWd8{uf0>iw3W*` z`4REfb+Q+_SaRP7*>-iE>qI{57WFiC|E71=+Sy>@$1~@F zJI+D=Gk5W3?H( z5tw$4g?!f6#mI7wMNh8y{56<=uR3{7K+pP*&r89y)2DoVUWP0epLNZ;c0H##76Uln zxcB+2w%)F1IrHuhw-PzZnRDfqf^%Pxv#-i60p}hjXKr%#?>Wgm;|g@o4t>#md3Nyc z(|-(pC6_kdvrex@c3yY=&GxQ+_!=nvH z_P&h8zXAUQ`gL5!;ytn4fNU)88JUw4!Px}rR^=q;`MxS1^p*x`NVuBxLiBt ztH9*q^LE-~&kc4bn0T$twX{h;^6BR~aJhCr*MrF=$KTV&oQ?ei){67vUNE19a;_h- zKOoyyE^A>DvbcYbK5OVcbaRpO+4C&{+>h+vr;;;1|C`7Mkj3-tNsbSKnfF`R1bYNb zyw?1W=;F2JH`8xwA)i{@0xs9C#jRj+&SB??bHe$NexE{a&xt>Qwdce$VB*G-y8Z>- zy2{1hv&j0C%iezn{Tp*W-?&qqD|^G;$hND`rF+1%b8nD0Pe0%IJ+hp6dgb|eFPNNt z`1i(Mz~6d|S;p~2bZz{12;6`C8c0FSx_I4}A3_(;oO&2pKjL+)9JB0c%ds~(o~~)_9Y;Cm+G23dH#y^%Oa1?X zZLR;a=wiw1d1U86t^W&P+F2X<)c>!@a@NKx^?wmeF3;Xqk;U@teGOSG&)(OO#qzuI zw~5!e<$Q8a`xm+|_cXbGa{Zml`RhHgzk}>vIG%Ra&34*opRs?hvGJ^3ZM02o7p8vt z(zo`u&l%u-Wci!{K0yC7v5Dt-{~@wD$p!leS=@gU#D0Bd7@No8NlU?*>tidW(1SVe$$gS#$$Uq z+q-tB0hhDA`%UJ-^kD7t;tXKsDVO;@BeHlsFV2R4@$5^z(8U}BYv_5gH@bM;mu5#7 z&%V?LSwG?#?}d=-c>e%hEaSZha(h2n6ihpFm(O@FhAh_}@5RC7vY#xCESCMGKeAZ% zlVy;_5<@Rywodgd-y2;#>v(qLKU)XxS+jkR^(7Z<4rKB6I(9v~f3UneR$zZ{y}PGq z?;6kEvJ9Mix19A1=h!a-?%pluJdn%$>4z?FPTJ1h==E<7&jTjz{*p7Q_r$e4?L8-7 zj$dO;%$|3aM)#a7XN;9w65VsMoPAVoad6Mca>gi^xws1X$@{s3W92+s6-+!fgOKgp z&o%OQ^40(o_iwhj|F4bg%l%(&O|HRQ?w{VxR~vP?W1GH)BHLf(wX+_^vJ(Bu>qA@H zX3qSF&rprsy*IIb0VZDa`4U|`?Y=@zK56$gn0U?c8+7sH*s+=!cI7Dd9oM&9=H%TR zv{9E!j#K1XymrZPDr9+mXlvWVIxCzx`u7JC>ug}+HOF4);%V0#*&N;X({6S!@tR{F zbn)ca4>>u?_2rs_%bdKMqc-Yt$#G6(W2n4#$#JfR*N3*YO{|L{o1=gGAh9kECSG$~ zLOZUsTN2qE{ca)cmI4#6IWCPZo*b7$PL6WRaP{XhC-3HUc2PDOT+6!TiYhqeUZ(vuDu_FiPs!|f-atR`yrd7 zXT;>VKbUyU@c?x3p(7Z@@@{=sLLhCgOQD)^4cZGLmOTn+S)d;9*=B} zb?u!1CSG$q5nVj(#v+@e=bhwu5}0_+@nm%Ink27~*3 zqMZ9c<(3Ec`$V~6Ep8ETzfY8NF4lH)gZq7=oMTwI-r#I?#7MNW6{0O=B`7yd!`ur5Rect^H zOgsCOPoJM7%eDLb513reyI&)V<-Ge1vRKZ$-y(}8hW(L^`%L=F`Z)ky+%=UtABb+9 zhnCv!f%xw3SQSpCXIb_g7Q%4`Jl} zmAp0c{Z$WeIcr9Uoi&=9drvUA^nDy{e0J+Ibr}O@UF1@izZ1~KM}XzM z&xz>vA(yr%A?t5ug2~zSWOQ-&B-e%OpmYD>o_tS5wpROLlX*2gzU#c20bMMy&xCBd zI+te#)6RJ%pLsP4vRr#!%?c)$IL>V1IIP4mJA93!54u?5=!Dg z*N$T@FuBAru8E`m-GuqzYaH{VizSW)k!@GwSO`ozxsESwCxD5cSK3~RZhN`(aXGT_U0Cd{0Mk}3d(;4I#Ir}OfG(Cj zYDHwRd@p|uw(jrlKUuTC1yh&Hm|TnOyqC*bSp`3JOjbn~OTMci+pdnu>R{SACh{4R zLCA9LF1v-xd+RoK6fMARxWM-fb4kGwv)gn(N->P z??*NlYnwhEur0b=@|%ood%3iI5ZSuQrQe5;#p`qFVRY*%7k`f+i`VDUqv+y!F8vYN zc_yCNoq5 zKe>74ZbtrM!|;>OiZ%xme*haluNjUkrj6q(b|G!7rCk1Q;J>MvI(!2ro*2GG7OOFQ zhc2ENrXY*e7&=z(ia{$W!F_)%cM*Oo zw+XoKujQ_9achA4{#x$d7PlO@@2};YE7j-1;J&|>a||mt7r5`Q<*aSxdV%}?TF#uq zxj&!i9?2!=o+)Q79zym##FgBAZ~exc81wS;@EQ3Y^Ktaa?0?#L*XFTevotnmqd(Z# zc-Q8vVlxJth0q^rY`kl;V6o}blizIg7b}vtzO8#cyQh zLw~ff@jjOQcy63LhU^(;G;+=jPk@R0-Bg~BPc@j|bH(mYVB+<^Uwx*r^S@t>-LqiY z)-%j==$;eg63Yw7o

Co*Lha$eta>mcN7gJ~gW6(GSqY(%(nOwyWpSkHNI_87iOi z=qJc>K102-_C5uZQ}0EaFObD@-u@CJL(Wk0IYV{yPI#WsjK#S*-3c z)1r%KkC_fxOq={o`}gQeJZF%9p<5I2emJ!; z_9ejdC12wgeJ%_Ce_4>1PdOv35U$!Q|3U zYP}Yic^QZMkhL9(EbiW+z7DdO^~_$jF0y$1tdFb@`-z_okj3L?BV@7aXJd5n_}K(m z-{N)boxAz_^sDiFb$+`poGZ>%+c`h7X1`*sxd%)vd*wG^*OO1(E4~HORxWL)Ad6?c z{{p|hvfg(Kg^^-ZWE4nt~uDw0D`^tLX4P8vX%31Ftk!|bvy52`2 zi`DUU&Fl^)=lEv58@K-SYo7;j_m%a&C%Tw6%31GwA*WB*?>^{awNKaYzF=~hQ<;N5 zDfV@}?*}dy`;7ViVEU4G%oDe-}hS@%TIjS*-2zSTMP^&oN-eS=amV=;Af@6VS!e&xy!l z?S96B$)%sv`V=tpGLEd%pCOB9ot}m)W<68u(~-sF=PYD>*iZbNjVvBNt{B~V9SDdT1bAIICEa<^m)P2F1{X0LW0TcIJm~+6i=;EjH zfJ)ox(e1-m+Rg|j?l~xJXF?Yr%{eq@o0-wYJy+$kpjpuEM=sa}#46r{wkI_4T?i)r zFniQP4R#T_xOR!J7wycAF1q8J9ZbCD)(2g@=GGV8+-lo?VB$5mxzNRHZgZoH*WBho zw;#FWHi3A>Yi^f;iPzjNM;F)5vG)ChdynrUvW6E#_VYW}aIi(d=BGyWyTnDo+~4IU zQae94TO8T;eg>1zk(NLgcYTdH?mmH|Mwt^x$hYBvh;5Z1F1#krM;0Ca8T-1n!Ri^jb2{CXIl*4=yZe-ybszaB%^PxidW(X|oR=byRz%Jb_9bTR!Z z=lS&%vTd!I&#$ME#p-_L^XpGwa@H%)FXPsqe(m!W?!NN;dInug8|6H|o<&ZdKEIwv z7pr|*&lkYt?33-Fdry6_*gM`iuf7B>7yImCFN5hz-g%w4jV;fw*N}~=o>yN-7tcI@ z16iy-zurW*U3~_;g)W|Fz}v`T?fm`@CYN|Kmj48^eSLnti!L6Y?;(q|ef|qfuI=-E zFypMxuMg10YwRDQi>IHDkj2{ld<-U+ep2htz|6}y^4$3xS=_bidG!lqG3%MN_a(A; z{CtC~5BrIqZ;{30X9}`d_0z$e6px>&(Df}|$KE-R=hqN%_Z>e+$$l{>@z?#bAG%m#pBveBb-$bkOgqO~KKtdo$a0RgSH^5UFuBArE3$F; z8BgL^2&~5O19Y*(u?Vv5Y8;EAYiAttiDNNjxpo|jgURKY-y2zMDca{5I6J!W%BAmh zh*jMEIpen;vUvUPgomMvPhnhQw?4Y~7v-$60lN73((gv-&I!5ny9u&=XcvE*qKnsl zH$xY%{cesfUi%%6E?)cH65aVE=e*Cn@$P56?yrNHliIizw0BO0TLaFx<;+1YwOkrZ zzMdzR0Tb_E&PvOoi))v*E1=tNZMzbfcx^inUA%o3@l0ZjewMo%e*DbIv*`=g8N!#R>O)&XF0nS%!* z>$m<}m_MXG;yDAYhAx&f(CWxyncIgpK3sb_M-71&kB>Fc#o}WvWU=Ge=N#A3*otLe zIRf3fy;RoUPtnb@o~w>R*H+H`^JIMZ%DHM|bjR0w#%NRII!2qL>nCG099;cHp-bh zJ0Pb|&s962i`70|_dA2hW$t9I?ON>nGJZK%?FKFv`#f7mfay!#^^>@b%{k?>es^SJ zs^_Xb(8aUH_Cyw|=c>KXZCB4Gd!vgd-hGh8+WGAZCYN|KmivL(zMiZ0M;DLJ1CYhq zJ`V(wYx_JH%sA`0>JW7C8vCK>;_2rwWU+QXqrv3TPilQ6n0XmT&O<*%7I*Dg>!Xpy ztY@Cl#~_Qx&lqHV*iZZ%k1QTPCnAegKV#9wNwV#cD}NQ91kY${*=Ax1Z44gt{RJOTT<_Cdoq}KZF>s3c+ORqBl~haz0aQV zGjuW6lXCWk(~#X8GJnoQ7jwT3b{4XDol|F{i)XCQK^AL|^*AuOjCJxq7fjCmE%}c} z7O&@nU!sfG^TB!O;`MxRKDu~4AN&g4n#!f$i;(R@yYzc8x_IsP*XZK4-%HTNYrhlF z#cRKpp*tRO&YRTTd(Ix)Gp3zm#yrv9F$p&u&bXat<{(#}-9E!}J~#;5`xxgP!F;Bq z51%o+!g+p>^BES-{c&4x&ku6OQn}60JwM19i=6%Y9j^1|O7!e&S0lH-XT1hYd|u{V z>V9p5)$dfV0~7cAu#CkGjh)}KrjLnWp8NIdoHYKMk;V0qxqK^fea`(3-SbN3@$Kl^ zi06572eNqjzYAI4{thku-;M6REtmQJdt}=>-|KVaUNE`#e4hj+r?2#NAF{ar4MY4s zfF8g8+Yos^O$L{1`+W#ZuKIl#UA+2z6g_^|WnAL-kKl4`zmJ2-RliT5i&wu-p~tVa zh~KBd<>GfDbp`>AK&aoC8bpP!?PrJr+=#nR7**qUeh`3PMb@vQGpkX^e+ zQmd@P&%pfdtnLG!gJ~<5wqGENyO%h}{)%s3IV1lX-SP6Cy<-A$-8(MRrt#^y<8pLu z#PxX%cV9UpUx6;BU*(*UuR^x1>)SK()yQJ?Iq4bsH(+wEmz5t~!ZKnYfuWhGA z7tgtQ0c2mUv2pA@)1iyG#+0+i%z*6vzO#^vj92!Zx5-yO-m~xg1G(-y z|3ueM=IXoX+K9Uce8}Bb_MP|8#q_J3edpiEwsoGl@4SyJR_B@f&Ie#}&a>=0#;rg7 z+UM8YeP!SI2whAYI08T|Dz_3bNQ}VoAHH2-J3U?M@9Qp0(QpS*)F3Pq0p|$uDC$ z9k}i5zB4_#czn))EY|ipBbZ!j5T7%H8E4&hW&sngvCoPwo_=OS7Hjv@3rsHkq}F}3 z%)HHXI^CS_?aJBtom61T|9mkMAo->9ed|M z_MNp^|ITmMg>%KZYCGpg_MO>SYufqB9@864+;eL7nAy?A>wCXG=;HNk*caXXNG^T! zL$;5)7tIYOUi+8_UA*=&FS>Z`V}5k^Eje?~{^UJp#U1ER8~0)DyXw;QnfMmw+i=D! zr=PsP^PcyY2V(1c%qysc=d|?U`EVC--($*oRt$%`j%~nwk11y?mD?2E_n30VB4_{p zj@UiL-w$VPE{xoMf4L}_c>Nvk;tf`R$Gaq$czw^gbYoZFUoHct&(Xx4ewRbHz3)4- zzb}ujtz72H3ds6&d}6mEy0&t`1|s{sxS01Z6M0ViUT76CZAT-!&kjTOpcird^ECad|KjJ9KvUdYh2# zn7KJV#%C;uuWbyjh!#3!ift;U-dpl%t=V!1T#K`#x`pwy59sHY%&u9P5@O9C} z62mZL+x3Mre}7N1KA3jS8F};fcOn}g%bCAd_V*3J6j{u@-QSaJhAfu%f}10Y zO>XAxuJmu-b${Cp-SL&v&&u>S0$Kb7+NqC37W3~G<+s|S(8cqWU;o-Vf`WcHX*6!ydFuC-TTK^2pyo@7ft5cE1UGvV>(~-rjXV&l;$l~#H zHnKkKCw|UB7LT8wBa2l(=c0?p&o7YmEndgoIgm5jFxI*A+jZewajx3V`H?ldZ?k5v zC;rTbpMa^?eQ`f9ZROJT0A%s3_m}bOE9?DIbk~UYtoO^2>w3QuT|b#4SD|Yo?%KPK zyRWSGtI@^utDN-Q#fvDznU$IbkoT;^2f;H_Y>uj~CbaJkrL%zp=_FL}p2aT{CK?VZTRRM-1m z=;9gQyOG646IqU=Yz;%ZJ!T; z$+dkx0%n|by+4XBUSt0wx_J6|3|Xw*&*NZn=_j>*3e3EWBkS~OWbv%iKO>7-&#d=n zkj3NYIb?m3r9bMgB7o;Sh7zoBh@NBtJMxOR!}c-om8TUU2{W5L90ZYQCO*W6A)H@DjM zR50nrD6dko$F&*q*zWE^t) zz2muH;`P1b_y()*9nS+3ukRf%Xzc2H$BV%9Ihwfh%()odGp1Z(xdd6C_5I`obZzA_ zS1&`hAJ4<_cR9MYa_$wrxBHO1^FBpB?^8YkmvgUho@C8`3?>(!SJTEAhch?x+?xVl z-!F8`!)GvHiEV0h+xZ+Y4&N{I0MpJrOFr)xdLqjihgag5Mq4g*-!II7EatxB`-K^i z#qxe(CS9&3EUL?_Ai_eCI|NOTP0W+pgw2 zADDLLE1!JlN0w{ny8xJ6@?98NEcq^iES7v1MHWj8x6r@&Iv)#)pId{;wS8_2W}NlRv>m#5jeUD`@$|C;vRJ#H9l_+%Pinmjn0XmT z&N{myi@WBWt0R!btY`MEk;vllvj?(1>?eNqL>7;qy^zJKpS{t=<7XdaeT&zzcMjyt zv;ogM=eO&^x#C>4o%18-ib_-qEPMZn$YR<1$0CbmAAXMhjlnZR^7|`#eybh37s0fZbD#SoK73`r zJ{#RSc~Ac1kn4VZF1miQ#(#mXjkrF4#obr->+$Gf`c=+;eIBxHU7zmP=Oc^N_33_n z0hpZi%6@I!`qQs{Udi28_UjAL#k5h*etj`=`gFg(1YNB5=^UE?CTE{@zrL*4*Zul( zaJkrL&0YbfFL~!-;x@MIyH_I{Q{AtBgD#%2yaripH1VX}wdl61d){^E;@R`AM;2@6 zcLSJQ;>}pz1ZMlXU*C)_9-p@$i?w~;3MSX~`8zPad*?v*>kZkfoZqes=ZbUHcFvFN*RQhHwDT40^#*evuKSz&T=v)fXyYF1o_im5 zUHx|LuRDUf$I6YRuW-)&Ey3MmK{tl# zYYs5+>Z>ohczn%?ELMFjgl-)?PbaP)fQeUM3!{t2*CNPb)z=c}##MbS2_{~BErl)~ zUrQs4RbKReh}iCSH9FMi-B-A;@CdIB)ZJ zro20EoihjVx2pWRTmBs`=S$|a+%Dk$-7PuCv2q)O`**kGtYzf}f%|v2mHPp>e|JmHv94S{aR2U>ob|5UY~cRgEje=z=Xc@fQMdcJ%eh7?cLKV9lS|Gu zDwpr9F6UfgZSr333UuwoPh<`1`zmB{`$)SD>EF7g-A3rP6HmL1k;QAfZPBf1+HHq! zJMpyJ9$CD$+a29{r`;atwi8dgJ(0z0y93c3i?llk-FD(>cQCSeZFda1vjriDRkG%!iy}-|^e17>Js)cp{6IM<==I_p+^o(1Pxle0Fp-5GGMCpl|UxzpgzXgKq(+|S@#7q&BB zIrIG&ch|;WxMyv=jGXse{h2$jpo``28^4C^TJiS|SsQPl`}}roxE4H<{0&)KIp_W= z_<9>zf6je*-`sU;20pOgsCKPakh1%eDJ> zAFTHA0lHZF_ypNLe1DfdJ_XaxKIGHKXUKBxKE4C1eM~_YOCLQr7ubitDM=qa!L+jv z`SdXjvRu25S;1-_v!RQnk3Puu;kc!bIl#2D5Bc=b7g?^|#{yurj|I`i(#Imm_Tj(D zl0Fs%)6PER)5l`Sa_v5r1FL;3k1m!zRzkLqNu`g0VA|P-eEL`!S+3p35U|?En&@Kb zV;yAsc(nAfE|_-qA)h|hLzYV)bzQl>vR8~}4Z4@Ow>aNjbK%YfcQ281o>p!gxO++G zp48&b26r!!b6(VTXM($z$T^;sJ00A;M9y)j+^OL1C34oUa;Jd1m&lp7ocWI6?mpr@ zIsF>D`&i3sg4wRt;^M;DU*#?;oN-p}!orzf<$hH->r%N33THhlcYfgiTTR??qmkhjRyZepaOZ3cCJ%UwQ%i->c}_i2F=-pL`8j+<#A&TgRdJ zU1BCaf8;)dC!D%AnVXwacRBaG^s^n9IY!?e-Fl?o9niHAPro}Ni>Ke6knLCh_N%T< z`rQNBe%%Mt&riS{lj!@QJAUbRe{^lc)9(Su;_3H5Wc$^>{i>31x$c=|mF*?#qJzv|jJpO2(J=d<_3aTKy+?PpKg3~FqS=03Qi zXU92=-BS3|XU-`*VK3$@*v<`xn{I5E26GRI-L4Jh87J6o4c4<@BN~i9chPM(vcY_| zrtPQ(o@kKJcr;;wbN)X(1E1fJ>qFfAx1-%BtjDTg z;uEp)H|9S?)`$4#*sRFi8u{{bb@>&z#I3Dz{+)`%YZ? z^ZX?5`Dqe;?A&nfeZKFl@foLcNV`7$8EDBf*R_&j@2by1{%#B(6UA(>8ivbnO!7oaowg;>~>Qhc2EtkHy|N zjl($AwMm?rdtWWfcO!%TJNKqtjzD-hXXU=(`kKqR=H0Q?MqMs*?_1>d-1`npJYzf+ z?b>s1YB2FS_j;fklU(LrPh|Z$_vAD8ra_jgb1(6E&)l01*|}#9wlVg^H9h*-)_}Q| z@tYA$yw0)w#)p<4xn6??eS&_BN_|1l_jd8I=jjUbboCjGO@x(bVvUuX057{`4!#LHoNt~}U zk6gcAHxp3eK7lsQ1>>GbJNM9&z{K4{-3L$M?#sC-cQTilb5A+@#FETw+c}4F-dVa} z&e{Ixw)386+Sl~&p0BSTgYUzYSe8SUH*WXypENvbXFT%DbBXI$IrC{HWX}_}Prd`e zJZH!STMcFB?enY|1SX!?)l*cYHYSd->|Xq zuFV$3=6P(EL*J;e@vhCX#ir-;tDabx3MnRWbVKZdw;5gWB z46-lV-9fvZ(KqKZSMO=JCGw>_tgLIsZ!2WSS}vdUJwUAaOve8XYBIW5#^oVo+tuHC zJPf9t`?|dQdN1ThkmcONyz+hXqhNCRt;Z9{V(w1^X!j(tn0uPf*Qb!h68HA>Zw#*M z%#9t+mF8?+tz2Jzx{XDN9# zzc0b$5^u)x8!+3~-+p|HE*_uXA&a$rP63l^`<#lgGS2$jkEy}LYwSJH#nVquWU+QX z(};1UpVWGKF!M4F*O9fI0Zcr<*_a7g%z9=m&WtV|KeHk0!+zqY7qWQ#%#JKp{q#W> zkDob^^(|h<-Z_xpeyp~1*Zg)}I9HsjwsU@XHghhHWUXpPI^FYOcQDTh?q%7R_CVHF zE_=eB$l~q^@wXSc{(NPA?E~gsQuoGv!Tg?4E`9tM+4gej<0r`CK9eRlG4F>iJ|67B z2HPLqc;wRdAY}d3ze6++`HN>SoEKdzd*OV@V)DH0?>H1&eV;%->W3kV)&JIWG`e`c zuRR=DKjPUdk3@D~bB(1gM}b*`T9>22w3SO9$0E1)-s8Zum8*NNd$4CW_x0--2lsZL zQ^wRaH@ZHnSRKy&TTWkc?scQM`^uiZ1iJg2_w3nAA=f>-Kf3<1&X+;gMqHmOa`%-z zds%cb{VHeAULM)Du2J{w0mx!?jk@ox04C=e&7N)C`qQs{4(9GFd-h7`V%jKY&t4fh zeYyv)iY`|Bbe;SVOwK;*p1pdpuY2|&aJkrL-L3(qFL}o;aT}ZC?Y^=mvN6>?do6VF z%$=dgVs+162i?eM9K^Bjn-H^qqpAqQd@iP)x-{N)bodemk2eFQv->wViigVR=&X4S|<5;iS z`I^X_@tl4>n0ti#N&c;e3(&=_mwTnLJC}b2CYOEpB4mAvXV1A9S=_zd_gxe5`)l-z zxyyNeazDHTS$qJpdwll00ldF;Zt64rtN>;|a_MJ9WbxY1O6c|@mwpB!i?{pP5X_uw zKO2GBk6ilM7+JjbvkAKW$fci6k;U8ni~_rU(EsmecQE^rOFw%ci`RbkM7JNg^z$QR z@${3iJqXOPrIg)uI~q*9j?XdZ;KWmVamJZz&b`-OYunl9-bc`s+!GpkRbV0|Jz3gB(HEqis4wiE-@Lli-uw2eRM}prWA7qxJI1AzXv5}$hFn-#3qj;}AATH>1>ELY?E3ATKV@Bgsn6W<(QxfB$wRU_9!>J{{MZt14zQwTRYkZ4i%O}2HfaPj@zr;4a(PeyB zhD&_viEkCKT06c~;nWh}>R`DV-x}ERHNG{m8sBEv9X$TCzYK(vPkft$<&3XBXMEoHKIR_u)+(LnCC_{AM?Qn1 zJ%#2ON6o#UYNOFSm#Dc8t2PSFvxJ&!plX+)`TSRN{#EU4G@s*Yj(ycmMe}*AX1`bM zcr>4@YUUix_swfLxA@Mf=5s{NzF3@hP@lPvV`p!F5}apl_T#7Fd`2EcALbc(27Vk* z-`D)U^h|8IjMq@G_3ZaNBZt9R&gYK0bHHccaIl(lz$?$lv*Fb8j65GKmuKV!V7WXa zF9gfw?ENh5o6k(VjQZ}m82S3~-BWEA?0<5%54@+|^I+?pNo>}exztnpoa+TH>v?ys zd4B&FIQ7zZ@4(r2`{FCl#dn)>uB()L56-e`*|RStm#i7}teMN;)!J+3ayYe&!H3i_ zCVxxtZ;Y-)8%UeJH}KO%m+P?QESKMFMqtZlK3oshuYBSk36}TY_)fVSvE|Jv?T^Bi z-w`hB^CoP0`^>d>Ggz+fA3HFA?Z+Eep4{e6aPqa!cE+~P)Y50WfYWE{>9bwIYVAJT z4NfgF?+&(|AM3L{(CjnIrO);R%cm~}f%Pk&KHCc{U;AutZ28(}`(Vr0KHC>tK7IB( zuw3o4L$K|$QKioggOjg)b~v_urj|ZC0-QcmPoEtLR%`d!QE+PMv!lVb^J9H>44Qpr zx%AnwVEOdfV6cAW(`Q4#^0m*7!!{OA@XJ>}qWL>}L8bIbRPqrTu6myjpU;0c`yr%lSq$ zbGBS^9tD<9&NqSeE1#Ti2Fur+Z^4$YIp2ycUvs_^%cajA0?Vh*9tP{TgKwTy zk6_E!K6?~fzV_MQu;pu?J%%lxKAQ-Zt9|w?wtaSM>9gnHW zXD@=)+I{vfIJNZIOJLjiu|9hl%|5eS`s@|3eERHFuzuw;&t3z|*FJk4TfX+$8`$!- z&)&qAPoKR7maBdCA+~*XTj{fp;N)wceT;3Nsin_80jJN@(`TQ8)!Kdb8Jt@B>~pZ~ z{8*oTfo7jsE`9bTSU!FB69eoF^0m*t!IrOm_AR!2?X&N&<1gXQcq&##`# zJcD^2vy5l3FTwVqXTIe2HMab4>Lspkn{s|vl`~im{CQUMdzEm#;N&fzzP^KgNMEa` zukVCcYxnhCmgn*eb`SS~_|F+^G`5^EreDWk%coz*g7qPv_{V|eYrj5#EnoX}0=9hZ z*9WoX)2|PKNTesvE^${Ghxfu zoMy(BuQ|@S0q^X zPG`WWO)00L@ai?EVc7CDr{UQ0HK((&|2u151*t>)UO+WBanAJv>=RXZKc zbCQ~4Rkah*JP)Xuvzqz(9gk-MzuOtxtl7R`&jj`Nq1hX*{ua~^&gZ{c_R`1bpNzeF z#(pBaT6^pthf{OxpX5HUV{LSP-|`P^IpfK*{#k7KJQx27)`xta_0NIj>-=~DTfWYZ z7qR8*{P-8PeCEeXV7WTyFQfm=tv>57hfCh-$@>bhT08G6;nZs0$>|z+^_tVQ*zz@} z>#*f(P9w18Yfjf=%O|IiV7Z#p9oXhnpY?abB`5XdbeB9=JEyzh)TWfveemivr@vy$ z*PQOhmajRD#+I)+jlq^rPGiAxHK)H}o0GmK%}==Gq@J86f*<2*=kz$7+LUs73SPbD z^fb17&FSyh@-?Stu;pt`|G<_{PS1knYEG|Wn^S$(zXq3_)RWWeV6}EmZ@{TdDW|vL z)oV`gV9VE>{*5hPb9xtBzUK5EwtRAWA1qgM`W)Mw>a+d}xa6dsoW2CBwR8FkPHjp# zeG9K%bNUWjzUK5jwtUU$2Wd9$3uv$B( z>EYC-l+#S`>NTgCvE^${vtY~DoMy$AuQ~O_mQPNzf#qsW{jklcKI`X!OHS&^X0 zcklPP80|Uu=NrvEv}zOJecoHoy{Kxp!TY>db4^$6DtMpwYOal{odGxw^Ug6;2l)-(629f$4jd1~e!&EN8_;deZL&r|dF zE;akY{~p70&o8)-ZO%PQf&DFS?H-fQ7fZwW-$SV7JC0?*o_o~7EeDqO`I&Rb3fTH{ zz2w=xVpB#fbyosgUoF2EzDBIBtNdR0I<{P5eG_aw=d#Z>|EA_GILrBap}K3)-wWRc ztGO1v@_XSsaB6AuGjMJ5b8NY^`6bvKYnxxeSwH77oN*@hn+!@zRY*KyeTTAcreDsdeTCtrP?fGr|fZXg$ZEYQx~&57q3`s{IMx{ZP$5s@f2E z_d_*vj^q%CTxzMiE?C|^PCWDA zJLfg^#4|6vT05Tk;M6i6OM>e&VkvC7jK?xy`=yS@vT&AjJk&ED%YoI}@HQ|FOO?Y`*qVJA4(t7~q2!|e=q9;&78E?{~8JK_AdO1om~ zQ_bIJ{P$ya15e;kr4jbm5r zow$rcJ#p*?R%^$xJDghP&&FW6g{hypvI(~FswK7qz%{l5vE>rm!Ql2@atNH|j7>eU z9ST-!$95Q;TK1Boz;fA3jt0wRFF6J*ml%$wKaG73_L8i%W8mZmGv}eZ91DJmyL{H) zV6eW_!VLk-TQ>9Q1Z?NKdvw}75zaQ%GT%=E%lrS+d8|w4--aJg8F|YrhtCtRBN(pwovgtMGJ)#LLluv&c9HS5~-oQCTzn{d8y@AFx0f4iR5 z%=x$;qYqhn9qh&i_fd6 zlRY=wwQ%yaZ!Vxtp3~}S=R$b3b~_irsU^pe)G=pcAHrI3e%t_eFn2ZAkKB!5>#Aif zi~`H=MZabZ-Gpr}YCe0uBY>O1A8=PQKL4A@Tfp*p_9VyK;LQ6C%7nWUPQLc}-PrQA z&o86h^o4r*;&OPkc3)fpr{)}Xo;W9*A8Ge~aC=USfoso+ad7g+l71bJZNI9;-veNM zs%7uLhW6{;e=W9L_J$E)>(%Gd^>CJRZ%{W+zuy=MRx?kpJRfg>Q*;0M4B;XCt;3jQ z93R29%&*{_zh6`4Q8>%lhI+>BZ(ue3^QSVC;+zPl5C6Te?8~=c%V%G{6`Pt|382&m;Qec z>>Q~5{}7zz>>Ks;|HEK4`^GE%{|KB~p1l*na(VVX4wlQa_X)6E{;vEP;&pC0pWM@4 z#P;K!ruH1yKe(K~-V^&j!S02_sb{}g&oY+J*uT(}@vL3TST=pTHvOkBeOuo8IRm@| zR?ivWWo)18@_F9B0yZbLaIb>p=VrdxZclV$^I4Jg@&?$xA5HvOS8u_&H@OF<+}m)L zRm-@(j=wstZ(z%%Z{7l1ua4{6aF%mi)ibW|SeC0juK$KpOB^p)4xf%w;`jir#_=C) zxy12bu=Q#jA7NY0IMfrz$6&Q~9G}3cWv_k-ELYE+FJl|8TK0i=iS_%QljDCMJNsR7 z`Vdauz76*gSibJPU*gw1jal88`*vY$;nj>8Y0{eb8cr?y&8O5c9_y=F-?jT0oSOBg z=E^+y60Ut-{0h!I)iS@o2Fus;;t!OO&%V@U9=>aZa}4amb`!kwjzYe^6cgJ3Yu9iJ@D*ULMlVzuAZ2ujPl$jPz-ubK7^UklaJtwOfW7Rgm_MEI{8&&%iyys*!V^qsrT!8%4{ocW`a-J;+C!aElf^FOH zHS+HjE(Ry>zuV^izckp7`@h-}T#Iv=pLg@MjJDd*O#^liZzR|p-S<=P1~~beXT_2XUZepDa z>^Ro7_cJ*8n&aHq@~PJkY>u9HGLG}W$=4j`#g%cHs6L*%X#-buw2f&?}O!X-u(b9ml(DO8~15lC$FC! zu;pD-d8gPB+kRHdcX^Xf~u zI*TroEw<&HSL&Hp-+|TI^XhvzwZw50*fM}UXswLMe!0tnqjlV15EUT8^P?n-S^D;(tV|3438eXj%7-`ZvS_V!nV|6Wc{JX;e z6iSTO!MO*krGG|%t*e&0H-gQh)*S^mx+}kVa8KQv!RBJ$rj1+RHpW&&E zf$dkdw0k>PzCM@kz_zc{;_ptdyz%9^bQiXKo=bOwooDii?LM&i*D?AloMWjL|D(b3 z=9ckT5nmY(^^C_#@M_&!zhl?Q>uCbEb=6Y$A+U9Q2g=xM;X7bSpzI*8OK-d6zbTQYWa5~PlK}`&ZRx)sbg%}Kf_yI-8pH@OL2ZR z4*NN=Ee$81*p>my)!3HBmQQTUf#qs!%VQgxT4GocEMH?-3)>imcAFeSe>nNXur^q( z#;^{yd}3G^ELUS#58D{j62tmn`5MEf*v8C>rt1)be zZ47FOVQa8_jbT^pju5C+ZgsO{csYTd}8<`Sgyu! zGPZnT_!C&J#&8O@F{mYm)4=jIhI6ou;f~S|=fcS+hV#I3HHP!Cyjx}%T;dr;nGLb;Y|41I%m$^*jQj@I2m7w3jQ8W&k9`i^ z1NIE#ew=f|eQ@&rHkIe&{SD{uTq!pOPQL#4tK*t-{`adX_W+z_>ltPOw&w)3#PSf> zbBJY~r^fdP*t5g&^OZ2UU5yzc|a{|#*GtA%?D zEN}n04p#j+$@0m+Pu~sOb?ZIzsR!8k4mKyeQHmIZ5erePRHGk`@wSEID28s z=~wJIZYB6>!Pa$bR>kfOmU9kzIW`;Prw^POMLN!L?m@<_KmFR~Pq_QB&2=d_J+_=> z#J0IU{EXnVxiR+4*mAW^*VQa=YPQ*f%NQ-+x0HAN7^CH9gI7!W0rZWr&kmjYx`Un&N%l&NbHMX%h%W!#gFZ^|^6|3*SRb|%KP!UeB|6;sZF#s-^CSVEL@~wSG}*NFG5_YJ{yz5fPVKba#NVOvJtwYM2}KUwd;#g@~rIO~05uyq|@*ZU@5xjMeC znN8u;C^Bii8@K-SYnwZ8_mlNL5L?bN;;e@)z-iOA9f##Gn)&e-x<@4JBI>U!S|+j@1)?2av;HM0j;uASeW zaB7J+W4Sk+_3L`y2U|Wq_XW$fef|zkt?hF^IODAAeSdAP8v7rx<TjQus&=jevSdl$IoD}T=g>qTRwh{1M6G9 zj=ggr>wR0+yYt(1;aqX9TF?2B|7XD`^D;Lm=g0P)pP#|WdoFYy$$bu%KbZ-ex?f`3 zhM&~^8cyDGQ0jgImOq$t==jFpx7hNYs~%{$@33u0E!@e(D&L*DLz;4@z{x+@lNcNB zRBU<6CB826b>>DBlj7?JCtq{xjxAqv>xpe{weD1K@-?@qvE^%S(_qWj+@{609kt|k z2Jv?A-6!XE7My&|Z78<9xjELpPq_E^9+5RX1GxX3oohJUEO2x6WX{89kDe9IGoIQg z`p)moW&>N_?_lyh((Ksst`GBYt~w8X0;iV!`x4@+=l@Hw%nr#c`n*FhGlzBo|AK9o3nol zn{xfIEvx3f|1m!NppBb{fhJa zx*u#^`^@LpXs}$}uY7)ufm5^3{F_PVhjHsqzqa`pcRzW4jl-6+j5yD)2f%65=huVS zaZ9;#DW5&;Z*cljuW=h&o?nlHjj2Arp1_vRJbw}_ zSD#-`V_UC21OARJpLm}E%eC|S2b@~s%~(DMXZ`y8dLCOoK3@RKwSB$_r`GoQ5}a|? z=hw^F@-_BXu;tUvt6;fyJFmg1rJeNkn{ei39C_}%1(tWMI#=HT%h{hTigu)gK%*gJRg{MwHF*ZJ+baIQF4t>^s69zQ>8&2oOS z=PUpx?_QN>(1Kw3y2me!ZCz5IRCiH0`C4}|YILkTK>e(-QgVh{suZ&qAIJLy_J^f`Ie#etI zW<;<1_DtAviDMS9^=cfm!dcEZ)DuTvuv$Bg+2GXj%&?=x?_`(3a5>kiCG%eWRS@0^OZJ(_W=nS)yTat``T z-E+ba*0jFngp*&i=j5}}T-frKOWk>}ZMW8)4^F<;ogZ7?a>k#ti1+-~HW)uI&dWFv zX z;x;zN$!GnhU}LK1s?D(Fv&II3M%XZ^m*vIP2GQ z)%Mu(@wo$7uI+P2IJLIVo#BkLo~w4jmannziY=dZb_2_`+u0pXE$yVQ2f>+_apXL- z7g*l4XJ79Fma{+ejNTV4A3ytn^$&PcZ0nNxq`C*g$=AAvV9V!R zH5BZ}_4FV1ltZ!QTu8!~^6!j^Nt4tF$IzRsy*u;nw>$AabBV?7v7En}Vh zkAqWle@p%+faUA?;6!ZsdOkP_TfUwT{)jDK&j)|Pwold4?x|qguw2?b4O_mp`)6$V z+V1Jt^0nPFu;pvJXJI=YYR;SVyZ4+u4rfd|#*BGldB-H$AJB~3d1el3_1Wz+Jm-U< zlpVu3Zvf{rC2jPAI~L9JgPPBmzgd3UGbS zU4`v=CG+@dY|F^!d2$U{KJ8xz*0+C$mK;Z5yKk#yzK;Z3*ZE$bBR9aQwdeaNI5mBx zt((B|+u|dBZ^4dV|KAXKKHUnh*7kcloLcpJ2ey3mdlz>6uFbf_@7?ffZNK-zsa3!C zVar#)_hZMeeG$K-;nm`I6yxUiV`Jg$U*Dg6?mq+e<36SK1lKq&=b88P)dOJLc8z9E zJ&0`|I?u*8^Wq_F`MMq-#OKlKAIpV%4BNh|{w89}SAUOVTVKs}VGhP??1}d& zuw%O!v4#6Pw&NmK>sdc*e`nU4{>|O;`i!;{nz^Xyzqa=*wtZgDwMVe#<#Q%I5?d~3 z(xbp~`8&wxDQg=i(3ia!lNYcpBcDF{7ua^{*>^By+nsuk&IW}2i}6StXk^61D1C$agIHVZ$CLB{~6oy@}9lp3~=2$ z&cfDD_Ku<0mXX)zdEEWvj64imPQT)ukO!bU>HMV@l_ZqNVJtJR-ZM}NV9DyyLc&`V`weuSZr#(oF3eA>AaEZ1)5E;zNclfJ$e&b*8x zXWRS0@~%<)`hKvS{h2fJXs~?zj05Y#cH(C|SU!FxfaR*62eIYj=OM7Z z8Jv8r`#H9J&dt-$-w{H`8atD{=L^uJgTi1E!zVi}TuFf;}otNR% zoM+j0j9Y*Dwaxdq`^moZDz=v`30Qy>%Q|PwtRek1(s|3{2ETJ?ekkWgDk_9yQ-D;`06mT@1pd}qIO zekXnanlY*wubO`He&;>!muFGdcg$gwf0Zk3^rF9xf%hF#&9h=O*Z3juzGJExOVxgl z?K`HLv8dVp(cIlr{QKdo&6&aN_sdz~GeUqR$Sm<{C$u zv{rutr=&RbU z?Pq@P!Mrg(`^EA#rj@Ym>pNGT>~m!}`^)$G#J&o)Wz`b<{Ir|c)f4;A;nmu)F94^O zK3ju2w&S~d=F*zj&Lg#yTMKMmwdCC&EMLESSO?oPkn=NfuLqWQeui5gY|f9-Zq63V z;NM()KKuU+Ulv;~F)RzX?O-A~SF8(=%fy{8|44YnW6(ew32*!t0@_HVH*Bd^ba-2LQ? zHUL{rzv7(HHUV4LzW0o_DOj#PlRcwt2B&7f=Zt3D`qQs%?#SIw&S;xs%UMR8GuoEm zwCNdbYizmNru)e@aB8;MgUc8#zg;Qsym5Y5etUSel+SZ|2RMDHyOtBTvE_`mGuW8w z8EqGA`K+N`!E*JCwmY`<>N#f*Z282yCs?kX-yk@(#GA3)2hRHSjJ7Yfe0=^6EZ6q= zdpNbW&;8+yv!2oZfGuBRKLA@k?HmY}YqxU{oLbsRUmpr*UdEBL)nQ)iS6x^S*ISFPv# z$eP`nwdR@~N&J})+rnwreQ`TD%c`aB4q*AL_rKxSPuBaH*sc-pS?@!^b-fSA)=%ch z+1QqmckNxs-A~s0IoNXg6=%Jl2ez)`>v}&QELX?Z^?m`In&X@GZru9QuWeq<-A~s0 zMc8td5of*s1)Mfrzn5am)izzfm%*uJPGt^WQOei#ekHtG%4f{4g436}W1hH;E$jVS zurby3ejT=a#&-l*uCDiy*w(9S<_2u}#Cs!HuASc~IJLx^vAhM&`gOhEiY*_Xw}Iu_ zK5vIpYx}$t&N%COzYANw#(p=peA>AOEZ1)5UO2V1lfJ$m&b*8x>vS|&KI?QWSkC^; zdLO6G6+aWe`mmk&c@QigKM#ZDs-H)&<>Tj3u)gK%*gFTZ-UqSXo!_nt=ZbUHdd`o$ zFYUrwvz#B>cYf{;C-2!i=cPTs@&|L~N!>x%?kRp!cW*d(&rPYj4_LmwYwe3I@7XPX z%kw*I+ffVmB(chOr`(VxzNg{jzlF=+QU4uV-g1d=f9jbVTi2xc4uq4hxgCTpUvoPI z+uUm1!{Fp=Zii#b*W8Z4man-TiETS-$?c!SD_?Va9!|dI_5!xNg{i|mC_h8%pG2F9< z3Oz6yJ3D$x)4r2=l+Yp){{@Ze*v5Cwk6-G7y93Pr@@v>zP-WLtNHeU zvz+;=C*SG7YVCZdhf_NWNFV$tT|{!Pb*czE^|I z*YBq@2d{A7=$ zY|F^&a}n--a%TEDww!*&IWsK?wyyKdGt)v~x%!Os%(O6^n*BdDmwSS7>rcP7xg2*t zIWsMaEoT{V&PRy$yDC_&o!@G3YKb>vxh9zQdS zZ29=?50-2DTpLcU?Q>l?_<=X9R0H>CA($~L%GcV)FS!W}# zylc+6IshzZe`ep>7%U$@n}PLVJMl9REFV8xfaR*6EwSa}XDhJ2*^J=>|;zVJTx)r?=w_MZg1cJJk$ zH82|d28q|t?m3?>u?HhwDY3$P3PDdaB8;MgDZQ;S*3j4uZO~` zrF_=xFgSgw*SL)>`}H|sW2*c0x!4_i^UiP{wp`t>FTl25-SaNQmQTDFf#uryT@0s| zcr%ul!dbuW*Oy_-$LHl>xwg+M;MCeauYxnqx?f+7Enj2523tPuTnm?p9D{h76Q6IeceZUyVZcH-wYuzdX70hX(N?!=alpS!^Nmak*) z+|7QyH+z-y+jZewajsg=`H}s4B5TcZe!@M`aPGr(e{-M9{(3rf++*Ey$55`b-Ol~> zNO<>HwF7A@nsfg^c=uQ}+o{?<@b0l{#-%pCnWOiE)z>8``_1p(N5jeI-%S|qcy2sJ=$Q$yZ-D zVavzY&0x9e>t1Z*@;sfm?t_!BzW$0WA7A%_<*Ki7*v3_TjkiuyF8%xfb_dT`*zXgt z<*KhIu#Icv%9G=I5>CFx^%S;z;(8h^SA9K;ZCusYKjGx7ujjDkmokHT$w^BjEjax75t1Y8S!#?{29% z&#HDNy#MZ&nqytHli>Y#x76(KsvQIGzq_So&e8lW{4V-!40koxXw|O3_TS`EbB(Iy zH>;tXOYEDx%MHV}y!>&DyS~o`%iBiky-EA_Tk5@qZ9VzadmAiY>wS!EpQhd?*w&Lz zy-&gNwcZcd_IK)aS*Ej|eClL(acjvE}m)ac@&*FMOxWeQ@&ey$1cH zZ`@4sy(XM|^}QChe0=|^DN}u~4<{ern}PLhK8brEoP71YIktR!Z`+iqzPE#ukMBLf z`sNj9lJ7xq^40fV*z)ncUsI;~-XBiB&K2iOp5?t(?OfaLllHOmC|VCR*RPs=TeWUz zu2D7nuWG!Mba5T3*>6?*p84%sQ?qZX_AQ$0NzFc~+Sh0cHJW)>?MpP*h4su=&3s?v z?%Ej7J!|7{;JkA!%G`MjTkgbW9Xt;H6_W49EN2_)Y2#9` zTDy(w;A$Hqu;tRmjbPhw+|tGYJG}koK@>xH1n(4v_-RDsy0p0?9ZxAT{Op`YEu=>@l(s5w*}a> z^v%MZ-wpY@$fKNLt>bq^+K*xD-}ln<*#9PCTSnezvis!YV0r(4vU6bXir+JP^Zg_D z)p){bTPAb!J^EeEJumHi0%wk~KgG5`((Y&2mXS}ppM&Mo?iXO&)xYg(TPE#xS+=uX z_rbI?HJoD-dm3!VFYQi?Z5jEr+Z!yOcKd*BSO2!FZJD&&7i_-njcI2tIOkC8pJ6-S z((c^YmXS}p{lM~RcOJ0q>fd&?E#rJ1M0?I>?}=k?uw(6aPnKDa(=??+Hkm;#O>B_?jb3+d&7Cg3AabX^(fq)4cD`9gBs3fYwGURa8tn< z|4GDUj^16f&c!7-GcU!}>la_SqqnT6HW{3a3 zMl-jn%>+M7qnTsXdc#lGXy#hAp72vOnmMbDVr}`iyyueZ{nPTygZI13^P92pyGyn6 zxa8~?an}0P;J;Gu`jtE9&od0v2)JFi)CSEob(hPz-^3;FGhzY; zT5^z2+iQT$!S}P|uqK>2s3nKB!16zq!#Zf@Q2ne6XAWw~VLhY; zT5^z24gJEjerfmjAIFwnj6D>Sr4`b5KhT+k)kPEQjsUY7RSK+qU)8 zl7qbaN!E?`SD25^d#{@r6W7{GeVAZ;Tx%y#W<_i{*P3`W=H3rH0NsOl+;!BI>%o^# z?md(uI@35cOgjY}fb->nNv(#S~ zPJT-D*M?U&o?me{X7AbC?m)6OQ1o_5qX=90G^vF&Wx*xu95*rpxJJk7NY*FH0Kp0~CK z+uvz-Cv3~ho8Q*lEuVJPx8jnwU2(>Gcd&h9-1+~u>;Wfle>(5?0>_uyATBw5iOnIt zqfKi(bpj^{hrw(UpD+eXK8p1Yrp=REj4uJgH!L##i?Tw6Xl z{{{RyxtU{Py##Em{%u-fy%bJ9=Y`9_)|HR1E5P#RuqN?3#@B*hc|uXcQYd!KCz8z%G}63vE2lgzpfdxo56CKpSOYi*f(moa^1mYUwBWwyTR7; zy~94e51e{x_i{bRWj*itj^RBr?{d|+vtnJS#}KfOStmA zb00X%JPX$ckH$S+Q)g;9aN3>`tQOxhHRWtOJ}h%*Gd?qeEn}PZ^K4*0j*r?bTypk_ zINy8s1>4Rgl(pYd#=Gmo7~gHm*q4^C_21}k&MW3^!zlm<0^vTZ} zeJ*&*W{mrRjpY*f>^JjZ%a5lYT>tZe9y=Mw~T9+`OvcHo&%ynsIE*-H&mo{f28pF5~cSyOz;b%NPv+n_FT_8Sk0D?}6Hi7TRd4Sb?jNcDKDzsh`;+DMZ9MLQ#^c^sZTZywfU?%tpKVw+`_Yr&x*vINm9tLv zBK_tW<2}!Xr@><>m-AxIGh4%3XH)LR<~?#NJzsR1kX;TkK8kgrY|B+Ou|Bqe|^nd(s;qt`+lD1ebQsn`6ut_HA%+d%AlV|Pdn5tunjx9IeW|xiD zAH2&R2OoUMUWe^AY`-J++U3CAh8?!wksZX+tE>L?Hr{gMrG^gMbEy?pTn6_Y({=Rd zcn?24kf$fQ$+-9AI&ioB4&v7FEWxfZRY%7#uIsq&;(Cbd5w4M3&vI=~B70BM(eZPx z8K}qdgxX<+=Ipf|=zQFJP0)LE%#S=N*ZS0|>??Qe*QKEL+N?)}>!HV9*;ln63MSlb z-?QU4jV`9YpF`+xiY~oJ#{uZ^r|hfx`(tn0zYc?+1BYO3J0);J~cuqt~d1YTIAH9};hs107chOT`xt5PUv3!q? zk&K0I`^maw?ZX?hy!ngiE|_J+W++&X21~q_H81V@a;2=zBDP4u%t364f=%9F4(gOO z2JKcT7}a!PD|5Gxo&eCFw)XLp=*dypmp*)HKdP}$A3Rm;m3>wFr(5>V6no{i{p`#q zlx_vfXqdT|dZEx#$p8L{PS#E(Y zy+_BR6Sy87j}_T7BOhDj#2MF=l&kSDppQ^`dXr)w5%A z?p|UuGymAyyEx}~Uv!3d7cVaF*`qI)uZ8i|m-{~;<@zB{!R2dixcRt?&4cV3q^{4t z+$|%f&h+T2L*FwIoaAO|I`Sojl=`EP=LB8p=-{7L9;gV9e$cW;V*3OdUSd;Jt${!c~Mr+zG}y*B24 zI(NsuaisjOknOMJjlKe-&2f4$`VHK*lZ)Nu$jg*+*P<_1^gp7nQ1pAy z`!~Ad=3#V>#}oWLj{aHUN1yy&x_&sX$;^1~ezZyXJ&~Pn zvD*th^~eR^8`<*u(Z>0*KX=Er^TV^g>y7inv%R`wBsOB|2XVKIwu#{|u&GK6L(vn1 zTw)kjaK~ft!@-Tsa@qtxqS)IX!GF=%TTUBuIhuQN@j1jXVJ<#*s2h81#MC>vTSnW( znU$_5XM*ux*DKh006&cHeg(T2%<qPXvg})ko5?(2PJ$g@Gsplc|)Z=^# z{&2zT{CNc2F=jb!^lQCOA@^$PRsS5F|0cve37x!p(Pu&*&jOkH=0~q_#P0&&%TR6w zdP~0xqF>Kld-ptfeK__OLLT1OxXvW!{@~N|N?ildQ&-JxNWts8+Ognu{_F&9TUbt; z_}{zO>nFMF18xqW3b?-HUDFpXzD@GUTLqJz(=gncS4=_7d!Xt#PUGFUH5}O2yVMrPMhFQ7JL1qT}FZT!9My^ z==NvY>1lLxv%I$Q`qbtbyjUXZe5nwRzC5+ zgnY%K5hMFgVnbF3e2{at8M)?`V-*#(I##E4RT&->uYHG0I=$4UBjI$%# z2hkTqck_$BBf9Hb`gSMuw6|PxIR?3%%drhsb2$#oT;ysl$D^BzezZw0!;w3Vd~ z9sxES-7@ly?N06)+rH=Pm~m|Tp02uMIW}U6`*h@X+-Edcjr&Y6rRoe(Ik7J@_^7meVHoKOo1xo{jzsehv1P( zYtSvHjqPYW9@4MlCLh}#V7Gw%hIJulddEReaNkdk-DK#uH+FKtdmt{-hOu2w>x zv6NpKJ+aEA{3-?aSv~lw;O1aCZ88=%M{bXWEgGzjg~4Es1-UvFwnTR<=trB3$E}b% z{6K-1F}S~M4K^IzGV($G#5U9vg2oSREUG z2Xk!5)v@s=x?@8>+GK3Jh1_v67cXOQY`hIN9NjYVuK8oRXU%^H*|Fi8@8@vpuKBSM zQ~!>;WwcFx3$iIEZ`(2Lvw@p6{-ST%rFV2a_tM=R=XL38Y!p8i7e95qx}@NBow*d; zezu%8@pD zRWIBBQE=N*`LQBD-pKRt?w6lYYG)t%-ivnfu6gat_n@9=Z0$!sOH{YtQkR%^ex{iI z_A^9v?GlHWcKIw(e|~nTu3cgjQ~xt}{_Bc&K%@IPzL@-Tjcm;7GfmaanUnd?hMuwL z=aIIXb^7_Ex@BS`roIq&%V?W1wmg`5MPChF!1sy=B3r+h2xm)*DO~T+M$faFb@BBF@I{M#-8&X*>@BBF>=!Tgwtes=8hguW6MV^HU)R>98hguW z6Z@r$eLV{<)7V>1o7gW~?CTo6Tw`xJZDPNCvG1fkg0IlnTTYwcD;E2@M)z;*EvHTF zS1R^(jb6F2x12VyU!~aBGtjDyz2&rt{eWU$&xb#2>@BBF>{l!H^{g|nvA3Kyv0uH| z*R#zUjlJcxiT#?zzJ6vgsIj-4HhHgLE#&KIcX`hgzMrZu$Nbu0!?|ly-z!)L-LWoT z+i3HG`x%jQ#Wi>f@CCT1&cW!`sr^1I2=b|OOXT5j+N4fn*$Vwc?yfi5#D1F=?%K31 zm}TUg&)adQnl9Y+LEZ0-iDf?Tf<6T?@7sIwjx&*s+xcOBURl@9f^*H(M&GY+ckOV$ zwC>sXpvpDYv8+Bjx|rqF=Rg*Vzd4chCoaDSch^FrsM>aZ&#I02J*+n7_p~NrJv*HHXLE@e zm-@LycP`J>j9+=@$>^dx*2fjyvAir-{HYHtx?^^DOFygV)_-@Sf6bX_W+8h_vBqo;+8b-yoafG08~ku|&z-NKi`__F8xa2(WHH|tx1auo?8|u zip#qE9*%YC`|Acj61^`zzCjmDdwgpdF4yej^&Pr+^76j+@dLVb`MG(@{TEEU zv+1kx$YPeCrs*5c(Nxv35SRY6u^-LRe9SGey@}k8?JY3z#P&9_>%Mr#$XH}?b6S(t z+RtO&LAQ^&2O+i;smF$M%o98Zm`4|CGq@{Z?ex%;vXZKmN8 zvkqnbxxT53tM_hr?`eZ6sQ+GkYqKC%AFf-Q_+~|x_j_btQO}GGpL*rB7q=eejGsA> zXXCPb)}px@-Sds()AtGH23v!>_5;DxwR1mqOvYbdFrOjycN%t%kNFzC`kNn2f7E#9$kHd7gKk*{=H`yZ*Zd zW{ub%Ox&?LsFZ`afeyvA){Uyf{$nt*oz&KAruW_D;ekzx7cuyRsAtz4D$ZH$^ zQe8yFX^S-(aW zbDy_wev527c{gWmrX?rsY=_6VE^Ro+-!yQJZMl&Rm%1-Ux9-fTE0MJqcTQcxU0+n) zHFxDN<`OpsW&8VT?!KJg#&Q+9m^R9`m7kehi){N@hkb0m*P)A>zwus=ES9l#6SDS> zt;~y?!8);(%bIozvg1%LZTClH{mI#OiOGA~?p9=DHW%%U*PL$W?#rCCxs6NAoRpK( zoyhiS&FL<5@#J(jvRLB37uoUTc+A-R6S6*>|H2 zjpX9*5oCSJrHvj%Haph8#$(I1KUk|^Vim~VS9K_9gZ>cFupoo9W$Fw(mkf1 zM0O6^?#b(EF!#=y*Ru^~UKyi*0n^sK-hO%+*_Zt!H=0Y#xRmXuSGd2*<@wO>1v>T~ zLw>Ena~2tcE|zoeUy;Rf7I_0Xb;-TX^$&UK@}4&M0NL}9aoPr!(?%eK;#q0)q7xawGQjbS~xc`7>luKYyCMte1z=tfny{wecWJj zvHP^aeD6JWpMhyBmofc0vh~TO>=(%5mNmxoi}%F%{g&P9ljB2s`Gh8uLQn zJ-JeTa%6euvg>7!hDYrhkMfgpiR)L{dZui2@2O|%9lGn$W&y5gxKhvb$nvRY>V~J9 zu6pFB(uT`=l&zC>JGapwUuGBLtvbx|m)sYhP>8M&-Sc}?~p-$Uq& z?E4S4hq3C%{Zib|a?)4UDVOyjG3wKp&0F8zQ^xktXUe4g%-1sZiDkT}jD2M+DU-gn zFI+cvZr-nO-EbWAM;FtNa>n)U$j%f09wg&>4={1hg|Qom?pTrwwjQ#5=9sn4FVKDE zJ(6FcTc3CNs~X;z{Qkf>=wjL^XI`9#tnWH6E@&|4g}%o7Wp7^k@;i{HpwG*tFYjrm ze#pjdoQZpWFvo!P#BKpFZRKLO5VGa0J9Z0$X)Bj?wMXynXGfn+*T%jlx>)k*C6B#* zP!x%ook`IYoUL;GX=67Q?l#Iv+I;#a^`+AzI>VcPQCa$3G~Id%-wrpT>{zM z{r+6ArNG3^-B<=t=XCg8n6YFm^2X8+|I>rZ84J{e=ja*0#66db;0Z}xwO-I$d;8$+4Ygd{dge-m%dzfvqF|zFPye=NTV(6C@8xYz>)8%j&i3rdl^C}N z^Lv76ry=OZ=rc@W+y%_fXlsnSf*GS+V%!Z`yvDdYx<2I+;~vP?YmD-VaZhBq#OQu; zGP-Ml>q7ctALOhB>9_sB+H-V&Fm2^BpEfkNGM_d=7fb$|AX~1^r%l1MGhX@3r_GS% zjMppc+vZ?$iFXjPJ{?zyV=J&4$JXd#iDO%2%hfoxL)XqY3*bYFJYsYpVm|WJJLy^U@<{T!+ zl{IH5vRGm`l=d`szZ;)9c^H`Zh-OX>MgEk25zjmwhO95SV22}%Yn$Eur9HWjO@yyp_ z(EUDk>OT%WYf9$V@nG877xI~3!;$6ei@FAk0Q39P$@2vCtO4dpn{;@*ML+y^g3H+! zG}DCj-~=!^V;PCPFJtjZL42VCiTdto^!zE+Vz|Z zCYKzqpo}>iduOxnT?y7n8_GGK+~59yY+1R?jjNEw7i0itPF;;|E^>}-Ki|0q+4gp9 z%Nye$W7R$n9})7g&2-+yf?VENR<&(QR9~_`45TpK{p`E~S2Bc5M1ga2dK-){D!L zEm!xd--Bsqo64J~XUi*)<;>G7d*+p3avA>*;LpGFNnbvMu8n`=lYV;`Ogrn4Prp5a zET@0_Epa{urVsxvC~Nh#=;B$cuR|BBYxVW$;&rXQ0bM-f>PBS!h}XWd&$7<_g*LQ5 zo#)!yk8+N+r{ElKa>g&0_P-a~+Wz;UizTo7ksSlI{T~3+&bE**KYrZz~r(Y zKZY!p{rGWYvFyhqk;U?U#M8v<*m69%&b^54%XLofIj(289KYTZ`?JU=;Aa%&Y&Xkk zqka1Rg~rBndbQCuZTkf6r!ReLZ~2@HUP6}7xnMN#HtNl6#T`X<$H)PAzetjKGJNs2W z{rZNsT9dxn8@gB0}Y8?MS*UmWP6UY0=a_u<&2_~2I z`XywsdKMjxZoG0?2i_#s?!T?lyMt z*obFc8iy`c*QGDf#p}BC6}ouVrLU3oBcA^5+2{ZF_hjf|>F>#r+v~{`VA`3xeENGz zWVv>KPX#8I^<+9^v8*T4Ba3A{nE_cWF^nT-+o_)KzXTJ{JpKyVc`Tke`!%w@)K}-LtctbyV(YaL>+i#weGu zco}P!e(QT8GxuRH2lsFNV>b(!xW5^Z@jg4cxbJT~*__MfK({`*%+0xw#kEa;U(wX- zJ`jKX;Kggb^MQ%idKW|&uk|j3ZX3v@-bIkbwY9y!z_;tU@7ua(jp6RgJ!?TekGL9L zOdI9IdL8n5Tz)>4Sg%L-d)jiT?*?S&kzBBwki}hp)0VfO>(8|!{{Gn5$ffM9$d;GO zTwa1)79KqDY_=r2SYllo*>ZL5UIt7%=dyg}^0LTs?YX=hm|T3`i9a#lBT5{rs}G(S z#~SEjDKiM!ylWh5foW$P@`+<@WVv=6>ww8+P1yihENjY!$YNPjHbNFlJKxvDeIoUZ zY{uvP4d(AK#O?tw@%r5GAiCw{QubkF+u>pSrR*bM;{GjL*5F6cEiad{k0V>w->690 zkznHf-CN2&fo^%Z*o{KA4{9DyH(1T%88Gph$Dh$HFPB)JL)Kr-<9T%Pn#T+1mX}M} zzaU$-=J67`c+F!py5;4P+h*i%e*RuhXVV{BfQdW5vxW>t7uPOjw?WruExR3&BtKzY)p_9NY_h011=-;UR75!N*bM>BbFCe=X z+OAo%j?7FfCuLmZV zHDe=Wv8)*zBa3Ct*aTTDalb`49P4k1 z?S?F78+zG>{w?C}U~;yh=UDSFZvE-kIuGLR%R2o{uszYmv{ANB|3-6f<1=iojtjXQTv}4d;8xQwLbt{F7}(#HpYG+n7-s|+{Wgdw*3x4HYR^>EaT%) zbn%Sc!;r-~@tJbN&@Jb0k|n>x(Zv(*5y)cg{C)u@mw3~cM}t}3-!zNQU!sf0=P}4) zZJ)=2$+dkR4`!TKKqU6z=;Af@5$NKnrxRJMUC#+%a;Yb6eKMGNb;Uui*|w*ki#vDK zPeT^#YENwJyVKFd3lSzL(}&mUU??vbJ*BFWx~GcTI@D_t5p{ zE92{ZFxQg0HvSXL?=H%vjt`J6FPAz#L>906{=d-0JvV1>{5QJs$ffKj$oliQ)Up=- zhTO%o7XB7pENkJ#$YS!`IzGo%-<`CV`WMJzKF=JCjn7g4K^H#>8})I>`Vr4s`4zJ3 zS|@zkg`xa!eI!7JXe*}|rj%Lj^ZvE-kI`8N1D{J;`=wjL^XZ^VYId!@Q--Rw#>vW#n z4JK!ubKe`f?PQIC!kj2{dya*Tx9WD_j&00vu^p+eLk{W zyY5TDY_rsTJ-TgUj;Z?wFzc2}-8UkO*Sc>)*PnIEr|z4P<=S=M4OZ)Z9KGxBU`yR2 z!K_;@bw7bDUh94mU4PaspSnjO%eCu%5v-1t(ddp9iciSy7kmPTM|sX*0U74Wvxd(^(>7nmwH?id`@+b^7%At z{eohAN7M0|wp}idX`5B3-@iYyJ(A0+O)hf5eugY=?yg@0C^H^E=4Y((#@dhA{9_O~m>e> z2v_PJL>bSuwsG2IEoANF(%x$$i`xh0h3k%W(8W8ObLG0oVzy;s{`S!BxcnYoV*U;+ zG0P|B?~&!&G5-K2m-v1}7OU}%M;EX0bug~Q6W=80Vl}>L(QP-|An{EHmiXio-}K0G z?f7N@lS_Pkki}|zGop*v_+~;EPkb{Yi`Dr0p&Os&65o7aiBCT9&5tbCj&A`lxx}{+ zvRI98VRZ2t-y-PZiEmM4u^Qis=*H)>R^saqmiXio-%7}G?f6y(lS_Q7B8%1d2B3@A z_Tn7OU}XAVz#6N_-oFB|iDYw~=MJ+VO1+CYSg&MHZ{^ZH6vh)aenytdgE=(d?$+H5d# z+Dtxewk5J$yUn%&lS|B7BU{h^YO`(NY%}fBX4@i*r!BTa)~|TlYu6 zv*XZhGk$vJi23MO91$!+M46S<6&+mSO)+wX|ubKt>=HW+1+rq znRaQjdyvJ`X7?iNS3L3Ghb&&(>`&<8waxBF7q4yh0J?bE>_KF)+GbCp+h(hjHhT(8 zytdiX=(d?$+UyzRw3&R`?9a$@?KXQBOfGHq9J2NNuQq!g&NkC7ZT14Pc-rhmWc`Y# z&HjQcUfb*?bn)6|qtV4{o4t%Ko;G_0S**6%o9MRLs-?}|1{1GsHWuABlS`YugPb;# zPn*4qEZ1(c_rT=RX8%C8p8wTm@59+<+NI6@i7cKr`v6(L;%T!Fk;QA9{R>^Zw%NbY z#cP{=gf5;o`xsfwHuL=Ixy&<|=P_+OgB^iv8+ztTZbzbvkD^@SI=Zp*{i>Y7I>9`v z`Myf96T!r_Pg}1@JEX1U)7JgL<=Sn%5}2H4Fn?37p1}s9iy33ub#-mI(ynVD>q9*8 zuZb*P+jT8;@!GCyql?#eT?bt}?Yb_qSRIRZAA%oZs_((v1D3qyllQ&Ia_zkD1Cy(H zC#MI%iag&fh8yTI)$*BjjSj}lVbaSfjDNPTS zoaB?!49IfroO*-F{Zvjffy>vNW=0pUIn9DDUUQliUA*Qr8@hOMnjKlJ=ClC1Io0=} z76eO9^2uo-WVv=u3xmo1R8EV5%h#M1M;EU-ErBjxb6OHzyymnNx_EM08dB^0PySm|= z8AZN~U=IeVro(X(!=dtEYa6YnUg8KQ;g$-6e z3;G?H`@dY)(v4`J^u2ugeq(UCcHeITCTHJo#=Y+KTcL{?Pxkt)(Z#bbZiB23@$B{6 zB8%7Yu|2wY9UnWOi`Vfn1YJDiV@G7MI_Br2zs#-f_49)zZ~5fC0J2;=?*+l+YTn6d z5pemM)1v6&HK)bU#cNKBql?#^mOvLzPD>(-)tpvBH>bMSuMC!)I3)t&T2Ub6Nvkyymnfx_ELLge+Eb+8EuO^p)|s30QKHPfnX6%e8ab z3{38)avBUSUvt_LUA*SB6}ouMX=`-xn$tGu;>l@SWU-plZs_Jz_xjzzl9POL+5=gx zoztFRazB;RKH%~-r+v}IYfk&2i`Sg?M;EU-{Ty99IURs3R&zQ6-JI%P{|m6>B%hp) zM3!skbQGA}PvvwBxO~m&Sak84({bqHHK*gz#cNK((Z!R~2xPIE(;4XIRQLKb!IG1F zaykoHuAS4_U~)f|)4AaCHK+5?#cNLIql?#^E{H=v6rryG&Q%&G2u?t$6Q z=Vd>4zjyz4?RQ@cHx;=1z1))csod8?*+;qL2DP~N!QJoWoYS@3YvAtpa?Xv)Jp=B3 zFXtGm+{57R_j2}C(BX;z5VXSMlNOVLAJbHJ}=yrSe;k-yl^*kvBbIuvgI7h?rnZvxF?u)eqJc=T=et8 zy^!Uci(dJ>aBncV)HxKn);SDaEOj1%Y>u_gUw~<6o${&kNMyNookxMmE z<#EVj`Hb>-WU;jADC#$E=YBpTdkRcE^ZaRKG2=|^qYmyaSNrEFF!Ac^X>{@UdInjn z`g$4N7~F#s*DGM+)z_=&;_>wwvRL&s7F}QN6Y=#9n0WQ|F1mPpy@xDTeSLziuTJ_n zzCHyLuf9G*7mu&ck;SU7@6q*j7#$d2KY)o>U;jlHkFOt*#j39Cp^UFtz{IPsS<%JgYc^ytebxEzI*_$+X4W{@L)S;gkZVJ@ zNx)qXJQyVgtYS+{OM zb{%w1WqrF9%<=b7pNV$2foUrjyE~9A_ein36HHsVtV!okcU_atMHhQ4&#K6lvtP3g zUI3<@Yts4LvnE}LEXOeHy0Q*l1SV(hGjjK3?*8WD7x=!1%iO&u_xq5|z5eFn{b1te zp688A@R#$Ee9lLgg3B2TVNO_+F9VZHJr6ha)Zbiu6wI}!w((Vw`*N*2ZFuC-{ZOFAhZbuhOf82>|yVU-;3rsuvLq7d+H?my2KkfmO%N}t* zvRL+r2av_GM?8oumc0K=UdB*=bMZMa+siQ*yXV2Ql}r0PhM%;LeA?%6aJhE-j0BU* zTJ#cStjG5TGS)|f*(2db^ePa9w%rjMu@nbM!luL}CAdA-+ zKSkH4Tw?qT*?NspJ~4idESDHvD_tL43tSh{ALEd-7Np<40&CCFufepH%Y1sx+y+lP z=Z!%Z%Q*QPvgPW0dL2wVi7}Qe4P@#{^sJ;=vh-Tzor4x&c2Y({F)Y7&c3K?z;s~sHy39> z&l(V)y}`88r+j?&L6(cpI%l1`p65IZt;L*kjl74;_I5tYA$AOey9z#E$UaIR}|<|b$To~K+hX5#J{<7Do>JY)Eqi+iBY+}L=}Je?KUab16Nadt3q_ZZt^ z0QpZxjM=l~ZHs>RpB`M!w!mz{dN2c+oUv?yy)R>Vk5~qx&&6fD-tA|9b8&9u`kRaM zq8poQNXBSCu=biaADFgs$!h^*@p>+qnRt?ed~%otT&|tNtYC8Sxd>&l1_xUVOuV+$ zT$D*Y@~LNTaJhCp^MJ`E$E7G^&c@!^%!{SLI%z{W=M%S%W%!?E&0)P&sogPD8%&Bax~#A~|`Ko_s=K0kG*J>=6K z3xLbD+haj6ImfkQ$8qAANt>^M+#VN$z}n+tZ7^|TN!zZ2ZrjSm-@3^9l*@jwDD@k& zV{>in7eg1zy0`?gTfP? z45poR$fw^nL6%FuCC<&j^ih9vaRqeotko-`i`BKdKe~8bt5-r7&sx1QvVO#CU)g6_ z=hmbR?N8^q_V%NkV{K(P$D5q-%ccF-!M3*ly69rbYkhq&9&7t=0H&R7BcJx)5LvF> z{u_bGWk22wSuFeU=E!2%kGDV;%XiYZAzsIpbyCv;z~b82jVep2SuK46{rcO8t~zF^wQrC;}?zS^&Qp^K$$_CdB>?bm(5 zw6kC3)35t!%hm4J{lVlC$Bx?J(|$@E2Z7Z%4n`MC9ET!XuEuc~x^~7PpE!mh%eCVe z1}2yFdKYA|dKTRk-FW4)4*Z;0>u)X|h@SN>IUNEfZrcVs3|YLcy+`5KJdIi2nETOB zM}x~5Gt`7N>6c(~*(VOCjPY1r&hpOPBf#V=?>>=na1>bk40$w|dCFyc{}Nfeo*{>0 zBc63>1iDyVmpakK>$-FTx_H*56Or{Jp8h@;x%T&Y=wj*b3y|CE$%SCrnY(=Y`yyny zc7OjGOfKumCCFk~PcB6k%X)GdvRGmmLCm&OJ>PeNiDw?4fb2XL&zwCGSzmI&PC^!M z&tvDa>xbvlwHX)Ach?l{o#R+4udyUAyHR2XfidPDPeCCv8t}^!l5N zXMl;juI1e7J#h`9yk}?6(#DvWQ9D*c_v|cZjFlUJ?%7$+Ix4pcxMycMW0cESyq5gr zeUHMv@>%6NF!9*jglyfuCz5~j>Si!;|IH)U|2vR!)|~)kaqA@1X3Q*laChvT*d^A*z{G1li=&ID+!DyiC*_s|6R$Zgg)W{P zmqYetj&jRzEzM<4-pxT9b-CoYEV40FUc2PDe8cNQTgxWaHIVHe|K>cgt_dbya~y;& zo^op;o1^P~%B>A1UUOUrT|7B%fSerV*5g{2%bdKMgEs1N$#H#TW2n4#$#KJm*N3*2 zO|07@o8$6BC&s!Rn0U=`dvx)X+X2}ePb@hO0TZt|?uag)9Ct-dj&eJ5?ZjnH-pxT9 zb-CoY3$ig(Uc2PDTf^%^Tg#^H4@P#5)_e{D6Hh*eBAbtA`II{hOuXhZ6kR;|`~o@o z$Q{l#jLZ1F8?QF%a>?fiWMinjcFE_+hS!I-mQAcDA)8N~dnbd5*Bnnl7f-oUkquiNXXK=aQEzuW}Da-7t@d5u(yupvhBU+Z2b!I!0Ef+ z|HxVQH8A&<`ph#1Ok25}JvXC{diLBLT`c2hFtX+9v&NQS+IjYr&)IV;WV!a)b89fU z)VVuyt#c1_vDCR2via0H_Xg9>I^|R6KFD(II`;*W%X#+zWU-ug4@4HrdG{b>vBdBe zIU9HV-P^ap#GO-V=dtLvvt0V)9b|FmS)O^{MHkN*_&sFn6i>PLk`@N$N z!L*f2*?%L8*XOID_|Nl|ylvKxAvFwK&Nic}3FqU(!Q@i+XOwa8)@Rz~b1>UQF6+t{ z$l|uk$madO|DcQexmBKh#-Uq>T*`ihtiOQ-le6pBVB)Sx&I{*(W8U$fe7{4st^7Or zjH{!ttK;fubg{&K46^0wxH=Y0JI9rL#?^7ia_w<-JeXYK__2xO+7ibJ@HLJT(Zv$S z$;g(gahw9CopHz~j#H84+Hsr)CYLxSMYcWuSmHPftj2LRx>({k2ibBpj&sqqGYdT!OBhamXi*OOfT;aa;x_7oSrh z+gHxtVAG)6ZjQ-}ziH9M9|y}goetgdaw$6lvbp-cSjzTB7k|2x?SpQ4x!BEwY<$lZ zyP46omCG7+1+sY7s4J1hvPS&@SuFpK;vC4X?{&SH6HHw$eKHra<6bUvl}o)VA&b|2X=QZV zN-q9ZK^Cw3(yHj<*_Q?&JI=%t+d$;@9<(}`eJL0JYa)x+J?K94^oM-<<4?$P?f$qQ zOfI>tgKS&Zy=7f=@w&IHhi+N9l-&T?vYqsI_LdFN#oK$!Mqr*l{Y}UX89(kpp0Tud z-;wj|wgH@bx14Pij<;+&)`xSClQSNmGuSyq`5W=SA&DHhb>F)G4++e)3+?BVgi>V*}OkD6*I~_OIBK{Li+O z%WqQ4wWOnr`1`&ip)_@DOjj!9$w<3ZhV*v^UVRxt6zb{n!-jqP@H@x*oqvRIAn zPIP0FOAL1-i`N()LANb@7EBC}f{7=F$B@Np43DFWCx(&AjZNC;33OwSOAMos#cK?I zK{p1U)e^%?VB(2kG_qKY;bnC3#PABTSZ#+_(TzbaF^oYLuQ9xXZVaxmiQ!!^@x<^R zvRIAbAL!zV;eBMW8pA))jX^Fke26SwWB3ocF$^f}Fb+&SF?@+ER%7@IT|6;-jVxAU z_y*k=BpOto)1x!3K%!({lW0(zHJTc6UELLNf1Kk+p62n}`;>J*)Cw;EWv-OO_ICF6M zyzN}hx`)^?o;ZEJmb;twtlYyaG$T`9FvuM0o>gRXwdqrA zcIwHQ61;z7<6WDlxTmfMu{j-mrN+kliLA%&L#v3jeg|~`n7E%!Wq(|)!Tg*n=Zn?B z#OvR_uG!f6x395V3ryR3hFKfkbAnuASr^%Jh_;T?u6+{Ov%|7{*CXfAt!V3d9^D#U zEcI=RygudXd2~B4?c77^4KzRxa^xfowaDqTbjIM%Pv@*w)D6wp-4$dl5sH5 z_KoK_*C6B8pMI_LZ0^3S(|<4JM07E2l&#Z$FXd$9)aiGMPem82bvmz31Cz7Po?OPL z{TapH`D2XQp9wA(`^{;aA>e0$=}W%GZEW_Z?RO5cG1cGRKNnp*W8*wzu}*xZ+y&^C ztG{1=A-Z_ty$D&Xo!_s)FGUt>`@9THuI=-3FypMhz5jc3 z@f!OT=;Ep8N@THiJ%0d`OFe1pYrxFQI9!Kp+iQ`o!gOk25>JrG$u^Zh&g`pSHN7~MJIJ@frh`TM@%|lItexMRU~-8!eK{7)@^!wygDxJQ?;?w}eZB`K*Y^27 zm~qzm{!euA8v6(6;;H9DWU+QV{{oXsJ!$KY!OY7zGEYB27SBBW3|Y+f%zXbGSv-Em zA?w3>;^#|b@%Z@~S*-f`23ShbwvBmcI>q0BYc z1z*wu58eQCTRo=h- zCA#&<1shMS;`QGIoMbMZdBBIUM&;iVoD@u4yTo@K<;;yLCd4-!OuXhc0$sf3b^^M& z)v_mniPzjtMi;NSoq{f2b2}B?dgPK@FX9!ixlI8kUUQogT|EEZ;Zu}x?eRGxbNDP| z-@of5*I?&@Jwt!h_h`=pbA6Y)mA>_TvkQiK_Gbg_(w*^#ZYp8w|n(@x*=IseazEa%+w${d;tOitbNe_v!VW7-qFAF^1^|MMY> zWna34`i)^MZILl~8M-<9UD(+D4qaP0*ZqC*;Vb*slIXU(_vF7ca^1g{Mb}T(yyeif z5!dI++y`Uge`K+`UJb#|N?>xfSN1RC)}MZ@b1m+^vVX0D zE~brg_OAiRsnh*yHFU9Br(<9sn4EReq!ZTEHHv-Rzt#koi+$FxL16llcMVJ2#+H3( z9b{vw``5bY;u+`bA&YeqOUiA4Zn?S#Y=|zNJzyhbv37nNgUKb{^yOw?maqHQ=IG+_ zxdpOV+vi{~xwg-(z>Kr*Ut6P#*Vwl~7f(IgB8#=_*$zxD^`xzbfSH$ZWZ&5lSv>pB z&d6f6XXf56$l~#{JF-5kCw}%o7LT93kj1K>z0t+vXCGvJi`Tw)3}pY>l=au~?YwZT zI94sU7FX8zE17HB`O2De6_~hdRp$HE$l`U4zZTuHEFlxhUJoW-%ie%4ZdvEkqsYFT zPvgLDL>F^DDQ7*o8QFEm_ffK597F7Ny*w6OEU_PtY`MB#4hPfDzLw8=IRaVEzV=F= zb%J$q*}Kt=!}oX+$H`zdj#JRZ631!C!?9A|>bWzYWwvRM7D z`jP0yE0?-&BUW+O=k(tl$l|WonfG_1i`Rck{4R8H|GnVUdpEjx-H-3phD$E>{t4MS zv`fABql?#iA3ztc^*)F$Uh91bUA)%&2)g4*&T*e{ZZkOJ zmNN&roF~o!ldtEA^T5Q%Fivw;Iv-tJyOjMky7ktwzXcPoWiLh-Z=XdxljO6uL-Df% zx@Xb(u&uf62R9{{oW3fz8{DJ~XN+>Tk?*lOw|s9keg7;A2jKQ~%^;`d)&)?BL;yD9djxLrn(C?AOGPd7od^q=Vj=Bn7JU*^Q7mJT;kj0KC z6W^nM4_mRUZ||eqZl{uHV*LQ!JnOmYLv(HBTt7d;hp(KgZbP?!y{C`vK(2js7rK7Z zM|Y!ZBd*T}xckbv>K=44{VL~Nbsw^2?MKg5e?k_k{ph*selR)vG3P4d)}MZ@a};-9 zIafW1E~brg#?HgYsnc`Sqv&F_PUrn&U~(Bd8EYepeLYt_0WKH&?5$6N=}X@Elemq| zej3CWcpBN5>bdF}bn(owKO>8E5?jhWhiv;oAF7>3X-vTo)FMz{G3WFVV$w zuIgPrOS^rM;CLw4)z1GcpX#!MHf$B|A;Ks?(6Yja_Q^j zKMAqOxxOX;9$@12e9#kJyq*sxLl>{-gI?(3^?Wb|x@{_#dZ$9Rj(RSc8eP2BI}N&c zt#?{<@mlY6=;F2B8PM$yImb=f-Fwa+`_tyyIF_`xPr~gEXWVk;AXoQp_wbw#PQdm} z#)fAG_mtG(9&-qs=Lb3WuyC%A`+|FZkTaIb?TYUCLC#p@tl!UY9Y20{n{{nwvDW9T zvx12~#kn!(t4`dtxSy!u@UJ%0Ud!}whpT(0eRRWP~gcL2J0 z^}8B+{Mr`rI}lthes87Ue1B{WFx%JXC-?m=k$t)E%WcZFCYR&Pd)jI(Wb1a0W=ySv zZW}tzMmFPOU3Bp}AJ;>-yj;p|fNVb61=|SSwyXX&Mi;OCHbJ+%ob$pQjMvx`@8-z% z?Ib-XVuR7`7qME-@|pWvGT-!X?%L}!++a9!k<)*zZ)b~O!@`7Sk9#X zK^DvR^S8s+I!>Z3T|c%**G4>TGz8gt>e=^eY{XN~H|S!i=UZg4)Uz|T=9zkSLDxn+ z^LsaB=k7wZRp#LyV19O1*MU93w3SQQy^+OTOB`dX&)qe|CY+IbqT65Ivv%}Cu4~5> z==#apF(tY-;`*GPyRV#)r$QIguX4`F(;!>c`Ry5bT4b@hPkKh44ouGZk~6Y#>rcPd zIR|%NIU~=2E~brg*0eszsnav^Oz2{@PS?%?tr&WAzt*<8rRRL{tBql>41=Rp?hB({|6i*C7k&g_RSo_Oa&7Hj7>KbTzNOJt_tPksnpH-2?$&+5bp26$ zLfN5U;<&qVg+92>~mb2z$~b4)pF%rB5#pL`D@*im5OS$9q*KVNw^-w0hl z-m~s(f?U^~&CvCevAQ|BHsY=U+i>@lb!Q87G5soM-Psb^vW_#?ovo0?>Ns=V*&0mF zah7$*xb>%B>)egIudF-UqKj#xoONe=4JI5l6$IozNeOOQYj6fETpA(S9s-F|l#pCBBWPOX* zzIO~{-PxM?@A!6JI9431mUDb$-8q)Irk$^>F~@_6drr+7GaOmGKKqS87q4f-6VP3c z`goPqATC1>tgpSf~XG}R` zk+c4B+^zp??wOnCh_#+C&jS;$-{ZZY!9HT(rXMc?6R*#lziI61^X0{0`s^g`)O#tq z<$dnV`hFR@wsNWCa%6qlKe78gy0&t`u0(df*oyrkW9n)!ZT-8R*jTHz$|d(Y2LJF6ZMvxyUD%3&7>txm*Y)ml*G+jP*Q;VfyMGbo)sz zcK0G%RxUB#hb&&7?e9nTjA8#L?gx>@?f+m8Bb)P4^k4SwEAekG?tg3J;}7U!iQ#Hw z%h|@}@9*5A&a?o?umXgvRIzAZb23s+0p$z z$w=xq@49|Gfo{Lb>Bql&coJE>lXB{#kj4C6pnMnlDRl8Xw>^z)ed1}SXOV3u=Y(g6 zaqzx!2D%U3Iqp5}ct5i3XpV!(=|Ob;=u`b6bZx}-Ig-1toPi!j7t^nD&OnbMTh_Ms z4D=YXSl#nH13eBVXS?SNWZe4GuXVn_-B->)PoRrwqntC)DCE@X8R%(rv0A6=<1=7# z*4dNG7`1=4*w-`AbKr8Z&p!A(n7-t@)==)oWNeOm+wU*P##GNhFQJQP4vj_@>m-(x zdj;Kc^&Igkx_IJ!4Oy(6-xx5t#GAf+9nA9e4D<%NczpgHS*-2zO)$B(&$q#hvz~#* zqKntq-$55oJ?|omwd;8gOfL1Lt^WyTUdEBL%LmBf&UxGVU&vy%XXfy~k;UWZ6J&i@ zPyBp}EFM3fBa2l(U!aS}&wr5hEnfTHv70l{cFZfsxAVfW;#jqu<0EtS#b(a>-b%*9 zOJM4CT^tRjtz62!f-Ii-K42aO5U`PwzV`-`v(7r-XDs%0zRv_M7yI=2%wYPGx6c!|v1Q)QhHOlAzR!*>p8lN! zS*(+IQf@AE%hfqEH@bM{%sj|q?fm8ilS{nAoB1#wnC0typC4U3J{Le1Yx`UfOs?&7 zVKC#Y^L-I?@f!Q0=;EnoF=VlJJ&S|MrJl6)Qefs~9GRy}Ba3IAE{iN?duF~bhb$gH zDx&o{utJ=;1S#Qu&fz9eUWlzj``HN{uTjs+9<+?2BKAdA;$nRn5}pQNGlU77dL ztw%1{8pJAIzdthwO#FIc$#-woLKoLA@%@u>=El-BA-;csiPzlzjV@ku`xxEaYS~Z0 z#A|M!p^MktK1Ua?xqX3dJ#xuyJ>nIwxorR@UUSC%?(>)zn|G@SKRZf9_x&n##A$~o4SowIxG`w~2B$k)j2XR~j? z#Ot%!_YGE`&Hf7}UZ2gzH+J>eY*OmgXD4yHrWk(@FwdBBiDfcmeb(o-USQhFWvott zY(4dPZAvh0WmP zx4o&~TzuZk=QVx6#B=VS5!rI$$#-UC^X*ge{RK8P-y_k*lJC*TmaF;x5==Yul~2CM zAj`G$Jr+zZ`Hn#D!kTH?sNq{%^+M zykMT09IvtK3#P4Hu=$Y1yT&_bji>SLD`%#&(LHB)&zb2QWZTj_2T{j)==#y8`uXVE zhK-`+KfeK!v;A{sGH(6p*E+A_?ki`e zi_yijQO=p^QsmU>ndx`vVzo}^`Q>18*4dLQ`}h^bzMh$`1ec3__RT+l=}X?VEO8rK z&OX;58&f?qU5hTB{=E)atdm$$?gn(r)pN&<=;Dd@CSbVzLtX@oZ}r!_f-FyCl;O_f!uF>I~OM8L4@5@^?Si9fw>mSWxaY0A9d{?gD#e~`x~<5>e~N0n0Age`K({yfS9~ z4knkie=M?C_PTeF#j^Ili!A0mvrT?R{l?&#A^EM2{z#wyf8JOFOj|kExkcxtFt4oF zpWxGW@}B%ZL$2%f7wG!Q9RClxHsbpHmbW|okLY5xPTO-ln4ERi^?DL~#=frC zlY+~|K6ADQn7-s4hl$(RvhMamHm15>PYx!YzMKMCtdn?BZYp%k)irNwF!8K;(;$nr z^P3h-F7c)>X8^N&U9Wqii^pdlWU;o-8NuY*K4%6q&bnUD0w!K#pA}s^^~{DW)~;uE zFuBx|ww?>jyo@93?A*xWS!d@(7PCDw_xd7>$Itx8`mmn(SpZo)eilL&t9}+n7muGs zko7HI``$5-^?C?vmE+ra;aG93TF&v2^?GgQns&Z|t=nL(!*zXgoy+=qJY`&CU31^W zuDjmu_4NR7*H}5%l5mdwJ;7aL<*cW2JA%8$${Cm3$Yu>%3R%AXF3Hkh;`v>YWst?R zNx2o!t+SR}5llSg`Xh^JlXZ6}zcFNe&WZRM1}0v89gZ#@Uq>K|RbNM=8$lk$L_&OF@tok|y-MBnYC$3Y$#H+8<(8c5HbY!vW>uhx6s=j^&CSHA=gDxIl=OT+$ zUzebF^$(wQC9X@s#H+8%(8c5HcgSMZ*Olm9eO7$^0ZhF5x(Z!9zOF_V)5dX|-*NKp zxb^dzKEs%QT>j3L<0WHS?nmnLcdg{?$I5*K?(bU3*_M@i1Ki)Wk~5#mJrC~hTFE)i zD)$(;ziTCDUsvv4aDUfI&i1a{t>FHym7F<;^Rwpb=uhXPoO85t=cD_ZS8~o#IoEsC zj#Y`xw&_RPxh^?Z2Y`vkW;JBnsM-t!6HlM7jx4q?e)3+<8tD3xi?2b*wrTaX7MOT^ zt&J>J|8{R3bp6T2*LukILG`shn0S0`fGprXDeHbu72s;|w!#ACAsvVB)= z27`&GzAcf(YCCL&t}nUx+6LLauD-Sf6OXU$ki}{{Y>%!#x%e7_?AWNjb_5fTubq&^ zYCG(Vu0J{F%@>?eJ==J9FL7K=zh(Eh8b3q#{c1SJTKC-QwwVr_m%y~ys1IWk8^>I1 z98=R`vk06v+c!4WUu|BY%v_Dl;Ks(j(k5rpt?-@SUiFOjF}$ywHBU!32k-KiH@s)K z%57P7vd_o_QNd?x9~`yc4_`C(Ep z?L7O)=lP)rvK*;*T{*+_1d}uO5tQ>~JNj=v@7kC5?77U{dtzM}+1%^D`MfBYxVd`{ z^Zmmq@oW6XB5y1}9aHf?Ib(sEaGshPOfK~-Ng3;@|K{`3V18Gjw(&Ax+RCNua>(Mg zapIW)--$;)@$?3lYsb?EOfLN~FLLdVzUX2;BlzzMuaD3A?+R~-Zu|PT0-a6YZwlrZ z>Bl|ub~9vim&>@^99g{no4s40>r*ag-NDG#Ya7d(ljC|zWI1!{$(0zl0;~V7@HYQP z*IB?@S!M4Z6tNpS5wNin6a~Ax1G^Oi>=>@tJu?<|7b12SqS!6!*xfmf^>g(9{c_KP zYu-Pe&*$Y`>v{HGd#$ziUi&@g+%E!n4$a3+~`ZO5b^|k}|%;iqVS#Q}xyMQ&g;i@z%(Ytua*KQ;iXer$*?7C$ydwqNyQ z6Lj0@$5_7Q$EIL%O+PjRlgpf~j4W2qmcHovD;M8(Lax5;j4qa3A4Dv!2lrC^9SEi^ zxvYml$l`v-@eHfZXODwuBW@e@f%f4tPW==cgf3qHzqEtV#dDq?qK+N$tmQ+{>;JiX z7<%?w*52V@wljzFS$jty%bCMYT(Nm1Sp7eDk4De_h|OcbY^P26*!&x^Tx{0$JQ&>P zRQKj)oA5kF96i8{Ylp&Z0_VPv(_ZB^f^%QX>A##~{L0-u)5hI8{sVVk)^Yz|-52KO zvwJSvc(=`i+RL)r|Rn`d7x+juu0{(rZpAlLuz_B8b7xpxLwb1$9=W?Q-Ji@zg_ z*P486*Y>q%F6GT7P=_J>BWEt5#_hG^z~o}{9Qvd-1UnB*yq-lT)5kULIPw|i6mYrb zIH!WiWe;3PpPbpLlNW)tb>KY@_w2cgk?kv&eQ^o0c>VuwFGV*NIoFl{-|c0{=35`- z^|2rF<;a(D>7$=xCC)3sjJ^JUx7UD)*SuecE?)C~7GozL^2x{F!R4Cy_y?Gr>&>;} zI&sa!m*L3Gbuj|0xh`%26W5pI_EvOrD;ImWA!}1Eb?RKkuXXA?bg|T=p~&{LwwP0Y z*6;!_+nG~&<6I5-LS#AP^hzzi2uv>P|4!`H|L^v0blcSb@Ae)r+c}1O=Ivf&xy)Pq zydO*(_5ZuQ99=wh@(OgZS|_hW7q4~lDs=JG$*YmIBVOmqIZOT7ViTU-;oax9cOK`+hMbw+i!x^nBPJdiy!YG+pqfZ zF1qdXLq2}Ihb-6h<9#r>)R1S8#p=2JEV};6Wo^EWul4_6eFHsvFfqLiCT?zny^Abf z>%k}3HBNn&*Jq#(pYo5KK6m8GKKTqxF170e`sk1S<+2Ap1e3GBwJYo36R_qp#iwA# zDVN&$8M1hNrudpR;@Kth+yu>wI^Zhxb!pb&b2$ zvzIn!zqp^=U)pp1XD_V}?tYRp4|2)hkI3?_Blq3UExrC9q`!cPJ9f@^?-_ej`ui*~ z7)(E^UmK(QEFq_z%54blvxJ;}$R*$BQJ1yr&pu?XrXdI7_3r>o3nuQ*|D;_Pbn!EY zCqJJw1G?kMW&O>BENYK$DIRAypB6Jx_BM8E4n$5%edW;#cgX& zzrwaP%g+jYCVGjxFQ18eOv)LIE@m6$_<9AhpCkA?1@a z7PrPE=hvZY&;1a4*SFfprSA>M_Ls|gosU@RdYxaLE50s>Y`$B2b==PUO-+Pet;X&-B@4aB+YcY4(-SExN z@RGKNb3e^mV^_x6PELO)vU>){VGZ zZM@s&Q?S_a^TVgmA8xhrZks1do118J4f@Dd8}GKcy0m$dHfy3k(rV+~HfxkNTXG=I zi9V{;#`}=gx_AuPJhb7M{eDJ{k7v^FW%SWp#_B!&o)Y3hO95v8_&Wm z(Dm0b)VD;pjkq?q=kCjS-)#auYepB-uCg^~FYs-U?W@AN1}_@ zn2as+@!dS_xoac1tcibv`8{A=6F-32RxY*eN95-G{sd-QxjMhjbDl$H;GBI4-F0Yt z{V~UHaQBtDzZBj4de7Wnj$G&dN_6cdFIS=4MqHaWaQBtDzZzXkyULmSYmx2i^Qk{0 zavidmXP%d5-Zt2|9!!oV<9H|;S*#h~gJ5#;H*+}>%>H#BJc2GBo1>7$nl>K=lWW=> z4W^%U-#m^kUVVQ8T|DDFi7eI}=P59`jFVhH3uavUk)Q2&4q4o@tRM6B0o)Ja%3~7OQq%M;DKse<5pIyw1IAAU`8ABm2np?Y?lWxK{1w`f$y@ z$2l?q=g+&`^YbB-q1(^b2;%bWofgcxU=7LN^PUb&-2C~>p6`{X2b0VBJ_E8g#ZzZy zL>BiPaXx-!{F%`8MSJqD{Vt3>GxAstxf56XzHi@lzf<>~KyQP0oQ(Y>m}ARj?5B{$ z>)21DYtOOeGxjsca#;%*dkmO4%h(^Fo0~fJhhUB^m$5%W7O!J}jIKS$me1IqAj>t! z{uZo`{a*pK(aV2&-Hu{(mxHOHO|tge+Q(OoNaAD8o) z!Nlu)&w@S{Cr6p@S;4gD*zy^BHe|Wx*xkV#J9E1Py5rQjT@rmPUdCAp%)X8zpK+E( zmTQjF2ds{>F1q8?d0Y>DEMCT0AI!dvBcE|LK$dHcvn5y^XE$`msdKhF`dGY-vj>=c z9Y;Rn?1?OwajXeGYkEfcjG0MHe@1<&&z7H~i^Yef=;QAQIBxdP(#SsZ$pu>$S==#PH@)feD|WPP{PM=%m011{ zTn;z>=X0vxz~nOaiuCcB)>sm2A7tCfC9ai_#f{b4W-VG7UA&FDsNNS@%(FT^FUdaA zuVcaD^HN~(Sw225jV#ync^NRd__rLgSoLptbn)t6FLd$v*Be=^`nLwU{+WaLw)(HRsVKG7q9;9gf1Tcc19Mf{tZCaKfl+AfBS>QKl%7~0J2=uzXQSK;@?1I zvFhI-bn)un!RX@g?+|3M>ff>G`Zu`vHv}yH$;ZFrkmZ{G9SjI`^O5D6{tX3_i+>j)i&g(FLKm<8U5qXs|1Lom ztNz`9u77?O7ypKV#XtG@cO$Y~)4$fGP`P#BJfr1Yf0bJa z&U01Hxv$*PaGr&7=Dl(~;XJ?Oj9Jcj{XE6<%g<3#zt=|2`IYl#(jM*e zu{^(SNFV!s#%D6VpSud#m+$A~PUYH&%dxzt-zLcRdjy;II|VuYIkT9CN~*h^@Z(i`bzX|A^UcMRH;c-O{>W;X1nC< zI%M(W?0RJFiYI3`AdAEyyk2;x_EMS6S7#%*?WVz-#`5H_vIr|3LasDc2-@=(Q+a+h;A&Vzx-y>^RJURO}vUtte z59s1GXa7MLuQ~e>T|7Da30bV>tOMt{Ia|KuYyvRxnzISf&6!+s)(JT|lTXejLY8ah ztTUKgayButLKh!RzxXw%)y~hw@(gwqn9pi{MiJ~7Fmc-_*Nc&dFM z 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 tzo83(5Ng z&3&TgK23A)*W8zD?#nm#4SIFA8`Rw2ovK@ZzqubhZAZt19piUwwEm{sthL65+ibt* zo_p=E&$dH%*?)&^_SkmlKD!*yK`i5T^}qVs8?C*-zC#Buu-M`Y;l5+ijvgH!;HL-j zWJEU(_nusPY`e=4ZXGWZ>{=6cbR5og3)cf&k8?fA^(@!RT!Tqu?}BWUaN!7%6;51dXJ9TkjLg)gI<+=<*xl|G}K<3)roL*^w=x=s`mSW33uD~>^Qg4 z#q_rug#O0w(tC95jvjx?zN){28+-Gy|3iwsvaf1?GlOSeJ-F=e)<*Ac-?QT$^xFTu z=(<@0TV-F3QF25`%3%hwf*NLUfX|xp7zSMee~bj_vm<*wa{%p zPM55Gcw?3~e=*$!vyIr~1?$mZiPyH~rClGcv~^g-<|>#uh|O29@fyrUowmlH-C_l! zn=WiA?#|KQ0raP>bNmnVzO+@Ao4rf#(ecz6 zu1CkyMYb;ZvW>EB=I+vabo_k`$5@Y%dv?_k?Ph4~j!|jkV~c!zkxwl0X+=K0$Y&P$ z>>@8Pb@yH|$5o2FMUnf@@te&CMc%2%S1<9K&EJare35Tm?Khhziu_KIC)l8)W1c48 zX^K2;k!LLO0!8j$gX7@LiD$~^xya|&@Vdop8ny# z?B>VVf7hiSvU2#b$Li=9wAYo3MDK~-|GGQJ*pGwW(ecXwdBGjA6@i* z=*A!W`O&T2(HBMc85ezNbYG5Be`Lq4FS_GB0DVPCUe3iT4KKGUvVMIz7oLs8oD0uF z>iSF@vGlnnGXHh)Ya`gFZRH*B&5@lG*V15Q`&p#nJX0Z#vE5IdD{YTJ9tUV9j5?9^ zCl>xlWd0kY4@YtBhCd2@f}$Ud?z1WUG3b;Tp7rB*`9Bt2pZc+__S%^H@!Vbe#*y}? zAUj{l$1|a?@aLh=jJ_DF&2@S{`gPp3lZ)LY$P1NrSEDad^qbHZEBYPiOEkLc=6-aJ z$7B3GjQ&;OA4Si)cMKm#=RiKj{%Lg@B%Zg?`v67%6uq|p2HpJ={y*rBP4r$)c+sap zpS9@A%Mbg_ej9Y-&o~W2&p64&@3zR36ua$;om|>)k9-w&`q3us2P3=RVz&c&`jHF1 zBeL!FqmBDzSMIKD_lIYF>y7)vv%R`&BsOB|L%7>U+r+RB*n}m9ebEzxTw)knaMxq- z{lJaQcG?8rzt}q;!T;3Q+fEyEIf#35@qLJE!d!gcp>FK45mWEvZX0dqWmj5HP6Xq> zu2-^4RoRQwD_-@Vbz>lE}pg&%=F7O%9w6}=~~^z%4+`f)!6f1==Z|2zrq z8nc}?`nBKZk;iTNRsRK@|Hi~UF_XMP(R-thra-2@1<-38@w*`SLbO|q+0ySq=+|=B z-e;b?K3sbXBM)nAtTV}ZCGg33rLTeL>8s|pW5Mgb+Nt1m|LhFzSlCXR_}{zO>nFMF z18xq1A8pe966EeV>OQ|*ik^Pt(*81J+v`W0;8!5W-nep3 z^0O>oi&1@jj@*L2H@bLi{Cvw-Y;J38#Px5x+mT0NBWFzveh2y^;QG}j&zw7vbI^_L zU0}n2Z6ojV@ow&UKKi+ueffO!b2D|Hhp`b;f1JB*v~~Qf0k4A1#9e({?r))YbPQWQ zeqYyAP1pY})DPL-YaMvlc%>cP-jpTX}stSN}vF#$B7b7QaMKU)^)xJ@%u) zGxiy4gB7b|Jr4!vJj~pLI4K^5`;d6QfUnUE=A5 z-i~pK2CFen31*CPHO8sXjZr_^B*v+cyWT)`_0_$mrU4sRzT)Z;gCxQ(_w~f4O z`y}pJ+kWQjnsIIWnXbBPIW}U6`z+*k+-Emfjr$xh#o0JbC}JVs?X>i1+QnCp5RyE z$9CH2e<1oe#lAk%$8GFwr%mj~EB5tlG=5`mJ8fb=L9y?ozu*%#_O{c;aWtNZkgwq` zAKOWh{{nU{bs=YZ*TH1qex4k=$cLk9cT8=kP1eGe$nCYTRfE;Fur-)#L9VWaKcc%9^rKDI<2J}0exbn27<|4A0vm>I z8+mhMsdVh9ZAZuQ>OMCPLie3mVm|^sx%xZ~-dXT^E;th0Ty3XK?1vZodJZ_MvA3Nz zu|K-lch|!1b$Co;Z#!)=N5>-jSz_8Bhn~3Qf*+4;eEQKQ?e9XKr?kHtJ?-Vv{+|W+ zGm5nT4*XKuN8gSQ;btrTwnvXYx%j)F;N71mbU$N10&lO4e>PZM8~*}xZOGNN@iDq< zLqFPNZG3{>G)nDN;d+=pTGKXmCGUGIBcmlt*EE3OqkR~A3DUR_o2T4$~Xcb;vhP5fL_?CWPI z*EaUH(6cH-{XtPztYIYtloRVZqA&{e>U{2MZb@9-0X7>WOdub zMofKS?zYi3YixNi^NPL(x`3Y*4@9{R&;F3r^${Dt7oCsinm!KX@;e1D<2o2!zdpOw4?!36{hj)u$YS#PJPg^m z#f@9tpOp}kAKu9NH0~48mBXKe&Nl7BU8C|>awVqR?fa&tt)KO(k3bhoY=1=-OKdkI z+mE=hsrxe=V#abGvg65PrYqL_(Q(~{Yp?G2#bW02U?baRVOkC3{s@@1a(;KLZFIjc zuDag^N7uJMJEE@dw~<|+?hSQ6gj09_Wc|$M2Xoj(pIewr9u)Mv;d1@{>e z`$fU8!rpe;1YfM!*JsD#jlJ!(iTx7A-mwq9WMgkTZGtaV>}zdZy0N#NHnCr(*w?dQ z|Hj^S+Qfd@Vqa_Ya*e(1w2A%l#lDmA2);sNZ#!**uUPDBjb5p-x1BbzA5iRTjb6F2 zx1BbzU!~aBGtjDyz3sG#{c6R&o)1@V>}{t_?AIvv^{g|nvA3Nzv0t;;*R#!9jlJ!( ziT&EezJ6!1PGfI7ZSq;cy2#fu?(&`~{5(}(?z8p4hH=-XepawPx@%p&j?tC{_d6o@ ziZysE@Y%Vi&#lqzQ~Q0`Zu05#kI2K|v`L@FvJLuh?$#S^V!v$*w>E7DW*a&8^Y+~7 zrVF<|sQYtcV%g8TqK{9^JM+fi9Ax8mf0&e{(*)=X{m{SJ3)h0ja-o{cZ6tg)_T z_1V$IY_C2CvRM4hiL5_y`61k`tA56(z9+g^?Ds-8ZgF!__vhclqWiOO>KUUa(2qvf zr*r0ay03w8ls_??9}lGU$%J_mEYJ@=^h;0qt0{myyT(mDJ7_Px97@Lcp>yw3`M z9{LnTKOcR{qF;bMRnad*pStK5p-)rvi_xbo`X%Udm3S^i_bp=jzYKk6^d&flFvVoi z{bHIregt8eu$IQ@`cC_u)w<`y@4kcib41Qj#r!#=Hs;SEwK0EAsg3z_Ouu1#zQlab z!WTYbu4(mC7mVH=*G_ZPHr<#%C-s}3Zp@#fYGeMKRU7l?u-ceEr}Z1g&vddz&f^j@ zF7*qG?q2TKtY>-m$y-Htt&c9cYk66&_){NPbl2<&E&bf0+y8@&{sU*CK7RSg>p#fu z-M;9~r}veZPtQpYae1ziUyc}EpAR>XZ6mL3 z_$L}Zx<9Yyne1rduup$xPt5%~yuqG9x1C(t`7?W--O|pV+Y__hu%_K}=(d%s@fg?l zjIRCtfiGf>*&MVt){Mz3$esu5n7oQEp4eVP7PE%h&i65Ip!?p&@7WUXn_%K;_ZG5P z+IiM|hs$>UJdW)=cfQ-;`=NX8d=Fjhdiokj{O==+`MJ3B^dYh@=Sl7ZuF+i1gLh-} zd^#4Fefe`Z_NDK!8~gzDKKST?E|&4=X&Zc4vy<02VB*PZTx2ny#~F|D(Cy3b&C_mt zF!9c2t|mklv;D-)+)RW_R~>V5=}#Ny(Hzak+!EWz$nDrZ0TWMbpCbFb5YHO<3|ZWq zR-#(_eaz?RjX~#j@6VA^UQz$xY5B=G-XX+^o?lk?qI5Y5cMAZj7$uX^{0{PTJev^*kMSU-qHR zv|M8Lp{zgao4UCAObzcnW3VOtThFvvh-+r95lwuvBFp=8WdEk0SsFh5%4;ufKgwA@ zb0E*gW&6~kevR(=#`Wpv1apC{#a;X5!PK?$dF+~uzj?uY52?T7uycLP-{{rf0$}>n zUVrM^wf&iEa;sxwE{^Yp+mzT#C1#$=w%Mf7y=OePYQ|HWow+vU%6JY!miKJ# zcy8A4=|^6Bar;ruIPHk+8Qk{frEdLg=VhPTIA=9ReX1u1@9z+UW9;R5-hJk{4n?;9 zTLV)g_5%}ltv=e=4QuSI5wSZ0Ok6w1@o41a_XzWH6#8*o=I1?i?|5XNTgGS`d2PcV z)9~s0SadOe#;CTjZRWzCbJnl@Xs^HI=+C3e`?Ckec`AC1^Az+mxQxSl;y4pIaoR>+ z+wi9~eBwMET`X~?jrYXq&tU79AK&*~hAeg+>%y9K zIkK3~dFSQ|WXH+7IcqbBoV0Tsp60r`;aq>)z`3^No^81FeI2@eXHVUTti8B<>MHK~ zqU)}`D}N=IxG^X@-y^vDa(^4kP3U6UC_7euXL2*L<7XevvH9MDE^hwDdn>Y7*47=! z+Pk*0FYW~E#8xgf?Ji{3pI&xIcak*mzX&z zC#U<7ozt4r1L)$(=|N<%#Q!j|>&f+)wfP9LKHUGwX%v{Yav6`u8awMr+CB~@UTen_ z=#G(G{5^@RPq~cIQ^>|A=NKhN?-?W4lw;tyX>b18x;7jS@9D!eW*){@*Q;x0-LbmY z^goc@gN}RhdI8L5XU*&71~ad$(Ko=f^;z#cy^ZY4d6IjJOU$^Gou_xWzsu$M(4Px* z?fIF>dkvnm$ouGGIrn~mES9s#Katay+(%qraoLymjKR0ao`;OnF|eIB+Q;UzV&fTa z9OC&L%>KL1gxo#jxktW0mSYPL`ETp$OE9_Ghkd0M?nMm7Vr<&lf6fm-Ap8EnHIkTq zY%sal{oG)F_8zyHW@$jwT*LP8}Di3Tp3H+ zWNw`c>&7n4=M~ls*TG8YV){|ey50lXed6zfWL*yd6Zc#gyMgGgCAnZ5B0FcUS^NAI z-B&&%IUn8ryvyIz@W$lN4_tsQrj2s;#YM>auKVJW26JENYr@7OH@rmbA+>ZHWtdq>}!u7dq!=wivI z7qab~D{G;@t1|_dcGg09YoWipGbOSdTe9oQd)KMJrNwi_Xf`}-J~ z>y6QkSuSyJf~N+ecT+`pZQCFTcEr4{e7=a+Ifcl zBUmSQ_u$9|+XmTnDVMf`kj1TIk2H4MqU%%6@$`3VwnMgG=U(3Nw4d#fhml%Cs zoQ7^Kur6di_CZc9$h-{&Ywywhz_gXie%geX>wel4T`c);j%>TSpZ)-*o$<%QP>;NX0b+taS znBU!I4f%IFj8`tP?Soun+ZSCdvF(T4t~vXIX=iNmiS19wa_!g-0Fz72IRsfOHRn)e zuGE~vki`m(GRQQRw2HdGp@$Xms(+%`xiu5zl@- z2Hl^>PXEWDr>10o9S^3Rb0MGobpo=Sb5U!+iD3Txbn-kIJvAUcPXW_TpYri}DzaRB z);;Uq^(>3)j=47Ku91s_Io|H)oO5S`o0S~p%(-%X;j9aC_EovwaMm?BbCa`w&r{Zn z)6qR+^hEdN8RH7p%e&xbaB1T``}8bi*LC;rK6KaTbHK#w8RJC!<(Vb#SoFpJN#Jsh z1;f;}wynJnTQJIV7_Fmw0kw1V9MCSJ$=E_Cra?w8Sb#zQ{iaXGkLdp!OOCg-|# z?YK@{GwJs}cw@) zwyV#o>%p{hOy$kfv*iuQa^~rkXXcGya#{b6;;(0^bC08IGagvx?FlgL>_a~D_9U{L z{++kP`81e5{Jo&m>YLHUQ>$-57pt}UR&?=Nt8YUW&$_xDSwG@+uAH;fxjCs<&Zqla zd*@NkwKg-H>rKx1?Ho7TX`_Ai z@oSBZ=k#i$ZN_#6#!p}R*539x7rcoqpL4-m=wA|>c+LQCBb$?4uy>Hf{e3(8^*Lf} zK0mTw-bZ%q{h7z?s}I3C@oycB-A7>B%4J^P!(W}(_tC{NHXkC}uFmU6VA?sa@|o9v zYRlE0*MEV@C63p$!>99pdwq1?mD|GFQLq2hQjV#xW;~Ox!)ay5q z#p+q~Ep+3ROC9)_Si66>vb)ZIik^CxoW1}PcWi@wg)Clc?+^GjPh*xh=Dy6+kKl5~ z4Ar#8?K9+$VCE^8_5BmFcs)b@7aQ@^ zrP1hOwJ!OKg5tFSje#A51lOfmno*Z2)^F0M}yPix5rk%OVXTGOGmTS-V z)L?R{C(|Q~rJl@yES7pQBeGax7){KMQ$62zpo?c8kA?0&7SEm?8(Cj+!FnKzxA(F8 z+4{lbpkr?8gZtf@qP=@OwPkiVYqy-^8P2(%5!~7>=Q@zfGi_Y_$eWY4<2QQ!IgSay z#H}wmw|Y-p{b=vm*|W4UCT7>?tmvMd<&3d%eb7BS%h^ZeW&!u?EN6^zS&P?Dv-Dd( z6X`?F;{L9G?D~R<`!^%9-e*S__w$WW&ADt2bo-Ob-t31gu5IS~hNfSi1MxQ>ym;+* zelYRc??UL}wcmx&9Rs=ayC|}_wvP9&__m(=xvkHv_qqG>ndR>&jX)REMme$Gg6wCy zem|91Z$(w*gKXY4j&;Gb zGY=?(e;&?cdRDFBiM# zke!2?#|sTs^LP%PYwGt9iVNE?)C^4c+!~Y5NAUZEGHHqKnr&-a@y% zTyooj{LRn5*VEa|$5vqC?(fu)tJRW**^Up&ApM+r{7ELi!N6C^b9i;OwK-gav7uc`xkrX z-x#(36S!RL*Jo^u{Qxk1$=A4z%{}e-9gJ*D{=KoRk3-PKvvvi^u0N$YO1u$AZbVeI5^HoR>i)_7l*> zYwRbYi>IHHkj2{loD3$Helpglfti$8x>D3?CIMYg?M z`uGl6ygv88M;G_poM+>|(TztgZGS@6pMOg&weZj6E}mL=1-e*j;g!f@^4vOp!B*d$ zjFq*%KSzNBtLF{3vYHM(Tj#u|X5Wll zYxb?^`pZ7Q4P6^?ecr>}S8Dd{=wkX+PR+g(*|zRcYxZ5pVs($YuI~nubC0HG8@K-S zYoDXI`%2Be7hOyn<XWu>orZ0Kt zEpZ#0^KBh@4B41!&3+tRJZt9(WU)@-NxP@eZCC5w)9B)(^pD%*RwSB$}W}LNVzk)7aV}BK0JpH_eEY|MlbuhW~ld*ma%)E>v zwf1df@zmOPk;NR()a>_=#pCBgWPR9A{CtEg9zXv=7OQ?fMi-BtPmuL3UgzF5keYos z`^fd}zHqI$R&D3{aLxL+My6oD`nO6_b7w%eov#tBA{~v4uZk?!?t5J@`_A}og>FA}Zns7k zul@WH-M024pMJJMmTUL3Gg$3se{}n)^Y|xp@!HP;=(e>V`Sf!jvRu2LPO#d~sp$4o z=j=3e@!HSn=(e>V`Sf!JvRwMHCip(pXO!CZlFO=1E^@(EM;14C z>sNo;Oo$)zGgf(H?MrMEfy)^u)R(It?tz(=qSr=J5xs3OE$l}g{d68bn z`sm`F&AD;|WHHAwF>g&BGcJD)FERfSEHTR`=53JW+A$9TlS_QtA&b@cwnrDQ@eM{7 zPkcKdi`Dq{MmIjkAo1-3miXio-@eFl?f8a*$tAx1k;Q6!e?k|p@g0CJp7;(#7OU|c zg>HPdOMFLzB|iDYcMP&zJHBJV6 zKJ+X!3SF$m_b9q}jqfpZ@x=EyvRIApMReoyJC4Nn5?JDsPkb*U%eCWs1xzmE_ZqTT zjqi1I@fzP7=;Dd*O=L0StIrvqH@;uACLKJq`|Rd<)OzGIDBMnPKhR#zT2Q%7;Ck)b z&AAUNw#M^Eo2tSory|&s;w@PHo=;InUhG`4$9ws*1U4Wc+a))yb=CYl4*P451N9452*zFDG z*j<9JJQw$E>|D388w#eaT=vX7b_mjM?qT88i8e*&WDo?J>I(OfE6sg=|0n zYs~J3bIi2MnB9Xcp0T(WS-;{Lv%evW*D<>fUA&Ij{pjL#%pO1&&zL=kELO+t33S)q zd1cI=0u!%e_B6Ulw*D?DL-7%BP zn0zI9k zE?&p%OLXx%W?!L;XUx7v7OP|SGrD7T0b`b&M}z%dJ?h{&B$u4WLbv_@%6V*fbJi|7 z_dpg;&OMR!E1sOkK^Ct$kBcr|a~=;}yyiSUx_EM)09mZ&JO#QrUr5gBb1E?Lx=yA> zcb&*(olJwAbt0cJn-*EFy-ubBlgpS*k8D5xYs_YVbIi2Mn9YbRo-vyVS-;|me`aLy zI%cz=i`OyhjV@lttPi?)#;h;0SRJ!@&>b`XE?N4V4@|s{+5G5^nOw$f0pyICe8y}+ zWV!a3Ed(Z)FbcA_ znCCHVJcAv9>==6HOKwM^i$6-c#C23-=jT;9gPjECS(Q$oddZ{A(kN|G#lX7yp0bioPz_{~K5I z^|;22EAskWbuG?7oi?}n8O)4e$y+{o&x9=3&UH{ucbLxvOUUQliUA*Qr z8@hPSX?Aq+oE8O>`@Ni&0GF>hEr~8(b6N^r zyymntx_HfL8FcaF)E`-_=Cm5RIq56wb9J!fB%hqtK$dIgG!RVg_i|brT)yVC4!U^F zX)S~sJv6|Dd=;l;EhdK@{ImsudFDCg=?rACn$yMT=2Snsx&$ma$tR~vk>%PsT?Qui zdpTVJE?;xH5?#FJbQQXI&FN}%@tV^$=;F!gT4XVEs?SKDmHA9-IG+{yzT3|(HsJ2_ zGu)nV57J(44(^rP3hvd0vldluEx4~6&OKeZW#K$m>(jkaxdq`oKgzkrDmOcv=Oj7j zs&X^Jc^;56XF2orGak$gJ|uj^wlx_Dh5JD`i#^|2$m zc-F^G$YOQPAH5f2NKExve+*dimQUWtBFnY&J`PN-=AE2Q1edQlorEr4b2=GayykQY zx_Hg$RCMv=bQ-c)&FKPkbE?n!3&E0;d~&)7S+1Sa#b9#3m(yk7@-?T+(Zy>{e?}Lt zIbDG+UURwp65sMob-9`^WWObr!h8_+Y;R8y_~hEa%+P7yq9xNSFS&}&wDxdM&%X&_jxbp8mruF;6Cr=oU6*s z0Pgc%&Yb1UH{V}*PfiD6cQBXV@0oiYiyhJZK2OfvE4MMa-{;Ahd*xO^_xn6KbFbVI z=zgCkXYQ4o2i@=U*T-rW_ zY{{sOX?aVGY8*(0{A^D`fqc=a_ux_EpofGk#hErqTxpTUW1X)y8X zYZ-L$`09@=R(-9Ct}mYx@wFP5c=fe9x_Er8fh<;iZHTU~PUbkiHUbl`zBWb|kFQOT z#j3Au(Dk(s6Bu8Ez{IPsZPCT!Ydd7I>T7p&efe(<#n&ES;?>s>bn*Dw6IrbKIuKo7 z{yUWMbr6_%^>r}1czhj#ET*rz|E&Y5g$GhQtcTV|*O0X#+z#N@Lpj$()`>!F-;P`SCmt%q`sY2|u@TMy+NqsmPSZatJU=Wy1-PpK!?Lpk@A zoMZ7LcWdG6-2MLk96uQ5<@f&n&Bfm6cVORDFS(~~-Gyu&bWf$e-2>+Odwh!D?Cu5A zRxWn;A=~cBVs}57wsNUS7tnXDNf)AvJ(TyV$hLD{QwJ{r)6SZ7G56G@OOfSRhFw?c z;ALQP<~|E|U*_)LT>KT^4{@2h_vAhj+1%^jTpR@^Zti)%aTWe@K9bM*=xT5|VI{s88gs>b*um@&#F#-EVIYm7gm>r*Z<{s-B9jZr=^ z{(>x*7_F7o2Wx?KA@eaBIkh13HWqg6Jvug+wsP4|?;+Ry^gg;+*2#y+wyXQ;BXsSI zS3djcpU85?>y`TUFEF{p`YGv~^k0%u*2v#-jX1ZQ27GdDT=_dI3I z=*`_T#%bJrdB(Vc^VJaaK8=m{?9*A1UDx$*F3t`nUe6fQ6JwrP@{UDc{LcU`=U6aI zW9q?-U~!eb(f;5}3Kyzqz;yn0Ouc)zHQ3xGzB884vl4$AaK;?eSO$OwM)f+Hsw@W)jO< z$nABp4p@6#tOq7;EE(JN(H&d4_}c(kpK^H~EJpvv?Alxf`^C}4QWuv*wq1QzEd{2X zV=8Z+em1f+vYdH(<(avRwp>~N8{@D3&Baa8wW)t|aWgRO>_a~DwmGs~<}Gn<0j7`o zHy2kx7f-ET5nZg->Xp#NYpouDE}mMwGO~We>s&c!sdHyChR&z^TzltH&b4*|oa;@_ z_~kPG>tkETe*<)}9{)|j(wp>rvxt-B{S?A<-;M$JM_3J&c4@R~=K1w^s&34*opMAVjW8*o!+Gv}x zJ(ls)m%g>Pea`B;BFpDoup9c9#3r6I!0yQABo}NCWbyp1HlHKL=JO-_WiMpM-p`Y= zul51!#J_bgcKd>9E0=lQlm699aU6s$mN*VUwq1?mP;~8#Lq2gFhAh{P<8Uy!)azZ5#p+pfH+18bOC8vs zSnJPV+8B@R z35 zor0_%@yz#y$aTIiLKn+?UxM7OCzpb0XYTTu@5_+o+Vg!mm|W_~RmftgCs!kjrJh`a zES4BfBxc8{p6^cr6VExbvlb66MdcWa9F?(x)? z)8VY$a*k&>=l(cwYqy;1KrYX;Gmz!YN!zm;z5dO`v%$ozYdN=iPh4lw-m|l3X=6;x zs2!)OH=Hq6?qqb&&bG6U%AE-A*;&pQ<+2uUCO>&Uqj0W#uW}2Rcx>)Kwr@WZ$-jAZ zCz!bZ=8^UPK4f3kf4O_O?&7k3dN*Hf)a4Fq`uZEP{Z(E&$HQ38qhEP_XlvW7nUnVH zj=dAR#CkHAc+KY&bn&!16*>8&-DzT6HOJG@#gpUN$iB=`?o6&TxXj7BIcTFUmmJSR zHipV;mmJS&cztMV+r)YWvh(BboF~>R!NhBhSD}li-POqEXx&e{Yrw>7j@P1#C&wF+ zlcU`AT-R}#lXr8_MqMsB-hgZjmDesg{-xpdp{;Eb>pjTkc+S4R#d1CSG%V09`yejzmt5au0Dm$YoC6%|RP=x#ajTvN2R%yX5#t!|Ov^+h**a zNAB9AWuLtOCZ2p=L^dDK@@e-Hn0U?SWpwf6^Ez_!k$aWv6)xlVZoJy4%O#)Jkd2}8 z+9jVi8eSjT+BUI%jBGx2?|lL$Ugzvnbn&$N4A~t0S(N1XIhc6O@e6eEq{guD_{t4u9jM%5 z;C>frJNH!O<^uP-NIBPH_NLSQHW%kJk3G=e;`!>>d(YYW9pr(Nb$|Ymv+jFfK3nR0p7+7DmCM<43w+kI z=a%SVSw~wV+pfOX_#>Eho;~Gr_S^#PA6@8+ZM?x1WNEyQebFpP@U> za+#0Mk;UC-dC&U=x_HjOUn1M5c-no9Y~K2d|8K$CpB;S%rmbAs{u^1mzP~yQ|9O8U z@0j%^*Tcc(95cEab3PshCYQedLmQvn`pmfe0_M2LrLO#nEbh3BY(D?{FS@wjTjjma zXmtCKOWU!~^|w61NYgmA@ySbu}EUuB)Ta#S;55$hNEN z>R5E`Tvzg0SH~gCwb#}0U~-9L0%YU3y2NoZSdHTpbg{&78nW$b9H*meXB_g0;|yfE zb{uDd$t8|Skd5P}634kh4i(PMI<9oW;^+DHGF7L^2Ko(Dpx)E6{ z@5%pyESB%|=Rmf;*LpE0n7Ul%q#yD)TyohfHzU_MxdmM;`QC+wiDO=5*M`3@nHn=cnDN%<)B<4I$|cu@kgY@7#^1tV+RFKvP=C0;A)A*m z${S-}YTSLua>fWXrsmxbCYQNd9C<@xw00-PCBUq~av7f`k!>rNw*8UKqqbcZ%yXt( z+Afc5E{<*bSOLshE0_FMM7F(L+OCA`xXPv90m$O@xwJC6VvH*yx_IwC~Yyo)a#F^Vu!uScT&w zn~n?Me8$Nck6b=C9hVi`5vGK{p1u#IP)~c#UB-bYrl_CWh6)#1q3B$YM2yf#~9iVNGPQ8pB%X z#vqp%)Hoz440H~*c?neG5i5ptj4efx_DyP5?QRquob#7$R&n9B8%4;c1G`t zp^U>WVB(2kS7fmo!*1x}iD7qSu^Pi3=*A$I81_UKuQ42mZVZ=}aX1J}JTV-MELLMU z1YJBa9EvPfV>k@m7~~SeFl2FKsP89zUzzvTe;P_n;`05rdpUIvv15C1-(SnkfS<~3 z0Pg#1xp`aMO5nb~mRq*PEeh`YYdP0S_1O>H_t$dHVdZ89_x-h;V_UhY!F_)%XU^fQ z&mU8>e19!x&6IO2RzU9h%!0e`t+$>LV_tq%`~VN3HPBa_zT3vTHmet#cd(fVeWk|6 zyEYRRn>#Qkn6&&RbI%bw0Te)D{Ba1t3Iny3Y3^_x|=L~fSxSV<7c1*oL6ihBP<_Ki5T4OrV z#ZzOBL>AK~f3JTh`V!9>WM_28L_GQLhV0+Mt@-Z`=KRWKtqnnT4b-#op6KE}tCIg- z=(d*&whywniw-W9D3YMmZf_Kl)TZ16><&eV)hNm-S#r z2J}pHG5sogj`QD3IUCuw&W(S2{~Tm7*Pxekvn77c1(S1bJjYpsj9Y*Dwa+WK`?62} zy_ECO#k5hjPyfA?3z5^OKT~`$x>)VgeRT<#oPGA>GDht$EB5XmW7Pg~aJks8&)94U z{%0_K$=A4z&G~fvu0l4Z`nUJ5Mi<(OT|DvLfGpO|??y1W z#GAPs0cQL9xA*^wE*_sZBa5|t-U24q_IVqaan`@Re>=K(jr|UE@$_>ivRJ#HyTIhq zPsaLQF!M4F>yTsnH)L^Zhx+}gQ2(@%VWR zS>NJy?p?e2+xwTWuUy~m3)hNk)po9r?AiU-@Uk z-$E9v^SdQ}-UgF%ezV_=TYvhs&riAg%6@+rT}&J0?DzMP)2I9QLv*p)r~CIKFuAO$ ztigX3`?}vh2A7L{=KK>deaSoLiQCw+Z$C#irn=w1Ko`$`{}NfOli1SkYjoSyJ@XB^ zc;fvQS*)GkcVKdfH*@&|nC8ma_W(C9Ixe!9o?q*si)o{r=hp_v>C@-eM(AR- zPuIZ4U~=}!kdCRTn-=@}{Mrm$F7~Nmn}g{~-Wry;jV;fiEs>3>KEJj?7tcE18d4XJ&?uP{R{z?eK>L>7;qgOSCmpF_~a7_3gfJt+-Zg=lV#EAHiPJ&R1&A z&0ylzs_ge$ki~0_zYX2Cl#nrP?*J38ZSO=Ex2^l>S!7@Cr_o?{p^Lenlv7XcLALJr zIZEoq>BL^^)xDc$y zaS^&$;_!_m%i^OR&ncd=I=pd zaqD&V{X^*D_1_YI7+u_dFF5^I5m<5B3Y3Ayz97_xn6mwq2d7q9(3fi7PAeG*-~ z_WKmNcpttoyPx%1U;oUS)W*G_y=yAm<#5I=XAW{XPh15iU(XZQfQi4) zI?Y+>T6A&k()LDl`>kzn0u!%oN1%(h&mx{ljM2|>AHmPg=$=KF;;Om*4X!tsoW3e| z8{BjaXN+==k)N@;xBP51bN?E0`@HiO*iiDU=bg8~JnzV5?Z1m$pV{xDYnM9z0kSsY zc{YBCES~!N5wcjj{{9n8&b>e=W6oF~gBf!@V|{`yu8(@g`V>qqYw&Yq{nmfy^H#=3 zJZGTW(8Y2Fx*b_8Yx}FlhkGyQsJr3CPw$7vHs=p(P)p_(>^$##P=P~Ch_ddGq>e=K2bn(RdA+lIIzmLG=5^v`6V=&v-bJZv4;_>+@vRK>aXJB$| zpI?9(XFXSai7sAa{|a3^{d|oq*6!yUFuC-TvHl*+yo@8~p?@QbyZ0RHACbiz&pe}l zLKcsoUy$`-Kk@S`vUvQAMi#4nI#`q9@iP{>zQya@y9RQux`I0E`gUKqR$QyLbA9Ao z^&j?{cD_AUC+AuD%wIS3nAC%+#=|nSF(;5Mb}0= z&y&TF#nb;1$olr@(9-{s=$-T_m-W6hvTa@O^*OSP7*~6}FAFB8uk^JXvbev)5Wg#+ z$L}bd^9f&So{jP-`zm7%x zt_?01zayA8KOb8c%<=X8lh6Hak$qXG2vVFTpv!*secMM%;Bb#-x zF}ir&kDH*|UM_7nLpC4ng8c#Av8(>JKo_t6wnVqRocqEYjMvx`?;nw!+lhPrh7Ce@ zUc_oU+h^}z#eUPjxofY_a96^ai=6&zf7_!w=Ji}V9`!>!XVUS}#d0Q{09hCPf!ZKa(MgrJvogHP7_32f8-m+24C2yLT66 ztg;XH2J^eKS_k$4(^f8Rha!txOI%}{;M-Tu$TOfjU*1zYWSGjbnvG5sp%j65r{ZQb9Vk!M2|tItW#$g_jVxnFWdHg5gt*FG2G?ki{HInl+m zQBF;p3pssyMxF;O=;DcYDP*yBeoKSNCEm>CvS7Ba=b7cu#p82% zWU;o-6~N@$K34)W&U!{3fG%ERUm3j%XFWJKtDuXu`&kuCF8ySz*U*;BIC8cfh%D|N zb*$Gy7IQpvMqV3PJbudb!QKBF>RDnclJb1pRVn_(Zyl6UPT zZevURI1t&GYTY>qT|DdTU}UjQVoSS2(QQ}v?qTTSiT7}1v37pLz~mBd=JH4|+t<1? z99=vVCH2UsTZdr zi>F?kjx6SQrtX}9EFM2+BkRL{;^!P>@%T9pS*-dwA6-0tEn ziPt{PMi;MroP#c2`#2BXx+Q1ssZZW>R=l77w6P9r-#sqfpNZcAXN+>jE2p0ekloYX z^ZxQBY<-W}2h4L?`tW@CFu3nA<#sBZd;A`7-($)dOWMiZg6?}vIb)Ht{|RU8?*Bsc z?9Gdj+wU(g1rx77$9s8$ea6DgJYE4NUf*+G)!5bdm)C&lvy<4;?{(<5_kCyT`}OGB z%B7DRk@e~P#O^QX+R6nRf$Z~QW1bfycy{_;=w>i&?bkZ{5V9}ptlT|Zw{STp-s9_b zWc_uw?S4Oe2fDbv+~fWp*yYTt&ldN%yzkBW!v7guj-l#+8naig0Fz5@chg49+?*fd zGZy1YEcYQNmh^iqZPKrN`n?WZuHEnTU~<`O57I`=_jTe-wOf_@Xbd}9AAxLiB-o5AEVW>3+^enw%Kwe&Q)>qstk z&mh}YE_pwTEM7l*_y@XYAlGN&ejZue^%?9%WOE+QnB{D7KmN_d=kqG~cmQ22F+7B9 zJD;`Y@4p}LFqn3(8F};f=R`&#%bCAd>iZ*La_ZVWjx1(vAB_G4vRK{=K8Y+gl09H8 zc#ZzeyVkeY(Vbs8{qXAw9d96uchXM%O=L0uZc%<#`z>_wysvy4+5W^cPVXT*PVQOv zT(4Ph#w%yEm#}w@d(Sw&g6ue&;{bAc4P8I_RDT^^8*zQU%iUMbXm6m4=~p>tw6~CL z>)89=@NHzV`b_qW_70ewN)3Ibn(Rd9kN(Ezwg215^v`6M=;yhGult+;_>-2vRK>af57D0K7R!>&U!}s zFS>Y*eKfjw`srYf#oGOh<(lP6KN;(uVCH2UIa`ebChndez*-#-S zvL5~gre5pf$6(sZrR}H4;@R(;5%1aWy^-sF?~AUVtdUvKwGnsk&BfhU z_WNw;V)|9iexC!`w$88neNJStI=}AseqeIWZ}z)!>rcP-xhQvE+3$0si)o{r{XQ>p z`gH%!k1kgGbiXeECYLppHMmf*uls#raJkrL&KCjGm%MYHxQ#9Qc5!55s{4Hjbn(pZ zlE`A6#FlnTquZ|TnPt$$6K{XyE{wHdjy}K4Z&`4;#GAQX0nGMwzpscc9-k{Ai?zpW zfHquhpR0fwXWj3sqKntqS3?(1KdU2)wfk8EOfLOotk(iFFXPBQT^m_E`*dAoF~>9e zeLZCH_}LIyANCVJ8zGCw&nC!X)z7Br;_!q@BDoOChpnW^&s{wviSU*0n+w+bZd&QwEY20+;daf{)jAI-)sGZE7vjBY=2!L}w=@%r;U+klDRN-X)=ph4*3+9keUX=iRM%`x$H@V-a9<~A0Xc+IT` zy1CW10+X-DfKf9FoZr=0W@kL_w z{o@7X_7>@MuY>NNYkCOW_m6U()51BgcZ2)>QOifyw=-SFzD|~OaJ9+zzvR26Feaar-a@GphN%s5@FuBAy8*Pkn-12_m zV0eA{?C|}?J#89)%OdBgK1|R@_D~73|Y=Nyb{L|U~=ldUpNX`%(~{SMxm= zOgrEC=^56O2SF!AKOFtY8$lkcL) z=IiIvS%Zs%d1i9G#%>8@ZRLV3g)Htm^sMm_zJ2A)bUnIz&3n#FHzGTh<~e{qZbH|O zKGjE{Ya_1D+qwJ7ndz_SV)|9induf}+q&*OGu?_TR-chu;^#InImbU|Cgawhe(m!? z?!Iznx&vKI8|9pt?m|wVo|*1J7pr|*r|t!lv(KJfd5+&#?CY87esH`_^XTF=_7~8_)6a{@V(orj0+UNW8S7WU%*!}( z)_DzC+&wpdwfY9KnB$qc^(L}-{Jev#5BrIqcag>8=Y3?c>gNM=@%Z@=S>NJy?p*^p zGyR2q<@$DCxK>=NwsU>tT(K;BO*>zy9V>u|`+Q0LToGBko+}2R+m_VFv|SZUytZ8p zUEH?ynd`GR&-@qg<8$A0fOV-mkM3vwgWx{*<*d=++)H0E?f);bSZe=hWUh+Y!wsn76ucty5tNU|H z{7eld=Xj-F8@K-SYoC3&`%1l@7F|pm<<#rxk<+L3dPa1y+NW!5CNMesto3@9VqfcZ zZ*aNTXV3Nl)0e#KFmW4O>h5gF##HO|?C9c|%Q=w6I*BLk`k~vd*1WmU#Z&X}#n4`%yXuNOcUkIw~>#o9g>0+Va|Tm;NGYrS3+UA)G=7`k}+SsYoc-OmzW za_J{yy)>A48As~uGRWeov&$ljIiA^j%OQ)$&x*+Uu%Gx@30XXTRz?=9epW#jkDpbM z^(|iK-ZhYVeG|3H_3gfJt+-Zg=lV#!-h#cRov&b9HJEj{);H^1>g)5gvBp|+-@>lD z-|qVQ0Jt?)u7ke9x%Te_x5moZPvu5{TVv&nOKxQI9(yfh`TBQL)&>*L-%VKuSxlR> z+W_4@Yr74>#M5pgWHD`0cV8aT-Jg3RzFq+nufASI7mu&kkj1L6x6qBD`g$8oy!v_v zT|B{jkFW2M#j3B- z=*H#WTT5JgA<`jUeT@Ys9$#Z4i&bCaq8nHBH6ECF^))`aczjKOET)a?Hh*WzyX)5P zYxWx27ux8xkl%B=|Q-`$ckpUN!)?%&;#bDdRg zPH_M3mYj24xtYWp&hf6?RN(&IE!&xMIKK=3m2q=F%DG1?_b+t+CYPLhRL**j+OZk2 zIW~P6JL{5rb#pNB*ldC97*(4s!NfD?TOo_}!%sfT*&1D6a`CkdvSV6(4FVI7uWgaV z>hBhAhps=l_!^At98_OBfQiS~j>uxJjl{JRy8h(iYd2))toqs=OguJ2ke$0~vnQB% z`r8Xxtd7Ip==ze2uYHl7>*{MLn0S2chb&gdVSjY}$;Hp(E^_&Nw#td7IM z==zg$-~2jR_u0m~&l1&h9XFPNOUUyLtbj-&r3^`U)uf5v6*-V^I8$mTvfHo;Z{6E}CyVSau% zCw`6JSmccbsG}eMlQR~mG3Tkdz~tg{P1@K`{Wq!C2J>eX>KLyBrmbAsu7@n{7$=_j z@tt_&6VC$Ra_x8)1e42rEQ?&{V>xs&-y`_%9`At9`tKg^gzotIy9}Mp-0ueF8gZVp zZ+AyFce$*~J&?ugzbQNf{r~7X4|qGL?EMEx5S<8PwCF9mL82vUMkk_2jS^)fdgp4< z24VExJ2RM3#t#vZ=tS>5MvdNr|M%;jCzkgg=ks~f<5k z+LVirhax+!KFY_(!;t0TqxI=xbl00}FLQY$a@Je+(9vMcbXY$tTF z?4g0k_N#kn7ckrDue|>HIr6T^a{B9)J+vE`T>RY%S)1;DOS zHhT73*4{Z_wljzFS$pRq%bCNvKh6WI|0nPT=-D5!d7*8%v?(8(7a_~VW?j#&YoAlQ zb>QcYI0LOM)>Pwit%th~&V3=Ly~unS%yQ3Mf^Hq30o|8%{7TNSPv`E? z;ZiQ!c(=`~+e8#yJT&_9J zbzpMY19#CUXLjo3-C%7Uc+bl{d+r`&`^sfs{1;ig{(rppq8p2x>&pL+_y3U1x4Dql z$3DpSA-qXn1luMnuo$+g(x&vJ-HR(Ud_Nz7YPB7b< zQ+eaGmfwXeXPjQC<#&V0W&J;ky^fuKo6G0XZBze0-WR}Z=NR&tw-=G+GH>zoWiV~j z|Bv@Rbn(>5`_aW}oqPaYyw=I#=;Eo94tgXZEpWnU&v#ngl`V4z@ta0dK z$>A5s_N#OKC7A7;2l>qPSIBbBx&9hVF8+?S9X4Hy@#A~2>cd*;XPM@JB?32!5a;aT5)*t)JWe-fE5ia{%yRr^Cg8fKaeMl}lff=V< zYG-F;@%l_L752rmSEfc6a}La*&lJ<3i`Ts}ExLI2%5=!u5zl&Kd7LV_#2ypCvBF zu6|U%u0{7*LQXrCyBgeQ2|4|cOTO=5KD6u4K4h+X5SMuUI|Yk_iTm?EX}1)*xbJuJ z^GQpiJDyzD-?GT!w$0q%)f)F<`o`Xh@Zxpco?zm2+?CPA>$t0+n*+IwyBe~%ZOv&H z;E9>Uv!hT`az?jcmVKpVk4hoqJV2^{Fqi+@$2d zD{J+yU~;kfnD)>Yq<{R_9KHIn1-e*be7e==So(}$&HEfYriJ;t@M-rfn0S3wdJf(G za_Rd5vOe60z4Uz%OuQd+mp%Rxy8Y$S_Z4LOKGX5HzORCbZ&~`jhHihkjPVAt@z*%s zYGE~wx530~9PgmpUoO79hpfFC$NT8wHIA|9_LocF{~_DA#_=J#c#Y#DboAN?&Hf!H~z{G3c!RX?)tNYD8m9_LdeDgE87h9M)_V1ha zWvwiD05yJcY86)(F8Awt^Fi=(zsfI){wjUluikC5NNKYs{W_z+)@tM3Hl0cvKR^6n zUOoqHwefD7v0xeNZrY4Mf1}mLyKNpUZN}1OAo`oFHr{Qsb7`{^2VyVuw_0tyAKTg+ z?;x9pHU_od%%$H2^!ps{T`ptwo_=GItwZKDb>jnM>yTXb>z2e^_v=>ZV(Ie9E5CN{n8J4+iBx??y=$j32+#?m~E7`aR~Sk$W0rz zvmWT%DJ{N!AAKsAc>EvM((8BQXM%~R%{j=9Q@`sz7hSyCJ`Y{I#$;@nk7>!jxoac1 ztcmHt{2s8bi5b9bE0@|f6LNEYyMozPuFkLXoac}|IA>i4u0z}Fk2(I1yRXdsz3ArG zd*=Q=OgB8!>NSEwZ-7>)g8r@-rfPvX5Nf?hDt7Yt??P57+F+oFj9wUq9lWpAT6O z-G07qB`(k2#lfr#){y+Y@g=~-&7aTg`CfTRFu9!XOCxJjJauLnWO2_C=c5zPT+5>C zi}vJQ`@WA`4p}bq5x?i&yWQ{9y&mXow0E40y*QX-%Vq2(kj3lROQLJfvE?)NQpj@6 zv3r7>bekS&BOLj$n>0 zm$7$37O!LPjIKS$me1G&k>#3W?+sSh%3yTY3f(8<{4g-_I^Tz*i`TJ_K-ZpQ%V+E( zk>#3W4+V4V%bDYb;>NvNeJ5HU)f1-=masGvF zU&oQpIJY6oHOKicSRLmPbjPW4_9(h|9p^E0`#O$%#(5lBF5_4eeAe`g@)Z1ApWHHa`_QHbS*-eZ5xRKw?_zZE_;(4iSoQA)bn|8o;@^#6@lQVf-GnUH^zUXcx%hW0vRL)+ zpXlP%zki{N$G_W<#j1bzq3fUh;@|yX@lQVfJ%B9N^lvzrT>KlM%vJq+2wlATHxgYu z{ymH=R{a};u77^75&xbAi+}R*?>S_-rhm_a$;H1Hk;STiFQJQ9|6WEHkAJTqi&g)| zqU+z$#lH{0;-7r{`yaAg)4vbFa}`Zp=Mc>J3TS*-du9lHMcSzP9Kda(E>AOB`R zmTUSqBbZ$L>xwK^{hJwGy!zJ-T|EBHf-I(gwVqqoeeY!r`f|VaXC$BdtVh=RaBsjZ zMSnSKLFFEY^BF_VeOS4B;d};=a}QMR7C6snIoDt1u7LAgm2>VZcOIN)p`3ZI+!=75 zUvkDQXS{x%;`!z0D5>AOBIo?dd9whu+xhX?a1C;`Ai7wdU-zPq{l4Ne8Q;$hNA~6W zIl1e&_U3Xd@9DP>vi%;!rv0u(PCvO*xCV3C&%5*H`?Y zj&9E6lCvq0lQa3`Y)WLgX3n~R$t7n~Av?|=8|(TL@je=4@f~U-7ax7XcGb z&K5-$t2tX1-JD%O&Jy#AU=yoHJ;CJ?b1!83|53~tq8k@w!enM0cIYWu0tpQ@5USrw@UA)G$ExLG(X#l!-V%iQ_tj075-I(fUAbWr% zCi%p)C$d~KroF)ACKl5^;PN%5!RX>OrXlF!HKu*h#cNFap^GP`{gK6LOh=&`leV%x zj|NLj@`sldI(HzVlj;Zm#;C6Mi;L!J%TP?V|o-_yvFnxx_DxG z99gW!^dh=3)z5)m0!vKtiRoozxn@kSfXPiPrq{vcYfNvTi`SUmL>I3yy@f7bV|p81 zJTbk4EM`pgjP$I`=R@Q9+{O3Zes*E)_xubu7Vby-%WcQKa?ir~K1$A7RJjM?e7_*) zp03>Oa6VVdxi>0z4V=%9a;~w;T?prMlALo@xijH>9*{F;Ipg&+9-j&PY-f1uncxOw zp9$)B8aK5tzrV;?|8FqQf4S7soybq-UOscbGq_xH?gxU&IrqDAuV?+9=wkYlvwkmh z@tli$BWpuEXZ_!h#q0VQj4oc+#}IV!x<2+r7ti|G4_U0P`TO@^Z{t%v>mLA1-13Qg zII>(b?gzo-YTSuwB)EKy>0xy78q+9r@fy=;bnzO~Bk1CZ=}}~{8q;&=##GPx=fM(_ zd}4Y5S*{t=i(qmSi|G|``5M!!=;Ae|*U-glOs}Jh*O=Zw7f(!YB8%0SK14SrZDoCa z1eTcO6Vu1Ya?O}N0h60pOyj`iYfPV`i`SUGKo_queTgn!WBLkRJTZNZELLOs1>KnH zS>J*EoS5Vj(&6p+ylbcvfoovrlW9p19USpaZUA)FL1-f{RX-ahQ#MA{@tj5$8 z-I(fGKQmZjl21(CkmZ^&%>pJjv6yB9m#;DX8C|@_G&{O@jcE>a@fy>d=;DcKE@ZJ9 z)57S+RL}ZFz!H;uVpK;x(qF(8X&^OQVa|n3h2oPfW`q zi`AG`K{uv))~^bdnB)`FYRGcUn0kZBO)RE0z~yU9Yod$SnASoUuQ9ESE?#3=2VFcd z^+gslrh4{y2If5fk#o}X-t*tu@3|Q6eQ?ivIcsR;#(;a?%UO#mHyqsa{?})U26r2{ z=e?YJqxQQR-1A<}HCDL`z&-EfoU6(W1NXd_GiEvC&G$s!6Vn&8`;yD=%8b3{;&pVt z8ib{bJ6{7OwQOVcRIS? zjma6iobit3?z7DZ?!#NpHV-5Fz1aB4SU)Xn6qr8?ESG1S(a1jA$OU^8S==)+&l-=T zYtKCqdr!35$ffU-$o7}Z_i+cYzT7+cKJH+2vG{r@vi)4Io?q*6KMc%ve#a&6e)ISA z4o8-Azj@{7I*tI7%a|u4*D+5)7fU>EFrIzfTlo&^O)&B7qqmU7^ees&WL?{@=4KZ# z@oH;Vbn)2Q4Oy((8iKAZ&$#%tFPM0>wI8~8Z0(OMR&5=Lt}W|uY#jwAUTqzXE*@KL z$YRyjDd^g2BfqhADwue+^>=jf*g6eatlBycU0Xw#tk^mqOuX8<09`z`E<_fqwys9k z)^^3#HDKb^*0t#3v2`7?ShaN&GAA@^mt*TAhea;}NWJqm8Uk#mkKcMrJrM$S2_+)d!t8#(8oa+iTyZ{*Br<<0@O z-pHAw%AE#oy^%9!Ipgg#Uwf_j0NwAvuUvpd!prZ@{rf13p^qT1zt$t}sS6{KtuyYM z)Q?eMuCe-a=%c}GE0=bUBHPd3e~7)uz-%j*J%24@*FAq7y4di%-$S;abC)`EBbe>1 zGdFNgow*5Fj-~dyI&(9aoUt#;-IuZZ_ffi_KZ$)~_a0xLMmF~P_ff`xi5q*K*>9tN zo-yR}jBz`-oW9`Zgqn8;m|Vtrp*2qZ`zSAgSzl_7Uk08F>EN+hD&)wLLKl1VC z9&ov)KmP@j%Y2MRuJiE-x|rvHe;?%wY}UVz@)f%I^%=?~#pN zE_?R}Wbys!o8L?N5nY>d#^lf7k4JV~=Ud*G9OoxwIb-U`6(4^FtA8J*1LNwW&tLJe zBf95e^|2F}KFY<%&dB1`$H~#PDHk87Kz3Yxl#h>7BFn``_oHjj_2$~kTuzOg^_D#} zEm(6MOb2FLxy;#T$aT)fp^Ie?eSvJhx`)0*x1IjV>#t|^SIBbu>y@+mYcRR^I~G}+ z?(z8XJ$m)y2XwLcF&^1|)sLUhZKogd@#AM?xuze#fXQWDeTXdfyWg`$*I&8#HuZwP z_iY+^7m2Zz>c_Wx{|Xw(Z!5YKgH%k7x(9L z^K4PMh+vxd^gcY}WPcy7tU;ZyvTOXCJyX)wo>i;SPawU&v{%atFb=ujTY#&M~g! z?w(nUyLJ3x?!K(!S9aog6TL^Pjd$DZUfO&{oBrs_w%T|%$9ID-hg|mr+P*Ok0J_Ca0`Sxz7M6@dw{ZvbZO_3xu>3?^RlzA3tR&3iA#PCn$5kCnjXn)z56 zOwRS@+Ht+PW|H$QkelmbE3oFe*al2oUy|Ex(ao(~>FSmk1kg0s&c!sWC@TN1RXh zx$T`tIoH|&aIQBw{g+Grx20{({{VC`$Fb(PCag7?!^4qX6TXMbTptP6MlR~}+fiV) zmCIO%HO4v|T`V~~64`!ru8#t#3xoB}478gd}ASUtB7Lf2optj%Na^)Bj0@_ih7_F%A~ zVB+RB*h$FZwH};--P8kleeTXY4Fi|cXTq7VPtF9B%N{tDKKf(Ka@hla2a~hEdm!uJ z46x=i#V|1AluPYA6Ir}IQ=Cg1@$8lJ(8cOrIUilT?v)GB#j{r~MAnXY*4=f;b-u4h z7prUBwVu6nIQzx@py#Ge{lDcoOzH-ow*cQ-gV@@yS$~JHra1&t^gBv?40r5 zGxnkM_gTVc3;n2m9gOa?gq(INcObaW5_0+>mwewx4D!Bb$>&J-gNdij2;-!U-=p1t z|Nai;Ltx@FFws6=Jc{hgXArqjTqC)x5#Ei-HtKRm(9UPUN01$_^0qT(`J)(DUK_Tx zZ}#HDgW7#>qg{L*1twnO8I3NUevcq0p7eVZOuWYU7`k|3dt+DXAag$e0>8GvJ7G5UE|`h5>3USs?LT|6=VjGP$d#&iA1WlY|U!8Yo0iSZ|7eW<+c65}r| zUK_TxZ~U5u&!F6+HJ)j~#1qeS$j0L{RQgR1CSK#20bM-t%#56P#uFp z-rEFByvDdGx_J8aLpDaw^vvUCVB$5#{^;U~aVzA+D7OXI=3K_)-56}6E|(a$ zMAnDO+b%I~-Qu-jTl?C!(|ql=yr=EB{rH}r%g?+$U#gu~!TpR|&bnN=N5K7zTh4k` zxx2yrj9bn+P`Mky{ft}AJyp3&!TpR|&b3&%v%&q0Th2MG+~2|dj9bpw<&4+A4`l8- zbN5`{X`$cpeLizFJ^DwSp|ExsG|LI#=TPnep;$oOn9GH{YL5 z0%lve^qmY@ygo0VjGpIZ`8+S5f-I-6gfhY3Q^Dji_7uuA&}Q;7C75x^We;^h7I$Bb zXuVIF3SHdKZ1XHTHM(QSrSG)J+FJ!@@|-puy14t#_2GJO?p+7TEe-xwbg}UFHTe6{#WEi&AUl`-{Ce`)6Rf#5dx6vD52W0s5GTOy0sb@?=U{Faa3&mhY+{T>4*7r(bf)~CAO2B3@A^|l?ledW@3 z2W0!Uk(;cy9nr;`>&{D>1hRg*fmwojDw#AmAPu}~y2qvEYr{yJNG21v_U9s1l zKITR)e?MkkFylG||EzP)nQi9-x4pb;K>ya~e9#Z`7T-1i6OV5jB8yeuHbNJVZyO_v zRo^y2*EhNN&<|O>`Y-@pAAGin58Hu>$A|5a#i|cGpo_neZC(QI^P-${Sh;_I z`@AS;ZYy^xxX+7n#w=&N>!JHBuqbz*6$dR!P`vzn<9>?gX6WlL+}_5!ZTgiqZ_;K~ z^bJ~VyxV4$(q?(;%XN!Tw_0ty+vZxZjP)pO7DwNx)yBJRdXzT1b>wph@Qqt-yxZm- z?y)n9Hdmo<(rV-VSZc24N}D`E&MZ zHvr7G*8hyV9lB?`T(BLGeIBuGo`DV|XZ0EEAat?xImkYKZ^!+pR!j#Y`-~tL{|`mh zZha0p3|+kb{@>x~_LqyjBay|8&D=iUn#cUT!wb+|FW%$#MacSX?euKB1YJAYRKFD6 zHsad6ntSGJ7jkzQx|nvAJ?s5jmscR$*XJ|;-r<$VVxIM0p7s8{!>hpLX!7e>@4D7+ z?P=FB|H<8#>-s<%UV|=X8)e7zZ)0AEoH6}biyP3z>X@#j8^PoplO^}7kG8+Lw08~Y zqwQ}2mrMKn&AVH{v?X8t);H(V{N0AEPxbE|-i|JwwQ&csSQ}%d-+$2USN~?@n;$Yrt;QhOCF(ajN_iw=E(mr$kEtt0CtKa&TeftBlKGpsHBf5CzcRaFK z8@{FA&*=86d*&B(@%Y<;Jc%{qo5XqNioco5j$rn$`@IvGcx-k?7His^989ihb4oD% ztoywSn0WPlDs=ITGc~eUbDU|wiGYhgd z94B^WMHY{p*^tGmoj;?C$Ik4?+7_>K@7m3NKc4;W`gUKqR$Qz0bA9CRnV!O4vo82@ zeAnmS!Nh&ma6O2fhAiHj11f#bKz9sZ>3b%axX&c%dls^I51z|LwCw!@UHoC{Nm*Wxw!?|{=Rq5=MT4{i@QIJ!?o%<_$QcL>i3HH zRi86^qKoBB_&04G^JDzTdbkta@up$Cw7U!4wsO|old<6|XU9h9#_T;~Z-QLUj(+Ic zNxj(&-8SOd+?uR>w5|JAlbKCMlgz&vq*9>)Ek0xLn$&ehdWDmb_~! ze(PJ#fZdSwsh%CXql;&a4MG-c!Ad~`OMkThAbXC$02LOabo9qWbxP;iY!*`oQN(SJ0~G)TfEM_YanOG3DiE< zxBJ4i;##$z>m&8`UiO;pe5L;12PSTv$bP>cS-jTQ;pq0Q^>qZ8cV51_N#u}gl;?ikdGfXBg-}YxCKlu z=k58(V)bXjEKg6?{fbKPg%c+d9*C$c7O<6f}6 zYbxAOIQ^D02DzN&w}Hvmv-}P)@poLOt!I~iql?=veeXth+}iiQVB)p!z3Ae$tIq*G z55&hyv9lO$d=9jIjqO~x`CFWR$Z5yV#oRxB9+vqXi~Qm|zki+Tq zU$d4b1Jho8=I97!TRCgXbUmyrzddt2OODKo_r&%*a*gdpbnPUzm(Xn^uFW^N`^q!N z%jja-Rn9ZVtH}1X?)c2{8nReDV|?a#9ZZfU6P`KrTYK7d%n!Ny$}`8C=wh}}PR`#( z&X_)Pyo)YY$Ml)wJuo@PB&8G1!Lg-%edhQ8TrTZ%?)(o-Tk@{E_^ofwQy=E_V`P1* z&m5nii)U?qiY(TKFX=Z9-G24l{v2IA=k^!KV$Jxz1e1%unagj$>|dWbzC{<0&F_%K znl`@&lWW@i5llbpGsk#z@#_0e=;9gYXJoPFIKP0&Wt`-CQr3iV=|`RwCIb_<=9=qH z$YSO*=T~QR@z|LXSsRWMJ6*uUV`pk)v1(@;bn)1k7FpZkb?#jQdFD8Y`sDg{U$|CW ztM+q!G53>lYQs#()`qN~Zs=mxxnQ%Pi`O+ZE4p~*`cKGW&AFZpOfGYs_-6-`v%V$% zInl-I**O=wcs)DkMi;MVXLoe*dUno>ZcgPg?)=D(QP1oJ(8cSx3!;nHaTh`tuj4L^ zE?&o76y5odbKNBG-gD+%#+?2-XRH<5J161JgVS%0Zd<+Q^z*8M&TUtD<{eXFaZlZX5BO3%!xWWA`v*`z+P*xABhv^E2T( z{*hp|l}q2Fk;RR{vuQ`>!B^hbFNkjbyvOH-k*m*(qH8BUFNSU#acwTm-B-@o9_V7) zRn8f^1hReIXP&W3B8%01<{7&bn4J48p9$-?_O$DmD|7diGj)Uu-ILL^NB0SR|1QQ=`<{j_o^$saWMA&FzHExq z(Z$?j%BeBKkgZR?R|s|%n0V^Wb;Rc@b!TsM?RZb!*$27SogwJj$y(hP-8SOZfP=aF zO5NEHT}->msXGTC+c$ORKxDDH&a68JfyuefQg`%Qd)jr(W4ZfE-8lqZ%r?rYJBJ}> zOzX}O=wfwD>&}s2a#`Ei3rCmsweGZm%cXtR-Z5a>l6URJZ+%PsI38J_YTY>jT|Db- zD6&`^zNOzu==Q67_hfYO_&e`bV)%SDI#WT*i$YRZL&I6OnILY;eV8*2%sTUU^i>F>(f-Gh}Q+F;!7LT1P zkhS4Bv2!J|c$0u!%4yL3wn`T8cztHQt<|nRpS}*}d7<6Z z`~~`}#;7e}}fl=RG#xL#}mvEV_2G z_dh_ljkq>H+{|MQ>?pvQ9KSma-`_?-C37DMwHg#OTwWnRj{GPk7 z)bY>I#cZRTI{rCw#?X#D^1Jjng>nDEe zTk7$T$of?4_;_^jtg)Yv#oF*C{eD5WU#*25$cuRVoy7U&YQ{Gym|XnLTy_Gpf34%4 z!Ng;8a%8cl%_+d-nl`(D>1VCuQ-O(B-={_w&p6W{i#5lY7ECVVB-b;Dap_0u?~KUe zslQ#3#mr~w_{`|yu`?^OHXJ8*{)8+ZJAXzNt9E8b7muAekhLvd=iW7tI({0p#r5sJ zaILsj?dST)p8c}5XMKN|_3$;AdaVcFfZ0|qeZNB%&wd|>ZC}~%i=ewlyl1~JhFtgi z;(| zbx0QgRD<=zpsuip7~t^S*(p1({C+w`_(waG!T|727Ko)D-+z?EzX>(&R{jB?a6Lj(F`=;pP8K)nzSaY1sz~nMca=itZap_0) z>6Xai*{540iLZ8%QsY>zA+J3AtaRXaPOi^tB+$l4aKbMG3+em|Z4 z?)r9LxK>=N_H%vYnQA(Mh)v%e*5#o0r zFwZT0O}o{RZ7UaSO=NNXvfh7*U0*r3?nE~y-s8{R$o1U%FS>TL*@rRjMYoN(HXr2f zE9ch#p^Ir(Ip@~>$o92Pd2T&`ELQ83=hkpAIhss3xAa?k+I7q)xckbvH3D7CHp)4- zMj~fS&#h7DVs%XS`)DvZ$Lz?JTKZ^dU(c<_z~$0Dwd-*(ZOOal;%+WU*#^FM!F#-^}I9VD_)))+^}ZvH2>pSkvZf zU~)~HZ-D7%J-6OO7q7m*g)W|P-bNN{j`I$fT*gVR-v=`;{m6MU7Fj&!&Hs?a%xBK6 z50S-V=M!XYI8N+*iYy*Gml1#E@#jB$l|rOZ-}nFTH7}P6R&+YMHjbkt(Vr#)ZGiQ zW9_vT+rB-v_PTo(xV2YKKjgGC2-$tP8TZ7qC9;3tt^Ul$R$$gSxzwUbmiT?`oD^Lw z^=&)a+Rxm?_KxT;&eOhk(rza(+sau#HpPao)WKQN_0fCAo(;Ly!P(KZlf5$sx^2X@ zIWKo#se^N(i)mLmb#QKE`?~I}gWZwE>bkcM&I2ary3g~werr#=j=4B@U#Wxhp^Mo@ zIdyOWtxG&tB*OrY(8bK>XIX)Uzd#^{Lju zrO?GQmrEmywc$_tEsJiyT1%Eg7f&tu3$j=;&0}%Cz$7&fm9A|Yfxr~!suLWjY`jPszHnMo?S6^f?^O-vM zS7hr7PC$I4M2Cy+HX5B@$}msS%R&;%+ zw*CYrUTw{WE*@KdMi#5K=0`UVes2}O7622kwiZMekFAA}#j35v(Dkd@>H#KRZ7q&2 z9$QNwi&a}IqU)ExM<2g>f{9mKz0k#DYb9i{YHKxg{i?QlgNavLebB{YYjtEX+qnMn zyT#sJe_ff&Px&2Wf1ldluXep;ZOXk2?(b8}Iggba1@7-t%bCl{-3jjRQ_C4o<*o>SiKhk=P_yu*>jY95Y2*Opvt z9fj>33o#SfjcrfwUIssX%=3ywh_T*guUFL3o*6?m^ zcP+fbzFKV_o&&p+SMK-D#rs{_x9^emHaF8|*;boDtv2S^HXE^zuEfse?DIuvw-cA` zwdPuD)CclTUp+RoOG?{K(JJ2mTvcJ2PObMK*t+qrO#@hD#4`{Ddr)eEf_omV9);ZZjW~fSC`u~+N{MqAKG?=MWAAJ*?Ey`&cMh2LY_C0a z+coW72Btm7h`p=8v}bB+v%U7zZP&DSE135Dn_{tdJDB!(Jegqc4lwQ6UVG}c zYudXHOnc6C>^%tP-1v%rBfzw0d+n*)u4(THFzp>(>^%dfJ)jBp#(-(h_S#doUDMuc zVA}I&&Z3LrK~g8(2w9haM{MYeQcvHmo+pV zxw(dZ0u#>~`WacwH8hAAenA$?oKK3~<{Fv|%rzvJb{&z$t$m&uezr3?y7pWf@~#a( z+nEAc&b2WGmuq8t#-0*PuEt|r&awP(#ypt2G27Ny-Pg{^bm;QFGB4AE9ZCDli+(sS z;}L)bEXY(+s8(oH|I}1&qv;K*6o1YfolNs7;Go>$+-Oc9?9p< z=;9mFF6(9>y8Y!+&jum;9Oot&-VJNZoBvzd%IHOY*Wv_-NCfio`d%DbP$;K zY_C0a+coVS0H(cq{v8CSJ?A?99So*D+iOqVc1?T7foZRve%ciM=e8I3Il0;X5by)In(f7X=1zO(`YviQV+il48Lay9W==vkKMB%J+&oZv-S?;W9+xw-?9SbJ^8f)Gj)8 zzAF2kNV_K>+t;=5CT*QVuR-KB>*d7KCS#rgChnNmV5={-PD2;>eS-Dt4DP=4LGE-e zF?~=T+4A8Z$oioV_UpwyNfWNr&APW3n0V@54`i{Nor@!j zWlt`JY+Uu{mzM^!?#ZRyvdGQn)aAfzE0_KJ7i95zcCLu-xUMhxoSi+zxZE?-bJaMF zH|uLRo&!fr*`5>om;>|n)Hc7SZNmGG2hoRfnJ4esvyHl3@-_mwnYV|)#FMv?$YROc z!^mRE$0+1x-bRC&H@UQX1i6{FN5O0>m%KfOEMA{s9!D2g3h6X?@OKSQAX#^FHm?LKm;^V>Uo<#b7gzn-xs|>id}4!L(QNHwT#ZY_C0a+coVi2&TRIK4wuc?bZA(2BtmRYfs&F zO?!U<(_Vca(-Ta4HGjRpv}b$msoO60@;+t&w(9$sE75&fpXH9{+K$Wm;N6~`BbS=86LPbr>!ZAJ^hDSMs(O*RHa2 z<9nMUksaIqd2e$Rx_F+Mjz;#qjrGr3XIs~nxNWnxQj7G@HhFK8cpTsOuH>#Ct})lu zx!mKc>*_@Gp{+LF?PDAJ$Youfgxp+LCxeM+U7dm~miIQNB8z1moQ~XFS7(5^uH@2g z7_zwaFmaxRE}r$``<;KFJBI5;KJRzVMwWBEOu?1+JLiDO)fkP{dH4O!XXMfMJLbW* z#-H~p7a`00%3NIx=KGz@m3}x^;x$2V*K&zDm&&$zo4#q&1?+BgG21BTY<(Zux!Mi4EEnUCcJh`R=qEvbO!aJbupF!t_&H$1L4GmbUyqkEcSv zqGii_e7p+Txb;1;Tmxooj+1uRBHLCj?XE|*pJS)p4al~Y%RW4TvFpzO4n-GBJSQRB z&$VXl^>6%~3}!pmu)KT8zwvVlvYdO#E8pjz3MOalUAX%)_T6~1^*?Oi%w-gY?4JoPryo!gd^rnDE;j#7AIG_#agw_`!Ca3u z$9I9*RxW+-K^8a1@#j2j#~=Clb3V9S)1M2#wMe@ zW;=5rpZT~6S*|%BH-pJJKhE2~kj1QhJEPx*EVeJY?}u+k7E9d2iAx{uft;|9!OT~! z!w;d`b_7@Qa~F1!ANl0xZg9C~e(nL2%U&8yAII@|I`j1iy7MKMJUxnRU%B*s3|V{{ z9?a7Baddr_OMFitYhP}kRt}y-7C(-fZBCv-HZS7N)v16_BR|7E>Yeep58#$N5A8ZkMDr_JX?Ky7fc`J;^TYB;?>9Z(X}ZTAIBm)u0G1g#}AO@;-lx3 z^}$+TUC4ZVgq&KCdHV#cxko=06}OXyFV%Fx%;ye0&>+EZ6kyb1=EooUf6^QggmR7E8_f z7FjGld`&*}{Uy%J?8$Gy#E)+6$#0QAV_w9wPrpOfmRzv!k;QGB^)w#cH9sr&jQJC? zW6EXC|BNi|&)et!+#XLGaocpo=1=zFaxR?;I4W3%YoImZQTm?RLboUppY5 zQfkVi=&32$Uz35^&bg4!{_2P<=Umhp&!^ImfD8H#qB>oUzF{zRy$EjH$T$ zjBz-3Up`~_|8Z}HK6R^&_w3VYkzLng%V$T^gNb{_m4|9*Ev*EefO*66HY&6@Wo`*F!7 zu0JD-yOtBf)cBJaP%v=CWF6)0a>~$=4t`E9x>i_$_I+*PoLq7Ai2C`h{Eq<;A zrj7dlelLnHo?5*ax>&8%J>usOPCy?CAhwm>!}xnNr&i@#2da9qz3ee?Xte%S`u z+}HnOeE?V+_N{|yw;h;mkeRY z@ncilVbghv9|OUvAG@H7#gE;P?N|NS9o=^NAs;^mAvMPJX)w5)K0{5YNkhQoa!%|? zAN{evoc-Oqdx6Q>-*Y1MbswCfgp}((C^*-v%abeaUmH_xLp@{e5=! zSy~_Cv(G$#LigEOP9G~b3%bwFa*k2CnZbQ_meWVMti|rsEbZ3MM9w2-@%r~C&j%Ct z_p7tsFG3gh^No?M=dz2@9ZxQM^HOAS+h)G!Z;k6Y5PMg_i`Q|l1{1I2UWYDT$Gsli z9LQzd8}R^;OYA+sc4Z;SWxU0a z-A8i4mP8h}{wC*3qifGvk=U1MwUJBTWs&VKm%V%|vDCf%Pjs>PdKy-9eJtaRXsypxTbO@WH0@Rc6R+LyvDIPy8Y#nmoda|eD&`vJO?K3 z{!R^f9$nma>H9LeHf!Hk!NhCd*U-gnSNFX8I%~7fvj6{gG;6dlbL{`=(wDlh&;fim z!*@M1aCPCbX56{luO;KxnjwD<`a1NrW_Y*F*`>{z^c#ZSx7EhGZ3dS%exKA2{jaSy z-fgpKX>&JimPB8-)yBJRmMCq;(&lOK^;&Jb+vX|mzN~XQ@xXEo`ueRl-j8kVjSZ2_ zLmO@FcQmpu`&~f4ZP7R4GFI>Dw<)r<(7dL0^+UE6%B5yJgs-(`j6@g9yo^G&U#%IV z!E9&EkWbBc1X-?GGadz#OU-x^Su8cQax;b+U^|#P%Bd*P{+ z=wjMc_8Hp$yYXFQ`}!Q~ci-hE!XjV_+G`wg;K8#dGLJ9PWi--Z4jT|EB&fGpOG??*7X_?x-> z8O;9m_qcyS7mv*jU$@2@r=_MS*$tE3*2X=+{Ml8xjIk%O{pB*oUdZD0+}|5r+~?+;jekSeAG!1$f~>u{ z*kq}NvlG8~YT+E{VyT65B8$m)C5HWJtL--CSp5KGG2hSpjW)iIIuKp_INGQmgsdI$ z)XGDUt!wVF>eg$Lc;<9NjkJ+FX{quhi@%(8aW? zoSMB9vVGm7*6gK`#p)il?kxi*=N?VX)^F`;*D+V+?khEWIdn1GD5qvGkDM{B!7HMR z)iJwar>7W~W7e9z5?I>Tn!Pf(T-s;ft^%eldFL&D>zng!{(2+pQ?1#3(8aTMR!0_V z!=Ln96WxBb?yZF`p1QX-vRE^|b-?7}Z)*0sVD_&ydp&gV*jyi3tZ8!tFuA79jllG? z*6fYZ#jEd|po?dmO_9Z#h8Sv+=jKo+ZZc0?DCot==iEner|HISNpK>zmj?Y?lWxK{1w`f$yD%z{6e{rVC2 z)Z8=C?dR)O){xKb=Yv@@tS|Zh881K=H-FYnW9dfQ3&G@4hc8Cfrg&=5CCK8|dgr4P z@7FFx*B9-{`@GT>dzT^0Wj^Bf>in#)ey1jGgx=N~KVxqU=Gbx>dlO{wI`*dM+H-9A zjNK1et~vI$V0G+4=;p>4Gxi=}jxCq5_e2)2WABBoJ;#>M*n1<(HOD>>td4yw`Z@dl ze(dAG99u49ACD|v$36jFdyXxiv4!tge-_&|NEZpAh#YVB&SYFGUxxV_$}@ zJ;#>M*q0;AHOIaI%(0W-yU-n{&h6dk;&q&R(CzCu@)_s9$a2kb9s;Z5j6rvtI*-qy zi`Q|UL$|Nv$Y-4Ak>#4>ya86n`2^i@>YROwE?&p^4BfttBcE}`AuYy>I~H6{KcOc0dYt2W zQDeJ-kED;!wdOcEc^KJta>@57WiIEyxVqAJG`e^jw$vX%7BiRec|2=Fzw&!T`ur1E ze3p;TKO@UEef|YZF8)n2fcIDE)xSx>#H)Xkp^L}Aj>uxwzv>@ zvRu=@nZV@Y-^|Ej)xU1&;?=)d(8c55tjJ>3zxmMh&wlZ5ez5o_AO99WmTUUAAedbI zTNqia`nL$Wc=c~lbn*DN7_wOPZv}My^SxI5TM;b&$;ZE*$Z}2pdV$Hszm<{2s(-7X zi&y_vMHi2Mt09Y3|JFm-zoUzP>x0EV`S`a1vRu=@4Z-B%-^R#d)xS;9#jAgtqKn7B ze#m0gzwOcW&+nm=za7BhpM3n=5m~P3-%en1@oylqSoLogbn)unuIS?NZ#QJI>fe6o z`sa5X@o#^y_$MF#4nUS``gb6hT>Lv2S*-eZ2)cOn?@)B{_;(nxnEuss#`DJai(RQf zL-ucfcJq1EdgK`tZU9_A>V}-PpmOWM`RpU-KCIkIa6X&Jxd$q@IGoQ8a<0G1%>(Co zFX!A>ZdN$YXgTvv(;ct)OsEaw{V${Bes zm|V`t3z5ZgMqY$0mNW8VWU;&#c!}|i=PN!N_r3Ar#OurV#&R>Gzs%j|4)5vrDzg0^ z#5enOE&b%a<9f|I{k*%@x?%SXWFauG_Tx1kAQ_*)vxVOZJR> z_RN*wa?L$+6_{M+;B)%u(?}Zn`)t?14P{J!S8IO!y%Al^cK)7OH?W(~#j_r6M%J!) z{J#ZR-0xu1?w{!5#+32@g)Z)QhdKXmLl-w^T^a9oWU*R5j${3r$8&kFkTFjH6R$ZN zif+#2lCu+$lQa3`>?CBlX3kCqlZ(%%AUn<<?~xlnzM`0&DnV+XP1D9*PLC7ZqDSAv&)c^Gx_A~a%8z? z&aMEHOU|xDcAP)T*;R1n%y!Ay)yU$>*)_=86;IBtMHa6)yAEBv=InZO@tU(6(8ZIp z8V zY?qw~VB+b^$p{%+G*L ztR9U4mrKmgBHRCuVtx+Jm~EGspGOu?%r78oS3EJlh%8=XehFQ?#{4q6c#ZiLbn(Re zDzaFO`8{-FzOby5v0&nLoqT}qI+4pd`5$uDiF|VQA+lU^oqPl)mz;f!>^Ogvvrpj6 zneCFZPm#rwv(J#VE1sNXY$F}q{wp3oJ}Uim7H}%cAP)TStodNX1nC9GqQMcHaW6(#gnrs zki~1xrbHL7IqQNhUUN1Tx_ELnHL_UE+05wX?BbHMS-`|=&Sph-oyjF5oZ=0eu4cycy3vUtr|cXaWZvw6_PYtH6H z7f;USLl!e|SsUW<{~=`Y zn%9TX#cN(ip^MkNjz$+xULQdgt7~xy@@#DNGngg861RNfUJ6;R8TZm)ay9P6v>dp6 zjp;Aw;x(q_(Zy>_E1-+lm{vp=PfR_L#cE7zq8n5F+-5DX#3Y}X)<%|V#v*6jcI*!@fyXCi%p)EwWrQrU77b z6N_mFaQPb3j_Bewrk&8mYfL+%i`SS2qKhY{U693UOoP#lseV2*1S~PhC#HRo<(e_= z2PQYMm<|M&uQ45jE?#3g7+t)^bO^e5jpZU5PGUW4a1myvB4jx_FK08g%i*bS<)2jp;UYW2&EB-42$R z;=;Dd#|B%Iush*LZmHABT z(EZ!rcl+6ewcqnI+%9mwzm)5Voyu(r=ldu*Yfha2&-xe9#q=j<{Y&WLITv3>)`ob_`d5&}>-u;N zUA(T3*U`o6`gj9fJnQ34WU;#DN0C2ct7rXau*5B&xF125YsUR3m|TrJF+Bk;Ut@X_ zUA)Hh6uNkg>1lNF8q+iA;)!VtvRIAjHFRUDXZ`D7iAg>&y@4#(jOk40Na38q<5|;x(rC(Zy>_W6{ME(+9|6HKs4njY(TspI?F{Ci%ql6|!72rmw-|CKl6o z;PN%5@6p9;Oh2HD*O-1p7q2mmM;A{_KOu|Nm?q!8J*IlrPXU&g7=;Ae|`O(E|ObeikC#D6F#cE7Tp&L^@>z4*gO!A3o8DzO; zOv{4FO)RG6!R2dAE1-+lm{vp=uQByR7q2n(LKja=D<0hE{G9aL;==Yf~aYc94$_xn6KW3Sx0=Dvq0 z{&M-g@Lha$U*-G4_t3@S>sVy_xt2ZK{J!u5Fx&Zkp}c$1?+gEjEazVI%J+pIg2`pf zZ;|Vm-=T|T%pZ`Av5xs8nC%=>K4XqYmTQjr6PR4Sqnu=U_5^yqqns37EZW+ET*6FeQWlC{p$Q|114T=ZHq1*TLX~As;%A7wdENczjg-` zueJuEi^tX;$YRyj{^;8BoQSOhz{IPq1JT7}>mX#YYO4)hTWuYFvvmxZc(rvb`mZ?a zzH0}*zmw;xwoXIW)(|Ezew_{`UTvL$E*`&zA&XU87ouxxyJG7iF!5^ZVs!D?x&&FQ z+PV&1ThmScn_t(1iC0@Upo_=WjmTo!s{7wMkXpFU{;W$b>!WMP+7NCVaO4!WoE-ep-Z*I)fz zh2_9(E0=c5Biqm4p^Lp0z-%j*n$#6vYE7CMU2J&Xt0LRac}*Rh70hZn4GbngDqdi?%!NI0KFHNv3rlND-8>)t%2SiO zV}EXNIeo#+2{pMpm|VtLy){n#n~Q6LS$k@Z*8;PxT>7qqEN+hD&jQ$vKk|8ATM%5X z>CZx7a+#0ikn4Q>1zjxju>!Jrsq?WSnC+Yo`OHU8F|Ou(^a7L18L=v|Sk8#mki~LF z^hOp-+#3>?KGeUtxG|Xda?PdPCSbOeOMceEPVyt4{HzTw*UZm4U~;LE{psU4em0P` zzB!olC6_#Hfoxy7^xYC!-0xV@cPlaa%Ej-kk+m!5*>RnF zdGqNwyCch)&yHO2aS&Mjn~Qs*>!Z*0@o^t8--A>i2ZQOOTznjYEM9%w7hRij@o_(7 z$JIyq__#l^Tzs@vo`Y^Jur6di4nj^X$h;i_*4(3qg4tFs`)O-@uKQ^lbg`_H0m$~N z`)RxXN7q@vTUlj&7_Qi@h&_t!jP2Ns*xfmbii+JG;03X}09&yOTkOE@09zS5aO|GZ z?|HcAk89q~IltfWUF%tUuf5jpbMEy5vz+m2&wA>Gtj&0RXMfuPrY-Sqf~-&HRpQtg zR^!+OU6wfdAX~4-u^YPOj6-|k*d1A0GmbrA+A^;;N0$B9-?>3IUTul(P~;lhVd%2N zb_8;B&p8riIb+kF*p5Qh){O0Fn6~UW?Z~q1IsK7k*>eUU%MwF7{ka8t{hKWPVeoOdrznv%bzi*5+8$ zJ>X1O{hNztqh}9@&vRgw)2H_MJQrD8eAYGV+Vwu?UFa0k41 zIchWKY8!~neLcO}fS+LG7R$nttG8B9FML3?r-0@v2e;e433_`IGv z*@MGwgvo1PT|%9-qdo0h3fI2l8FW+Kh1`-pTWBn7P-#xp*H;UiKdymkb6z`loF~qi#4-Z8IWHcAHRr_>mg8+K>DwpK?OSc}_Y|@| zwdFjxf%c8rx!IHQH=@h3FAhVtUOlUBhFQ)&)oz}CH*yQIHuLnIGxJuMw#@%$@mK%m z;`8X1seg0v1(@Y*Lwm;UMPzLmx5W7}Ods`cF5ZPM&t5$oT~_z%yV2!!uf7Lep1t~B zWc|qNSUG0d=T2h3ay(tbH$A6a|u1s|Y$*2{AT z_z>Bgw1s_yEYII+^BgfY&yTE^Pm%3=zfa1#`W)7dfA_(Z8w0bfwv6j1_^adkDY`6u z^EtBh>bQ=9Sw)`Y)Ka#4*}(_;j2S$2YJV$G7OR#PL0{^=ceHpj*y3 zv?q=qk+n7B_z9*h`}Od8Sm+k>v(rVmu0+XKyL0Q zGr}xq?%FfnGa+khj`z$kZP`y|LzZPfnH^b{{iHjxEHR8vAK6d!em?=aJnMKuWY@7g zYjz@JeQ67u7+Kz2$F67h5AUa^vOl=q-BT>@8qeNx0yg(DC`&#a;J`>l;)c5Y}UD_BEb2nl>4&A%6He;-|W6`}kYqO1N z>ks$ttj!p;WiI}W{IvTWg=6L1TL30cnMIIo+wVlKBe%6EvnWjNzc=OnzZ9}B_kV4F z=e-zj_fMbZYZ-NIN4MHq64~~u-E#Jav7Ao3+Vx>s>t@aj@6{1|JLMAV-7tC0=N@!< z>fMW+d{XZ|n7rnAKe{|QK8)FQ|OkQ&wi7ro$uOs_1M{Te29>v?7e42x0 z)U_qY*N}~&+AWtH-)PzOVOi@Y){l|R(Z9uzSU-WuYmT3y%Tw<&WOE!)a{L@7uQ`rE zmnX-skbRk>wtw;dg10&OGzZJ5YfFw_A{#@sTP`_%-LmV$ver#LzazUwYd)QJV6TQJ zpU&v!<6S=W+FZJ$!DULT_2XU zZepDd*?j8S>jsn89H&Q@r``<6=6Fo!KXRNACa*cpgf35xe?j(Tj@oA7Ju`1}@@Wp1 zQP-9nXGJ!KYPVc+oULWohh?psSQkJx$GY|wgvo1;3!%$XZ((F}tUq&H1SYRJE{ZNs zj!PgXM{SGqUW~Un`7{U1sB24(e@8ZkYPVc+T(V`?hh?psSXV_h$GY}q*pdf&-hT>~bsIj)H=Pmb#%Cr52-^InU$Ir%gP%cyHhj_V*BL$zBjIj+~T>%+3v zwQPR&<}+pYIf%~+y#3jv=S%go4cwnaYI~&Df7{lA`?E-G?q{{$GH`zusm*<$+WrRj zXOY@mQ`I&beD;>jxmaz}!TnjJ^&G=$n;h=XBDI-&Y~F4DNlx$a*5-Xen|@dhho4EM7&ooOe&{xqH5btc@_nzH{$-9i}a9euP}x{1{!9Ha|sf z-giHPS$%X0_rgKV4f)Y~07pQYk|PuS=9spGg8%(B{2cOPVV{e1N! zdOlxix6isWHa{V2v(Ion?tc6;Ok3JMP?-YyOurlivtP8OUk*l=+b<(pbMg>$`Mj`v z_Bj;YHngSg;mG=1kzjInJpx_sp5(f49XRKm|H=1gWc%u3{AXVM2Uh3RZ|Jhb-f3C( zEA%>-JHssJywaX|)rPFCIj_c(@lG7=)HRN)N*ohnuW?L-E=wGfAX~4-F)7S)#-TlN zOoptj8OP)>ZHZ%GD~_8=98+VjaZH0QOB`L1tykli4rV#y(4IKDA!}>KF+EIM;yAGt z$DJjPnX%V6WKOcp?wCEtaRtyjlnVVLC{ z6YUw3MUb^M$7E5Mw!|?Mf3B5xOT1UYn&;G2Fw1I7uGb*v`^@;e7G_y(o=wZ)cS+ha zFJshhjNMt`ZKjwrs|uE#I3S!JV!bzq6O`E{{T&IZv%;zw|&p8m7&D@w>~6OFx)x?}Crq zt4@MhenjicU6uT0i{mHX74?M4AE8WF{H=y8vy9^_JB2#-rMCPH%+p}@!{M~&JavpM zdpg|m+MSceyu}V3aoEp^ZA+Luv2BGctFdj3E>CRRAj@iO+oBtrw#2XlY!7_=pZe#r6~!-+Ctc(?N(F`NXGCx(-eWi^IV(B+BYRAgC=;WTt( z(3Tj^K$h1S&PO+fi%UOT0Fx(%3z20thKtbUiQ!^oS&iWmbYsw#7%oGW*BGux9~(pG zKl#-hSS8Eoa|zZEp?t^R>3^@KbGT z!u@=$ZJ&m1X}F)Swe@S*{tEZ=wKnHU_4yaLpRct!hSk;;?&oW5_HDII2A{lTGw0ac zpGUK2`T2TmEY#IzU)+W4XNdE7`q_Ha@)YLfXX^*qY#%}&&i-c^pO$&Blo?H#0qA$P z%J{TQ|59ct_MYj`?`f6sX_>C2%+r(^vK;4dtBg;}42C71K3(|#bkOf>mGNnr4N93O zC^I$s{jD-S2e2P^!^wll`I~IHH#`iJ`?IN>k0V;lpL3<$V=#IBe_x+ymGl37O}VFF zmaTV~r_sG9XiF^5B5w(^tn<|Po=5iXuspx(k^AWT^ijQ!et<4ZdmkZN&-U^?#K$np zEd$e@`{*ag+6Z^-JA3h`Fm39qQRfR}S?=5aLYC#e{Ux$2alhP(dsX62ej{P+v}6CK z+$dzrYD@gDA={6S({9SWj&50PVQ(SJ?YG=%zaxg+p|s}?^*vmhdE$25nezioTlSb= zkY#m``4wHBJ?7uYGRx%e^^c}4dF~+pM7K}m$^Qdn{}yh||3jGLt1WZwV;S%M_)pzW z(B+<0$^TPy>uU@999eGvxej`)K(f5@xA!MRcisBTe3}^9K69*l;D1td{peGDGIYzx z^*IesU+xFH(4mu~%k-=4J;&OzUf%{KU%8m7&$@gC7WjeHNI$wAZ+e&GEGVW<<~IRdfh9&fmv2t z>VAhT&w4)rzrM2G*GG4a_{@6W5V@}RjnVa!IkE}5W#q2Ct$6y%dfyaXreEc(_sx;5 z>-f6fw?LNF@pa8?3Df5IX1yD?{`6~`y?Oe|dfysdW*OzI_id5Wrt5b*bXjfF^}9Vx zTjo^e;0~pHUGF=>wWWNTk7qOZoRr@ z_CS{>-aV0J&HVO)X-m8r%Y9+iuj_q3ba{O4k1T8YJOHMx>GL3%an|*IFuJ_Peh9ie z?Hr0MYqoP3Ok3JXUmpoGFXPBMJxZB()@fg4nf;md-Va$GKmC#QVLS0N09hVC1CeFb z&vEGT_&FX~-|{;4&Vj7=^H}fBZ`Xx$#kp!d=STi+jh|R+?hC$b-}(6qOzyqV`5^lh zS-uJfROcC>|^O04qwZvvhU zllNth%D*Rg2D;pGiEn)BnHx=vi*G`hyyi9$y1eE#3A(w}x|6}=HMhyp^I-Ct+aPp#{=Gv#Pq_E^IU;MgE3)6;wUcYu46u=mSN$2(j4=0i zZNnG~zc-s1+4_D5lkbscL6^He%)`0rJeU=xE&KNs#8vPASE9=@AFf8W&3ga824*>Z zYtQ}vT4ZgmJ>OYF*TJ-@d;h-)S!PVV(T5?+a{s>>S(bBY4%#<{G4w^|*4%k-<9^J@gM zb=|K#zaB-F)%|K4{5%HJW`E`UGH(6p*EV0`=_}{g6X-I_DChio3OQ|hem#ROt8F?5 zo`q?%O}cd4p89+#U(c@>;M!6?d)SLGeQ9?OOWekmbLbUhW2)!ZNOXDT`6y&rJF%qR zYv|UiXTa;|@|*#0Aj_Khy$REncr%voz^q@-uXoYq@i`h<*7W&Ln6{?R_hH6a&#w>A zxpezCf1QpILkVLYBwR*U0*?o%s0% zSsp*%AQJ<#p_x13AA2vHv>1T^G(3=c@IbAKByQXRTSzSN5F0!Q}2$ zS?>!V%j+J$5W02QLdMly1SYR_7e$v_*Y&g}vM<-u@36(tWv(aX>?eOmcHi-Pl`TNY% z+?D1)ms>7%=RvpKT6aE}yw;r`UEaKlcqhrv+U~`V-#K{~y_t8-?KW)QXSC_7+OEfT zM$2Z5+U%pjJY8FUx0RmN4%-+A{aIMy_Y}w&<42KK~D7%gA#! zZig(-{<}T0thxX8f@yOt5X!ha){Zb^u6L}R(B=B5cdXtpZJC3+AnUjOJD&^EKl0px z7DAWh4zw_`EOUFemJion?oo?lm&eE7(Pi5mUhzDd&A7jIC3A_2U+ggv#<9%(^9=U`-c{2Yobt9}kcm&ecH$oiJov3CySUUfeEtn=G-;aqX9TF?2Bd)0xgHOu+R z9&#{D?*5eZeh9L>-m4Bnw=SuVt9t}YUh5u-F3-Jc5V9}V)0ONgN1@AHPs-UF`XakG zWd5|H%iOQS`XkHhoEm^G&sZOeENhPSK$y0Sb@D$Rrp^5=`Jad^ulIwK(B<`ha5B2Q z-VaVem)HBjY3TN;wzPW&vTf9R$(iW#+U{BC^4jj%=ytB~dT$Xvb#xt?>^p?hD+JiZ>?GV+`!Hz3Q?{!PgG z_V>`z{xI}*+SHc$ehad7o$vJ=xfQ0ZIp1%GY13EQx&v8$8b0FpF7)_)3@7D z>b{`N+j3zqq1$)W-^=Lo>hBeF>uYmen1k^ed*Xc+*|D9h%OC7@bjL+j>sdc*|3cQA z{>|O;`i$)YZ04d(|Fylh(CzbjukFX0m*-A;47x0L(spE7en0b(I**nfbu6xIM==#atF$morcP7c@0lrxg%eUF0+hs_Owfp)24Ui z%h6@E&2IP^3e%P~nmy>sQoinOSHZQVeC|nC!}O)yd7Ze8&GpcOF}n`gnCcz*dUScl z_XcEHJF%tSP3YFE_sn7F^2B>HvaFfkEii3~H)DA_%=+~{a|gOSKJP@9HGSR%)7JEP zH_SNe9r+$~d5!&Eba~pj4_Vf1=YE*Bw3EJm2xeZ!k-P1~$a2@HeLX^%xBZzr@}tP| z_;~_ZAGQ-ePa@0X=V@eF_45q6Jbs=<*0;Qly>lRU^sw~)Zr`p&Ku;bAD`KG-a@YX&O7M($y|LG-7<3b zfDg6v%DyuiU8Y~<>^tuvTi1E!zVkk^tj@D-@bdvooAWIDj&bWxzqa`mPhZ)0K0=pS zMmhV=C&+2jedjZDS#8sO=X030%KV;>J)o_4w*%bM+s57U-*($^Eg%*!~kUrY>>XTO*fS!RD` z-%(^9XDVcQ{7i!^tA3_Mm&Z?6WPQu)*gFTZ?_A9KcYeDroGZ>%>p4HN z?{s0USe~;Kb#or&!+MFJ_`T252 zn7sZT@60VWhKZYToE0XopE+l1m8+jGyTkO^PHbs+PIT-0xikCwT za`U2FR$JKo$etIQa$XGMoc6QO-(Z%tUH94LkbSw&YWq9y1$f&hKI3a)Wc_v2?f5*r z2)bNfuJPrFXJ*FLv&A*8-Opy-vCjh6MpuoUlUb{?!n7r~#i=7RH^;~LjK#PT%TmaR zCGE~ZowTbx?am3;)@*k!n6|97WvL_cvtDi2_A|dPW8N5_{bKnV(~9W!^`-nj2l2Tw z%>MFoePUk)-Ll#e`~0+<*tIA2zrwXOWB(gWTl#D@>e$X>6wF*&9o>1PE#=lgwyw6s zxF)i^e)q68x_2PwXX0KLS?>G{TOZk+2heA^TP%%#bMbuciH~K_Wr<-qWb1j>n*X{y zmxo!-IiubD{XLNtkhPh=@64GMEyG*gay^h`?(MzNS4EcPvtUnT*$CD^H~efu`{rHu zw@uL8@P_05rG{@tSduJ#t_@_eq`6500T>8EXw?I+i)YwkqszH&#~ z0Npw6GyS*`vi)d|J;-Sjbp7a4eN%MH$o083PhYvCZH6w>uX65aTOeE4zW0u{C9J$E$Y)}MZDb7!8ua!1<+U1k~O+|mAloHo6qZI3RiZ8|Q!VA^c63vXkz z{Enr3y`${}*Ou}*r+dTnrQNlhxQ)$uZ~yIzY)tiz)(2glHMASDtesd=Zx3|q)qBpK z=<>w77qYCG-`+57i8o`pAI$pojmBV7ba{>aP;`0P zISg6WZ0B&8wzQMJJ_=@D#*w?#(a3VwynWpdS!RD`4IhInkDmd^`mmk&ITl$SKgS`< zs-NT0%>p4HNX18yxS-<)p8Zr(fH=o~N&@_sh^_mQl`nABvndUB6eN%W9jh_p4yq zGN&>JuPNp0dcPK~E#))j*TM9q-7!zx#+G$^BeF5o^?nn&JmWhIS=LT$sdo#y_3E0r z6a0d#rV zc@SCFZ08}EwzQMJ9sx5i*xR0$CnEPb2HYcH-w5WO@8Nhb*gp zo=2C*&kM-h8e{}g{baZ}~=Kyru(H1s}SmpKidtQUdZzGoc zZqV!Ka?2&YgQ;h3Y+d8xI}9eTxgCx!uelwGZf>>i(J*<p5~^|RxNEml7}o(z-M&yJ_I z%GJ+~XTbE?PTVgUNp=$6&yUg2lE56L^9 zQ?%!E%13Z*?iJ3Htoe^&+7jah)G@{h%IAgeu-DHE-=oVC+mFcBtDhHsf?3WzOM5;q z{EV#4ID99LUtrqQ{k-rSvdn$Q&kMgJ%kp`l)5;wz>-G}bHy1w}=I2S5!sNO4UxsWw zdGZ~KY`)W!d?%+&&36iPS@N9<*?KkKsbQ8gU+u|v8f0zFe5ZwJOTN=1%aZR5$g<=+ zBeEwHMQ*TCe-_gZA@$&>H($mZ+!)0u-e!n`v%UsLWTWXoy`yBS&TJoK)y zJ-&VA&NSD`9c#^J?o9I_*E`dE==#xT589j`-7<20F3i(c?o5AOneQ)nyM~o>XIcQ+ zy3Tv=Oba5*>KW;sX(5<4`#*OkeKM-lqJJTBI^7vd6S=RKq7ED{y z=Q=Rstaqk$(d9Mv_0Z*MXMJQ@vz-lK+R{$?dSjS*8At9qn;^?wb3K@=n<2~W&+J>9 zBg^AwD`b7xPW)_*ERUaUk!97-KhWjzvmLU&<#p_x1GzI@!FlKWc3n7EoU7Jze&k+p z`||ug4CQ=f@3;#l_k79zIUHGD?-lo;TbIWQPPJVP_uSWJ{Mu}P6tZjgA)Z+Sk0SdwAnWff zKL&Fz)Rz5fFMQO!e{XbI`fguj>(#w~KbYm5YudB-?~km_x#l}_<^b4O8@q#N-680* z?EQx#k7d~XKK(FsS@z+ljhnZ3hUE7gdVW_s<(`LGR-60W1NiWj{d&O49sT4p`42>{ z`}OhY`pFtU0o^ikeV)eCSN7`@SLVAn-uAz8_Un_8t?T-9zdi+7R@dh?oj6-y+U&3F z*T$_s{o3Xbp1!hQpT07C4sXjSXTLrZIc>UMpN%f7ZFcL#9SWw+HoNf79&#QmYjHgx;*h-hAeC5 zcR5U3;>}oI3A29PudhOv$LH0^vZl{#VA`5KuY(z9-LJ1lm)F>DK$oYT8=o;mG>1o%p#MSsp+4BFn0u`_Sd_b3d}a z<#p_x1KF>yWUq35yDpq7&Q7j7!@H&O&V?khRypoARi3-ub&J zk0Hw}lX_2~+h(ozG)$g)&mhYzlYRHO9Xi@;@AQYS=V9{d>jiXqe7%S)tG-5}8$gzpp`@#Eka(o{quf9G&m&ezK$g=9|Q*`61zCMG=tFO<|{e&)$ub+`+)z^Q}jjQ_l4JNO?en*$bSEn8MjMggSn#kXo z^69+o%2@7o5N9WE{|=Y)C39NaR&f9BmNv(++SY*kcek|Jm({iu+`qe}&3vkDez<>k zOPlko+Gd6Ocek`T*3~vGylcy5e^=Y2aR2U>^~^c82~fYI-&~K{T%*$DsOp2PTiNcadezpZFS$u0L(@^#QVDR(*X4lc&tb z$c|kt^9f9z_C7_H)qeO4U0>SbYYehuU44B4lgHP;kY%+WzC_obw)pxQ*||}DeFKxn z*SE;B+7I8M>rb2O=HNv;?lwL>OPp8RZqYHX`Y+b;oFAKWtz&Ipxof_*NXK_-{?5L4wEnB$oLBCe zv!i=I^QnD_mfbtti4)RC=rYSFXWyR_S>KPfb@Zz-&)s7FJX~L=_ZZvM*!!UWCiM*H z!ziOKpNa7nWbga+-h3OZo$9uea(R*C+UQT;SwsJXX-m8>BkR*Oo;W^))i^#vmnDu*kgZqa_!Ql8 z#-TlNe1@#8tr5rPFm0JvqmX6wYQH@!1VoTU*O#ozKo| z@2Tc?8E2q-%RTg`c{$f(y9Ar-LYw}o?ILWhYi-7_%{Dx+8^RWX$vq>|&g|4lJKEDuceu8; zMmuxBv}Fw}MxC75*~=G)wNp=9*4*Ebt*b5TVhLn<{r7m6L^l_0#^}GtyA-nhZC_|N z#vaH^BWr7;t%-Oi&t+le-VH<83NU%?_m$A)wcqEZ?exc3d#m5)gKKMR^vC=#ZO%96 zj`OVt&$QbUxj8RZhc)NLnlQPsq;J`99tTd(e+ zi^42tpK7;H-OCq4*49RzzO$Dv4%3$TzaIX&aJFYGH$b;c{r7k`gjvouv}fElLe|!X zf5$CxZUWOs{r7m6Mwi=;d*U+avbs+$i!QJGqlP4$}!6xGn9SA@pPSA z-f`6CT)P09^G%!aYfJyHMcLZ_Yop6-$34e6;a-z5+zr_|@eO`6)_cI($*dN0fJZlhh_8SA}a+7fRs%i*)0+xx?6&Ih2& z630Qv)~j(GjBYvO(4IIBLDtrc<4~Bk>>)cL%j&t^8{K%v+B$XY&HE5*{WoIwL(dva zP6xu|_HEd~$nv@$9EI=f2ilFfJAHLDTw5D5>5S{UzA$asyAGp{@tCu=tbxN}+S;h= z8pu323f8<+91Sy1ZCP)9k>&MHF@Q4itd(QYWp%9#M3>jKavZumYvp)k{m3)#&Oxr@ zeJ;AJ&T;2@*3#vy7uS>POMlM)tflket|x8wgSO1QlaaMMk6d@Bw)E4+`=iWhFu85# zjQ5$gFQvYB3GWuhQRBK8-MfS~{Z!k9aPJb@j6+-cd!bdh=VSACA2L=~l9#;xor0@i z@?oXiwdis`@8tKBu0yvyZJB>JAj>VAb+lNk-N&h$c5lHhukGFnlh=0dK$q8c??kr` zw58qQ$a2ftr~UEmp0xx|??k)t^yR&2k%>8j(PfrVPOQry`#pmHk9%TW7Pc$rgtoM| z9J1?CTi6Q7a`%|@`AX>eb3Mf0%B?cmQg;<(>ubw=y^mb#e7zrCmRKJ|wqD(z9)elU zwW>Y))5FNx+UNt{nX8Y$w8iIY_>;{`{lxJCdX3{nbXjs-yH#fZbw)7fy$7$`V*bDI zDYqU>Uhhilqg!8F>TZZ^3=eevqwYp9`KF9r*7(Ng*4LK0n<88Hr7nNe-3%t*s?^;a z-TK-R-^^zgUMZ6S-AEWED*8LPFuXR5|ms_r`H`i3=(gr>M z|95g5wU~YE-#1;0xibI3eE#FRy{UOm!rS%w=xP{vxn8voMc<6Nu2-LyxxAEFje332 zH*b~kX_=!-8NWZ=0ey>B8K0KvRm$8=nHA8tY?bk8ndM8Fk16vGe5+O&pO$%>XJX!o z1MxQWty^V$4rr~7ZISJVb_!eXROHk5b975Ue z(PfrV*2m%SACa3rEa!e;Y~$ls`nP;AF&%AB$vocH@MaKP(h;i#rzqYw9PhYm_Tvy5`ay(e@4cC_P`8|PkVEWST*d%Ua%lup)*_ckIa?bM& z(B+vQ8zRfvX)Ey_dz+xk6Yr+TvSxmp!L%jbjOCUv>(_O#6}mh=w?>vVeQpEO z*7W%gm~qy1vmLs;#=bqeJni&CmNnbi0j4eOq_2C!%*#0PyB#|t%RS3_FkZVN%k0ne zbsuDT{Op0O58H{KJ(1<{vp2G=`q>9v9zXjc>swyO-Z_xp5!s1#cUp5vuCE|lPFwOCi7Yo)_cr&UQRwpaP95LTzKSgKtWL}i z@7NJne^_FE1ZIC2v-ZS10$E#IBj!h8+7jR6$g&#W6X^09-;?O_#P<}ktj0GA-F~wV z65p$^#HT&+y@srh8vKrq!=*H*I1k!)=!V;hM#5W(Zwq|_u!?Y#7zah(Nd<&q< zYkUi$%M;&1$g&#WvgpR=cX5etIauP;p7@qW*4B(~1(>$Pw-U0f#5VDntn=Ga%;>DW9Awb}30c04xEFKyRcdeT>ypv!W9{fIi&`;PBq{5-cDetr3QPTL&lAM>;=pQ-mLvh^Opr}es* zdfLWE|BR>gd^&D^UK@j)dN~(vv(B<>Oa+W@bF3((l2w7Iw;yTO)`*9HW+qAhJOkVqJeRTUw zTl#DR9Y-ywKe-}Bbc_tyfL!v{I5RS1e<+kx%Anl$nx~XX2|-LC;rWm<+abY zK$q7(+Y((~`)n(8dHQT?WLfRAozU&G!KKf3hRJK6?SgKfX-l8&ikv>vo<8e?tgYE+ zyTP=j&vr+)o&VKmdtkHAESEmp6Iq@<+Y4F0^7Pr>$nx4}`=HBfpY4k-uYI;3x;%Zh zKeDX$*%9dW*^ts_N5SN^&yGg7&$Ok_`XZ;#w5QMdA!}>)*)cF}>9clZ+xcI8)*qXF zX1Vm)0AzXk>{w*|%F|~9k>$0|jzgE%K06*=Ui<6>bb0#hL}Xd*v$N3cv-9b*Y&-v}&u+zL zpII(_b{n!heReyte&y-2JCNnI&+bH**FL)oU0(ZaIJ!K2b~m!D_Sqxo_SuD{&mM)z zYo9%aZl7sOpFNJ8KGU8)djeTov(KJ{X-l6yg={_v2W`s^iSS?#ko(e1N~N}s(Alh;0b2i-o?mOgtIIen%* zeKs0dTeHvp3DcH7dk@)m{#T#9kIg=_T>9(-WO@4RLuCER(`O$c%WI!~j4rQz_6fSY z_SvWC^7Pqf$TIuPd!qL;?_l1?EaUxULS*~UJ702}7$$$5dWmb&R=LT?`{NEaEzG-` z-%;dVHXTfE`SkT;^h5eud;0ouxVC0rKLOL`9qcKd^$zwty382UuP>m>)2}Zg>qDOS zUqY7GetiX9Ui)<&Ga zeuZnVIsF@5UUT{ny1eG}8@jya^gFsdId$sIXK?hI)1)wSs^5W321`!blhfqL+L}2{ z0n_$pIZX}MUUQlTU0!pV7F}L*>WVI}IZcNyPfp#CWi_YnGIG*a=I0!+2ym0L`r}@z3HK+N}fh?;zt%q(-_4}FiVaZ8* za@qh{TQjE(VcPyIr%mA6YfhV@%WF=Xq04Jdo1@EXPFtYMlhc;SvYOLQ=;lUHshrSx>$@;_3Mr+dJ6&e5tJyeyZ(hY<`Z?=3Z27cVqMOf;QK5wOxnJd$l&# zMzvjp&HJM^=UBC!h0S}CHpi;kPQ>PYK$|&hGhe^s@lG%Y&xc!gg1L}KQ?C9@W1bfC z=NJ82--plF3 zcXB!#uD#}T4!XSNbS}EQ=5!vqyyi3rU7nlba zwEbC5*TA*coUTQe*PO0Hm)D%GN0--}Za|kOryG%FHK)7K%}HOGpTl9vNqcg-8(CX3 zr+Z-9{w$~a;o56X51`9yP7k8XYfcZL%WF;#qsx=iBgnFv)3fO2RL}b7V97~)a(W(F zTQjE@VA}pHr|? zK-SjG=|h;dKg;P8xb~XUr|9yU(`V@Nn$zd#@|x2aba`_60$Emb`Vrln>RJC2EIDaU zPCp}SYv%L|OxvI3^dGqPn$vIS@|x4{=<=FVr=7X$!)i{QVe;hEhAgW&O@?kx^{k&9 zmYlRFrzw!NHFKI0rtQying*`D<}@w3yynyuU0!pV4qaYz>V_^)PSYdH%&DGzo`E^f zzu}zpy!ZTf@Aq7c?QOW{y|%&hU$s32_q^BUUQ}(v;hy)}T+`KdE!^{7n`@)mE`)pD zYjciO+nI3Bdu@(YwVeR>yw_&V+RQgUC-Rw`KBe4ey!~03x!1lJiSEzFw3&OgJ%T=> zWi$6`yA|D^jakp!tL+MOe>SGg+^cOcx<4D!X71H?8oECl(`N3~b{x7t8`Ea)+RWGA zMfPsv?;tOm64nOPr@p&T_@<&Nn7qVJ&?WIXbbC!EccAeU1N3h=KqthMyrgr z)Lj$V`r7jIxUZRCuATfm?i+MjV*L);dd^qRuXTBT53`&<0Q+RD$Mwt~sCj*t+Bb8+^7vX2Syp|miLS49 z`ZvDTg2}6|wbAAAwGOhZ`q~U#U;8sy@wGWjUVUwWE|0G*k!97_j_CT@zWCY+Ca=DF zqs!xKXJlFRwGXUVZI{E|0JMk!AX-Yp>U8f9y4%ur}Rq+<%-yuFLF0 zufW}Jv^giL?P0k4jW)-)+HQfn-)I{ z0&|XS(DRRSJz$pAmU2Cjt+!Drw;If{+Op=m6HDD^=0KM{+^J(voD11{j$QVdxnY)b zpV6LuW*%g1Ott^oXXb@zGxwqR@@4LQCg5`t`kK7W-Dh%N8`<3FqDL_P2Xejnz5RYL=ZNDxqQ&+{ zHg|2QdjPV${_T+i(e32vPv_F-Kg7sCdZ^>HbB z)<=9^2D6+#wa4e>$lBtw&S&Sf=bLNu0Dh<3y~RD%yqxQ??T5{Ep-q3)whuPfwKn6| zW*eSau9+*)-N&a#_vJo5lr!u*_?5gZ9a&!Y7w)h-Qo$L)^ z_rT=!EV_X@X-9k7xe>0d+0IQcZCL{kP$y@0_Q?lf?Zl=nYwjUr>uSrocoqD( z{0O?aXmegYNnejZw!iHQ?Z(&x`B7wT#yAo0ppc4x-5IreaP0Ud+7Zz%h{*e&C|X70c36F={tM*gD`EG|8L;0OW9-ILbuF>u#DT= zFw5D7_Ke#*$lCNj5%0t~8m5oQ@R5D;QFM9s$;Z%Tb)S43U0(OeC(z}YS5G4AM_$Lu zG0Prv5c`PZ={mQ(ORumi`|_+1mfFqRVW@J;yoWUXwBW0ogg>XSj^@ zPq23SqTb(rhFMly+WNlH)(_~i^x;p))~jRvGt6?1gZ7N|FP7!q9P3|U+7j;_w? z%Nm#vuFd)r@yqnk>HwSVZ?>W(Bb&fmNvz88Iy||uSU;15Kb4x#M zyg$m!0+ZWz&Ul|`dw=SCml%p)nkd2|*EtecmXxa5)S?ea&bCDgNS(zt^^*oro<~Rslo_d3k z&C$Ir^@hOYHOKSO<;n44S97$?+m&W2kn^CC5uzc70gZx{37$ zWOMZY`%J7i!sIo_o6zN{Hw@Vv{k|*pZidNgj<=x8lj9x8$x+*Fyl>@gPCm`SGV0or z30fMqOL-c?Q`Ss@-zQ=ed?$AC|RlVto_YeCpbJ3ns5QzKt$Vy?2n!(VrnE z$9G}!n&W76d2;*!IXP;3kM}=$o0Cs-u#CF4uQ^VNE>FG5kj>FEJ>xhzOkQ)G0$rXQr$J7R+NRs=;X_+C*HpEg2lqQ}>p2&z?G(7*acgr7tL<30 z-*Ia*cWvf-Il6tDs?@<3lmu0TJk8HhqXZ`@)a^4@c=g#~gvNrFJzH@*22&OGLi#pbDxNJ_K-m^ZCO_vl8g2P} zMlgB)otBM}WtMTg{7f>0I`)mW{QZ~jZIr(mAvSP9)2yn7^um0|M4unMxQ#?S*@o)}g|mem+~q8o#@#IQQD zyvDF0x-q!7B!-P(^2D$)vaH6i3A#KnY>F(aF>Hoz4B8UI7Rd4%!w%@iaB=B}9bxjs zuoJSZ#?TvGo)~sUmem+`K{p0%iJ=d&yvDFU`q&ssKO6v)Cx!!&Wi^I_(B+BYU}Ra1 z;Sh9V(3ThuLzdSV`lB1eC8Zw*z~qVHSY%m^VIaCZF&u|1t1%ppZVcKI!->dpW2kp0 z?@+lbe#9Ni`=a+p*K+nT*Y-@$&nP2iZKILw}4t z&N4nN^K2V9)hjc@{Z;XCY_t^Dw#J8RkrTvBmuUG38!{ z$?Nagk8G9m_v};dRhVVn|I_Yk=-vUeg}s67eZ;c41ARq*)H~SM=(5!L+B)NNAK>Zy zHK%Woy(4H#{NEw#x86g(N0-uZa@pOEF|X5VhG-q`LR_xBFFqB|FSChl&? z#_ite**1e^T0YfhM7NAwpR@7w%B+x#m}U$%J&1!qT>Sw`754~NfzoHqSki@DHcwN3kdZkRUP zWXg?=(em?_^3DNcwETQc{e{yU)pQj#^!k1e+wWR)5%oM`LrOqJac0qWLZ0H zrQRaw);p7W$!}3~xqWK9iy_OJ`7I99Mv<}kIX{eLNtpGA6rW3>%j0utWLeYaGB9mT zpUc6F^HL0neR*_wjeP}ldD>YKS=MZ4C78CflfLc&GcV)tu4g{0BFl3xTMb!ef2OZj zN0!IWTFCmao%mTBSsp*@BFn0u_0Z+E)@8{yzSN^`~Ht4PqpIPt!K(6b3dvyI| zj`TvejNG-i3r}BJ?>nH&^sAipz7w)_v)+3n%j)>L-gky+b9}wq+jqvTKmFR~ems3; zz3+-Hvy5`q!*0lF)Ag_ix~#V8`rQ+zEpsY!aPLySuJ?W5+EPAazAsE)+H2g#mbrfb zvN6^5ejvI$<9iUYtex0W?+|qB)irY{x;*h7hAeC5cQ{O2;>}nd1+#u#??;Pwqf)qSNBfyAzR$|9*@tYv%U}Ok3j3 zSbh$(emy(Jpv&X)3uIZ-=f7aunm)gR8D~8^zDAeV*uO!Sr=4$+WzBZJgK0}U>FXb1 z=4Bk&^M68?XV3oyS!RFc?D!Q~9zVY!>%(^9=XYdz{B&mi$*P|=m^^;QL)N#vj=ggr zXUEa(ea>&!g>%KZYCY#i_SYp@YnJns{eNkg+la>hFYgMK@k;X?rzdmAgM@{MJC0yI*JBuZb?dlQBrSwb13m$~nI_ zy1br+>!Ld+w58qkk!{0r@wWlGytca`y1cf#5xTs#yD_@Fw!101^GTcYKJ&(BeqPXz zIcXW!g5{l4vGv7f+}g}RTh8(YVA|_hz7S0QK7EvX%EIV!%cbt(=(bzyE&-F*x=W(V zoA&_k1BvlG{CHpR9%%WR+iBP?YT1lKoBePlPuGv%hh=-j?Iv*>%QZiV{>F#J!8CcYys2ede7%ovcZDO7&AoEV8Wn8Hg^ApW~4AEw5wm9LSyH81^UUx9h^W;#{?!^CNeT zV_0jJ^Oduszl^v0K-T*JWO==F3`DmssgJ9BJWO8eo`5dTo#P5*U#_PsSpX-Z%Un;& z*&9wqc5lf1ISpOrJ{NX6vb@fzGtlK3>obvM&9OcUrY&Qg{Lg`DbALY05py1ce~3A((tdnvlSwtE@6ytX?O-SN=o zyh*?N%$YZcF&#T*%oEEyCb6B4&A6Rs=Af;fd7gbKdoE=?KevVHv$k<6y62}heQMK> zKX-B-T!o(f=^Etb&xWpp$zSGfl>WP+#p=(2ZiLDGc}vD}SgV{r8%i6uz`Wb)*SY0B zeH*e|ADNSPAlLKiE_Bc9%*WyAmXYUNxEom>zuzNUXVETywErW_?}TgnKfx@kEp>lE zmYaiT)0>Qgubi=$pxb{w6Z2)rHRhq{`bo@Jpj$?+&+B;l${Bklx=g>yIb*Lzwyx{U zGxi!}SzTwIvDd=1xz2LN8n^!RYnylQ^p!LAdUTm(l+%|tBBxEy*kS0h+NNW7GfbOp z(#_-cf?G@ZddA)c*Ov0xXK#n;OS|(kaT{CC%Da$_sh+XJ(dC(6cO%Q%i6!;!MYmo( zr|v_SXYaZnS=P+&0hqSLo3VTtX8pP!K7uZf&k@M7rq4%V+L}HehZ$!*W1m2m*Vvy# zm#3YlkY&wwo`z{lJL&7^VCH2UIUAoxmb=D#us&Wymf4>gRQIdHlSAtZ#W8d*?vT*mm|V=eO&^x#C>4p7SGT>~E|!%lXQD=)^wfXIS@^ z>|dQ>merQMsts9Q&)qKQ`lI@|x)Z|WweCdd@|?S~Yv<(}TZ=_8F}ln(rkp)yQe^ih zKP!Yy4wGl!nPYKJs($lU|J;pr>;&KKx1{VHeQ z`4ZW>*>}D|meqOYzVkIqoAWIDj&bWxzqa`wp1!j0e2Xr#jB@s!?~&7{`_7N(vf8Hm z&QCCHncGLI#&Tkq_3OSf3A#K!CqzB41TJbq?D)`#uH&#cJu z_?Zn^R{hM5E{~t?$oiJov3Cw+-|5f#cYeDroGZ>%>p4HN?@Y~Fvz)K&G1J22-fgnS zbVZlfyW@1|@_Kii9^L&&TiTcr**5B4G&4+I+n5DiUfY-zU0&Om4c&c9o4IFy@|k<( zVA`{c`>^FZ`laLdQ_sL=jM|J>n|^Yy^cg?rP}V!DcUFDYHcmnJj;c+c+Vtb^PPsSu zJ5yO>b0IhHr}Mz%^>>%%Yq2p*z>LRVVe)!sU7%I2-cPrHd0yx@d-7Jua(!gaU5$L* zbKSRkQhs%GS?ctmtb4m{xc{Ap%~$sEZPCroXMAplT=(%_==#ap-vQk+a((W~(^vNK z9nod_Rn9)%8`-+9TknrMBg^W#bsygarpvSII^sn-w`lvi8o_;G|c*SAMcAUkI#O{vZl{tVA`5K z`@@X0?&AZ{&6JNWgL^?o_JYs6>P`xVG_y%B+Z@i*SJwMY=rYSFXT9Hy zoHkwWx1!5xn`1xg!?a~iWe(m^%GdRNCtO>~XUy+{-NswHW1hH;E$j9kWMiu9{a$o= z#`ivCSvxtV-UH~?t83;#ba~=^2wB$5?_rp>#GA2v6lVRp-XBAk$LHh7vZl``VA`5K zpMn`@UGGn$%WLexA;2(-F?Pa>K+A?dxuEfqmkwHj@B1l z{urH~pRe^pw;gR^?-Reg{><$|nEWbDq~?_0BmMCa-tS^IPS- zbLJfAyy1V}CEL(tvCq`7&x|h1*)trU`5qy0-vjg9GS-y47umAf!tO_w8<+e2p7`~Z zb8As_`^0DBSsb~ZTT7tpCwtwJ=$4V|b9tV=a&9e!F4M1a&aGvTt?NGJxwR~^tnO2u zTg$<;QDoe?W!(DHuWhcu(^t-|70_jtQO>!w5^~z~+*$=)R@-#F_kd}$%`UvNm-Z~> z>$$ZWTwBU#?^+$EFYV5`#BFRjf7U`arh0CzjV{mlu7fOVCzjM(58Zlo?_VEXo_IGv zmNoO+5T-5hW-K>>S-+lJo1)9(b2DUF)92Zi(qp0L%L`@pS zMj&O##^CWR6ytV<9q+O zJFCuG&wBR$@BQrS^FHT2?{^MBi&@XSZ=C}z9y{kkYePS=a~`yK?3@oRR_%NnUOaX# zfY!En?Y(;-?^`1|m)zf87w#4Js_WbzImaL3T2s$g_QQNI-?uz-^4{}^G(%b5dlo>8 z*R%cC@Y<{I3y*<`*R_k`#a&y^OV7=myEkITv)8j&{kGiN&fQVqp1sP9Lz#B`y_MJH z6U@oyDQN$FxB8upC19R&%5oN6hK>3;{6FLwIp3C|>pE)_+biJn9g*lg2d1tv&yU5} z@Rf7$$MDAJ9N#xW*K=?*ymoT!jDc52T$|&WedQb+3ooW!>70Y(pk3>}_Z++#TCDDS z&%s;3l)3M7|8Csc)2=@6VD^=Ba00xTI?_1@Z-tIe&%sIXV%4YT;O$__^jXir$wj}O zgHynjML*ZVR4{ERcMl|PW6OCq9om@cIXDAeJiVL=Ep`?0WZj+cuB&IsUGU;LOJ+ff zwdOY)Oj+VhFYg6&eLV;7gBOp@|ArQ8wRu07vR0cv2Q$uk4*mjOyvF`N@Z$0FOK7oH zKfeM~7C))=95C}Tj+|d}p~Z84Jp?UgJ#!8|teg=$3!t^3pV(OlEgn0MLW@;9i{Qm$ z=P_t)i`U+}2XYQx%Q@lx_PTJdxK~~0{>VA_JlC3fzJjf6Fwe4jws^+mjJkm}o>QJ% z>bLoAJEN`x_ncCueP#2Td;TY(mDk_gJ_RP8-`p;N7E>qdo`u(EUAGiWJnNQ0i>Z_I z`zC&)sz3L3Y>fsJueQd(i^tYjXt8SR7ISg3^4nr(_n$g1@*8A-Pwnrk-7ndj z%AN%G_teVlW0lPTpWDc+WtGhW_xIGUGoLD(1itzA)X3atRW=%#zo&Mcy{@uR;QpRk znf0!+;ou`0nK>)-{56OF#fLferUur@_l@6!iAU#oXmhPPFMx@scPpXA`d}xY5m&)$ zOId8a2yJbut(U;WW9wyTvHCsYSKzg$EVf>SwwBe_YhdEB^*XeeJx*M2z-v!gY^{d2 z_SM!~VB*nP18ong&RQ_>_*(}pR_m}HUR%my>s@GjR&BipCLUWGpv7t(Ho|L9S!}%z zZI7$155UA@i$k}aSgk{QFzqRG{}1oicCX>=+3sFg&UN*Rqqq1expFu8}sK zDd^nU=&WjVtg$*@DhMGU;Ghr#)0kS$X@$kMc(t;`)*9M|{sSzrgrCL)#<3?C&c0YZ(3(H}}^s!i$?r z^!^WC{P68R#9o6pmI3JH-!6I`Ox(ZA#oin6u2*I(r(xqw=o6Tgo!@=Cb}N`SFvPuA z(hsHG{8_;N&&k-8yS{xF?wc4Nz}H+lfSHT`=0JRR1QQ=ta@ihU{LF%NhBp`AbF;P! zn7Yam_YTlQSf|XmH{x$sXmRhQwOQjfPUY#rZ#jSMf#1E0pQpjBt?#R;_cLJP)**UJ z;l*nmm%&>{WvSzGXz{;RNBt{L9alhG#~RNcz^qS==Xo%3^GiG{;l*oxR>4~zWvR~} zp~e4Nee|!~>t!!|`to{t5*vHMi@A@b&G=df|?u+b_KJ0 z!Zqsno0g9FI0jmIdgc8({|r*QW5Et%xUU@UJu&r-@i=B*#&{=Z%|F148Kbm11B%Xx z&?hm@WT@ku_`V5!Z;8+Sm-x;>rabX^R%lln+RHvU1=`Qcu8rM+VAZZVv3n}C^4LvH z2Z5>QK8T&c@YRkwvGa9k<*_r2>(aWO0j3Y-HD+Va`95S2&sN~Ah5F```VWQfhm zbB*>=Yv;tin*C#cy>=7(8nEYs4w>{6!f7tu=;9~Yf zTAdC>$KG!Mf5(B2bK-j!I<+;v+WYt5l_x&))~+_Rm)>uLZteXhuxeMG^z40T<*}Rk zwZpc0wfF78svUJ=XDevsv6J3!4W;0MQe%KRU%sxr0 z^Vy=~e)u^2UX6}(;_C&SdK+Ke553`)Cq8STUHxb;`{5JNt^47VVAZZV>Eqte%40Y6 z>jS1<-4FY~S3By&&ZnW3$4>UcXTbEKyvA(o*$?|do1e8%-+WU4{h-|swfqM#niX21DI>?kAN4mC(`PiSaj_DQSe7L zI?m~RKj_rf_-gOJtR5rrnYVWJqrLS0Xz1479|KnHs*|1_3#~kMQ@`WD)T_Pk4`1!5 z6FbL4E03M@{sb_6D6cUadwTyBX!Elc>YGpMe-dxd!6XR&GQH=UtC8oapAIn_#$QXDr zdnX;=w?SX>H+)Y*ro7en?O;D)RNrFiTc7xGPA$%&R_0cFI}|K=E3bK<3$MJ@_jzE+ zJG~K8-@Gqku6ch8Ud+6ullKMC$-C9}g~*h*`u+}B@{VsY_02neoRjzE(B@swgkfOG zTY1gU zclc+_k)Rh4kVrj;ZqCcwH9;WmAA$-7tC6? z_i|4lroOdU$XshN4_?e#NXPel=+vUs_an%ZxB6ZHW-Y33G4-uQ{5Yo;OQ5yyn)qG@ zpS+dVyqCi(Z}q(bEP3a;6I0*3S2EYUpMw`OZ|V5{19b9k_5D0D<*mM7088HSEvCMC z$B%RJUJY&D^_pJ;pS+dVyw}1jZ}q(nEP3a;6I0*3H!;_|*TajMw{-G;4?20b`rd#{ zd8_Y@V97ha#ndt;%BM5LwJWWk*$wX;KSwow)HxeJ_cF)N{m{ze=N@?F z@uU21hPZyD`|-KjXLk=n``pMl`x2wi%jScLtJ9u&0mElG`cTJbQwtmXg6`Y48_Suv z2;Oz#k21QFqv!cNXl3^Hab{n64zn136T_IC&HaOhcTVodH@T~G7P)W5xUhTM-xRii z)_-cT9lZMD*1SEl`l*HTcJd7UO6NYWGqh*BwaC8j0_NvHW!7USmUo372c{qE;om#D zfr;mD9o?bDVrNHaZHdQU4`}^a*XZ>G^F2mc{OtlgzQy0JVB+z&8?;#L><+Chacke3 z*_XB76S^1UK!!DN&UJMVbneNGxqfCi7+!gkmR^|!^(31EGiYssEwe;C7w$dsq2Cqa8{M8`ce08BhJ`$y<}zO)y{kz7xP zR-Rn5W*}J3WcPq^X3eS4%3If*4wkdDb;}I* z!@c3`KD7?Lpv`l5W2ZN~*aV(=cIF!_>U4$odi^{@xxTEQz0;32wI7>%Lsy%hf)~?f z;_aahJu#mvnpk>*iO28G(DADc{i>6Fv>UW>s8?e#rtG7E_%MERR^K>12kpHw*Lfb9 zgLC$}=bC%LXW8oH9Q2%$_w00yXQsV&zr74y_nYrSo=4X36=ce@-(H1wzeUIW_8Po+ zK6kzW?X!uzr^VKrV9KKRXK3HU-Q%&R&(&bcqW3m*e@3glHDJo3w+`C(=sx-E)V+o2z+b&m9IPo;}wWI)1gGUv;wQj)XQ2^=d4}lsz|?J{Z3_t8bj{Is30H z`=t-}HFdvuuBONPC}U*5d>Y#Q5*_!;XTZd>W?$&KFZP4azQ{WF#s1*RvhG0W+W*hN zr~h@`=fRbw|9=OqPwmKmv1x1Y+=|F1yT{`(%Co}7eCdHO#9+Wtq!{(lurJZnyduKhm+KK;)+`#%s|S=N0G zy7vE{;M4!Q?lf>^>Hq1_`qZBNAIj`2{XY|a5W`+Mr&oiajXnMUI<#2r{~7S;h|>S>B2%9JUkq*kqhtRs0TWLjzYksee<^(WpLO>CGH_*C z_XFtK{~yAq|8?Ev;L6hfE1>nMJ^Me3*;o2M0{%*dy>d>khCv&9`hOL)SndCC`1C=! zzO0Eg*N--}ADdT0SDQbA7pwihMtz2Pr2iwK#nb<5q2pH@`c)_WzYf|s)T^-=Q~G~B zwDFs>`o?Mh?WeNze;jn}zu%=uPi{u0JpI1~+Wtq!{*MO}&-?ZS=-e;Vb9*AVve>>2 zy51K|g3o4S28SrconA8l$sHfKUtn?HjWtNp(d-ki)M{l5!ZJpG>q9lzSpuR7`fY-r<9uf}3b z>Hj^@#&6E*8>juZpUTqzIncHL!%F|>B2%9J&x5xA(Xsyzi80cj`Ovk`3*h%F@?S&O zelCKq@8^%fYr}Q+^I2wJ>F00Z7c;EAb87!Mw6Ub0Pe6;+e*OkNbycn}bF_x~(Wdre z^GWDx^C@_-+Rr8M=42k}=hM*Q>E|=h@v9B}s*`^H4%#@>tFahU`neR^_{~{;F3MP_A@&6^A#}hta%l>_Vac4Q;Pge=-SUe!`Juc)$rPI zo&DUz>?{3T2mcns+B>KAZ$leP`nd*LtoCy)eCn!PU*>2H^`lMg$L4zIYV#d6GZiF@t^=d4}lzzT1%`j*6jnjVGA7$z1N6!Dte)|8= zr8k|CDNjGUK-A@aQ6_Jr4l>+I(zn0=+6 zyTk9yu=dWW{VvePl78+AEmr%v8+_`jTwmsB4fUfHNd8D7c zpvBYA-q7)@4gIQpu6vx`n1i$Yy$$c2&-`ce z*?#kLA_7v!=e@4+Ij#K6hIh^ypE3J+I?oAw7VVlD&6>UE8J)kZ2 zz5u2@^|dFjUaP%h!L+B3*gFnPdpvsCVy{1#_SDy&yn3znP6N~4h+=OLnD%%qyv5#N zFzus$pZ!^XYrQo?eR02E+^T;AxX=As^~L?Ja`fFJ>A$o56|8eV zIH%q>A$xk@hx_aYjn3uFt{H>eHO^j3?xAPU_ZgBpyYNSYamey4e>}8u>+Q4rpTH}( zcb-AY$1=pVE3Kc24euO3zia%c(-S|FnB!+MwDS154PJTtD8H20WB6gzk$}4_+4H@#Q7AovH3mtY3=xT^}v?Ei+gT8!|cnwA^tQ&%-TuE z&N682cWU-!be!#@c9%nI*P5&EdVM^{>`Nc&tYC=gL)v{|59P&^&kN8O5x4PMm!+Nf zJ2v#Q%>KKo_QqbU0uxW4{|N0`@z{C^THG9R@9-M5_k!*R`;l7v`TKQb%JusO^P3F) z`fq{h_X+4fHF#oM-RN}2Kw^6fOngSukGG-4yne0CI%r?kM%h}%I}U2$oOK(ZUFW&% zy7!^8PT3|#C$1gWIs18YYvwKtP7x9E%L39yQVYV^!IO#d=F@K z)8p?#>&IBXLtb7(7lVn>jL;;}stTD!_dHhXGVgDFd2 zhC|CIm#d+ZtFo+#d}NWUtK5-TMnSvB)QgY*gcgsD|ALMWW%{rC^2Q=pS6i;1K#ls7 z(`ab*bB>OI7jvK7%$Rs3b#oql6kGL-^ZrfDH93p4oA(&! zE75VEd%xkipZomWpLqY^nn}!?YgN{GFXa10)=X@4yw`D!_gk)Ujvw#Se4oi0@8{I< RKFl?}kjp!7VwZlA@&6OM_%i?i diff --git a/src/vulkan/spv/gemmi_dp.spv b/src/vulkan/spv/gemmi_dp.spv index dede9ce9e648847c8899f83e6d2d3f656c01b272..962b6e70f87067b61fc52de44e390eec6db8698e 100644 GIT binary patch literal 222900 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