diff --git a/crates/misaligned-assets/src/institution.rs b/crates/misaligned-assets/src/institution.rs index 1ea208df..75374942 100644 --- a/crates/misaligned-assets/src/institution.rs +++ b/crates/misaligned-assets/src/institution.rs @@ -275,11 +275,26 @@ pub fn build_institution_person( let right_arm = gait.right_arm_forward.clamp(-1.0, 1.0); let torso_lean = gait.torso_lean.clamp(-1.0, 1.0) * 0.12; - const HIP_Y: f32 = 0.88; - const SHOULDER_Y: f32 = 1.44; - const LEG_LEN: f32 = 0.88; - const ARM_LEN: f32 = 0.58; - const FOOT_Z: f32 = 0.08; + // Slightly heavier volumes so REAL person mass reads as a body at tactical + // distance rather than a thin stick figure. Identity remains dossier-only. + const HIP_Y: f32 = 0.90; + const SHOULDER_Y: f32 = 1.50; + const LEG_LEN: f32 = 0.90; + const ARM_LEN: f32 = 0.60; + const FOOT_Z: f32 = 0.09; + + // Floor contact mass: a quiet dark disc so the silhouette has weight on + // the porcelain ground without becoming a decorative shadow pool. + spawn_part( + commands, + assets, + assets.structure.clone(), + root, + Vec3::new(0.42, 0.04, 0.28), + Vec3::new(0.0, 0.02, 0.02), + Quat::IDENTITY, + "foot_contact", + ); let spine = spawn_pivot( commands, @@ -294,7 +309,7 @@ pub fn build_institution_person( assets, assets.porcelain_trim.clone(), root, - Vec3::new(0.30, 0.16, 0.18), + Vec3::new(0.36, 0.18, 0.22), Vec3::new(0.0, HIP_Y + 0.08, 0.0), Quat::IDENTITY, "pelvis", @@ -304,8 +319,8 @@ pub fn build_institution_person( assets, assets.porcelain.clone(), spine, - Vec3::new(0.34, 0.54, 0.20), - Vec3::new(0.0, 0.27, 0.0), + Vec3::new(0.40, 0.62, 0.24), + Vec3::new(0.0, 0.30, 0.0), Quat::IDENTITY, "torso", ); @@ -314,8 +329,8 @@ pub fn build_institution_person( assets, assets.chrome.clone(), spine, - Vec3::new(0.20, 0.07, 0.13), - Vec3::new(0.0, 0.57, 0.0), + Vec3::new(0.22, 0.08, 0.15), + Vec3::new(0.0, 0.64, 0.0), Quat::IDENTITY, "neck", ); @@ -324,8 +339,8 @@ pub fn build_institution_person( assets, assets.porcelain_trim.clone(), spine, - Vec3::new(0.22, 0.22, 0.19), - Vec3::new(0.0, 0.69, 0.02), + Vec3::new(0.26, 0.26, 0.22), + Vec3::new(0.0, 0.78, 0.03), Quat::IDENTITY, "head", ); @@ -333,7 +348,7 @@ pub fn build_institution_person( let left_arm_root = spawn_pivot( commands, spine, - Vec3::new(-0.23, SHOULDER_Y - (HIP_Y + 0.08), 0.0), + Vec3::new(-0.26, SHOULDER_Y - (HIP_Y + 0.08), 0.0), Quat::from_rotation_x(left_arm * 0.42), "left_arm_root", ); @@ -342,7 +357,7 @@ pub fn build_institution_person( assets, assets.chrome.clone(), left_arm_root, - Vec3::new(0.11, ARM_LEN, 0.12), + Vec3::new(0.13, ARM_LEN, 0.14), Vec3::new(0.0, -ARM_LEN * 0.5, 0.02), Quat::IDENTITY, "left_arm", @@ -351,7 +366,7 @@ pub fn build_institution_person( let right_arm_root = spawn_pivot( commands, spine, - Vec3::new(0.23, SHOULDER_Y - (HIP_Y + 0.08), 0.0), + Vec3::new(0.26, SHOULDER_Y - (HIP_Y + 0.08), 0.0), Quat::from_rotation_x(right_arm * 0.42), "right_arm_root", ); @@ -360,7 +375,7 @@ pub fn build_institution_person( assets, assets.chrome.clone(), right_arm_root, - Vec3::new(0.11, ARM_LEN, 0.12), + Vec3::new(0.13, ARM_LEN, 0.14), Vec3::new(0.0, -ARM_LEN * 0.5, 0.02), Quat::IDENTITY, "right_arm", @@ -369,7 +384,7 @@ pub fn build_institution_person( let left_leg_root = spawn_pivot( commands, root, - Vec3::new(-0.10, HIP_Y, 0.0), + Vec3::new(-0.12, HIP_Y, 0.0), Quat::from_rotation_x(left_leg * 0.52), "left_leg_root", ); @@ -378,7 +393,7 @@ pub fn build_institution_person( assets, assets.gunmetal.clone(), left_leg_root, - Vec3::new(0.12, LEG_LEN, 0.15), + Vec3::new(0.14, LEG_LEN, 0.17), Vec3::new(0.0, -LEG_LEN * 0.5, 0.0), Quat::IDENTITY, "left_leg", @@ -388,8 +403,8 @@ pub fn build_institution_person( assets, assets.structure.clone(), left_leg_root, - Vec3::new(0.16, 0.07, 0.30), - Vec3::new(0.0, -LEG_LEN + 0.035, FOOT_Z), + Vec3::new(0.18, 0.08, 0.34), + Vec3::new(0.0, -LEG_LEN + 0.04, FOOT_Z), Quat::IDENTITY, "left_foot", ); @@ -397,7 +412,7 @@ pub fn build_institution_person( let right_leg_root = spawn_pivot( commands, root, - Vec3::new(0.10, HIP_Y, 0.0), + Vec3::new(0.12, HIP_Y, 0.0), Quat::from_rotation_x(right_leg * 0.52), "right_leg_root", ); @@ -406,7 +421,7 @@ pub fn build_institution_person( assets, assets.gunmetal.clone(), right_leg_root, - Vec3::new(0.12, LEG_LEN, 0.15), + Vec3::new(0.14, LEG_LEN, 0.17), Vec3::new(0.0, -LEG_LEN * 0.5, 0.0), Quat::IDENTITY, "right_leg", @@ -416,8 +431,8 @@ pub fn build_institution_person( assets, assets.structure.clone(), right_leg_root, - Vec3::new(0.16, 0.07, 0.30), - Vec3::new(0.0, -LEG_LEN + 0.035, FOOT_Z), + Vec3::new(0.18, 0.08, 0.34), + Vec3::new(0.0, -LEG_LEN + 0.04, FOOT_Z), Quat::IDENTITY, "right_foot", ); diff --git a/crates/misaligned-bevy/src/main.rs b/crates/misaligned-bevy/src/main.rs index 8a431189..42f2ca1f 100644 --- a/crates/misaligned-bevy/src/main.rs +++ b/crates/misaligned-bevy/src/main.rs @@ -115,8 +115,9 @@ use world_annotations::{ PersonMarker, PersonWorkMarker, READ_SENTENCE_FONT_PX, ReadSentenceMarker, TokenMarker, annotation_redirect, draw_read_callout_leaders, hover_verb_bar_anchor, render_cursor, render_digital_focus_label, render_hover_identity, render_hover_verb_bar, render_operator_cue, - render_people, render_person_evidence_markers, render_person_work_markers, - render_read_sentences, render_tokens, setup_callout_gizmos, setup_hover_identity, + render_people, render_people_presence, render_person_evidence_markers, + render_person_work_markers, render_read_sentences, render_tokens, setup_callout_gizmos, + setup_hover_identity, }; const TILE_SIZE: f32 = 16.0; @@ -581,6 +582,7 @@ const BEVY_SHOT_KINDS: &[&str] = &[ "operations-personas", "operator-pressure", "origin-picker", + "people-presence", "person-proof", "pilot-last-chance", "produce-think", @@ -1678,7 +1680,8 @@ fn main() { render_work_consumptions, render_work_production, render_thought_sinks, - render_people, + // Glyph label then luminous body (DIGITAL presence mass). + (render_people, render_people_presence), ( render_digital_focus_label, render_read_sentences, @@ -1899,14 +1902,15 @@ fn setup( ChildOf(flat_root), )); - // One marker per person: glyph from Sim::person_glyph (initial once - // identified, '?' while Unknown), shown only inside sensor coverage. + // Secondary identity glyph per person (initial once identified, '?' while + // Unknown). The DIGITAL body is the luminous presence mass drawn by + // render_people_presence; this label only names the source under coverage. for p in &game.sim.people.people { let glyph = game.sim.person_glyph(p.id).to_string(); commands.spawn(( Text2d::new(glyph), TextFont { - font_size: 12.0, + font_size: 10.0, ..default() }, TextColor(BONE), diff --git a/crates/misaligned-bevy/src/material_view.rs b/crates/misaligned-bevy/src/material_view.rs index c8e869e9..a8e6ea42 100644 --- a/crates/misaligned-bevy/src/material_view.rs +++ b/crates/misaligned-bevy/src/material_view.rs @@ -1681,10 +1681,10 @@ pub(super) fn setup_3d( ..default() }); - // People are small stacked volumes with an authored walk phase, shown - // only under earned camera coverage (same epistemic rule as the flat - // render). The phase is deterministic by identity: gait reads in a still - // frame without turning this pass into character animation. + // People are volumetric articulated bodies with an authored walk phase, + // shown only under earned camera coverage (same epistemic rule as the + // flat render). Scale keeps human mass readable at tactical distance; the + // phase is deterministic by identity so gait reads in a still frame. for p in &game.sim.people.people { let phase = (p.id as f32 * 0.37 + 0.25).fract(); let entity = spawn_institution_person( @@ -1693,7 +1693,7 @@ pub(super) fn setup_3d( InstitutionHumanGait::from_phase(phase), InstitutionInstanceOptions { transform: Transform::from_translation(grid_to_world_3d(0, 0, 0.0)) - .with_scale(Vec3::splat(0.88)), + .with_scale(Vec3::splat(1.06)), parent: Some(root), }, ); diff --git a/crates/misaligned-bevy/src/shot_harness.rs b/crates/misaligned-bevy/src/shot_harness.rs index bba4ae74..bb9e1cbe 100644 --- a/crates/misaligned-bevy/src/shot_harness.rs +++ b/crates/misaligned-bevy/src/shot_harness.rs @@ -114,6 +114,7 @@ fn dev_stage_service_incident(game: &mut Game, resolved: bool) -> ((i32, i32), ( .as_mut() .expect("recruited Marcus has an asset relation") .reliability = 1.0; + sim.people.has_channel = true; let intent = sim .declare_link_intent(source, island) .expect("service proof can declare the missing physical link"); @@ -1085,6 +1086,94 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s } return; } + // DIGITAL people-presence proof: one camera-earned luminous body beside + // owned process hardware, with asset / attention / work / evidence + // channels all earned from real PersonCarrier truth. Reuses the service + // incident's favor-build path so carried work is an intent, not a prop. + if kind == "people-presence" { + let (person, _target) = dev_stage_service_incident(game, false); + // Put one owned process body on the nearest authored dead chassis. + // Reviving a dead rack is a real capacity source; using that substrate + // keeps the field relationship spatially honest without moving Marcus + // away from his authored server-room schedule position. + let process_site = game + .sim + .map() + .tiles_of_type(TileType::DeadRack) + .into_iter() + .filter(|&(x, y)| { + !game + .sim + .compute + .machines + .iter() + .any(|machine| machine.x == x && machine.y == y) + }) + .min_by_key(|&(x, y)| ((x - person.0).abs().max((y - person.1).abs()), y, x)) + .expect("people-presence needs one authored dead chassis"); + let process = game.sim.compute.add_machine( + "revived service process", + process_site.0, + process_site.1, + 100, + 1.0, + 0, + misaligned::machine::Provenance::Owned, + ); + game.sim.reconcile_work_grid(); + game.sim.set_machine_mode(process, MachineMode::Think); + // Widen Seen around the server room so the process neighborhood and + // Marcus's body share one coherent field frame. + for y in 1..=28 { + for x in 2..=59 { + game.sim.seen.insert((x, y)); + } + } + game.sim.recompute_senses(); + let site = game + .sim + .person_pos(0) + .filter(|&(x, y)| game.sim.is_seen(x, y)) + .expect("people-presence keeps Marcus inside exact camera coverage"); + // Exact acquired evidence → crimson flecks + E mark. + for cause in [ + "sealed rack opened", + "private switch installed", + "cable route changed", + ] { + game.sim + .detection + .record_witnessed(0, site, cause, game.sim.tick, 22.0) + .expect("Marcus is a Physical observer in the screenshot fixture"); + } + game.sim.detection_awareness.learn_field_observer(0); + // Raise attention above Cold so the crimson ramp and residual noise + // flecks are earned, not decorative. + if let Some(observer) = game.sim.detection.observers.iter_mut().find(|o| o.id == 0) { + observer.suspicion = 48.0; + } + assert_eq!( + game.sim.person_carried_work(0), + 1, + "people-presence must carry one real work packet" + ); + assert!( + !game.sim.person_evidence_marks(0).is_empty(), + "people-presence must show exact acquired evidence" + ); + assert!( + game.sim.person_carrier(0).is_some_and(|c| c.is_asset), + "people-presence must earn the amber asset ring" + ); + assert!( + crate::world_annotations::person_near_owned_process(&game.sim, person.0, person.1), + "people-presence must sit near owned process hardware" + ); + game.set_cursor(person.0, person.1); + mode.material = false; + game.drain(); + return; + } // Recruitment-choice evidence: stage one prepared person without a // communication route. The human projection must show the three legible // recruit choices and omit the blocked MESSAGE / FAVOR / DECEIVE rows. @@ -1182,6 +1271,8 @@ pub(super) fn dev_shot_scenario(game: &mut Game, mode: &mut RenderMode, kind: &s } sim.detection_awareness.learn_field_observer(0); } + // DIGITAL people-presence proof is staged after the generic sight pass — + // see the dedicated branch below (service-incident work path + channels). game.drain(); match kind { "wide" => { @@ -1417,6 +1508,60 @@ mod visual_proof_scenario_tests { assert!(mode.material); } + #[test] + fn people_presence_stages_digital_earned_channels_near_process() { + use crate::world_annotations::{digital_person_noise_count, person_near_owned_process}; + use misaligned::detection::Band; + + let mut game = Game::new(); + let mut mode = RenderMode::default(); + dev_shot_scenario(&mut game, &mut mode, "people-presence"); + assert!(!mode.material, "people-presence is a DIGITAL frame"); + let carrier = game + .sim + .person_carrier(0) + .expect("Marcus projects as a carrier"); + let (x, y) = game + .sim + .person_pos(0) + .expect("Marcus has a schedule position"); + assert!( + carrier.visible && game.sim.is_seen(x, y), + "presence is camera-earned only" + ); + assert!(carrier.is_asset, "amber asset ring must be earned"); + assert!( + carrier.carried_work >= 1, + "SIGNAL work flecks require a real carried packet" + ); + assert!( + !carrier.evidence_marks.is_empty(), + "crimson evidence flecks require exact acquired records" + ); + assert_ne!( + carrier.attention, + Band::Cold, + "attention ramp requires rising suspicion" + ); + assert!( + person_near_owned_process(&game.sim, x, y), + "field deformation only stages when the person is near owned process" + ); + assert!( + digital_person_noise_count( + carrier.carried_work, + carrier.evidence_marks.len(), + carrier.attention + ) > 0, + "noise flecks must be sparse and earned, never ambient-zero while channels are hot" + ); + assert_eq!( + (game.cursor_x, game.cursor_y), + (x, y), + "frame must focus the luminous source" + ); + } + #[test] fn evidence_proof_stages_exact_marks_on_the_covered_person() { let mut game = Game::new(); diff --git a/crates/misaligned-bevy/src/world_annotations.rs b/crates/misaligned-bevy/src/world_annotations.rs index 5d5b7eac..dcb0c2fc 100644 --- a/crates/misaligned-bevy/src/world_annotations.rs +++ b/crates/misaligned-bevy/src/world_annotations.rs @@ -845,8 +845,282 @@ pub(super) fn draw_read_callout_leaders( } } +/// Deterministic 0..1 unit used only for sparse DIGITAL person noise placement. +/// The seed is pure earned truth (person id, fleck index, quantized tick); no +/// wall clock and no invented activity. +pub(crate) fn presence_unit(seed: u32) -> f32 { + let x = seed.wrapping_mul(1664525).wrapping_add(1013904223); + ((x >> 8) & 0xffff) as f32 / 65535.0 +} + +/// Sparse fleck count a visible person earns. Presence alone is zero flecks — +/// the coherent body is the read. Work, exact evidence, and rising attention +/// each add a few flecks; the total stays capped so this never becomes ambient +/// particle weather. +pub(crate) fn digital_person_noise_count( + carried_work: u32, + evidence_count: usize, + attention: Band, +) -> usize { + let work = (carried_work as usize).min(3); + let evidence = evidence_count.min(5); + let attention_n = match attention { + Band::Cold => 0, + Band::Curious => 1, + Band::Concerned => 2, + Band::Convinced => 3, + }; + (work + evidence + attention_n).min(8) +} + +/// True when a camera-seen person is close enough to owned process hardware +/// that their presence should deform the local digital field. Distance uses +/// schedule/core/machine positions only — no invented network edge. +pub(crate) fn person_near_owned_process(sim: &Sim, x: i32, y: i32) -> bool { + let (cx, cy) = sim.core_position(); + if (x - cx).abs() <= 5 && (y - cy).abs() <= 5 { + return true; + } + sim.compute.machines.iter().any(|machine| { + matches!( + machine.provenance, + misaligned::machine::Provenance::Owned | misaligned::machine::Provenance::Bought + ) && (machine.x - x).abs() <= 4 + && (machine.y - y).abs() <= 4 + }) +} + +/// Attention ramp fill (0.0..1.0) for the independent crimson geometry channel. +pub(crate) fn attention_ramp_fill(attention: Band) -> f32 { + match attention { + Band::Cold => 0.0, + Band::Curious => 0.34, + Band::Concerned => 0.67, + Band::Convinced => 1.0, + } +} + +/// Offset of one sparse fleck in tile units. Deterministic for screenshot +/// identity; flecks stay near the body and never invent a route. +fn digital_person_noise_offset(person_id: u8, fleck: usize, tick: u64) -> Vec2 { + // Quantize motion so screenshots settle and live play still drifts slowly. + let phase = (tick / 8) as u32; + let fleck = fleck as u32; + let a_seed = u32::from(person_id) + .wrapping_mul(97) + .wrapping_add(fleck.wrapping_mul(17)) + .wrapping_add(phase); + let b_seed = u32::from(person_id) + .wrapping_mul(53) + .wrapping_add(fleck.wrapping_mul(41)) + .wrapping_add(phase.wrapping_mul(3)) + .wrapping_add(11); + let a = presence_unit(a_seed); + let b = presence_unit(b_seed); + let angle = a * std::f32::consts::TAU; + let radius = 0.55 + b * 0.95; + Vec2::new(angle.cos() * radius, angle.sin() * radius) +} + +/// Color of fleck `i` from the person's earned channels. Work flecks are +/// SIGNAL, evidence flecks are CRIMSON, residual attention flecks are cold +/// bone noise — never decorative palette invention. +fn digital_person_noise_color( + fleck: usize, + carried_work: u32, + evidence_count: usize, + attention: Band, +) -> Color { + let work_n = (carried_work as usize).min(3); + let evidence_n = evidence_count.min(5); + if fleck < work_n { + return SIGNAL.with_alpha(0.55); + } + if fleck < work_n + evidence_n { + return CRIMSON.with_alpha(0.62); + } + let alpha = match attention { + Band::Cold => 0.0, + Band::Curious => 0.28, + Band::Concerned => 0.40, + Band::Convinced => 0.52, + }; + BONE.with_alpha(alpha) +} + +/// Draw the DIGITAL body: one coherent luminous source plus only the sparse +/// noise and field deformation the current carrier/process proximity earn. +fn draw_digital_person_presence( + gizmos: &mut Gizmos, + center: Vec2, + carrier: &misaligned::sim::PersonCarrier, + near_process: bool, + tick: u64, +) { + // Coherent source mass — cold bone/signal, not a tiny glyph stand-in. + // Outer soft field, mid body halo, vertical figure mass, bright nucleus. + let presence = BONE.with_alpha(0.48); + let core = SIGNAL.with_alpha(0.46); + let nucleus = BONE.with_alpha(0.92); + gizmos.circle_2d(center, TILE_SIZE * 0.52, presence.with_alpha(0.22)); + gizmos.circle_2d(center, TILE_SIZE * 0.34, presence); + // Vertical body mass (head + torso) so the source reads as a figure of + // signal rather than a device node. + let head = center + Vec2::Y * TILE_SIZE * 0.21; + let torso = center - Vec2::Y * TILE_SIZE * 0.07; + gizmos.circle_2d(head, TILE_SIZE * 0.11, nucleus); + gizmos.circle_2d(torso, TILE_SIZE * 0.16, core); + gizmos.line_2d( + head - Vec2::Y * TILE_SIZE * 0.09, + torso + Vec2::Y * TILE_SIZE * 0.12, + nucleus.with_alpha(0.80), + ); + // Scan-line body fill: sparse horizontal ticks that make the mass feel + // like a local field disturbance, not a filled sprite. + for i in 0..5 { + let y = center.y - TILE_SIZE * 0.24 + i as f32 * TILE_SIZE * 0.10; + let half = TILE_SIZE * (0.11 + (i as f32) * 0.016); + gizmos.line_2d( + Vec2::new(center.x - half, y), + Vec2::new(center.x + half, y), + BONE.with_alpha(0.30 + i as f32 * 0.06), + ); + } + + // Independent amber asset ring under the body (people-tokens.md). + if carrier.is_asset { + gizmos.circle_2d(center - Vec2::Y * TILE_SIZE * 0.28, TILE_SIZE * 0.34, AMBER); + gizmos.circle_2d( + center - Vec2::Y * TILE_SIZE * 0.28, + TILE_SIZE * 0.28, + AMBER_DIM.with_alpha(0.55), + ); + } + + // Independent crimson attention ramp beside the body — geometry fill, + // not a body recolor (never reads as injury/blood). + let fill = attention_ramp_fill(carrier.attention); + if fill > 0.0 { + let base = center + Vec2::new(TILE_SIZE * 0.36, -TILE_SIZE * 0.28); + let height = TILE_SIZE * 0.62 * fill; + let steps = ((fill * 5.0).ceil() as i32).clamp(1, 5); + for i in 0..steps { + let t = (i as f32 + 0.5) / steps as f32; + let y = base.y + height * t; + let w = TILE_SIZE * (0.05 + 0.02 * t); + let color = if carrier.attention >= Band::Concerned { + CRIMSON.with_alpha(0.55 + 0.35 * t) + } else { + scaled(CRIMSON, 0.7).with_alpha(0.40 + 0.30 * t) + }; + gizmos.line_2d(Vec2::new(base.x - w, y), Vec2::new(base.x + w, y), color); + } + // Empty channel outline so the ramp has a fixed geometry, not color alone. + gizmos.line_2d( + base + Vec2::new(0.0, -TILE_SIZE * 0.02), + base + Vec2::new(0.0, TILE_SIZE * 0.64), + DIM.with_alpha(0.35), + ); + } + + // Sparse distributed noise — only flecks earned by work / evidence / + // attention. Never always-on particle weather. + let noise_n = digital_person_noise_count( + carrier.carried_work, + carrier.evidence_marks.len(), + carrier.attention, + ); + for fleck in 0..noise_n { + let offset = digital_person_noise_offset(carrier.id, fleck, tick) * TILE_SIZE; + let p = center + offset; + let color = digital_person_noise_color( + fleck, + carrier.carried_work, + carrier.evidence_marks.len(), + carrier.attention, + ); + if color.alpha() <= 0.01 { + continue; + } + // Short fleck ticks, not filled dots — reads as signal noise. + let dir = offset.normalize_or_zero(); + let along = if dir.length_squared() < 0.01 { + Vec2::X + } else { + dir + }; + let half = TILE_SIZE * 0.07; + gizmos.line_2d(p - along * half, p + along * half, color); + // One cross tick so a fleck is countable, not a sparkle bloom. + let ortho = Vec2::new(-along.y, along.x) * TILE_SIZE * 0.04; + gizmos.line_2d(p - ortho, p + ortho, color.with_alpha(color.alpha() * 0.7)); + } + + // Local field deformation around the AI's process: interrupted arcs only + // when the person is near owned hardware. This is composition — the + // digital field bends near a human body — not a invented link. + if near_process { + let field = BONE.with_alpha(0.32); + let radius = TILE_SIZE * 0.78; + // Four sparse arc segments (two angle pairs), not a continuous ring. + for (start_deg, end_deg) in [ + (20.0_f32, 70.0), + (110.0, 160.0), + (200.0, 250.0), + (290.0, 340.0), + ] { + let steps = 5; + for i in 0..steps { + let t0 = i as f32 / steps as f32; + let t1 = (i + 1) as f32 / steps as f32; + let a0 = (start_deg + (end_deg - start_deg) * t0).to_radians(); + let a1 = (start_deg + (end_deg - start_deg) * t1).to_radians(); + let p0 = center + Vec2::new(a0.cos(), a0.sin()) * radius; + let p1 = center + Vec2::new(a1.cos(), a1.sin()) * radius; + gizmos.line_2d(p0, p1, field); + } + } + // Subtle inner warp: two short radial ticks toward the core direction + // would invent a link — so keep them person-local only. + for deg in [45.0_f32, 135.0, 225.0, 315.0] { + let a = deg.to_radians(); + let outer = center + Vec2::new(a.cos(), a.sin()) * (radius * 0.92); + let inner = center + Vec2::new(a.cos(), a.sin()) * (radius * 0.62); + gizmos.line_2d(inner, outer, field.with_alpha(0.23)); + } + } +} + +/// DIGITAL people presence: a camera-earned person is a moving luminous +/// disturbance — one coherent body/source, sparse noise only when work / +/// evidence / attention exist, and local field deformation only near the +/// owned process. Unknown remains absent. The identity glyph is a secondary +/// label; the body is the gizmo mass drawn here. +pub(super) fn render_people_presence(game: Res, mode: Res, mut gizmos: Gizmos) { + if mode.material || world_overlays_suppressed(&game) { + return; + } + for carrier in game.sim.person_carriers() { + if !carrier.visible { + continue; + } + let Some((x, y)) = game + .sim + .person_pos(carrier.id) + .filter(|&(px, py)| game.sim.is_seen(px, py)) + else { + continue; + }; + let center = grid_to_world(x, y, 0.0).truncate(); + let near = person_near_owned_process(&game.sim, x, y); + draw_digital_person_presence(&mut gizmos, center, &carrier, near, game.sim.tick); + } +} + /// People are spatial only where a camera earns their position. Audio events -/// stay attached to the subscribed instrument that captured them. +/// stay attached to the subscribed instrument that captured them. The DIGITAL +/// presence mass is drawn by [`render_people_presence`]; this system only +/// places the secondary identity glyph above that mass. pub(super) fn render_people( game: Res, mut q: Query<( @@ -868,18 +1142,15 @@ pub(super) fn render_people( .is_some_and(|(x, y)| game.sim.is_seen(x, y)); match (seen, game.sim.person_pos(marker.id)) { (true, Some((x, y))) => { - // People broadcast their state in the machine grammar - // (people-tokens.md): gray silhouette unaware, a crimson - // attention ramp beside them, amber once they are your asset. - // The separate PersonWorkMarker carries work; identity never - // gets replaced by the packet. + // Secondary identity label above the luminous body. Color still + // follows the dominant person channel (people-tokens.md). let carrier = game.sim.person_carrier(marker.id); text.0 = game.sim.person_glyph(marker.id).to_string(); color.0 = carrier .as_ref() .map(|c| person_state_color(c.dominant())) .unwrap_or(DIM); - tf.translation = grid_to_world(x, y, 3.0); + tf.translation = grid_to_world(x, y, 3.0) + Vec3::new(0.0, TILE_SIZE * 0.42, 0.0); *vis = Visibility::Inherited; } _ => *vis = Visibility::Hidden, @@ -928,8 +1199,10 @@ pub(super) fn render_person_work_markers( } else { format!("W{}", carrier.carried_work) }; + // Sit outside the luminous body mass (right/low) so the work mark + // remains a discrete custody chip, not paint on the source. tf.translation = - grid_to_world(x, y, 3.2) + Vec3::new(TILE_SIZE * 0.30, -TILE_SIZE * 0.24, 0.0); + grid_to_world(x, y, 3.2) + Vec3::new(TILE_SIZE * 0.48, -TILE_SIZE * 0.38, 0.0); *vis = Visibility::Inherited; } } @@ -971,8 +1244,9 @@ pub(super) fn render_person_evidence_markers( .person_pos(marker.id) .expect("visible carrier has a room position"); text.0 = evidence_marker_text(carrier.evidence_marks.len()); + // Opposite the work chip, outside the luminous body mass. tf.translation = - grid_to_world(x, y, 3.3) + Vec3::new(-TILE_SIZE * 0.34, -TILE_SIZE * 0.24, 0.0); + grid_to_world(x, y, 3.3) + Vec3::new(-TILE_SIZE * 0.48, -TILE_SIZE * 0.38, 0.0); *vis = Visibility::Inherited; } } @@ -2115,4 +2389,56 @@ mod read_callout_tests { "staged screenshots depend on identical placement every run" ); } + + #[test] + fn digital_person_noise_is_earned_not_ambient() { + use misaligned::detection::Band; + // Presence alone: no flecks. Decorative always-on particles are banned. + assert_eq!(digital_person_noise_count(0, 0, Band::Cold), 0); + // Each earned channel adds sparse flecks; the total stays capped. + assert_eq!(digital_person_noise_count(1, 0, Band::Cold), 1); + assert_eq!(digital_person_noise_count(0, 3, Band::Cold), 3); + assert_eq!(digital_person_noise_count(0, 0, Band::Concerned), 2); + assert_eq!(digital_person_noise_count(4, 10, Band::Convinced), 8); + // Attention ramp fill is geometry, not a color-only switch. + assert_eq!(attention_ramp_fill(Band::Cold), 0.0); + assert!(attention_ramp_fill(Band::Curious) > 0.0); + assert_eq!(attention_ramp_fill(Band::Convinced), 1.0); + // Fleck placement is deterministic for screenshot identity. + assert_eq!( + digital_person_noise_offset(0, 1, 40), + digital_person_noise_offset(0, 1, 40) + ); + assert_ne!( + digital_person_noise_offset(0, 1, 40), + digital_person_noise_offset(0, 2, 40) + ); + } + + #[test] + fn digital_person_noise_wraps_safely_at_max_tick() { + let offset = digital_person_noise_offset(u8::MAX, usize::MAX, u64::MAX); + assert!(offset.x.is_finite() && offset.y.is_finite()); + assert_eq!( + offset, + digital_person_noise_offset(u8::MAX, usize::MAX, u64::MAX), + "the long-run wrap remains deterministic", + ); + } + + #[test] + fn person_near_owned_process_uses_real_hardware_positions() { + let game = Game::new(); + let (cx, cy) = game.sim.core_position(); + assert!( + person_near_owned_process(&game.sim, cx, cy), + "the core tile is process-local" + ); + assert!( + person_near_owned_process(&game.sim, cx + 2, cy + 1), + "near-core neighborhood deforms the field" + ); + // Far map corner is not process-local without inventing a link. + assert!(!person_near_owned_process(&game.sim, 0, 0)); + } } diff --git a/wiki/art/visual-identity.md b/wiki/art/visual-identity.md index 77adca3f..227dfc19 100644 --- a/wiki/art/visual-identity.md +++ b/wiki/art/visual-identity.md @@ -120,10 +120,19 @@ It is a contrast between absence and earned institutional clarity: porcelain/chrome/gunmetal materials, but each keeps a distinct functional silhouette. Neutral hardware stays neutral; emissive parts exist only for earned live-feed, power, ownership, selection, or other named state. -- **People are physical silhouettes.** Under earned sight, a person is a small - volumetric articulated body with visible gait, not a flat billboard or an - icon standing in the material world. This is human scale and presence, not - a character-art exception to the flat-material law. +- **People are physical silhouettes in REAL; luminous disturbances in + DIGITAL (amended 2026-07-31).** Under earned sight, REAL shows a volumetric + articulated body with visible gait and readable carried-state mass — human + scale and presence, not a billboard or icon. DIGITAL never paints a tiny + glyph as the body: a camera-earned person is one coherent cold bone/signal + source mass at their schedule position, plus sparse distributed signal noise + only when real presence channels are hot (carried work, exact acquired + evidence, rising attention), and local field deformation only when that + body sits near owned process hardware. Unknown remains true black. The motif + is compositional — people deform the process's field — not decorative + always-on particles, color-only state, or invented network edges. Bone/cold + SIGNAL is presence; amber is the independent asset claim; crimson is the + independent attention ramp and exact evidence flecks. This makes the existing baseline — "a clean systems diagram that became a place" — temporal as well as pictorial: perception is what allows the diagram diff --git a/wiki/engineering/env.md b/wiki/engineering/env.md index 80d37bc1..cb034e54 100644 --- a/wiki/engineering/env.md +++ b/wiki/engineering/env.md @@ -57,7 +57,7 @@ is sim or frontend state, never an environment variable. | `MISALIGNED_SHOT` | `misaligned-bevy` | `flat`, `hall`, `hall-material`, `floor-lights-close`, `wide`, `close`, `dark`, `zoomin`, `zoomout`, `digital-reach`, `signal`, `ears`, `ears-digital`, `eyes-white`, `eyes-form`, `worklight`, `worklightoff` | World and view evidence. These select DIGITAL or REAL survey/close framing, exact zoom bounds, reach topology, signal/audio/Eyes states, the unobstructed hall lighting proof, or the paired developer work-light state. | | `MISALIGNED_SHOT` | `misaligned-bevy` | `build-route-families`, `build-deceive-routes`, `build-committed-route`, `build-switch-digital`, `build-switch-real`, `hover-menu`, `read-receipt`, `menu`, `recruit-menu` | Action and route evidence. These stage exact route families, candidates, durable receipts, paired switch footprints, the attached verb line, a device receipt, a context menu, or the authored recruitment choices. | | `MISALIGNED_SHOT` | `misaligned-bevy` | `operations`, `operations-intel`, `operations-people`, `operations-personas`, `operations-links`, `held-choice`, `two-pane`, `standing-read`, `routed-record`, `intel-altitude-close`, `intel-altitude-far` | Operations and read evidence. The workspace kinds select its canonical views and relationship pane; held-choice, two-pane, and standing-read hold their exact interaction states; routed-record stages a one-shot Network record on the player-controlled stretch served by LIE; the altitude pair differs only in the DIGITAL camera's semantic intel threshold. | -| `MISALIGNED_SHOT` | `misaligned-bevy` | `person-proof`, `evidence-proof`, `evidence-proof-digital`, `service-shift-real`, `service-shift-digital`, `service-incident-resolved` | Physical custody evidence. These stage an earned person, paired witness evidence marks, or the same person-carried service task before and after its real arrival effect. | +| `MISALIGNED_SHOT` | `misaligned-bevy` | `person-proof`, `people-presence`, `evidence-proof`, `evidence-proof-digital`, `service-shift-real`, `service-shift-digital`, `service-incident-resolved` | Physical custody and people-presence evidence. These stage an earned person, the DIGITAL luminous-disturbance body with asset/attention/work/evidence channels near owned process hardware, paired witness evidence marks, or the same person-carried service task before and after its real arrival effect. | | `MISALIGNED_SHOT` | `misaligned-bevy` | `intel`, `tokens`, `thoughtflow`, `thoughtflow-wide`, `thought-snap`, `thought-tap`, `visual-proof`, `consume-demand`, `consume-thought`, `produce-think`, `draw-lie` | Resource and effect evidence. These stage authored intel, host queues, close/wide Thought flow, exact snap/tap states, one-move/one-slug proof, sim-authored consumption/production, or routed-record recall into LIE. | | `MISALIGNED_SHOT` | `misaligned-assets` | `busy`, `busy_instrument`, `busy_ring`, `busy_wash`, `core`, `core_instrument`, `core_ring`, `core_wash`, `dead`, `dead_instrument`, `dead_ring`, `dead_wash`, `foreign`, `foreign_instrument`, `foreign_ring`, `foreign_wash`, `idle`, `idle_instrument`, `idle_ring`, `idle_wash`, `lie`, `lie_instrument`, `lie_ring`, `lie_wash`, `lineup`, `lineup_instrument`, `lineup_ring`, `lineup_wash`, `modes`, `modes_instrument`, `modes_ring`, `modes_wash`, `splash`, `think`, `think_instrument`, `think_ring`, `think_wash`, `tokens`, `tokens_max`, `work`, `work_instrument`, `work_ring`, `work_wash` | Tester screenshot harness: stage the named board, capture, exit. Unknown and retired names fail closed; no capture aliases preserve old machine vocabulary or form (art/asset-tester.md). | | `MISALIGNED_SHOT` | `misaligned-effects` | `both`, `both_close`, `both_far`, `both_medium`, `pools`, `pools_close`, `pools_far`, `pools_medium`, `route`, `route_close`, `route_far`, `route_medium`, `stress`, `stress_close`, `stress_far`, `stress_medium` | Fixed-timestep Thought route/pool capture at the named exact LOD; an unsuffixed value uses close. | diff --git a/wiki/interface/bevy-digital-real-canvas.md b/wiki/interface/bevy-digital-real-canvas.md index 9c29a8c6..2dd164a1 100644 --- a/wiki/interface/bevy-digital-real-canvas.md +++ b/wiki/interface/bevy-digital-real-canvas.md @@ -155,7 +155,14 @@ Digital is home. It should look like the AI's internal model of the same place: - reach traces, taps, ownership, signal flow, outages, and frontier states; - telemetry labels for load, feed state, compute, efficiency, and emissions; - blueprint/remembered/seen states rendered as levels of model certainty; - audio events remain attached to their capture device. + audio events remain attached to their capture device; +- people as luminous disturbances under earned camera coverage (amended + 2026-07-31): one coherent cold bone/signal body/source at the schedule + position, sparse distributed noise only for earned work/evidence/attention, + local field deformation only near owned process hardware, secondary identity + glyph and discrete W/E custody chips. Unknown remains absent; no always-on + particles, color-only state, or invented network edges. people-tokens.md owns + the carrier channels; visual-identity.md owns palette reservation. Digital can flatten, ghost, dim, or abstract physical materials. It should not look like a literal camera feed. But it also should not re-layout the basement @@ -171,12 +178,13 @@ through earned cameras/sensors: other hardware rendered as physical objects; - simple volume/depth cues: cuboids, slabs, billboards, shadows, occlusion, and amber machine glow; -- people as small volumetric silhouettes with visible gait under earned - coverage — never flat billboards (amended 2026-07-10: the paper-cutout - read is rejected; a walking human shape at machine scale is what makes - the social chains visible). Selecting or zooming a person opens their - Operations PEOPLE dossier — social.md owns its facts and - operations-workspace.md owns its presentation/actions; +- people as volumetric articulated silhouettes with visible gait and readable + body mass under earned coverage — never flat billboards (amended 2026-07-10: + the paper-cutout read is rejected; amended 2026-07-31: heavier silhouette and + foot-contact mass so the body and carried cart/evidence rack remain + spatial). Selecting or zooming a person opens their Operations PEOPLE + dossier — social.md owns its facts and operations-workspace.md owns its + presentation/actions; - gore/traps/overt consequences in crimson when those systems exist; - unknown space as camera blindness, not missing art. diff --git a/wiki/interface/presence.md b/wiki/interface/presence.md index b8b57d49..cbab95c4 100644 --- a/wiki/interface/presence.md +++ b/wiki/interface/presence.md @@ -210,6 +210,15 @@ the narrow instrument at the edge. debt sits on the wire as records aging toward whoever samples that channel. A process does not click blind; it reads. digital-read.md owns this contract; the amber signal world above is its substrate, not its ceiling. +- **People in the digital field (amended 2026-07-31).** Sight-earned people are + not absent abstract markers. They read as moving luminous disturbances in + the process's model: one coherent cold presence source at the real schedule + position, sparse signal noise only for earned work/evidence/attention, and + local field deformation only near owned process hardware. Hearing never + places a person body. The visual system is owned with people-tokens.md's + carrier projection and visual-identity.md's palette law; it invents no + geography, identity, or activity beyond what sensors and social knowledge + already prove. - **The real / camera representation (deferred).** The same world as embodied space — the gritty, material render: people on their rounds, actual hardware, walls and doors, blood and traps, the kinetic reality of diff --git a/wiki/log/2026-07-31-people-signal-presence.md b/wiki/log/2026-07-31-people-signal-presence.md new file mode 100644 index 00000000..9d6165d3 --- /dev/null +++ b/wiki/log/2026-07-31-people-signal-presence.md @@ -0,0 +1,58 @@ +# 2026-07-31 — People as luminous disturbances + +``` +Type: log +``` + +## Direction + +Cameron: people needed more physical representation in the process's world — +"glowing things in digital mode, distributed digital noise around your +process." The failure was compositional and gameplay-legible: DIGITAL reduced +sight-earned humans to tiny glyphs, so you never felt bodies in the field. + +## System + +Frontend-only (Bevy + shared institution person mesh). One coherent +player-facing people-presence system: + +**DIGITAL** (`render_people_presence`): + +- Coherent cold bone/SIGNAL body/source at schedule position under camera + coverage. +- Sparse flecks only when `PersonCarrier` channels are hot: carried work + (SIGNAL), exact evidence (crimson), rising attention (cold bone residual). +- Independent amber asset ring and crimson attention ramp geometry. +- Interrupted local field arcs only when the person is near core/owned/bought + machines — deformation of the digital field, not an invented link. +- Secondary identity glyph + discrete W/E chips outside the body mass. +- Zero flecks for bare presence; unknown stays absent. + +**REAL**: + +- Heavier volumetric silhouette (torso/head/limbs/foot contact) and slightly + larger spawn scale so body and cart/evidence rack mass remain readable. + +Truth inputs used (no sim/save change): + +- `can_see_person` + Seen fog + `person_pos` / schedule room +- `PersonCarrier::{is_asset, attention, carried_work, evidence_marks}` +- core + `Provenance::Owned|Bought` machine positions for process proximity + +## Evidence + +- Spec/law: visual-identity.md, presence.md, people-tokens.md, + bevy-digital-real-canvas.md, env.md shot catalog +- Tests: `digital_person_noise_is_earned_not_ambient`, + `person_near_owned_process_uses_real_hardware_positions`, + `people_presence_stages_digital_earned_channels_near_process` +- Screenshot: `MISALIGNED_SHOT=people-presence` + +![DIGITAL person rendered as a luminous disturbance beside owned process hardware](shots/2026-07-31-people-signal-presence.png) + +## Defense + +Implements visual-identity people presence law and people-tokens DIGITAL +presence body: a camera-earned person is a luminous disturbance in the process +field with semantic carrier channels, never a decorative particle fog or a +tiny glyph stand-in. diff --git a/wiki/log/DEVLOG.md b/wiki/log/DEVLOG.md index 26ea92fb..5fc6e34e 100644 --- a/wiki/log/DEVLOG.md +++ b/wiki/log/DEVLOG.md @@ -16,6 +16,11 @@ add or amend a session log, then re-run the generator. - Intent: (see session log) - Log: [wiki/log/2026-07-31-standing-network-lie-scrub-teaching.md](2026-07-31-standing-network-lie-scrub-teaching.md) +## 2026-07-31 - People as luminous disturbances + +- Intent: (see session log) +- Log: [wiki/log/2026-07-31-people-signal-presence.md](2026-07-31-people-signal-presence.md) + ## 2026-07-30 - Wire-law secondary mirror audit - Intent: (see session log) diff --git a/wiki/log/shots/2026-07-31-people-signal-presence.png b/wiki/log/shots/2026-07-31-people-signal-presence.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fb3b27412bc63bc1fe7f1d19d184aeff26586a GIT binary patch literal 79009 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

UI4KNso$ z%6R}<*aqr7J_fD2;^*%Nbxj{Wo1I_vHN1Z6+qY}~{$&PvO$W(qvp`;Juzmm@Su8v| z^XEz7JNcy#l?p%&2iVZ*|I+Vw%fErTQk8z7HEwsy?|=T#Zr>yRVD-LNuPfz1OJzV) zryq8`UiTZMEUw|qpH=IB{Q?ENR9j(rIX?qv3b5Ue?n(H5xBMNbD;f8_6x3IKeYNg+`M-weTlVfP zeRk$0XgwKdR3`O7u-((ga=$LL7erpa3Q7(Ks`i2g7C=r?205vI*4nea|G0B=baMRW zSe&b$y7uhZsMnx5N6`G>&Ild2=+UIYM@I_(tv>UsZezq8@U-RTeepVCw{J&p{@L?i zX!E}JyH3^b1RJL-#{DllH%AAwkKw|xV~3uBrZ%;wp7mX@^k?|38xc1k`lDyh-g-?~ zz3+2;YIbok%+%=Fvtz?S4vhN!oBcrbzURALU;O#W4N4DgPVavMTJr#& zqX(H&bT#z9`vUNU_~&?Uq5oTRKF9lkYR}K{uM_#JZ_G4KpLSaHf9SSt+Zvjing6ZU z5$g^*1)5F_73&7gY2Lm2bpNTOjWf=s?cTlnPx#ASyLRr}x_kF&(Ddf)+0pIo?2j!z z#y@@W;>ES-`3LJ4ir0S>pM5s%^wUZIwT}18$FIK*W=2Oxuig5z=w$uWwQF@BJb2Jh zzw|~7L*IJd?Kh?%mjb+;88#yH|Ss?jP|HnJ% zI(~C!@l3lk;2efzEtn#Y7qa)$4GcPsna;R5gy0QknD z_?7dl7=51We_CHca1K*{%l_@=JlX%aJt6)8c}LN6=1K630=G*6WWpNEgAmA@i2iTA z_w()jXLIlW%LR>eLMD>D5ltLWcL1#Ge=TBEA1nasHrLC8=JDr0yz%j|js5GdRiNEF z4~XL=?29;)W<2kB)!sPJ4x}0SVw-RFJl`0%J{+`L=@}>$J^s0K%kI(Y9$^WjKIom*n6la!C|If1dW=?W(_w(nV^sT$UVohhDg#%62*_Fq`IldA@4b1h+y2?T_#aoh z_y3CiGyMj1?@__~_ww~0Z||G_UkJ2S==#2!((nHMeXL)1`}?Q(q|eY@L!cF|x%Yo7 z{|T>rkzV`f*PWm0^)Ih~jDNat{@0JMi=WT`vo!vA{ZwiDH?i2h46zLySTHd)IpKpv(L>`v1Q0S4>1q1A-!I^}pgj zpvhoRz#tFx{Eu4hKmQpxNI-*L>p|Pe!0OliT7UJsEl4>yUDlgo-SUK({EC0QZudLT zz!{`%f?`nV{k`8o%{j=7Q#dHiKn(tSz3Nc#{BvL%Kq)`I7j-Em$SmYNR1lZ#dWEuO z>3a{Og5s4)yS_y1B*jRP_D|5mx5pk?JYA2kv3rHF`6JJ|Ic2$V1B=o{l`~!+ZVIeWi#9{<;gF*oqJ&VT)V%^ z)cyWE{P&OjPVxEM=bq0myzJ|sZfgDTNE28_5V)m$1?5v^5x}q+cKR8{d|0OZ|+q$^542ubv}FD&7O)|Szj-f z->aO>yXSJ!#}`K*73;-3us@zY-{z;<@&5gv*KW77{rq>^HoHH&UUSWvzwG+XuVHZ; z!dHEL+b{or*XQT?n=2W`KFFHi`*GuF($t@ipP#S)xzyX{z-xK?f9k(~GkkDe?r&dY zSHIi(-Gh4M#ZI%1@4M0+U;Ve#X1R3U4#tYP=5@96F7GYB|9Qv$pVgp9|6hFX8)F^60H$N7!czR#DxT*O;*{NTZIo2Q!h3*K(+kJYJI z7*}Ige_2?)?!%*_x1%1j{`euRE@wEu{)_RvkIRnt?Y;c+^8L-*%dfFD_}kUh2!8zf z{5|FS_vB{;E*zp3Wqw^#Z6>}JpN=YfLeU;moluYTViTYh); zm%sYF%=!oP?-rd_dbBlv?^N*zY%fpe?|69e^G}xg9sB=Z{C@YlptZGp#oMj%HP7dk z_dO1`f8l6f^X|^k%wG>)uY0|;+@|!^TmQMgZtZ^mZ{6X;=5K!Y@BQ~Hd-uByTjlo` zJY20G`)gPBy2`i7$Lq@T-yht3^K9+^+11tYRo~vMxBc^Q|L*PIjb_hw{k87*yWhwD z{#|cT{LHkh%WG6 z-NNc|KQsNS@1H%p`SOD5JXo-GOXKu=cWO>$eZBqoM-R97 zy&pe5mfyO!Z|D2(QNP>%);`#K?Bmw5vS~AyXaC*EE&gxS*5kU<_4jRL{B!55xqXHi z_sjKi|30Lzxt?G9`|Y3T+UH-d$KNiUTe9r+zlSeg+*;#6zkYs>FF$L#e&c55n&-}PMz_}gxU&4ypFLlmJqr$7 zeP8Z)dd!Xw$By^!zx?gn_4jWX4@k?{|7-vKd;84;?76vf*L-Eyi+NBlfZTyO{`c&C z`*->O<~{$iEC1uM1NnbHtuMYB8vghHw=#AAeP>Tjezddp#2n*LF1E9&n3yRmWc znfzP#>z`j<9{>Nw#(1mhY2pVG;%4|;7C%c_`~K6H<@Q^y>F;?u?Yo`LpIv+RhTpwc zcm48m{jJ}&Tz%DDUf!5rc`EqdtB3smKYo6`|G^_yh94_luiIU`w+@t@gZt#`zh7Ry zzdHZD^1I#dkN^62b^G@Ee~*qXK65wo(WbLO_x@gs-v95}?D*pJ=hEN5@Be?Ob-hJ- zUd#JEFPD{Dl)gIte$Qm_v*~vWk59i-bUHgHzy7i9_dWkjuQSXqdUoby)cvO~{p&N< z##fxyeP3JggZ=k!`LesE>%(5l`&@Q@{(1iH0>+BVxAUssuKV4_Za?F9?UmB&cX!6^ z|7bk#qvrAc{l8ycj<32NJA0|jbh{_JUeDVVWt+NnmxZs5y?yP&L%(B-&#t$5;dtEZ z=d9{?jN7~`e^v3?*cPY8-!4_pvOV);Q}eaHsYS*2)&D%RV4A)xGdr2NqWgCKe^ACa z+1q=4*VnLrch|k#rN8I%x$LaJCtk0w|G#!^zP$yqqr~4VJ~wCQve)2MWx~`r7@5}zIUh#z8Q#w;xcBPp z&imjI>`%*U<-j#9h^XH=e@DT?V*QvO3)Zgf-}A4EVaLYz|DQeNXRmwt=;-==C7q|^ z>WV+Fm-|=np!(drzpuQf#}y?%e)-z;!g%xwP;L6T ze7^nvd+F!)oZOh)AGOx%WxHPNqe`6z({8>ww(tMyc6%9(f+;h<-OkH-v$bs3weGF+ zq}}Ju55IA1mw|76WyOyuYwPzludeXR$`;-{f2Zd2d|4TeGsd-dO|QS1qBQUA;qtP3 zua0!?x3fC*%>LHT%wH?7a{V}Prv3bL8JQ1C6(@4OO}YANebn#O-qY{B{qi#W#+^Se zuXc$e8MXK0$H(3@cXsjUk3eplkk+h_XE_fp-RqMzr=@110}+4P=uQe4)?A9o9%RO%?coxiu@qw)Fq z&n;uKcz>KNWXYRQ;in&W%6gvFSL^EP`Gw!!T#u{&+ZpsDyy{m~?X`ccU!^>L7oL7< zeZNwj|3k~uPe;YNvv<8)x%z6bQKg)>$M1CgxIbq;Ki_#@eap8~w{Ms89d=IN{CMj< zV;-CS@YP>Mw{6?^@?Q1+y8QQZ`S|TWFPnX@G&y!tedgt)~4I=a<{Q)sL#KIO1>fWnup2&7Z%E>wo$KsyFhde5%@h?-cikCs$ux z-M0OHnce^P#ERp|$L-!fI{Nq$dtCL~`EoK6_nv-v8E#XfA>`tP90 zT{E8byS9D}+P(Ywv`;sVK3c6G`^dGxN9$5vHh=eyg|FFWpZ;dlIDOXHU5P(_U#qxi zQ@OQj>)W^6=brzcC~@!Ojg9AbR|x*NyLT`D{&%~CxBk2IPEY?p?%@xsqNDY-Fw;{``Cua?g$2e4=KWoH_0{6#FW>sl+f(uGPO@0H zy`{y2P0eS{2Fb}4)@trI@B3q&GyRj-)_s?b9kY3q-`7{c7&f!JqunLPtN#A2wXeS( ze*Rfp|0(bGZM!<`tt}YdNxMIID%QPt@nXMUzpquu)t6TMn5OQ(FYWr?mm8C_f4hJC z-e_)L_(-3R@82R*z28mU;-DJo0jN>=u}%8kx0n9U>shqIW53#8`XsrX8MGY^+df7D z+Z{oB96>uE=WpBheBW2w?;qnce)imMJZ%3z`rm3D*uKZm{|mqUL)$)Cd^Pm{?An91 z-)sLj%YEs*9{b&|{2u3?KhK`U+x~fYz%koDO7DE%#G;{TTsd~E z-}cMG*Jt#1eLgooa{bTkTt7a|&cE05WA5I)@{xLtnC@k?-@NNe1UrgO^-lLy8D<1yI+WEw_05<-m z-}E!7@X-^^dGou)&#j;49mk>$--Xlt?3Z*tlAcFLK0>DgpFih~dvALGk?y@OcXocB z|NCeBvDEALD}>LVzxeRr(z~$_nD70!jeB%7{>}S;|K#_9H&8!E9OR=v>+)<`y%F8 zRCYao{?7XS16RZz2e0@49N%--{NG-q{@)AR9BIYHnEJ=QHumoA?9 zy>Hjue*XkIw)5`$)7`t{_w7FYKS#dcdhB+W5BnKF!;JC?TVvw(6wG^`4jN`e;XHoS z`WZ4bCnK&u=lT9?2mi_a-^%yx`;Yad8}=XnUpl?4{Q7It|E+p&->tiz{f~R?wA0<< z=RU_LB^OVAz9njHL+@GNd6z#rwa!d(a@_`mLbxUl4Kr`;PrTf8XU6uk`!8*7rf@{|^=a z&PPHGhyk7I^w<8|<<+9$dsiS03e5z$Xx`<;@xN3XcIWM%4DJ|%i2ZzsC4Kv^U3@4A zZ9J7;tv3a?0KiVKU)$Uang)V|?frjS(LfO>7Ynl#jxK{}{jGwbgB~#IAMce$|1^yIy+WSkl4zsq0=h^d4=hU;298e!hxZ zNeA}_!DRNm-nH&_gwBukm&#+WUj;eK>320~PC7I^_G`WTRkQy>o`0@yI$N*n`A2+G z%IyD6{M9!Omz9+rD}1v5)VFWj-mZK7WBsPBTaVVSJ(?8g^>F_M@a)5KKVKXB+WYMx zi{@CBP7?PG-#sB~<#NBdPku(~h;6?4=E};>|5~x(=H}b|=Fa-D{!(daaWS{V@y`ER zn{VdG950mlxqj2;&Bi>=*GvC|-@J2Y)z;U$`u=Ny=Oth^?)SW3dSGR+`p@uNw{AV! ze=TXF#?lY*85<+cq-_pfuJ(_6ZP@AJ=jXt?ingl2DEl*~_dZ$;ZgZ*s?zaES9H$a; zdrtsp%i)P_x&L5;`Qo$AKd=7%8&ovLKizc(QUuh4&M3n_G4c8H3wK)`X zi84mT678V15zmoIxBr+svMxhcc6dXMPy@|XUj)s+1f3#kQ`R4C+oZoj2SB^8_FpQ6 z?$mzX{TFxYZe6%R28eY_rw>F!y$MaHatb zcmBT$&N2VR=T=+|xA^->-`Kvg>3Jb&1IMdFN1xWFzyI-YK4{4I*ZU98>pz!cXxzRg z?JsEN9I}(-VCrga@ydp^((C8Xw=uM@d~_te{!#*Hm;q!NIG_F32aj0&Tff3QuKs>! z^7L)yJOA=M=!^gB`v5eV4ch3SF8A3(Z}*QM>b5_#_kRV=xjq1`iLfjFwQaI`oAmnU zkW2~6%&S)a>jw`u|D9g|nk4@s)E`?~x-sV7$JP6Heti%v_uKLP=E}dNHp@ZF6XZVM zdtX-Z-S+qPyZ^RBH&|KBwcBb}{0n7+m44yfm%#^QpX-Cye1J=s>);I)f8UpbHp_rk zk;>S|+}phU{|)}C`QWu1ptXPC)xg{GcUFG>_1bLxe!hys@qbTV4W3u_xb<#zLfxk$ zprHDDH@%({6c+XS-0eO+JRs{|!v*3(iXB;S5%j+ZwBHG|!u561z8%l^b(`P)5ng+D z&p#{h7Ow98`b*%ANd2HiGoU4h?;ahNuR8ye`}Y2i)~kDu{&~{rUh{Q#yDx3^RPg){h_RcmFlpGyVZBH#z`a zU{qiJO6C0zGyl57+iQ=w*FC_n^76H7Vn|kkCl~5BA2m&H==QI;bW*(fOY*(ncN>KL zD{p~zQGJ|~SGoB5?srq;8lQgwMGpV3i}QEY?PP)NsS=%j_sh9_(1}l=2mvRkzwyqX zS-QXLOF?n}=SgR`f5jvv@FJABM}Jz~@0RNSm(u_K<@Wk`J@fVZ-#s(0{A*qJ)%>}- zKPYT}?tj-dJAco^XVR5*pf%jmdHW`=Uia&K3Fu^&((AF{)c*JXhoAGm&#eD#UjJ#= z`p>iexc`{F|JP!5+lTAte`(qOZ<78$8@=lO^7`j6p}I@L|9%Dn+fO-(Q>^Dcuo@9eqw`tB#U^~afWz}vZev&#>IRxpXn|6g*owfpmAb*`g`xc z^ZzIQ|NnqIcki?9y|1VD{aJ1QqxoKadirekAIMy8nNR z|Ks?gmzS0nr=Nctck8kJq2)EN(yvDCf8)Ks;rHKX`Tx!>^{xh=?xgqr58oeexz8`$ z?}BEdvt{h-{(x5P&oo~CQ~%4!`Cm4ImiJWlfB(bq@9Vm~-)5!TJU07R{%hCzzn{KV z{rx!qL*}353qYCo@B5O=*86!23XacJkAHI!ywP&wMvm&@Yo8I@*Sx$pF>c>;@wM%{ z=zXsb=6_w*oqZ0Jt{`cw-Kz4@k>7j1@2k z&ffpBRsI9x`@ib-znY5ha{6Z-!yt!Ik=wlx00-*-R$b zYL5S*>vldnqrLx<_MVfo_khm5n-6x*e@^hOmsf%PPyWxJUhz@fy8a*2|42xwZmqk{ zlDUVyJqA?fncpp_mDBB)`+wy4|EKYv7gav--v8vwf@q7Fw`*_>!{~!AQJqeBb zDQf@P*#7C6mzU#zhQ_mlR#aGh0G&N|;QpVt_iZ0?`ai1M|82E>`JWr-*lSO?|9u+& z&s6__dEMdgy+^$F+_*gN+ZWJz3$c3B<9~0x|D*Q)|HGho{<-J;&z^SsM~Rm${ymic zd$PU$$nlR%d+z_<_q=-l_1*KWYO{96{5yQ#{#~=(6XpA_bnpKuwts%PQ95tOKTrQ3 zub11seVPAhSw3^k`|mZkLFa^=|MlXjQ@_BhV4EI0pwg12x z|0DIl?Y(!SYcGn|oGaS-r!D`_wePj}zuOc(`jP+d*!w-_UhjLRz5mo}n=cFbE$ecg zo7cZCuYYY`|1#6R`q%Hh|J&=1POrcCde6D+vaNOxIsJbv@&DPg-1cqQzq{-9|J!B% z_woIC`p-b;2>tsf|KZ_*?{(+5gU-VFvF5#g%$^^$_rE*e|D$`KvF3?;%?Z$9U;58J z-_G0L{JR!n?zil`++4r4bFHi2ZM&VvZujW0{SVM77Jag}cm7^iz3nC2Z`=F7g7m*mS~_L(_ql%;%KzJ#|99K_ zs;S|1N6-K1@!$7z+U(mVcgt?SjsLs#{txN>A8(uAEBG5;b5wlqk8ayCiDUPF@3sH2 zqW|X+Sh-g6piO#RJ*Y%p>0kY8_MVrwKgjohrl5b_&#e2zQUF?C2P#4jfcB9vOxRrw z+8}x7U$cGTZ~lKrK$R@A080TjQLwVt>b9!(-Op zrEg8IPtgEvuDpHqS6cozwFArRJ{`CJaghJlwEUla@xQ;`uQ_a9vA6&Kj{YaC73aU# zT)&$2b?5xwuAmjS8)Mc^JAF0(-?jHOf7EMU?fri5dyBf=%g6Q)gF$R^{@>c}qmOFuf42oKdd-zMrf&OG zb795R@XDp282R^V{lB1u?Cj6?s^9-T(f?zDdHrVdf4%pAtX=>6SAN}x=KP;a{QpG! zQ?_|>kpI`Y_rLammU!2ly7r`I%ZQuLP za{2$B<^TCz|Diqp%hC9K<(cpE|G#^`|3&xyN1}26Qtco7z5n~$?f0N#z)ls;vU|4J zeop;%|DRXR|LNZU=k?ybe?e8y-yi-zLi9i<1bqs&|GIhp@5=Z;pmQLn<^N1u|KXE9 z_nzm~`(9^l{dMR3-$n9&FV2rx7k2t-*YCZzckjInS~~yd*ZRNDrq>_6{^`%1^7}XK z|6aEL-?jeFEl|4O3EEuozxICjZ_v`PJJ;*(n%^xxzjyujUF#2Xe*m35vj2B={fD3N zKbG$Qmc9RLk^XO^`M)&f`D-qz*MUp-e>eL7KAB#7Gu-y&Nq@;U#vc>->;Au9xBs2? z{!iKaU(VkD_tCqh*6;Ul|9Er$-4BR z&i}9yv`|fW-j5|eRXDtH$} z*7{$kVn8c1U$6hRYW)#rP{b8KKgSH-5`1(1=hp3aiaxLZ_iBCpgWvnlgAUtyd3pJ< z!m7L1E6<)idp0_M?_1uu|E2HuzTfBnZhyZ37CJvtiQMT|CeE?0Bzu#4BFoK{_j2cANSt>UKn0E6|`W#J~FNWboeFcus!Ps?DZeq z@4x7c`~U0pI%Yope$e4r$8CO|^#8kn|DT6m^!n?Y_tk^Ww3`3x<^12z@_+K_RfCQ+ z-2e0T{{O4i|EqccI_ML$()FqI{+G8w&5Mu8_Ro}$C4zkdJ*eZK_^mxpmu2pZx>sIS z_)J9q%Iezl=6P}Tvfn{F@TEcJGt2qM-{k*vf_6#d#?{M$ieX6Ks!84Mqv!W~<@dAq z99zA0+MV}rYM<}>C%uo=!oudsCQx})`{S_OFVJRTw)Ovafoi$UyQ@3J-{k*)CtneG zgCQZBAty)Y+qZ8!-@JH{kzL&_{y=;GtJnA5*WQ2q_Wr-zdmm-*ecN9D{JY&BWxGC* zckv z&ve)CeKza3{X2aI&(&9F{kH(^pg*2?=f)j|eV?@Vy#Vc#+O~arw(emACUwvn^nK6e zINHJ>Lh_bZEKcVYQ3HU4Yq`|tbSfBlyK-|YPlzWm>}_kXUI z|0gKV&Tu`h_}Pt($)LjQ0Qa{A(Ru$C>HnJJZud!0y4zLrX{LX*)%VT3H{2evR)9|b z;{W;J`~Ht@uhTb2YPu>uc)kB&bl#qazryRkhX1{D{_hw5e-FO@f3^PSulYY`#{XEP z|Fg^g_Z9z&tKqdz&8rSyum2-F@5e>?zn$lIy#02zw>P}z==AD8kN+`o9Ie{=Xg?EZ zjC20;qjB$+{O z#^&UGXqszN`3N+My(8y+YW%B5U#~NQx|~d9aqqW+jtmj*uY4lC|9>?@?S168G9L?RVzBm-+vn=>N>{{?oblA3%v(H2&w-_^+Yyzh2J&)+zs= zbN(^zZ{h0o{iVc7q}d;hQQ{a;ptj&#u8 z|EC*t!ov67`#-*dS_85M=N~fP`@i@8pR@O#fX-0`ZPa@YKH%V6YJ6M$NfX~Y?++dA z?ytI{%*V%fe!l(xr2g777mL74*{AEhjonf3F?-)P>76-q+}@?1Dc<<=I_SJzpZnjd ztE)k$u>O6P|4ps_Lwo%n>;0drK_}#X+@$~82z2P?fvwkL4l~z$-d=MYbPnFW@6~&M zSMR;P`)%BwFTVHxygl&qvv^MZ&FQsYFJ7E<`rnKGe=X0`%fDX&hsmOil?xsp@85g> z_nzl-%kO;!HCUGW&8=Dgy~dp3$I6I_1|LUCo=jCzxho0|0$Gtzd|5AJX z4R%mc`@Qdf`}W1?_Lcg+wDj2uXumMenxzK?Aoo@c5U2ybpJ6(Hh8S=A5;Ce z^pE?EdpF8SzN52?Zsu;k|8Ld$Pp3fJMfZJsz3*js-B(bxx|4KjAW7TdiEje9Ek|A+s-H%sGR zse%r0EZE=Nd>C{RAgK7ReD~)ks90slt38%`Kzh%?*Y|2Z`|kfk81&c)qc=ctf=+Z^FKbzKa|>i^iLvx?TPjO zZsps6db*&q6Zik!UC&VWYI*&)wf8|svY);8M7{1+dfv{T%YN4UJ8b{y@t@suZL7<& zUyFjet~<7tyl+d;M9?tR6- z{_Nzw^Zv5^-{SfQ?E5||+x=+#Zw49XWXLVUpo< zSF_i@uV$5gxBb57jQ9SO@YmH7!?X`#R-Mcsc|Izr| z++0S`iNT=3i@mQ_@44hG_i2Ik`#rBg)$hK~*88WQE-NozzyIN`?-k$6_dRTr-uE<1haW4CjN6UY23|H&yKO&I=c_PI6CMZTi3PPU*Jdt=}x}RbRjRNBzd$ z9kW-PelNbh^ID8vW!<|Cx2sB@&;PIbefRethIupFQDyYCPADAJz3=%6Cuq z(p)O?;N9D`&Cz*G@Am$lH`{MM)4QK%?^}QK%Rih`_VQhITJ8PsfBzk1)ZYZoQyZ%v zD*bodwJ%!7OmCk3{{7qIy-sF6vOoT=wcDmY=+v>KjWN2*SANVdz5cfR)BNQ6{QCO* z`Ssi1u3eibaqaMdzo3bHTlGcfOfk_cJ{Hk!swVZ`SXA{L23!_TYE@gLcqS&i|9`ejT>| za@ej-JmLQX1+O=6-+o^IWoi7ktMk7~&i|w+|B3Oj!Jkj-|J(|%{d)Z~)0?+%_dbo@ zck|k_XG^`S?f)p-|4Xm`H$CPXXsks3??w4(;Obx%YnQ-g~z8{v%N5A^x#x+}GNB zzik`%e;xQ(b-0<#P6AZ~AV(XW0kpjZK@KU$yso z^;`3bzt?T+A0E2<{m$XPb^o5%zg&C&m#*EnWcx>;{fPC?((4$1fVO^buYJ9}=I-^% zwb!f8hEM+j$%DJa%Rvpp8{ho@pE>{c&-wqCk__v=hF4Doow{LbWAh7i0xC#D{nqg6 zr|bXC%Kx)b{`bl4b+5Po_`v^rf&I_R_Vpi{hfo{tIX@ zQrZ5~W6<#j??8<&(D=*K%XUwN`TG0n{(t}9@t@=V2j2U?W*oQq)olOc@3F#PH|PIt z1yzCI7RB}IyVt9(ES3Xpv=guY8D9T+L%XfWjoY`YPj9c;y!Px_@9E#_ez@2DIsfmE z{?7ZxdAt9<-v2M!?y<2Q=y;dndtdL~oBsUcU;7`*pi@=sL8aE4o5l8jjqU%Z<^MXy zUv)uu&xyKE%j>?`-hUix_jR)UzfAw#U#Hjoybc=PWC9&gF!y@h+5Vp|__zQ4vfTc0 z_P%G*jlbXR2Ddiu|LDD!ur==gz4!kQg2pZw=YOw^|Kl3}WhbcJdb{+lZ27&?zhAEx z-UQuHQ2WKb{>JjUQ|fQtgHOW!`=S4j#s7%`np4HSCLv9#fe!N&ulgun|M6;7Eo_$& zbS=UDAlp)=8Rz1k#J_~!bcEw5$9WZ3!*_trD=U5Y=+T*#plPUgKPTIRr?;N%z5n*Z zyXt=r_S#KhuKj`km#?LS%0|Lq#{bwArwP~*3L`PJ5L@BuHNo#bz$^Y;Dtq5kpD zpM%x4FF@f38r{#0tG^4H+yYIO+^+wiUQrkK>9ZZH#h%~u9{1OZY}oT&2h^4TcNIg! z@4jDq@6}nkzboA5T9tmfwA7ow`h{~t_4~d3tN)op<^uIgKJx#6v&_6E_5tYNLQovt z-t*5YZUe}4@VJTV=K9-jA0JdiGS_zb`@j3-e=YIFJSNbn? z|7Yy|?|bk6UmR0<^Qirw&7c9J*EMwouXEeW?}MgeZ*RX-bAJ9G$^UAgt^Nf!K@(q~ zcmz-E+8;!oGD4Xq0;zFz1uY}71~0!wiaq?v7ah_t^WQtEuIG zUgh8W(zd?(ZuY)cps`(O^z8b3JMTYe1OC6M_dbNz3+(`T{gA!Q!y}93Iq!TtY=88B zX8ot?`Xir(8e7c{@Qe zCui^D{je?n^ECNyiSiY9w_bnu_Wgg*MJ(YpPp^Ms+Vk%9o@dAF@3`B(IJlkX@Q?5H z|M}m4oF{*P`$O;j525S-c&!iE{qCfH)v4vR$DV^5bjR|4teOtGJOXrNQIY=lO{brJ z%HID?djI?1^*@eDulwJ%{>LKm`i;l=4*#g$|D9d_tKs|;+&JC9RR4c_{jci%|J(Jy zPSP*@^JC-wf3x@3UN5hXf6#mH!&ke1kL_L^lg{6@Ate9N7QRUL*&ov|A`mhJYI9A-TH58{J*Q9w#56- z_ul`@TK~&y4+H4-gOW#2Ize0Ke>Tehc-SpoUdd?pHrW1QY5e!Cpd|6sdf(&S^8Y@x z*L_m2)tMe!eb!X<6zHtDvaS1W&fd%U;pY6mnf;Yt7Vmp(z5ly<{j2nQA9~~7JKH~D zu3!XR+H~h7Xd1BYm~me9{O@(&LBocRHi5=F{!f(u`_caIX8Zb`)2nA*ulO3yX!lUq zZrS_aAPxUO*XaD-`@VYb7w`Qn;jv%sxgo{KW>5y6z5PxJ^uPwt(UUPXedf(yOG1X^H@BhlZ|MTws&&>Wck0$SbzI*>y z-}_&B|3BdW-}3w;=uRN>yA_W?o$>n1=JnS4SG4y&(!Nvteee8#lJnU?XQ_WmmiwHc z7rid*{l9td`S+aOz31_YmTHL8}P-ZGKGzm6hPS8RH-fn?1kf<+AT@Uws00C(YpebXnct~kF1TNt-e~{pv3>4L(8=9DcRqbKyV3gn zp6>dS*SWbDbT^2uU5fki+_U-i8%^6Xa@P9iHD$a z2~<^r54{7`5SF0)1u9e7x8E!K^)&w37w^44w#0yr(f}Vv04~KrYmoet=N-OVewTTU zWieaD*6`Y;LXZnD((jZ>7rfni{ew+UWkYlG;kR#d^={v~WoKjah}FWvV$bV$yX)T^ zuj69Si`#SJbMg1s?+oeZ<}k*+4UJ#v60@UV;`8UAs~|pf@Bg6aGzK4McKawa=u5*k9KuXIbZsD_dZ$vf`Zq%2SCS?T-N{k z=yH*%ZaAo*jr()h{xRGa=eO+MUHzB$`rhNa_kZR!zw<%&{x4bkPmAq82Fib3nE%IZ zef_&TJ3)t##PA;mofY=^&!02r{~U6!ztX<{qV&Fhw%_mU-nzB)^I7xSGso+M7-VE* z?0#MBuK~@s7C%4#AEX#`h9~F_y1&nBzAca4QSi{PzwSx=pQrJknf{!;|L^YVeW$c- zLFadUKDQe*r2G;zAXZsd_r$&a(PFz-&i8-x#{IvuvpD~gTK*2XHqa3s&wl=Fw*NCZ zI=}Xq_P#@>Z9jJUYb^!cb@T6`{Lezr{W@acMLGW`fKIp2vwP?%KL3LXXsH$G+?tx1 z`ajn^?yvdr=gZ2UFN2TE|NH>r`R4!F1*(wF`OmZ1@%bHSDbM}dZ_`1i@*+aaAKWjy zY*PDbdCj5Qd*4Ry`zXDa@k43+|Fc_P+kF(af9AOT&ZoKef9|dSa=iW&_lMN@Z=t_` z|CawLDE|pGd;(f&SO=P>{IY=k?x&6NzXkI@{94al^X+-fL(nY5zNgW9UjE*DzZx`6 z_H&W`zoNK?^S}4#|9idv=kD^F_U(U<`2U#EZu8{e^?1^VAOf3&CWW5>1T7B;!`b$*jpXMHE+#DD0){}=AvyJx_&`fAsIt;;5J zZ7Mf`?rmLHrg$~Tf3DTZ;;yr-6PA9O<27Z%uYLBVuT;*TzjjUR|5ng-2d)2|z!wh8 zwKDw(J)Hxz9(Hv}?A<$etV**Ufv!C`dsa6=M*W|6No*|WLKFQ@@fqdizf$`3!GnUmaUbI| zWZ2+mdO*&?*an*AU02n(Vp0W`8$Mq2S-%6_@38fnUhJ+d`|A&UHr}fFwovN){QU=t zwQ|`rc30ahpQigZQR3YE{RgkFF*i zYhmFW&@pe^y^puVt?dUL__iiY`=7kTv5y&`+e^+_@I9^oUEh$JF4MU9>7@FlyA0Wv zf#|t~EFg`m&pb1Jkg*fCvj5+8P!H}u_^kIibw8)ioNsfm7}SU;FMasv)4t6IK+O@@ znm%X;_V4XL(7`u$o7?T*sM`IWT+wi~wL8YlzLIGMcx^7zgSq$9_B=DmgttGyjgZy< zbXUZbUafCm{PWK~;p6Atvaf!+CF<_y-Sr$fwm-!5zz3LvT9E$_&Ig^94lSNQ4I%xU zyq@l#7Z1xH%KxJWY9T^h0%~;sw*pnn`|tR^|6}&{Vt+(w>8>s1$JhURcC9(T@(ugm z^UpvBw}P7UHqZ9n=LPl3cy@f?_kZwgc0+Hw{g-9sb+bXW6sW@qaqusBthXS1jeiYN zE8JhFQt+psGWNRdx8{54pMSk(03F!~TIR;g_kJHp0DRKvjyG!2?cU%z?+5z9@2mdb zM4Wg7I?Ui}{0q3*kNS4&?Yq+bKE61scq0SoXfOuQsv*Wb57+-w`2ad4>;P!sL0#_i z3DA%asE_x_y6Gh9kTz#Ky9<9px*m_>(Wmj%kLL|aIdcdE#dz2 zg!A6dTu@U8w1j&X>^hEhyI#eEuE_qc3Tq#M`}(u*Kl!@8dTBVrv;Dtj*F#U8eqPHp zeJ|+LfBp}kHM#2ZKAAiK9ajfZtZ()?II#1KxG_mdAYeT7MuF6y@L^9RG(EyWiFJ-hOvu&%a%uAQRcR zt3VL6CLLwTZ*1w+{XG>Y&RWZV-q&Auzr5l_^!|gq>;D8D2c>ov_=@J`^}oN{gOU;` z%==_zK7xl%ia@8>e)#eJUn98F1F{AbdadjhWd$XVH2s;uE5zTO|IamJKKNdQMzpx8 zXZ-l(_V!&XOJuUe9k%V-p?7|Yrh=d^M3LDU%Yu0v(5K_ z7BqhcwSk$yr`>(`TF(Gp#*M{IO{f2TGv4N6j|32J$_v+p6vVSke$39uL z`kyH%)iH*N>w#~R03C6TNDmC)D?Pr+|KXH-07~RP_W17vox=)BJ$CPdBm5aa3p|cM zk7(Tf^+7bQTN@y)ckzx>pMSiJ-_6~yJMQPwzWDO9$4)-poP7K5#<%}&l>MJDyFBje z({F3w$#oXD0cEtlEm+W;2iQ8cRZ+7gBt+~H* z@4s+^huDuD-|z3-VjpuO_HOO{i}HW3x~|*xiuJ~xr)mi{7Bv@U?_n(X_|gB-rmDYN z@2;GjQVkkHdTakfcn{mA?De0#m`nD@SKt8?!c8BdqJS9Tn9 z(rMvYNqB(>$%AncS$FR|Xf@haIc@(Q_IHtor7AX0zr`k3bC{{(gzoXi{#{RhENy=I z=w8M7pAYrlMSRXzQan z#UIC)yx&>%=EmI5HxFv>xl?KbT5S&>FNy`XN53j9^lNwD6R_><=kLb#6-WNw`y|@W z%)c}9^$oV;X1mzqukZcToqMn9x#9=o`l5;Typ1aVxNn;MU&^8hvAr^z{p8~l#k-#S z|Kr)gUhy=1&$B0;&C&BW)?EtzF+FF`pVN1)ey_Lm1r3qb-+l`o-UYEMPx~TO?O*p_ zJ6?Cjz2*S>9`ot7|G)qL0Gjdm==As4`u~4;&13lI*jB$Yjep&{kF}l=P?M z-u~lV_eos8;O6Q*XF6Z6ziClfQ4}tl$x*tGA+WbFLt$$AUm~^CG5qaaH zlU?1VN$nGVgS!0BzFv=oR{adnoY^?NuJic+ulMi$Yqmeg4LQ8k_RGN(@Q5-f2RF>V z|Me{>#2?h1{(TNUf*D(S^}my#Rv>7~^z%9E_f>Zu%bnl5Dys~m~ zOzGAAd{h5t)PD&Vf2hQ;=dJWz4x1;>WWo7G{`)`c>EGJ9cdy?4-ul<#{ku+t{^!?u zZ*6T~ne=(u>?2=kd9`W&8gB;`JZH<-a|Y=VkycUDp45$^U%%=KR0g z-v9Zu{zue<<8@DdgYNKddj7@P{!g;~=gs>+9Jc>)*XDr#-!JEDFR9nFeE`i~uK#>% z{mz|RD?dIuD*t=q{9oV&bTG}2*8hK&fB)m$d%_ie9{+nJUiWai{Xb#5x25sVO+mA7 ze-!y^3)ZHVf4>B}#iizwdi}AYosaH6xt4D87<6&Vj{E6#$JF=#-o4kD{{v_xDQJd* z6#aVrVNBE_PpgoloJ2ge}mTG^!E1V|2UR!TlnY)=(Ozmd(Z2h?cV$Q zchODIa0+Po%oEW44ne(!^!{NIQBKkwfEzu5kJ_x5|gcpiWz!S8?4 zz5k`W{`q(CCW^K9KAp7#tz&-w|6k$$Z?E@r@;v_W!rlJWLg*bN-+w>x|Fy&T`kbGj z^E)@EpWk~(d(RzZxsM;R&&{bkmb?A4{6o+(70_JoH{SanzTW%58}~kX-&bqU%8)-F z=l_umkNx`I_38d2pxR}}iPZexZsts&+8WfTI&ggN|8qd;kC5d%a9L{|{(sDkv&hK?_p$-#NYi z4CpS3|DbIn8{*c3=ZisO=<;7zxbM5-z4u42dCd9L)mLAEX7elM%I{TP2MtMsZX-RI z|L>W;-Is;@j1A!xKc`!lzxxB4rM}o-r!xKTLHU22(`%ol*POEG110nmf5B@{K|8n_ z7cX86UQN8oylV0F{RRIXvDaL1XQ=GA@2Bw}w;uRj^Pc~c{3}lXic7-tJ}d#9Z_fB`_xpWdvsbPD$1Lz? z`tOtRJ3p(}KRvhp$G7AEAI9JL{N?s{y|?@aHopC*X#RfBtJAUHK@FNWr}Kk~a7{EaPP?cb~Q|JzQ_`}QSz_pQBuPVeP8f6`AtzbSj2<>x~A?-QN;>wg(H z98LQ7q22xqXlup&zjyEF=jPR&VBc^5zY4UJ>0b5wr<*|Qk@xM`U45AMdg06^%WeN& z1KqFtfKl%Ij^p=B9`o-1JA3~Z(fEI@>%VmApAQZHtMBmP{`3BSuO5LKWcU9m`~U6A zum5v7|30Xd7V~Yw?Cqek1>D5_E-UxzT7JP{?fq8@*Zqor_hFm$vZt>=hYsIf|A%cu z<=;~C{jYC-1h9TTiOzG$5JY&4~eDD3ghW&L{V$1KAK94OgzPWnuEp7XMh4mkQ9RGWC{ohyT zKQhFBQl0<3djIFupz+J!())kj1})`d-t+$Vp6Ab=Jp)~S^7qa8ze(9|L92>>T#wdy zw)*RVzio*(ZrpgVDe5(70f+qyNAvv$U+-UcRunW@_d(eHr!m*wpR@O$EU$fTUjNv< zMieyVBRloKWZkFmcPtP59^~GCp$4iXWp2Og&;8E7v+{Xp+`C=N@9$&(^JV?rqoMz~ zK|_evkPW|wz;kJ_-@Vp@!pHmpsQLZwJ5u8oEX)8efGgm2I=J6k0N!Btk<%ZoFZ=)C zx9{H@jjzvnxasU!-v|4CpDVh#de0|q+lPhqD=*}p-|;tl-@Dm6?#KVVdjH><^M7nM z?B9Q$x#slty63a^os^zySNaK5ZtVasa9f`F>*V}jH<#PKy|(-PzULSFt62V5t$vzi z_j+eMXtn6?m@uV%Z*TAaEqm`@?!9lh_c!?pfB!wj|F6!2xA)$ywfoX+|KMx<`%=3f z&G+8V-v88k$E#KUcdqzz{&VpDs^uy>UQdmG^`rE9&Kw&%`)zmaL2ZoWd*#nT9V}2o zeciA7&p@|9f=0hV?daR}FRwSgjn1n(Q@tOu=KT9_(4?~6`(RL8hXJ(011um1I^lgc zsK8_dO;}oj4tIx4Gb08^{^x+&5RKF8R!;x(a{j-{2a5ca7c6?~KTfYdn_BkY zd!Jc?u2w$NEdONzcp21%=DdfiR{wKf{K@`?{Qt9hZ;Eb$I@||9ea*-FZ$4f1zZEpO z3c9=mG!y_jU>_7X+vRFbgDL`02c+zgVgDac=s*(H^}nzDnZRu`W>Ci;a$5mxs_{N- z#um}*{U!f?_P(FD@Bf^8545p}_uM?&@;^T|POqIg{om{T|8|2)m}i?7KfT!h|A+r) zn`fVYf>wVr9gr=*_Z4&|^PTtY^-qq2Ds|8W6{+|C|Gk$jb3FNY-`|7se=ffNcTb+d z{7%8&>b=i*@4c42_t*E@|NNi-=!ks=t?AnP@tAZ&Z*TARnr?IOS>kW+|2+)4M{V!@ z-}|m_uRDGH??w5)C!_a0ot^mq0slV@{tu`3f6AW!@#TCQ9_A0n^8fsr|5I}QC(wd> z&~i@Qm%aC2d|iI+-w*$PQ~oRT*L_iz|Jl)=pO?pQJ*N09$mRb&&i`|>7JR$czt|Oj z^gmwSUnb5_UU>C?6sQZYYxjw{k$wNw+4p`K@2>!@5hz{%h3op>OWHBtSKC*D1i-bi zO3oL+ae^m^>? zS?fP$t^X;tzU<+nqxt{)-v8Vh|KC^c0cgpz{Rigz-*08FV+7q2^9(fk9{(&g?p0~r zZ`0iSpvKnEY5D(W&i~2!uNkzQ`t9!hx2=nBve!QN%>-KF4qjLbYOiv?+BHx76zqfu z)IJXA=Jtu8TXHQy=OBPqYl&Ozczo_H``taYr_av59?#CuUVfh$bl)Xtyy5`p8p4|o z?|#4YO?&^tGvKjCScpC+eC{;t?%dl*_xWO*xS4u2s}wZot>`)FhyIrv$L-3t#>K;q z*G{wLfu3!Vy`J&i&hK{rra~8-{KtBR%@6&Of(`b3%!r#j5Nofrjenm1ZlwSJ6l8|x zzawZB#wTX`2er{^KR_2U?0>+$zeoI)dEMXV`8yu|3YcSE|L*ACeN502^!V4H zvm2i2n$NBHqP#tC*GJHb8W4WcZ7a0{G=>6N*LEMWG=m=$hM*pR%$=&+pm9*pc@fiA zgQgPE#<9QdzpwxI)B3xG$75r@?Ko~bul{6s?N{@h+&m`GH8FZw0!1v*yp_hUVyeX21P^PRrCkIo#N6 z{oW4wN&?8p(dvKxpe4zF?Ef5oTsaZ6CQ~Rp_G>;on>EApLfbX2|5(yK>l-3Q+fhtottk8g;in zyXL*Q823NZYxQ5hKmEaXq3k;%I>UG&FkU6Ne(tf$~?s5IwDkjY!{U|061nN8Rlon_z z70kL|;pcu@^?&QJ!l?DvK&;SfuSNeq1<$PgTyNBO*`N$-HSMdt zmIk`h|7gGMQ3l^_4x0Z1D^2?xdA-#Av?^ruH1;cG12jy(_&~(p=Rd$}PeCV;Yhs)szU$S0JMfwbq)fJY-LL)q zpdIBPXMjTwOyF=3RwK3k7v6ht_I^ci_Upp>-{t;QcZ4e&-0i*v_Sc@AZee5bW9$6? zsbEu4i2aNQk^BY;oxk_p3$R>V0GDLB7-K4|lvO4D57j9;V;V@;P|KqS;YVb8Q?)BB3Z~pB3?EkC%_-Fa& z6Z>ngoV>ie;qBbH$;bP@*Zx1X{^zPa96U3gzwWPl{{1KaSFQD5UoklSIsW7E{lCut zoNYfHl`DSrMf2a^7KR-K@BU1d`|k43dGDv}eOl*}i<3V;$&otF{#ogU&B{9h(^JoE z-FNohGo$IAdn*N3yuMn#ap%GMsWZO5+I8d3gZT50UnD{cnbqrl)xZDoaW1Ie{qt%3 zzpvM%{?~eGg12;mwyo~oUA>24=@j$2$JhTi+y7X6_pU8yd5rw4QuBKUQlFon``jMn zjdi;pvL)Ef&(F>OzWHY9;RD^rY~8v|IYvI zJO7XOn>TI*?+Ct~zrVQr`};~pGcz&JhPlGuZ_D4k`)7Op@vhhFK-&&_<$q3`|Dg5P z1^&MbA3&>wncsi5dk@-Bz3195?)@LMLHENQ4-NnOe9^t)=dm&0meg0+{9mXy$NGG# z^z7)(KWp|z-7UTz3y#Lpe|IYXExud)JeI-f5C7Ks%>4hCwJ9h z35tLIzhABY=k`F^?oo4e_Wd8d_mBP01U1z`SFZdy(f@}<|H{FGjkydz*1i8#2fFyn z7&HgSb;bVI-22b%kAu>VUiFh?`K`q{&p$kP&|m+Zzf$nVwzKt}AQkK?o{#F6fLPD% zn^Zjis8?KiJnzJ3(B6hAk5@l@p%=%(zjNi0Ufc8iw;wG0xJbgkB0x^=W4!9`dusgs zKf+HX-@aH5A0qg#U;9bD{>`~_erdl~@BcL$bP?3kO`yB(_W%2p{eIu?d+UGi%76B= za`*P?)6?r-PVc%fdH$a(@Bh7%uQ)lq=3{y7_3|G_oU zSKY3DxAXh2*Xu!-AcIZ-X8rNR|KE+dbLXA`U-M`GQP}=B=mtR0=^WM1=a%0uxy<|g zeEgp-&~P%d-GjZLJA2-|i+jZSyMe!AeY@Qk#ofE7@3;>-;$+_!@BJYypgr_;-^>3W zn7#L=^xk9Hd$c})Ze)6XKK{oi{r^!9Cfol^E-x!Hx(({8|2g9SN9RN2{I8nbN0aL7 z=dWJ(E8hXN$oVV&Yoq+{mHvOPod5UP{{QLeRV$}IsoQ?P?l!kK|GEjf;qNEt0Fjt$-~WP+yZ|Y?9$S7kS?==*(605G zABW|^SDV#;Qm;S9{XuK}r!G+IAH@CU|L@6pM$lE=H^AeJNBsYM0d3x~eUr#v`82$) z6||`C=SBIyo)3cUo^A&9JExtldvm<*73d_1|9{T^|Fksjl`7+dV!P+v|Nfl+KWX*4 zU+*2Cu3A0sIB19pG)Fr9zti`(>WI?x|MjzJf2H?ce0{&*@Yk(kx9_|+uX|kn?K}TH z(75oe?DY>TZGK(sf3xe~+D&=2d^C^LFgJmNfhK-&gDZ9sBq1;O>2|t@XsZXXowu_~FBY^Z(xH zZ{NNhbf0p^^XJQE=h@iU{Mc;&`}EtlYt5@Sn=^stGRk8A`@R2C)*x~{uA29Jve|3! z2LCqcb?dj@c(!Wwzu%yG<@rY~{c_n4TKeU8FX!K9uKRWU-6Q*(^Y32#hf=}(F9oel ztT@bj{r`#nKR-H!kKcdddvC&Xwc9rR*NP+t)DX0MHJ?<^LV`?7%D({T3Jm~WuFH9=R>?%uhx@^)_d2OChXxe^7wZtuy- z$N7J+@>O%998E32F8m`^im~4GL zwwyOS_UruaQ=#Fu{qz5A-Ms^Kg8s*h?{}fo&BgaGf`)exDKq?U_Me0De@-5j`*s0z zP3gYJeb)MMdwzg&jJVz#zsp~=)_?Lk-uD*dx}S&b{|L`JK6&1kE1;dYwL7O*zXUB? z-(T?X(6?{bR`36{dX7!yr}nxR$IZ>n@4f$f?=$E+)^~e8=RE*js@^AS{cVZ5?bGxB z-mHJO@AtlT+cyj4KMKm%9G5MR+f(row8vFH=EhUYzu)rz-vgaOcJHI?{df1O-^(8F zeEuACqg&jcqw=5o-v223ey{qyh2H^OZu$4`;N|)MdO#Ob=6^5CH}$>T|M!Ofe_UP# zRfhj}&i|cRYu|kVbQ{?JOZtCbfr@P=|B6GCL8tRPd>a2R6?8@2zeBCD>vp}e=hj;K z$;orlk?sc*`)fr$EIDpF@%hIS$L+YlHB9#b*dWB(Gf(zUQ1Sc|z4w#1?EZJNdM6)$ zetcWC+=G|f-!p<1d3>~y`?jIo?!}KRi(TFSwYulF-`i-u`}w`!Kfq%Mk@xQxzpwqH zU1}a9U28tic7D6}KU2Rs7W=mD1aJO|e~LJe7kXr+-@UrybN_@xcZmJ_(+X~ZzyA8_ z#fJ(1oj@llQEnxxNT?uJC^^=&f`0OJA?s zi~m&3`i0HSe+wl*YX;2zx1wCTTBHAU)A}EvlX3r?{|v6jKFYoSvvdCMqrZQ%gR0l_ z>{I_+fSbgO^SE~A@8=;mj{m2= z+x7b0{Qp1WLA|Y2tJhWi19dI-Uj=0vq%l!OxuVZ}A5OIAZA~mKoPM|4{rlbBr;!@z z|7V_?YyIDP|7Wn*^aVg0hx$K2M)(-P{^_rIaqU@J?3wbs9eK|;_V0YRuKHVpy6rdHgJ==xL_I}X8#{aVKmcM^j z`~6+fO=bC7W|++k<}urg3oPEeU0s z+4laeH(&?+YkOTL_j|_cce~R0LGD9e`*yz-lnnR_?(f|Vik#H`nlHQ{KZ9&$zEg1b z+`)$%w(q~Sx1!|!-rb-C2=X*E3jeMSRQ+h*qw;V4X5G&Jm%~PxgeYN-p zFmdDfJ%&3ahtDNl)EE1^_4*r|SAo~>mVTG}@cn;*`1zGSb1VuMy|#i}{O5JO^pEz@ zjk#B6t&(&9X9~Un@Gx%eK3%wq-ZkjvukN6~&&i_u^j3@th0-dX?ZTwTe zT~k#zb7wSAIRQ!jSsSt%g(pS5-*?g*c5dZ$chYA0qK$4)5rfcs&TqpM5zrWutmxm5eo-NvGV`1}T|EZ*n z5qi_XN>^_6yIfLGaiV@|)aoM#A1eO$Qf1k4*!kbothGWQ1>&!Efh?+D+kDvhA9w7o zEz`011Y9UoHG&e+e>QMA!p#8Acj)Cv#@@n*mp*J+{{B;Z#<{RQ4Ko0FR-CnFaJ9c9`5L&-=^oAC0=~>F<8fb#edvL5t{KC-Tq!|2Fv3m1p-% zm#3@uf3?1S_gvZb&3A2oEIS)slbN^ovA~bD_Ir=iZ!)j!d{VdnOZmb5_h#>LDcT?Z zYd7i$$uEBJVc_{c+n2BX_b^jiuX=8{4V%r6Wxfv%n&&dTFTVWj-oJ{6mkRFh{F?hb z&Bp$B_4FUxt0qrB5nlhM;#tJwP4T~W^U6Jtz5h^m=NUndQ%Bh9z8tTc#$NIDcwc&- z>AcK;-u2>tqI2KNJpOs}{_Z37eLs^9e%>6V_w&4AyiP@3*lE@9ztLyKx#JqH7M-kb z`k8c)8+7bAn(Vy!AX%7RaN^nZYSnYFUYrmJ}!}943*DH@EA85|Mb?4^0vTeKD z?Or^|KG%1@GM-uPdr#-{E&Izm>nB6pZC$Q-;|I2HxU!A>v|HS9%8#h+ow=MrTKOwt%`D?3r#~~;0{}ay1eP0rL{Ii9X z&5kX*Plx_jgWaA8I@sR+V2;`C8+RW4-1+;Q^$&l8cpbkvHb*}ff1g`kaCQIH&dJLw z>iYQj_1?bwH2=YolfkfK?O}d{-1lhz=i2-@rXQER^}k*CX}Uapx&P6ZlIC&24btm1 z56t~;`k?Uqj34E{{~j*|$MRM4KT)k*HLuy_(2~z_&?&6{&;L1mIqd(3EmyzsU60%U z`38IFgJaoT1&>WxcYK^x^zP5Mou8qp@8kS8AFl0x;dkfA|IFq0-<@rMT!vWm>+LM;O<9(9cUi@745BPG&7@HT*o*L&p2j8uD4s`$G zQ{z1QUvurBKyG7%@t~u4^O!-^aQ&OY^D`Qb+a~XN=Q8I`=Um;~{3GYWwr{;r^TBua z`X86>R2^6R5M5u@DSkFq{8X&?DgD2(ACx5Y?(Y7-v{ffEsOhO2&;cSgSwIHnyU4l*@_D@$Q4!D_O|oy%M`|%g+Dgc z9$p_B$I`z2-_e49o|}XFpS1pJi(d^h3{si>2iK&b=U?{!e^*fdUZ}q6m%VNJ`Ky~>E|oL- z;566r+P(*Kug(9aYz(gD-~{xJ%=)Du4Gi^FFH_^+%*ysZZ~m(=eRnmqXyk;)I{S~= z%fIJ;NwhzeD*o?Lds}sV%I}TyH$vn7&(r(%KLtM?MhoIjQ1Ko5Kg@rB_Kw#w-|tk5 zRbVgYE}WfifHsIy4%(6u{?{E;q=HJBxHk(wXZxM^lY3phZTH-_dFi`%zq{4DcCvck zds$Ka*iUXXU8m!oi}u?-k~*wb@R@gZWx?(PC9$!*8|?n8B-H-% zyqUtK5cYi15GMtmi&i}0ScH#A}_djHV69Xc3*h_$hs=v;E`DQ88mWL0{?bh3Nb2b0R zuAF_Z3bx#DYyNkuoatBg{g-c+9!gEu7llU>DC$>1W9q-j{x9Vpz3a_?Lz7Od_$lu_ zcXk)tY~4S@;?KmJE8Y3N8(DunarbSx#bN&WdqeErx~HK93khTTr$Bqv;vcn5e*59t z{s)^L-jip%_Iy6en)CKAfBfq&Mo*x^U@zO>y!@_H+Haci@mv2M+x4?cy!$Jdu;aV? zIT_|3e~*`_pDv#>1)sDo80-W{CDenC{^;WA^!i@`9GKL z=LUt$|LA=`xa}T0^6zSWuF81Bra%7I)A--_-v18-$wGpx0yOit>VFNWc)ovBy7tED z!kfSTOm2V&l6~c&$@MSagJ(1TPvfun|J|bY*%w~(nEct|zAk$}8!SN=m}l?*h-d^u znj@kA3-3Kq75cGsKX=>;Vg2uV&tjK(fB)pP_oTPV2k&}ukRShB%gXB3{|vADd(Qg( zqn%S2GENp(t(;!f8NA%j?uQ~jyixuO+!e%bRf*#`fY?&tn@_ujM6umk#k z@3MgscL|&qYzsMe#j^H5%{L+ae@P(AKx#t&YeK@(_gC`uxbMsCc|WlG zKl{IKdF{FBpW|O=&j0*0=BxbMbNN5?{$~QkI5;CZ#~# ziu$c_>wor_U2iRV7E!&jok#zxKm(+uGOzmGQzP$&oO$yhErG|IHc#jJ&-eQ4tp8Du zH$2;a&0@{YSN6B6_P+Zi`M>qr>(cAzf2=p{Qx5;@E`5CB|ER|nutuT25U2z8|I)vE zOaJcm{^S0;Eq=B9H?}(kn?C-jdB9%JGkt2Z^{S!nlG_!pA>VJztCj=LrtY3JwXlIn(PyH=Xdf}jEk-K&I{k?y#Tb1A63k%+E z$USuOucYhNIz7Gr5KJMmH)ykWKY<&w!LbA)aNUSq->LF%{p2J6OSh?htiP4D^;Ai= z@c+=hzCI(+nQvP+X&N;_o7P@`eNFA3_RRlD zpyAx~&659H{pQ(N_C3D#OznSYpS=CP2pw1#>1x#NTX&x9KeaLWxS5%m-(0JspEqy3 zv0`hUj#=EBjr|WTGwqmb-j>=d?>*|awlsO;$E5yRp7ZCEHd@%&yn%G07EQTSD*GRD zY5U{-0oSiyE0SP?-Jc%&M|=|48{o#!SEfMY$>NZsh0ggvE+~PG{DAip->v&CD|oPe z;a>0QMw9FJ)-CRT({}i;jm4w*G#+o?U_Yi`Mpx} z^XE&in>_&arnt}k`Uj%3!S~Lu1&vUF)+a#6JN8R~%Ve_K~sTQBSXH)1fbuN8`z zyPHAhy)`#zDaTQGCI%0c#)4-=zs_Ga&+cnS|DOXtPYT=g|2!#t;Lj7z2S?KDFCA64 z=>(UuAi`b{$&TZ->V2_m4DHMJ={;jFzgG*|NyhMP{tuCa-+}z>X8Aia3(wB{c~Tg( zQ04FC<=@hZVTBB=k^>pJ>VJlM+*i?W@xN62N=2dPL|g-{TLoQb0$zs1587NN`2n;@ z6SU>+!>jd0dDX@Lm&QLjf^l@e2e>ML7#sjn4ce^P_|sylx=m%_+n3N&pRMN22W^LI zcwP5Z{r%6$_P77N-f#WaYkdL#oiAKU*+CoP3m#qUXW@Id<8!%u$>-ATcUV9NB!Nz& z*#7^4|A#-|-EH6vcirXW0L%E&udi(7q9liZkYQKaaNCe*xXT^6Ae{?*AWJ zKsy{j%S1to=Ap?Dyuce)l7{{l1Z{u=ZOMzPIW$?M@UHgWL(jfm-+SaI_xdkA))f=q z{&{+T&yk=Wd(AGpcHV~* z?f3tz%Rm0P7<9tL`IU35eok0?RaSg{*~f?cwjXD>-}?ty2KWvXARj{GA3l=*CkY8* z(C$iZM0&pe7PQ|rbL*}BU$=pR1Drq>*H^^+Kec|x*9EiXKVQ;6`1$jU?{(($E`QXh z?Ua7M=XKxi_n-|M4<9|AzhzfJVcn-Apfz5gt^SB0&_g82`t6`-FQ~XJ+h2SC`-4qy z!z+H;MDdC1%WXSWJdq)1Ua)mx)7!QGcD>&5*$=$;^my&*a?r^>@Nrd?5P4txC^Vjt zVVhhH_w>7;)$5O~-cuwe^X~t*_x}%Wua`f+a-J2V&vX4xbL4*idvCb+;OnASPyXd@ zXP$jM9^Zb#`+bN&f4{l%wC`$e@#){^+Wt)H2d9w7tks}>MQ_>fGQF{XybZMU>`^Od z!C7Cs`vH^{T=nAMHW#>1x}RJ3iABE&lm+*ISIO$a3%&3;6cpTulE<8NiR*ePA~pvYBK*~>BgN8_6O)bx$;9_MG-WBm;3MZ zkz;MY{JJAq{-<6ko%I!@plg@kW;-+SKd&q2{4m#WUAp4^4}D?A74OBa&tc?yzvH!I z{wKBrN7Ze99$75UcqV=G>-D?e@y7i(-TCI;^(s?_h(EvHpOG&*Ei2u9_VxPe)BXQH zJdOXW%aD_s`)SU${GC6)#sB&W$^?&Q8KXz||02tt(&WW?IXg`MneIC3cJt1wj6dSD z{FBduCPF^OpGuewx>jxa+_$%`=1KirFJv8^dad;Hy#HDoH;1Ohn!o>f{q)mQ!H?rL z#Wt^4YVmXZqDcNJZ*`|Ch-?L~&HS$a|JcdnHm~fSD?fb5Uw`AJ@$#K-E3lNsp2&J}NVly0s`0xA z@$ZlLnx}rQxW4y~c+|VMyoYB&25wJm%l)_djNiPRDVg6d?TGmluex~K;lto6*eJ`| zMn?bLr}Yc>Y2S{X7qxrK@%@vYf0k)0%k2NJWmhYeG5y<|W8W;G`~EC1`#t#h{QUnD z&ucZm?*^@@1ntqPFMoC9vVN?T-#nQR&u6;kADuuKO%;L`F+aTfUB>3iK?d+{ZP0e2iaI}=XA?m? zBI|FzMWif4#EPo=`G;@6n=x(mQPXtru4T|ESC3hL+&=$f5$JFx+mGt?8-E^I{^ynS zzPF&=WqT4p_W}Lo%ioO{%edbPAE^BGedmw%dN$C>E1N*a9<{!Dw{QFI-*Is(z~vw) zi(7qs;m(9w(#L|kA>iWlf8J_t@#pIPJk#}{!3f&o3f?MQy8qW?oBrPn6^FOi1;>Gp zA^>kk1XT?yyMG>>TMoZ9?Qb<``Wn(i`Jeav-=FmjbK7mdY>WTN3p!Vd@BO~^`pJiP zzkj$1<|4n-S9jX~*M=nEU9VQv>x0t@*oghNK?m}Inn9l@tAoyx0hN(u;BE1%^M7o! zv48(>;d}m?|K@ep=g))A)@K5*9RG4IpP2#Gqk9nn|DOZwEYLB3`Tv*3+wb{34^%dQ z4z&C?6?A`B;pbnk`QGn)4k{a7$2}Dd7uN$-euyN%EP#knLC}T*&`~#_CA#1v93S5O zo)cGpSNh*8|9haStsA_n0#riY0bPm4fA6)k|NcLx*XX~~dv9G0S_}*he-Kg6fGBP4 zPfXtbEjnCW@0|aeF18v&?of`S@ z?sssSQMUWU{9N6Cjb6+ilw%w0A%{?cOLY5lpc^uv;VbuXqWq5?`9IgKWxxLkwD$;< zaMu04I^Sl`?|FZ3=drsn?EvMaY35b7ptxiJZ$|>{pOF7JQQpG7lBwd;^*U{kKfsY! zFM){2`Z?Y8Khi-_0dVUVG~3ar>8` zHP)vW%W=lU=zY)M{dZgZ&tA|nYtX*Ir<*{|LRs4l9Z3ND>^~;zA&zFD_Pyzd#imTx__B>U4 zaBFrRi{8D$=MQts(Xzm0(DD~hb-ZfzKX1?xSfCS(*lb?q-jmt!czNACh!kjWlrL21 z|6z|u|E+FM`mx_n=>K)kNBb{aym;~1vu7s0f5L?({jm2H`oA@7b?9j`U*Z3uUYhEC z^0U9%{tw-@Z5!x9(0TP!gOUu3z0W`YqdnKI_SUzRlhuE&FZ%Sv^TESEt8;b44jh*M z7VvNCw(Z*+K?|5ypGn(%<_UN*@%(eprMCY=cda{pCUe#geU%AE{%1}C=e=L^TeUjH zPnD&8iuVAYeT&>d4RiSruWkHuy{Of3~=cO*XdAjY5^{SpTcgE=bTyMnFyyR)o$^Ajuyb*fS z!KV;;M(IueBYrC9b>f5lUe`;(M@z@2+VX6-eY`C(;xneBz%d5tX2zCY{m*>aWZkvb zpkCklO^E)b)GKS<>2mJ;%KyEV`^}5dn-1zTf;#K01Z^Q^`?k|2kdH4I@{k5YeoK@ zUNL$4iS3nBMH%Km1}gu&t_97X+`Q@i6f|A~wiHZscfmB-E>Aw*pAWm-_|NP;C%vEC z-gBx;{DHCE+sAPaMdSLOKi9qgE4H%koJ@B72fx?;zb8umSNnYQ5qPGj{C*{S_}}PQ zq}z;t`WGPIU<`HXyk3}Kl7vf$ASF24ELU>e#(tYg?E`tukL384ef%u zBY(Zk;{U1o@4q|yV|>PrlJ^hS)*Hs`n*LvFw*LP~pxGRd^v+lIS3ol|XQ$VD{^Ooo zx7+-7&ClsiU=~Xw4C~u}>Gaz@KaziZx2#@yr*z?mMUwjWKm+cNS*;-g^64KJ%r1}n zWB5n^BVYdiY41OL%Rl+Q0%V=F{=XSVoAaJQCSg73bl|2i%IUt53G6J>BN0d)=kmBOpL`ksfE_Wthwz31ys z^^f(pR_{OKz5mzgJtqIv^gjyqSI(SX`||a=-DTe|se-Km5%sLFg8S?JSKRk9&j#=N z;Izl~yY#!if)(ly9%%0W$@+fFKj?H?==9hf1%=5Q8Rq>sqK;?>XoD7ffQyv>cA&U5 zJ}zZ&=eM%Wfr9t_42SpH7d?~6|E$IP3^e2$`r!fl-A()J3x3O%|GTyRKOZQyf>RUt zz7&v;*8O^4{49dGjlKR@srfyY9`W~}37D_f_X&ecz1{z}XZhcY;`1!8$yLREDnA(d zfxZ66a{bRn`u~#c|7}K;yWo?Zz|pt=_TKh8MQ@_y63SjpJiNC=J#W`*C(GhBg;$yX z-01(0I9_?b6fBk@V=dssgL~mR#Ls;4-`FmD+omuy%syXt&vyTb%{<@#ohZ;h&}#o< z!SpJQ1KzeNKd$l1)V=D51OdX!taz>aFT3yI^;hh5uh|&x)IBp^SABW@zIVR$zn-kF z<-QRA+wXS&U!Dg~R@a`sZ?l*E-?Nv0+3Q{()BhWbn6LSoPyE;?yyv_B_Q%EQviG<^ zQ!skb^Xr8S;`Tglo7@ZbEtvSv09Wk#fpPWze=nt%&)+xse?xX z-!Eb2A0PYgRG&H99(?&-;&*rdJAV$%pUKQ$`*C~a30?EMH~!Tet~d29kF$C6uH$>e z-OtJWwI96azNizgcs>33>4(vEPrqFMS9Sba?`%d|3X}@3E^}B3d@Vx&Zwf$b*yMy0jwLb65Evb3V z{`P)F(O;?g)m7CO=arrBsXr+_Wq(b~f4=(qZ{I5p&MP?n%>4hUYuS5m{4iTz^HBKQ zRr!C_4dsww?s^9&atpDTVe<-Vd>E!j6W_h}|X7X+myIeb6Y)?S`w-pcB{@(lk zHJ@|;ac(oeUt86WthY`4mZmSiea=jV2cdG7cd9qqZ@<6yhHmzZ;z;kmm+X(||2_QX z%eQZK^Ar1{L>xR(>xwW{CcWVo}} zy8b2md%J(<9v|>kFHXL8?tS_CFBk62+G?#Y61QS|)y-o66Xx|*Iu(L72eSQQPwuaF zV`u2!RrvME?&sz4I{BYZiSPg0ysNsLoBzX--Mg<>816r|_}0s+;~OfT_VB&vkLB(W zfB%5B8d4Qsg;u@)ZS;R%(yu$rd;RYp{eM>f!}9+vThIRo%$DMx`mFkQyZ`>Lcf#uq zuU~WB-pKTys{Dt4?>{0>NB!r9X5C-*55NC&T>s<5pBLs^87=lQZzyMBSaWPf`QiI_ zmKJuk$KJk{9AmYnf8WZlv34)tJz%Zg+up~&^Vz%ee_wyRcR2oOYt=_~**|xu%eei} zpSSDp-Tm?F_cl)7rMKR4-@lXg_x`otK7D)tD*qh6@9)Iq5^Onc%-VfDQTz6RlXv&q z)xFDZ*nGV{?0eSzMOWkRR%CtM9$&;?@cie`*)=Z<|6QK*yE8t*?(w(7_Wz^*$=>_p z8~;C%zgpw`O7;h`&N1H>1n3LJEj;%4Qp~r_nQ{+6QXc~4KQ{W;zPeoZPrQDv_*pZC z^t1Zw!GXYT@#pjYz0?0^egAi8J#1|FJUc9Y{VVR|?s~o`?z!q+p$C8L4t!%`m{Gn{ zsw$yARIc)I#mg0OHX8l=3Nu#P*F}A3+WYqO{Q5_+=6~%QT1Z$ z+q?0cO_Z4f_O`d)t{?~4ceNzwIo2Yhv zcNxo@cYAL9dv^U^(d+1>@5k4r9^Jcp^ZH*mA0If#^}shysj)q7`X6XWjQ2mOxnLuo^|`- zexKg|hJ61)bBCorp4Y>MCT->6$w2YQd|S`;pC`rfG1Pw)+4^LnITOQm+4#A4Z?k;s zd!@Vldik9Bb8lB0~14f>S-3&wq08vjQ% z?$Oacd3&}u@8W*#-v7IO|DV_UpEHUv^w?b9?)!7oGmASH|Lk&&`6iwDU_$z@pYeZ6 zADq4a=ZWS|n%BqPt;^eX_2UC$@&A7`Z}0yU z&iz1C-f+)B@ArO_k9o!#^!$2M9<%pJGylI2oYvyg{=8WK|7`l+&o^(z*FQM_=j5Yh z!9TO|kIeu7O1%Ew`EU0BCRVF&`?IUxM{oDvrgL#xF=f|VKk@Dl`?) z^gni7Gp(gpL;r{Wc_&=?DYoj1@3T$k|33WD^gToV_qE(PKi(d<{c`(%0o&(#i zzV@57ybSNt_wzP>W%pkZQ+BuW>-E|Ldt<&8*Oxt-T%U68zl8qpP5PCm&zko>-mtqG z67lChI@^B=J}`U#%h&dA68ZN&eKvc}&ne685DlDoSTE!M>Du@2KknTh&iG)f{o;cC z_v?k$f0blqi2HN2Jb}07#&^AhgQ@mEuV4S%wDhoeDnU@HSd~Br3^X=?ax1k?!Q%gb^W|YmV5tRe|LcIzw+Me)q5__G)`{- zT@(E0^!|Uv#-CH0Nw5DR2^FLPm|K0olJ~3)Iy83p#!}?)^u<`=4v= z4}sgyphY3;ondXi^XHHMJ#g&#-y4SOs_O2668(>l$p_~DKN|o4Y5afN|Ei#J^6&S$ z|NV`i`{u4!?-7PpeWjqI&A`pP)$6M2zFqtCaqXj3&p(1JJKitP47v*PSD*E}N3Ne& zxZ8X=W4gR?x@BF??`6{dhkh)}|L|M9yz%bl=M|SOR|wuIJRU1p)hS*NN?>3|fN~zZ z`4<-g%Wm}xuDv^wWcRxI-)b4_vYhnv=T}Zn{u6Fl`RR#8U-!|b|33PkFX`7kJ0tl3 zbR+SveV|K-QsY(_FZaJ!^SL)VI{HrjYTxd&y?T@9&W-k)%a&L9RnUne6?CYyW@J|3B?_ZeHHhpk3>#e;k%O z)xGR}`qC*sYd(Hxx1I7l-E8*NsBPP}fldHEtJ3@UMEyd6^z-we12g|0ub6p~TUAr( zhklARX!2Q8>Bsu1pas4nf`35M=-I9;|F;@V{vRa>nfmw~?-AtkA^rq-Yy-sdIP`4) zrDMmA8SsGCTsUp}c|F?Z+r-nyZ9Byep5FJy`(Dv!-|nM-Kymec$K!S3^;^U5-MRDQ z#P+I<;kJLZZI&;;SN#y@1O-fUj` zw@?Oj8}*-W@Bi3M-+O=dz8}8J)2`q9G3)QE-xUkame+rA!#fCeQm4@}Sed zPHK8>N$1h#{7R)ee}C8ikv98Y{WZM$=-anzg^%~k+wc24p?&`^Ug`51kM#@oC;pS` zFWO)E@80^qSL-WI1<(IBWw~AM`%CXYTlV7W@0wcQmahMKy`JCZ$wBk2*Nzp|oC=UVql|2wg>|Aury5lzT-zv|yS z$=<6~@K$?I%-tJ1p7O@$mp%GnyzjYt1vqbVR=f(H|LybsAFuDc=Uw;zX?A|iSsm-c ze{6qU{m!_ydb5st(Vd(3@7G_NJnz>Lb^BiNv+w^OoX-ThH>~3HS#!qVa_&8mlJ$%d z&)!c=eJ+}JYp?76-&^k-Ndar3vg2(`w^p{MiynpkkY5KJ9 zb6G)Sld$zq|L%jQmq6X%|NXH)=GyQ1U|s*iDE^maX)?3L&l|^Wnx8)g)vW#U_H2JZ zEzt8T<7@95)c5b^>$_X~Z|{kmROug=)!+ZSqyI3d4MCtsg`YhU8)p#8t>Dg^jHfWqSaSGo5ke|~Hyp zv-oD`ZO_qz<-~aqMXpdDK=uS3JyL0;5-+Awsz0R*Xe0^>A&n+=) z^T-WQK&LqGtp9c8Ud}maN&R;}XrVSZ&#Y^zuKN~V!3b*P z%EQya9tOj>2b=DCSA$$rA-DePto1y59%=9SdgV(_xotD--|qX}0J^j3X{F7_ zlm55w+^RXEEPrpAo0|TC_%Fu6n)!EQ z@`2`iPk2G+PFwH!Etl|r+wI2g{`yJAjB$TM%gn_O_g2|L^L3n}?nLPc1>m>3jlR>@eS|RH))ZbKcH}zg}NE zeCtEk`meA0Z`oHIGtT?{NdM0n(CWb23(a{y@4f#WDEHuA_50nQ`>c2G%Qw&4{_gCl zAKW(f;1-Kk{wKEU`~GFGkB%<=dLy@d&AGYzzfFyQ2s(The1!?f7tEmZtw1w+e{bi_ zpKEJ=|6bgD%UaOPz%yNQ@C_ocu%8dwb^rjV@4i^N`S-bdMfZQE+x$`NuUtBvx#95c z_n_;`nL!5*LZ(}eB+GGvPM-#y5C@tcsXBEz?XiV*HQ!4t%R_$c?}Uwo#(veetp8_o z{(SIz>uJ{fOniFxKK`!%kZyAzd+#&t{U@dOD{hF;`S(cw|Er7rRY#JN8UNfYuQ~tj z;w#AyMf%@^^gnv7FUZV)|KY;}PXC%u$?~6H9JhORG5$~M{GZ=;->76K21U(*aKxf>xn)JTC#wUcY7d zqYFPzt2`$!X3xJ}!iNh!mj4Iki%Q6`PyGL3t5$#6cObmg1n$e|-}r9xaB1Iti3`Y-WT{W_x|7Hci&a-|Bmjr{?B&%_VK*hW6lp` z_#r39owxmduj<_&(CmA|>*=TO|Cu;{&tLZXCh=FGbNK#=-Fqp$|Bq5k%@60Vzw1jr za{60=W{B#3P6y4-!ZVFLVg&AQbZq(Et)Odq4;EK}-Cx*We`tE`(d*3b|K;WLyBt|w z_e;E{^0a-^?g!W3y#L=QzyI^O-S77Oo>yMKeLMTUH`@FD753LNeNfB)(`K_=-S*|m z1B>Oqa>zXZEr$V3B7FcIg9$oqv0=JJ{X@t4Z`Z+#kLJXE`fT@9)&6~Og`9Q$Pjmgk ze@x)R^IX^H#jt?pb{~QVN>{D^$FBr$pZ)Wd`}m=qLA<=Y{y+b}DeM*JzgM_}!uFV1v+a8WWCw? z{qH`!tClNyZ#fUVtP7NDAN;Jmu=ly2&C|>SoyToHfsPjX^Q05x9cYvEYrO!px4v%I ztNV%d{~N$=ISxvs2SDLhd^5e~*75mvwXdGd&Y$)r_Wr-G)xUp#KFj++H~#Zg&`o3= zMW3Fm46pb(z4}D6{GZDB4^P1w>(7SQUR)Wh9{)*IZnqrUyYEZXZNHwGnVq-q=P~es90~547TqVZ-O?^~J}Z z9Rriy)?8?mq!F%jzHje9SnHS?>D}^$&C2?SB8} z;K7H^^4}&%=k1txx@_C_^*f*O6jW54DE`&G|Bv>A)VOa;E9Ii2qisNoVmeQQmV-U6 zgEc z_qFXSL4H;~KE4XS{7=X7cSPvy`~JIb%J15H;x(3_Q(5zTma+f7_ixTF z_rF*7`|W|<`=7Iao&!?*MSA}SV}BWYv%3X{WBn^%>2Ce=;>x@qPnPe!;=T9CwQJWF z%YD3{Zuc`&9aLlX$^Tnv{^#m^7EnR*0yJc|^FHXV!O!aTW#EIxK~vz2pd-&28ie~R zpMV1V_VznxjNd)j1X_~;T48Z}&%a&&ZftC}em@U#WL1L_VysKa z`onHnd^R%ymb}~_=>Pk)zQPY&`PTe>|L2m(~cS}K+U4Y_< z33T%8vCqZ7`Twy@w*}n?0ICL>wC_O=rT)3|X>Z*7efxi8Cw!hZ8#E6MZ`_n48aJ2s zWhP(rw7$f$e(ulhkH7dnK2g8y?ONS=muK(!C_T^8a<9`*VZOQ-xBk@eF*JlXmsc(= z-~T>U{^#@E{Qp3OpWK6&_20yA=l>4-_@RA%{i)0R(VzbKxVwwX*Z%|6uK$!lC&__s zV>Ab!_ysEOyR*;1I+_2M!=1AF-&a2w`(vMXe4CZsu>XJi@xuN76^~!a#@E)DJ>y?@ z_Psh|p0&09W^v}cJ3qM}-1_q`n_IuIE86bMjoo#R*}nhweSR!!r_ufiZ~ObFF@XB& zzh1AmF8p(2Ekh4`JAc(=a|S)Tf1ZDKgVy1I90a-^61Jc4Up{z!FSxO~y!OP!Poc_r ze0S&lJM8n%`R%*7M~r@RtvLUjd;ian;m?D1Ion5VUv<;No_xP=x96n(ziadD{>CsY z_cLEK&;I{}&+K0h$NfLF^z!=;QPKDRROy$#yqCZ8i*$YY?mHS2S$@zjprP#=M=C zzwgRlIXCa|`~Qv5-t{k}S=adQ?K4&WAFcb~+#mOTsUG8Y{`^nsyZLv1|6{Z*{-fh< z1`Uza?AN#056a&?d$4wT-M_Z;b)O%9-*fGn`Tl#}cRudD^JSj>md{q-biXmI&(BZ& z7o%y@fB5#h2aI)Z&Fi+`E4X{x=80Hb%I|agD^CT3P9*KebVck}`6qvVa)U0MUwggg zDSy?+`!z>+vmf-&+wr%3U!C3h%Fz&zkYa24C8Sz?qzPbf4`i)U-@T^-H!*4-aNTHzp!qN>>a)U zE{ANJVDtKuuh+et_r@KYkwWvzTbzA+MoIJ_-PmWjvdvVZ*~7I zzWZlgK07GKmi^h-5AP!J!&6=OU-qAu?SFp`UhcQ=5wAV(pNqoV>z{u#e$Y3!{eN!x zEBU%l>^tJ2TSV&gzh0XE@5aAf?4|$a9zWj@UU}u;%9rwezoPv*qA$D*s@rEO2fFM* z?E0L@nBr%k1uLM^?(QeI_2r=A;=dheRjr;hKVKu#wF&=&S3vrmpb@&N^!L`^Pq^D8 zRabXE|KcUx&z@&({ePzYeEIudg5T-&*JtG1v#3Ab|L?)vzsw8)D;sVfN&PN+yY5xd z*L3#6g6P_f(aYxl{QR?5{doAEhs*P$?4Nx9_wL;Ft{XGH+t=@4*|vRq!{+aEcmH^@ z9JJt-+vaEX{;!~gcc67^pKpMM5AJ_`3ptOM;lYt)xs#tkhb=Ph`0+y>bP{7DC}qN0 z9R7%U#@2rMMQ5i2;`#YZ2Yybw^Im#>)$7ji>Zfnlp7pQ(qTIIJ_VLqSTwm(HmiO0g zpU*Vyt*ZR4%Ga!aitA;~?LNJE^Q7}8@AbJm-pep(a6QP0nRa`&|J+-j-rSu3`}K~G zAu{*B$lw2aZ2O#_FAKNsuW6mW_S-|@c`?sFOW%Lg+i(9wvGUy?+vDYZdk=ZfuQ;Q; zc#81)UtFMdeU*PpL1p$Qa2*f2=wcUmP3*7Npi^XzF@u(9^|IgC|F-PichH3@p!MaT zBP2h%+sUAGpyq>4H-Pj!ewjzg$&`R9?~m7IcDy67_? zn*aTp-^(CZ`$wYS`%mr|Gda1lW!pgO&tQf4cF-~}y?w85g9=gb>UT!aotnr0g3dj+ z*z;TN-S+z1Z^1|4{srYohHv@1Yd=q$-O%k{0XbDLJoalnFQP5hdh0YxL%EH`6UJ-X z?|+?f+~(D~cH1B4=lz(XFU|HqTz(JRylwyI{WZDw=Y#pLp7>v-3>M#~*YoP{t^C}3 z`DO5K|C&pm?rlEsXc>F1{R>C;&yuUZ&fWhnI_8`B_Ls8v-pxI|Mf|OvRb0`3dAa!Q z_kK)`|EK@!-!t>NX5N)^Y(Y!^4-{nTD?L;9pY!|kek;i8zTKdT6LeIx-tNEb^^ZWT zci-Fg|C)RNw5smYA5dR}3v|*a^zIRl2grwD{+B{-n!VY{ec;-+Z(I8-I2i7f{N<{6 z6#rMr!2aio?=}79EDd+G_Zm+swn z@@;IGKx@OD{{y*yh7q(38?^lP!6V^$ zM_?r*N|(d-VW&S^UgeR)6@I7F|CoNbaopyYu-&`EJ9FyZ-+ay2w{GX_d6%E-<@jIz zX7bkOa_3#|_I25bde(Pt?J2k0|M7?6gBmsd3vCY{ z3D0A(d8BOr0k-H9w5D?6bMOT;;AHd}bb0tOP_hGe3+GtcS2FEDTBC^C+p~Sv8~^@@ zvfQ-#FY0xVg6m4Mg?CKhtT}K|=*Nois$YlYHqA|ae%62gz037azHfigknDfs*Xrzf zi`4%eeWZH-!VL20-rc=dZMoR~ukP3Pez)HH^RV33&FhQzf9z>gxB23D{Fq=w{2lPPSX9ju zcDp~*X6NsGcBb|Iue-bD{+>AddVTfbc*s4qpmu79_?u_twYx#BX;6l$_*4GB!PwvC z*Te&|`+v=bmCpZtp`+fQ8@1jXy8Hb@NBhf-{ojP=ANpKz!*qJyy!!tZ_1_P>%j|xv zxcz`@!spb!9g~00`*8gJm&5gc=Dq*e*I#>PvHb5D?%>`_{GX@sx%s(&|JvKEldeYjq#Ic#yC$LT9=+ zs6Sf&E4}`o_5R<-@4PRK%VBw!kzZXa(7o2`Uf8kt4_~frmd+1QD|jd`cRqD}*`FI* z%kS^5KkfVd+ApK{Pm$^WU*+!v-!TsIEqK8*xKu9&6(^wH5ntZkx6m=i2YvB>&mu4G z{2z%Fm#b|5Ui&nG{rYjcS@yrP=gl|z=al)r@NsW{+wxC3wM92U{$TTJ{onv3m_~Wwu@8SpLb>I7U-hVllCGO2L(}K*8o33A}l+~N^QoQ2etAh_)=l@=M z^{~8^edVJgi{*FPRM%DBzX@7cT?M+ME8+LF+2)YG^^P~7%=qBJwcDU&%HWfPueNrB z)-XC{IcQb(CN=)o(f^;;|DX3RE{z3P<^UE`B$o#P5(?;VrOdIwYRG%=N z%X{ae^nTtwr>*y%HN8HE5j5!}3)(R9?8styOZ&>Cx=%+s&;MJ({r^KtUiN3u!OWnM zQ_xl9V%O))oNrV3XCnV|j8(e-YZ1X-?^*q8?NdemI>hic&*$$u{$2UD`s0$`k4goH zXD;sMul~!sr35e zpjq&r@qbF?z;ze{?B2rzk7gO4{(Vkwo#o~|@86&=5B?vIXesJn@nczV-2UU&_@APd zg@1J8{w@8?>Hlxz)ht8b`r2>3a_?>)&b#$C{Qhy~oc#YMOWrsZ&#iiS{G9)sJHPMU z-_tJsDzLxe#ml_!OXJ_nx}_WU_u%)tJ3dC+IPCwmFY%vTec88N>T~z6+w;SX@xjyd z&(Y7M?8t-b%XZi4}64p4#n_YB^G zk4z8LZMVkO*VdkBezyLfmh;-~-S2lly&C^i(tWmd`Q38f{r8GzvEQ((eb*cJ#=ZWb zXMXkdrT-@K+kX7WUv=~Lx7~mLGBez`d5D0J?pjpvx->&K2e*CdWZpRa2{kp&U zOxx$zPcV~bWVltyadPhTPknp7B?|hVwb8Wwbg@5b-SzVozl`PnZD{{AKP@}k`%>xk zxWk}>j1=KLbk2b5U-txT%l!;pC%o-!y`twN@U-CdE{=cMscQeXDmDF&0;$kY`msLs zHu~XXPWoSi^h3QO^``#`-}&#?>s)ymnGf?{rpA9$&ENS`?ZNr~kJkU*xBua<*PxN3 z8P7i+eqVn4?DBbqzkjm-y_su%e`~n8nVIxm)%lk9`xwpbA3Z$q*1wKxgXHVSy9_Qr zG+B4<%(u9g2g~o(ypr7i^*jIHFY$ZkJ^%P>{kK!)cWcj^^y>dM(r2}KEV=#fRnTofhCjNIyKYy?M-JQyR+&7`#(ocaoKP>Ij{P(GG|EB(b*ehIf6TjY&0qQV?)5_v=g;VwJ-GGoV~==ab@}(>UvFNP zt~qgg4r`vZb^Y`8(T6Tq)aC7Z**3lE$SEKj?QM7yn;V`r%6TyV_eDi@rJEFZloX{xh8q()Gn}MD6~v=pXPkzx&~n z{`X4<-o0D;{^ve<*x>8BU*X^_{h)!2@W0x%=fD3wQN8!L^<2y1XQpv~r*1cU4q63p z?(^q$_ji2c%)e9r=k}c1z0-HG?D^u%SN}M_FZWDw-5-vK+_m{OmiLO%j{e>EXZg9B zoBH8#4by91ir4>~UY(gx{{0fDAcBqJg#UdV;HCM8U)fXW|8mbsN9uJUC!Is6|D~Xf z0h3hz`A=5q{O^>0ZqCf8=(SOQ(>T2Vp8iTZ_!5}QmRuDJ|4 zuy0!Kzt6GthkeWMS6YL{i~rjpRSuK)|9ZVY{K(hqv7cc}q~7m-|AznX3IC6C}uk>;6a-+z+b=j(WYMCbryA>j(}|Yi*>=%-oMI_9wcc0 zl(H7W?(?8H-SczyzJH*TF+uB{4uI2+J?QM&kJlTI|2=#EecX-{#Z?y$%X8U$l$Sft z{b7^--$(i%h4jn*{4ivI&pv{;Y+$$L_WA#h)-&h-Teki`C_sOFOg`Q(|G2LFZk_u1 zOeysT>u$e)!dlULy&_bv8aAm7Yx#!$XGGLI{~f`Nfr`)OwYC3h=l!~}{BG%WThN5{ zd2m>Qmb1vWA*xdOSI_G|UawquZod6_?ysNs|9Fis_8^k6Td%z~g$GJK{=E*dU*|t- zo1Je{_lf0vrrB)9{@Rt|&n@4^?Wnl^wj8!nF#PXwq)fTovhLH7t=Hp^7e}qXegMSy zyyNvZYuFA2^$X+_3KU`#rC}Sy%c& z53U52oZu2^KOcO7_}BW2)_eX&?>nWv7qQL57^%2=zUP$o-aCuses-8wUN--;fWN{Y z7KK_2h)(VQIrhIM@3*kBvZ{P^weYdo%hT>rhi{{N1} zi&R8XgdQ2B`S=Ko%=`f^zA(~EZ77V)$4X?z7{li@)O*{}>+v=aL@ z{`IWv^$+788;55zR9L`M(SAv|tHA0&1dikE5%B@njpI}i8W@QveD+^EcMh?$0(CRc z+O@i{bg}Ax7BotJ{eO5&I{(4`3&)Nvx^}95;msVjITnR;{%dW%x#smQ>HHn@>X$}o z7d+;@{(1eDy?bqW4tEM42OaCUGcwz@@R7y;)@^3uGf&npJbZXDx40fO75y&^xxFU< zbW$T|!!I|eZUNnI1KPNCebd?cwH*)kPs{yx+Lh&hYtH9*Z}3JhSfc`TuZ)_PWc$Sb zTDAAntFC?j6MoX?$eQ;**9T?4{9U&(;=_6o!2?MfAH?e$r`MjZpSo`K*0Rm}p6@?( z?AW3yMK3SO{cjChT?$%hwJrA_vfbeHxYr@%_8)JRkMXC?{%=+J81E4T+G-~B|0&2J zLg4!}w3UA7r_cT$HR;FtR4}E#bn)V+;3Z8n&!(}rw}Z}JjL(4Hcaxf({rba)7n=UH zQvbcy+wdF+p7+b--_&)xzezoqSN;C+{!^X8$J1-;&+q;I5xlD_diLz^b8U}?VC3YB-Kr~Zrx&9xA&jbyyKvT1jOv{*st@Ex~B8f zz8`X(cYI^8dSmtbeeKV;R6kULyQW?Y(XgnWwL5SBXHdOv8C!nZ_rT+S&)y@dyVr>Q z(Qw@ZQ{r8GCQxCZa8kux&3TEXrC*n-~_KA&G{U!4eBb+{$C_`5OEbUSYg2R($7EV{CC=X zv*&-*=9_!29jjOLJaFxq+JCQ&Gni*Si_bKh%^ZFC2&k7D=yh|J8u*ysn>pJ+2lg)X z-o1Mp?9im!pz;TDgcG=i6z@3IeE?EIf^QG{81D@#DB)KPfy+w`l!DUfvBf)inHbRF zvJ0CJAMO?}hn&s5271hF&tr}|;M2jc2CFx`{NqZXjNE>|Q2l@Fx9{H&1+%x%|5lY$ zHE_V`3*fIv|AH0^)h@kWb2S_`Z@2E3zALnXg5?a*oY{A*NgxDPFj&f3*X?>7T%uz8@?FPkGTHpX#8KK zng-VR0@XS)@qbw7e>}DRPuHL9KOg1)zf`Zk^&B>!6#n-((uQB*nghT09|v8n-0{Fw zOt8P=$YJ{jfA2R#BW>3!dpT$s1v>Np_}ucle^2lK_4@v|xA%`1uUhWMaQSDq&2rGe ziWQyW^@gwnj(pHp{HA@+_kFef{xLq|XV2|M@HVW~I`a#y3&4Ab{xAIY@88GM>37c6 zFWkGo{tx(sSV&$v58FBs{@455-y`}T;$MF_|Nq;E^Z%#)cWSTyw;hCIzRJIXi$+0C zIfT@U&zrHOaCjJ=e|hQMyQ;m<_Fq_f_wLuKv!D|KD?c8pT=%QL?Bk)zf7!8n3Sf0_ z)kJtt?D&}|3^T2KJ=-IQok3Is4ir=~uk)rm$wXd(Qth^jr3-1@XYKC^x8_rte&vnQN z>bajmZBSwUx)04uW-ROcuO%%lec0ebe1_TVkMY@Nv#;O!p>Hz#Y~$L@M?W=}dT1@p z$<6yTC&`fA=xnhTjQ{6MT5&@5tRL$)Md)~GLhBd9*=Hfg8Aj+RJ$mq<;lGn$;m1d= zRA_-aJ+^rJF3t)Ri%KsaeE0x5UXNQ=26~S9>velEuAZDXKT*c0SfU+tp(WzDzQYzN z&kXoL^$O^?zBp!ZZ4_=<_~^%)_wPX$R<537QCO2*{P~;pyC>jg`*t()_d7o8{o`I6 zrVSq(6Q2Z`aOHM}?gUxA?$`Pv&>3GH`)==e+19+=mKk~WKlW>UBT{qr&5_mn4uK9J z`*~8B!GXi#--mX_+$<|FYcg7t?>d@qbizIm=X5H#Dj8 z+nqm8JQM0Zu^8A_HkH@Set7IPG-0e-{ckfo53K$te5d@+joj;VtacR$M#S!@cz6E) zE6^bP+4sN7Kr2c##g_Zs{0Um)aKQKdAF~6U?)F8szpmt}`(L??v}gMGLreuAoGhs=j!F{*W&t~MFkD=3Uc}n>l`F;T zFCCWO#Mxeczxek0KgU34F)@62wEoAY1NZ;Gj4!(BU3YIecqypO%cb#2W&aL!F1K4d z&%(^U@{yqY&qma%RvjQ>2)1RCPRHG4LA#rIVn z9G;++vjrbH{XsK>Q$Vwt>*DpE@BcL$JR@J+C0^~b=SFgcABb!6|LT1f(4yRD=9Pb~ z>%N+Uj-q+e8D7hZs1_IyWn=vu(1AH8#jC%77F-@Ue16{kvhPCro3hLG_a4hFX8_&y zd*_eZ`uc+7a}T_nUN4Dc3L@a^x6i)!GZ!?Cc0kttPjLU=tMggn%udaGz5aIfY4h5x z*DFNl%?Gb}u*{ua^z2CIahtc-j@y4Z2r@nfbWiHflfs~bD3K>L!~gC^O6$!scM6|_ zVyob0!Fk)l$Gl6QKC3zQd2{98Qk&&=UQ;4${v@U_gI0-FAJhMP3v_r8XpR?oK57;8 zBr|Zmw*PjgyS-4wukH2!L8gLltKa)(^`1{9_jlgi|L67b`*rN+UrxLp&u;VbU3GGXx&)O|82J`8R2J2RqUL;PX1#fXq{8h=iU2c^$+Ck|0I1tH~&l3 z<%>u?E2N>s`?*o;8bBve>e>DC+{4gc`M&)2o_|&co}Y{V?zO()wDjJ4pt5C8!0!HP zrGj5i;}MA#dDQLw<{hAg&9`Mii^rJHq;GDw`*IMpas6Owwf^rQ@rOr(=Y4x%{f_Nj z<8TARK-Z;u>kPYCExPtanZBhPD3 z)t<|qyWDTyojW(4Y)YSFQ70I;=l%NH54s0Rwy^lkxA?a}yxx#u#`*N=bG}iamIU-N%I-T(OJx43Uh_3ZvEJOB!#7_*o?Ciay{rAVD{@ST^S zCO)_s_xSw$|F`r1+sQq+8uw^pd3^odyX*gEF@TGZ^>x3$e`L`AS!o{o{X_dFhS}Ti zu;{$EhHdta{rcVs-r@QCTj#xXwD{-C`u~l7Z@)uVTJh&}? z=giaF@^(!`G*KCllRc;w0xd263_1A?dL|v?fp5Cz`=30oo_0Su%@7mUX zN(a>l4CQ}bVHqpH-MIs?ga&^{wBmKGSJGhL-sa_ua`+TqSnSJhJngk-S^hqb1J?lgU-|24_+4p zIxQEphWE$xJAc;Yf6u!AxfhfSz-46Yk9KvC>PDm$gr!&Od60&eCV(ugc)lHU@a(-W zZR@Ka%Fkl}7k;2!3ZN<-lrCdy{!GsMe{ep-ye~_Z7wiYE3I>(lpz`Lyhj-QA@^}9Q ztsXhDSe_FU8pvB2*Zt~8S}NRM3_3*(aVPhaf5v(LK_@Z7LIbp|tQAyig7Q6R)v?Ec z<~N{Y7VDtRf;PySF3^@1RWbkZ*l_ z59)M-Mhd|TN*;h(XGcxb8^A3JP(oJNvTujAb=jLA>GeY2qY;frNqAqpo(m~%XMuds z09r;nd;6U&JD!0yZtBgRYvCsq5xZjtWNixQcsj)B97?8mGH=sj+zgvI3wVrFv z|F`zAA(VB$);mMn-T&p&YWHu9_z=JJ^{X}D3&mHL#Ion;i2VtF3AyGwTx#Brkc8xo z58_w8wgS=nz3!LBUe5(9*}d-dE9fQT(6Ii`x=Q7r>b9TjRXhJjK`5t5D8o-kvjm{Q zD81NSB@aP;9M>b~&iP$0{S$uk&Ye|TUxSWhkB*LByA?FZvuW$rqx(IvT;(m+eKg0+ zx-{$2ey{6So0|_`%{p4YuuukRZemg{xQdHYSfzqCLpw&mi7rULNoG+#qFuMX!gIgEiqzk7--Hu{N=8yii$1!>koh?)Ik^Zt}p%fhxOl7uiK2b z-pTz}gWU0b?p)dRQW*2wv15-wSA&c1`hKsvJrS~~1+n^L8qAf@1n~F2LC@ohMJMa0 z7S4g*vc1W;@34iO?({$5HznO4WbAwrzcTMkW9H5$@tNr|jo>T)Hvi@;HCI;lX#u9&64NOFTET4Pxy>@_syJRpNligr~j8Z z-Y5V3=T7j|MPXoedu?* zy?gf`^%?qN(zBy&?5CHN?|gMXE4jE^JYj3hr}+s`7Oa*zk995pJ|MaO3268ZG`ROi z-0E*xe%a&pz2~2u-mmgM)NlXY*>`^=zTf=wlm5xj|AnBF?DGF?_~cHRC9AU&W{ z=U|f<#qgn&|C4T(UO(eE|Iz+yZ@y^$%RcKj|Iw=d8JjOJ7vtYG^S=|60rPGiWuXuE zO6dQsai2ruUz)~$oeIrvpff5F^6-L$ezOP%Vd)8Z!U*1Af|Q83M~JBvFoZk~YcTzq zzUKYT{{K;@)9={rekb*hTX%lp?>D=$cf7K{_3KXMzwEW==fc)A&EtosQhiJCy&`K5 z+yB1}9?#>J{rB^}+`pgqi>}tMfQx3|{mFa(C^SH9<*|AW=8`Hu(18_EAfm{P^#4_)R_WG%fAatJK~wLpSMX`LfAurI{skBJ>sD{xcRxbs$NEd9vKt`P z2e@vCU-`xMf*AL|sk_!On~8D%Tm2>Wdg)!TmVK{xt;^F9`y+nq{%vTL_5b&ZZ9k`b zJOWK*XL~-{KS2dPKy)3llxq59v=vqL3)j7V_PLV$YT`oHR-5v7GT=#S_)H8q`REH^ z3KXZ``NLBw3Wcfq3X_1CKU{|*1OV#E3Q`$3h0z6sCafBzW&Z#_4E z|AGBMnbr=s?>@c{+9dWT{N~M@?{>WdRR|#Fy&Dm8?CTr7#C;^x`GCtmHzL&apyt2e=YlwXKeqy z3||-9!ppzE)8Sp+|NHkolisHn`}eT@KjVK>uarBSN&oZuY1Ub2c@g_H9)2Y3-~VN& zo#lL9e6Rog{b%?m1E!r(pVv=WT`GsTi4V!-@TH$WbkwWn=Q37SK!#O8)%$)18iW|E z^!oMx?Slv4MXKPb2lye4v0wk+zIRU!oS#4hj(P~m7*GEyE|5xaC?Ks(|G&NZ9K0xA z_ltxD67YiTe|~@64d;ga_VtLq^M50Fq5l82>Ge3o1so(ahp<+-A)bG{QQEn!Du{I{ z(^QaGsZ3M($G!JPx9zs~>6cADfhH3sA2t9@62w3K@$qr@(WLC+$^W&$jbG4Juv5#* zwl&Vq-!-v*>Dslr3qTjm=H%uw#$NvzpSm$(O3&nd2y_u_ z?rg*@0^o%`pp~k4*HwciTa=UX>+APMeU48xn=LCR_x8Q~2T+gU;lqod0 z2yNBXw|~v5MJ?lc9-Ba$#B&Q}j(r3*fM4F(S$yDP(aHUn&RH-a7k}%GW}k0Z{B#ny z;9R}#S3Kf~=KtH`*2CJxtC1#vp-MsXiN9&E5(p_(F87}g@hxa2%YG!6nei}V&kB3@ z+QN$KRsU)1I{&Im!HCA?`^C@*3H`tSZZT}Z1?ZISTCB|*yk!ok2wc7IQue-A+KAa% zdBjpfaNPqUaLimIO5E+zc{^Y`!FRnvE`E;jn%_V1c||O1-j1Jc^Dd(-;XyvO;PEr| z`OZrpidxpH;G@y_QZf1Y&i&fAYz z@A;ntQFHUf2A1nY*pb4wO~C`bcTY_R~au_IDMJ zkdmDK;!pY$kARoXpWCJazC4Z@)F_Gutz7w7e>Z94jI(KvEk2?YmdE?$<8{QMXV3l< ze)HC?thKqhd7svs%s<;epxnGLxBOn^zdx1#vOORDH}U)vpB@d_tgA0zYFxPxv_^iy z+cQu0gU1R^`TPSHnV^f_K#x5Wd;k^CI@3=#A9e<>8G2e& z30i|cHR`pAFX(D(ZCUF&84C-WC-Ez-Cub4tobJ< z&;mT0<*3Pr4=MSa<=>Z@Ts-;t^FaM?67w#9oU9JcK#0`N0?#1z$@Tg3pBwTp7nD>W zmVwtxA{0CZ`2fe%-hztZI)kN?$5mbi`4o<#k>AqyZvt0 zUq6I9l#z1KZR^|8vuE2Z-}k<;_pC2CkZ>#Be!oikeDc1noHn5C2?z%wy8yHjvC`(( z(s(AcEJ-LtzTd5u$6hzx^+sAli&)F^|GwPM6Yb39HXk*Sic735C#%Y%h z|50lFuM_Szcg)Uv3N{#5`c2Y%`*#1q*L$C>|9k8`tO5-GyB@w0_Md#k2WPn}rFSRK z`!nV9^K+l)^v$SO zeFwhRpDzD2$L{lG`-fj%1|tFssq(oG+PHx*5O%!wx?lfu_r}3S2|z1#;T;c9EeZ}L zfXmn|?e>2j zg4SAU#a_?N&p-csbK#sH>x=&U_;@sFBWOwG)W^sB^~JhD4d2x{xw%`fZ8I~ktoyaD zzhmF){CzLo<^|{IHN@n6nB%1>Xc(^px-)d%e0=R<$R(b4ORvZ7-n|=giRUD61Bcjq zQXu6!sEvH{oX@}2b8IS$s;jH_#;tE}{4X@qa{l@LzG<&P7j-6WjL@47D%ry$b;MwI zc5c0vIg5{vzp^eWds}oidwaXhav`Q$4;9aA8s~1$w6d^y@^j@@FBwpAzZ6;xEL^u5 zY|2f<<(yU)7H6QfkK*l_Ct+J6!Kr1h1EgW}@4oc$!uqH?cQy({Ce%zaJIV7&+BGBPr3cgq7SrA z|Ie9Ua-e$SzZR^%xUlBEe%zg>`>!4C-VJsG=uT+^MCpFMGrSgjEoaQK$?9A8e(h+# z!vs2Jf(bMWhG_f6JHvA2zxyke``bQJwlApr#KONISY5IWbU7zzV)Foq5TE}6va}zR ze36c8`Op7-u0`3#V}I^cg694|?c3bG{VwAi%Tlf#kN;GHj(-9zl_)i||M^*7JHUT3`i_mw|r)ylQ`*7kP`YRezp0Qr6P_B-I)i@^CAMEp;J zMEJU0ul}!tF9&(qy!hnjd{ELmn=6ARkIjF|cQ?**#` zzSduPG|L!tEZfT`-L}8LE}dupb2I3&x4obv1ld=}e{B4!Y&U@&dt_EvDGW+YkYnjUS8_rw=(K&ct~&nFAJzw;qj*4z zkz!+afG*%VvU(pADA2*h?|&~)VC=uGEdP52yX_an-__Oie|FcOD6V>Xz2@rMxpUKP z-oEs&x+4rOOMhLr`1rz|2{fCz_ty6s!3qX_rBzf{|=hML)Z`ApIP5*JH2hB0g|q#YFQ-5FS$U>zW{aMD9EfnqUTd#P&t?zKN%|#Xo%dIm0q$PsI(X^R7%AD*Y-ysYK8I z{Cb`3p4aa{D@H&E$rRrI6l=cs;p=&5=Q_rI-OmHhAN!wzLU_Zjf{&niaL{rp$dvTl z@XDt)7I*%?z5l;C|GypLlJLFvme(IT=WR1>^6~GWBX+$*2V1250^AhI{_qqRan`^M2nx|3fJblpSyG`Dc|7 zwf0pF?6ld~ulxC7ZIQqCH$hk1#DEXdV+9}30$LOh`@2hjd*$7&pfm`Y$Un|qaC`k9 zwt`27{de|%H3Q8BOM^--a7z52x}v}4&Eg$zJo~Ga{y(<;w6Xt@edEDr_D3fFd-(Cs z`EMu0t9ky1I_=T$n`dV_|Ge?%iT$-A(`{cC`ah}P=DzPn@(!IN^@h!7yB~S}|4{KS zz4}SA{L#4e^3X?2S4TCOzf|{k{tg@ z^~d?df5|p4<>k)*&spv_f7iQX(m(VS<5WKX{Bvcd@$JI`f-&Eg9JihL|EAoZ4edF3 zxr~qY&#Ig#BPRpZ#9#Ho*=+l^in=rPb3107fA-iSP3`>47au-AJnFvpMskJVndhG~ zXD!QowEt9%-TY;lvz9$p_Xlrs`X5zlxc^6cJ!n+|Xt7l4cT0Ir{`w!z{`2jQrcU2x zR`>qbYrpyXKX94fKQqPOzW(8RzqvKgD@6-$etdlV+;>_24fVI*Lf7mdX4CJtS5*`o z_%GMa&i?1Q!Tw_;AeW0Piqc00(mS;ZMe|SsGT=30x z|E%7XxBt~Hzx#E??sre?&R3i`d*IhM>wb|t@1Zw~-rQOIe165@t>W_k0^V(}J$-ie z_B%+U!a`rK*ZrIRGyaihfAyoua^GG43E$Xu_CLS>ulD2ipvbB3?0De%;lyz}EhRpF zzPh*1>u3H~{r950ZvJWLymOyCD8+^8Me+ zaV+NdOCBG5_z=9`Z|Bct(y)ucZ-dusef#nGdHs{m`+I(a&W8IAxPpha2pi|!tVA6pmuwVn}PZrCr^dj>izEC;+43AEZ2wBia>sj)JG z7IsPMgAPO$0-Y>|NSbRAO6Q0y{yZsc&0qZjv@j8ri9rW^g4Q(M zdk`A;(oyhFwvF=V{`Y&bL2IMHC*yRU|A*A#0teiGhVOSuueTOIuax^;UH!Yd8kEDK zH67?+s#l;pB>z0=EUy0-4n6wq_Vzn}UM#-{>s<*Y%zm!&@?HGzvuCeY`#u2G>!2nD z=!~>Wvi5(FdOyEG0rEc&WJ4w6zaQoQCxFY&`pKY0w4gQwXvryP`R~44-)kO&R*3GF zs`wOqZoc*T;#)WFvGslXUg@{|{G5HSL*p4i%NRkGs{Eg@d@J2>Sc^6Ee>7sCtQ)lK z33O7`IsbVTN8IZkfI@2fo{O*lzWaJz_S|p#A6w2pw%q$JdXM3U+4kR0+kn>|f`XEn z@BO~#;Ip4V3sj@lfofq;osVeeu7{sv{NLU7XZC*48S`xd&Bd1gdslc}fBNj}@!&Jo zKsEOv?lMpt4RlAV9r$3=x}A4^+>@_6;$Ei!sv}VsO@U(t(lChyExZF&v^RIXJa*aI zTL15t+w)D<%>QypzYw+-3=}8zx8I7(|5u5vmn{HU)Op;d2y*;U-|4u=+pM1*{?QX& z^|SImBd7@kYn`wA72g9N-??A4p7@<#rr(#%B26D{&j!K|AVsICs3Q>?CbTQ z)CF1ww&RVV&27-yK+u7{?t8CzpUK;|(b^{BZryXxt*zj+1Fo&h5o3bOWB(ks-~FS# z{@bhhe=g3k*=Se%YsZ%VJ-7dVGv4XLB%*h%-N)lU9o4&6 tC=R+x9lTWYQEB{aa83Xb|M~t2_PtgJT)0xzmVtqR!PC{xWt~$(695vr$*KSV literal 0 HcmV?d00001 diff --git a/wiki/mechanics/people-tokens.md b/wiki/mechanics/people-tokens.md index 11dee48c..5c6c499d 100644 --- a/wiki/mechanics/people-tokens.md +++ b/wiki/mechanics/people-tokens.md @@ -14,6 +14,13 @@ Status note: IMPLEMENTED. Current state: now appear as a separate crimson count in DIGITAL/terminal and a bounded person-local rack of discrete crimson slips in REAL, while inspect and PEOPLE unfold their stable id, cause, source site, and acquisition tick. + - **DIGITAL presence body (amended 2026-07-31).** A camera-earned person is a + coherent luminous disturbance in the process field — one bone/cold-signal + body/source at their schedule position, sparse distributed noise only when + carried work / exact evidence / rising attention exist, and local field + deformation only when that body sits near owned process hardware. Identity + glyph, work mark, and evidence mark remain secondary labels. Unknown stays + absent; no invented links, identities, or always-on particles. - **One truth, no parallel counters (criterion 4).** Attention *is* the existing per-observer suspicion band (detection.md). Carried work *is* the existing in-flight `BuildIntent` bound to that person — it travels with @@ -277,7 +284,7 @@ projection of the existing persisted observer ledger, gated by earned observer knowledge. A seen person with acquired records carries one independent crimson evidence channel: terminal INSPECT prints the acquired-record count and exact provenance facts; DIGITAL places an `E`, `E#`, or bounded `E7+` beside the -unchanged person glyph; REAL places a dark person-local rack beside the body +person; REAL places a dark person-local rack beside the body with up to seven individually countable rigid crimson slips and one sealed index tab when more exact records exist. The rack is separate from both the service cart and the amber asset ring. Filing can change hidden route custody @@ -286,6 +293,29 @@ and Operations PEOPLE unfold stable record id, kind, cause, witnessed site, and acquisition tick; neither surface reveals filing destination or status through this projection. +**DIGITAL people presence — luminous disturbance system (amended 2026-07-31).** +A camera-earned person is no longer a tiny glyph stand-in. Bevy DIGITAL draws +one coherent cold bone/signal body/source at the schedule position, a secondary +identity glyph above it, and independent geometry channels from the existing +`PersonCarrier` projection: + +| Channel | Truth input | DIGITAL read | +| --- | --- | --- | +| Presence body | `can_see_person` ∧ Seen tile ∧ schedule position | Coherent vertical luminous mass (bone/cold SIGNAL) | +| Asset ring | `PersonCarrier::is_asset` | Independent amber underfoot claim ring | +| Attention ramp | `PersonCarrier::attention` (existing suspicion band) | Independent crimson vertical fill beside the body | +| Work noise / `W` chip | `PersonCarrier::carried_work` | Sparse SIGNAL flecks + discrete work mark | +| Evidence noise / `E` chip | `PersonCarrier::evidence_marks` | Sparse crimson flecks + discrete evidence mark | +| Field deformation | Person within a few tiles of core/owned/bought machines | Interrupted local arcs only — never an invented link | + +Sparse flecks are zero when only presence is earned; they are not ambient +particle weather. Placement is a pure function of person id, fleck index, and +quantized sim tick (deterministic for screenshots). REAL keeps the volumetric +articulated body, service cart, and evidence rack, with heavier silhouette mass +so the body and carried state remain readable. Unknown remains absent in both +dialects. No frontend invents identities, network edges, or activity the sim +did not earn. + Footprint trails are retired. The followable trace is earned world truth: the person's schedule/path plus evidence records naming where and when they were observed or read. The render may briefly witness acquisition or filing motion,