diff --git a/crates/bone-app/src/main.rs b/crates/bone-app/src/main.rs index b4c6f52..8b5bb56 100644 --- a/crates/bone-app/src/main.rs +++ b/crates/bone-app/src/main.rs @@ -4602,6 +4602,71 @@ mod tests { ); } + #[test] + #[cfg_attr( + debug_assertions, + ignore = "frame budget assertions are only meaningful in release builds" + )] + fn extrude_live_preview_under_frame_budget() { + use bone_document::ExtrudeEndCondition; + use bone_types::PositiveLength; + use std::time::{Duration, Instant}; + use uom::si::length::millimeter; + + const BASE_MM: f64 = 4.0; + const STEP_MM: f64 = 0.5; + const STEPS: u32 = 16; + + let (document, id) = super::initial_document(rectangle_sketch()); + let mut cache = super::FeatureCache::new(); + let blind = |depth_mm: f64| { + let Ok(depth) = PositiveLength::new(Length::new::(depth_mm)) else { + panic!("{depth_mm} mm is a positive depth"); + }; + ExtrudeFeature { + end_condition: ExtrudeEndCondition::Blind { depth }, + ..sketch_mode::default_extrude_feature(id) + } + }; + let edit = |cache: &mut super::FeatureCache, depth_mm: f64| { + let started = Instant::now(); + let Some(preview) = super::compute_extrude_preview(cache, &document, blind(depth_mm)) + else { + panic!("the rectangle extrudes at {depth_mm} mm"); + }; + let Some(solid) = preview.solid() else { + panic!("the rectangle yields a solid at {depth_mm} mm"); + }; + let Ok(_view) = super::build_solid_view(solid) else { + panic!("the slab tessellates and packs scenes at {depth_mm} mm"); + }; + started.elapsed() + }; + + let _warmup = edit(&mut cache, BASE_MM); + let durations: Vec = (0..STEPS) + .map(|i| edit(&mut cache, BASE_MM + STEP_MM * f64::from(i))) + .collect(); + let sorted = { + let mut v = durations.clone(); + v.sort(); + v + }; + let median = sorted[sorted.len() / 2]; + let Some(&worst) = sorted.last() else { + panic!("preview loop produced zero samples"); + }; + let budget = BudgetCeiling::FRAME_16MS.duration(); + assert!( + median <= budget, + "median evaluate+tessellate+scene step {median:?} exceeds {budget:?} frame budget; samples {durations:?}", + ); + assert!( + worst <= budget * 2, + "worst evaluate+tessellate+scene step {worst:?} exceeds the relaxed ceiling; samples {durations:?}", + ); + } + #[test] fn extrude_preview_absent_when_sketch_missing() { let document = Document::new(DocumentId::default(), "Empty".to_owned()); diff --git a/crates/bone-app/src/shell.rs b/crates/bone-app/src/shell.rs index ac62e29..059191d 100644 --- a/crates/bone-app/src/shell.rs +++ b/crates/bone-app/src/shell.rs @@ -5579,4 +5579,290 @@ mod tests { tree_reachable.len() ); } + + fn isometric_camera() -> Camera3 { + use bone_types::{Point3, Projection, UnitVec3}; + use uom::si::{f64::Length as UomLength, length::millimeter}; + let Ok(projection) = Projection::orthographic(UomLength::new::(2.0)) else { + unreachable!("a positive half height yields a projection"); + }; + let Ok(camera) = Camera3::new( + Point3::from_mm(10.0, 10.0, 10.0), + Point3::origin(), + UnitVec3::z_axis(), + projection, + ) else { + unreachable!("a non-degenerate isometric camera"); + }; + camera + } + + fn render_phase2( + size: LayoutSize, + strings: &StringTable, + document: &Document, + mode: &Mode, + camera3: Option, + configure: impl FnOnce(&mut Shell), + ) -> (ShellFrame, accesskit::TreeUpdate) { + let mut shell = Shell::new(); + configure(&mut shell); + let theme = Arc::new(Theme::light()); + let hk = HotkeyTable::new(); + let mut focus = FocusManager::new(); + let mut hits = HitFrame::new(); + let prev = HitState::new(); + let mut input = InputSnapshot::idle(FrameInstant::ZERO); + let mut shaper = bone_text::Shaper::new(); + let mut a11y = AccessTreeBuilder::new(); + let mut view = ViewUi::default(); + let frame = { + let mut ctx = FrameCtx::new( + Arc::clone(&theme), + &mut input, + &mut focus, + &hk, + strings, + &mut hits, + &prev, + &mut a11y, + &mut shaper, + ); + shell.render( + &mut ctx, + document, + mode, + &Selection::default(), + &Settings::default(), + size, + None, + camera3, + None, + &mut view, + ) + }; + let update = a11y.build(strings, focus.focused()); + (frame, update) + } + + fn any_label_rect(frame: &ShellFrame, key: StringKey) -> Option { + label_rect(&frame.paints, key).or_else(|| label_rect(&frame.overlay_paints, key)) + } + + #[test] + fn rtl_mirrors_extrude_property_pane() { + let size = layout_size(1600.0, 900.0); + let doc = sample_document(); + let mode = Mode::Extrude(ExtrudeArming::profile(SketchId::default())); + let ltr = render_phase2( + size, + &crate::strings::make_strings(Locale::EnUs), + &doc, + &mode, + None, + |_| {}, + ) + .0; + let rtl = render_phase2( + size, + &crate::strings::make_strings(Locale::ArXb), + &doc, + &mode, + None, + |_| {}, + ) + .0; + let key = strings::PROPERTY_ROW_EXTRUDE_DEPTH; + let ltr_rect = + any_label_rect(<r, key).unwrap_or_else(|| panic!("ltr extrude depth row missing")); + let rtl_rect = + any_label_rect(&rtl, key).unwrap_or_else(|| panic!("rtl extrude depth row missing")); + let half = size.width.value() * 0.5; + assert!( + ltr_rect.origin.x.value() < half, + "extrude depth row sits on the left half under ltr, got x={}", + ltr_rect.origin.x.value(), + ); + assert!( + rtl_rect.origin.x.value() > half, + "extrude depth row mirrors to the right half under rtl, got x={}", + rtl_rect.origin.x.value(), + ); + } + + #[test] + fn rtl_mirrors_file_menu_import_item() { + let size = layout_size(1600.0, 900.0); + let doc = sample_document(); + let open_file = |s: &mut Shell| s.state.menu_bar.open = Some(s.ids.menu_file); + let ltr = render_phase2( + size, + &crate::strings::make_strings(Locale::EnUs), + &doc, + &Mode::Idle, + None, + open_file, + ) + .0; + let rtl = render_phase2( + size, + &crate::strings::make_strings(Locale::ArXb), + &doc, + &Mode::Idle, + None, + open_file, + ) + .0; + let key = strings::MENU_FILE_IMPORT; + let ltr_rect = + any_label_rect(<r, key).unwrap_or_else(|| panic!("ltr file import item missing")); + let rtl_rect = + any_label_rect(&rtl, key).unwrap_or_else(|| panic!("rtl file import item missing")); + let half = size.width.value() * 0.5; + assert!( + ltr_rect.origin.x.value() < half, + "file import item opens on the left under ltr, got x={}", + ltr_rect.origin.x.value(), + ); + assert!( + rtl_rect.origin.x.value() > half, + "file import item mirrors to the right under rtl, got x={}", + rtl_rect.origin.x.value(), + ); + } + + fn cube_group_x0(update: &accesskit::TreeUpdate, cube: WidgetId) -> f64 { + let nid = bone_ui::a11y::widget_node_id(cube); + update + .nodes + .iter() + .find_map(|(id, node)| (*id == nid).then(|| node.bounds()).flatten()) + .unwrap_or_else(|| panic!("view cube group must render")) + .x0 + } + + #[test] + fn rtl_flips_view_cube_with_the_viewport() { + let size = layout_size(1600.0, 900.0); + let doc = sample_document(); + let cube = Shell::new().ids.view_cube; + let (_, ltr) = render_phase2( + size, + &crate::strings::make_strings(Locale::EnUs), + &doc, + &Mode::Idle, + Some(isometric_camera()), + |_| {}, + ); + let (_, rtl) = render_phase2( + size, + &crate::strings::make_strings(Locale::ArXb), + &doc, + &Mode::Idle, + Some(isometric_camera()), + |_| {}, + ); + let ltr_x0 = cube_group_x0(<r, cube); + let rtl_x0 = cube_group_x0(&rtl, cube); + assert!( + ltr_x0 > rtl_x0, + "view cube follows the viewport across rtl: ltr x0={ltr_x0}, rtl x0={rtl_x0}", + ); + } + + fn extrude_property_rows() -> Vec<(WidgetId, &'static str)> { + [ + "end", + "depth", + "draft", + "draft_angle", + "direction_two", + "thin", + "merge", + ] + .into_iter() + .map(|key| { + ( + WidgetId::ROOT + .child(WidgetKey::new("props.extrude")) + .child(WidgetKey::new(key)), + key, + ) + }) + .collect() + } + + fn visible_cube_faces(ids: &ShellIds) -> Vec<(WidgetId, &'static str)> { + use crate::view_cube::{CubeCell, cell_widget_id}; + [ + (bone_types::StandardView::Top, "view_cube.top"), + (bone_types::StandardView::Right, "view_cube.right"), + (bone_types::StandardView::Back, "view_cube.back"), + ] + .into_iter() + .map(|(view, name)| { + let cell = CubeCell::all() + .into_iter() + .find(|c| c.standard_view() == Some(view)) + .unwrap_or_else(|| panic!("{name} names a cube face")); + (cell_widget_id(ids.view_cube, cell), name) + }) + .collect() + } + + #[test] + fn a11y_smoke_post_extrude_surface_is_reachable_and_named() { + let table = crate::strings::make_strings(Locale::EnUs); + let canvas = layout_size(3600.0, 900.0); + let ids = Shell::new().ids; + + let (doc, extrude_id) = document_with_extrude(); + + let (_, tree_update) = render_phase2( + canvas, + &table, + &doc, + &Mode::Idle, + Some(isometric_camera()), + |s| { + s.state.left_pane = LeftPane::Tree; + s.state.ribbon_active_tab = Some(features_tab_id(s.ids.ribbon)); + }, + ); + + let (_, pane_update) = render_phase2( + canvas, + &table, + &doc, + &Mode::Extrude(ExtrudeArming::profile(SketchId::default())), + Some(isometric_camera()), + |_| {}, + ); + + let (_, menu_update) = render_phase2(canvas, &table, &doc, &Mode::Idle, None, |s| { + s.state.menu_bar.open = Some(s.ids.menu_file); + s.state.menu_bar.menu.open_submenu = Some(s.ids.menu_file_export); + }); + + let (reachable, nodes) = + union_reachable([&tree_update, &pane_update, &menu_update].into_iter()); + + let ribbon_buttons = FeatureTool::ALL + .iter() + .map(|t| (feature_tool_widget_id(ids.ribbon, *t), feature_tool_key(*t))); + let extrude_row = + std::iter::once((extrude_widget(&ids, extrude_id), "feature_tree.extrude")); + let file_menu_items = [ + (ids.menu_file_import, "menu.file.import"), + (ids.menu_file_export, "menu.file.export"), + (ids.menu_file_export_step, "menu.file.export.step"), + ]; + + let expected = ribbon_buttons + .chain(extrude_row) + .chain(extrude_property_rows()) + .chain(visible_cube_faces(&ids)) + .chain(file_menu_items); + assert_widgets_reachable_and_labeled(expected, &reachable, &nodes); + } } diff --git a/crates/bone-app/src/view_cube.rs b/crates/bone-app/src/view_cube.rs index 9528d33..747cc56 100644 --- a/crates/bone-app/src/view_cube.rs +++ b/crates/bone-app/src/view_cube.rs @@ -126,6 +126,11 @@ impl CubeCell { } } +#[must_use] +pub fn cell_widget_id(base: WidgetId, cell: CubeCell) -> WidgetId { + base.child_indexed(WidgetKey::new("cell"), cell.index()) +} + #[derive(Copy, Clone, Debug, PartialEq)] pub enum ViewPick { Standard(StandardView), @@ -489,7 +494,7 @@ pub fn render_view_cube( let mut hovered: Option<(CubeCell, LayoutRect)> = None; let mut labels: Vec<(LayoutRect, StringKey, Color)> = Vec::new(); placements.iter().for_each(|place| { - let id = base.child_indexed(WidgetKey::new("cell"), place.cell.index()); + let id = cell_widget_id(base, place.cell); let interaction = ctx.interact( InteractDeclaration::new(id, place.pick_rect, Sense::INTERACTIVE) .a11y(AccessNode::new(Role::Button).with_label(place.cell.a11y_label())), @@ -513,7 +518,7 @@ pub fn render_view_cube( }); }); if let Some((cell, rect)) = hovered { - let id = base.child_indexed(WidgetKey::new("cell"), cell.index()); + let id = cell_widget_id(base, cell); let tip = show_tooltip( ctx, Tooltip::new( diff --git a/crates/bone-document/tests/folder_jj.rs b/crates/bone-document/tests/folder_jj.rs index cd4db41..01c4b20 100644 --- a/crates/bone-document/tests/folder_jj.rs +++ b/crates/bone-document/tests/folder_jj.rs @@ -1,11 +1,15 @@ use std::process::Command; use bone_document::{ - DimensionKind, Document, DocumentFolder, EditOutcome, Sketch, SketchDimension, SketchEdit, - SketchEntity, load, save, + BlobKind, DimensionKind, Document, DocumentFolder, EditOutcome, Sketch, SketchDimension, + SketchEdit, SketchEntity, evaluate_extrude, evaluate_sketch, load, save, write_solid, +}; +use bone_kernel::{ + BrepSolid, ExtrudeDirection, ExtrudeEndCondition, ExtrudeFeature, ExtrudeSense, MergeResult, }; use bone_types::{ - DocumentId, Length, Point2, Point3, SketchId, SketchPlaneBasis, Tolerance, UnitVec3, millimeter, + DocumentId, ExtrudeId, Length, Point2, Point3, PositiveLength, SketchId, SketchPlaneBasis, + Tolerance, UnitVec3, millimeter, }; use slotmap::KeyData; use tempfile::{TempDir, tempdir}; @@ -176,3 +180,154 @@ fn jj_diff_on_dimension_edit_is_text_only() { "expected no binary diff:\n{diff}" ); } + +fn extrude_id(idx: u32) -> ExtrudeId { + ExtrudeId::from(KeyData::from_ffi((1u64 << 32) | u64::from(idx))) +} + +fn add_point(s: Sketch, x: f64, y: f64) -> (Sketch, bone_types::SketchEntityId) { + let Ok((next, EditOutcome::Entity(id))) = s.apply(SketchEdit::AddEntity(SketchEntity::point( + Point2::from_mm(x, y), + ))) else { + panic!("add point"); + }; + (next, id) +} + +fn closed_rectangle() -> Sketch { + let s = Sketch::new(plane()); + let (s, p0) = add_point(s, 0.0, 0.0); + let (s, p1) = add_point(s, 10.0, 0.0); + let (s, p2) = add_point(s, 10.0, 5.0); + let (s, p3) = add_point(s, 0.0, 5.0); + [(p0, p1), (p1, p2), (p2, p3), (p3, p0)] + .into_iter() + .fold(s, |s, (a, b)| { + let Ok((next, _)) = s.apply(SketchEdit::AddEntity(SketchEntity::line(a, b, false))) + else { + panic!("rectangle edge"); + }; + next + }) +} + +fn blind_extrude(sketch: SketchId, depth_mm: f64) -> ExtrudeFeature { + let Ok(depth) = PositiveLength::new(mm(depth_mm)) else { + panic!("positive depth"); + }; + ExtrudeFeature { + sketch, + direction: ExtrudeDirection::Normal { + sense: ExtrudeSense::Forward, + }, + end_condition: ExtrudeEndCondition::Blind { depth }, + draft: None, + thin_wall: None, + merge_result: MergeResult::Merge, + } +} + +fn evaluated_solid(doc: &Document, sketch: SketchId, extrude: ExtrudeId) -> BrepSolid { + let Some(sketch_value) = doc.sketch(sketch) else { + panic!("sketch present"); + }; + let Some(feature_id) = doc.feature_tree().feature_of_extrude(extrude) else { + panic!("extrude node present"); + }; + let Some(&feature) = doc.extrude_of_feature(feature_id) else { + panic!("extrude feature present"); + }; + let evaluated = evaluate_sketch(sketch_value); + let extruded = evaluate_extrude(feature_id, &evaluated, &feature); + let Some(solid) = extruded.solid() else { + panic!("rectangle extrudes to a solid"); + }; + solid.clone() +} + +#[test] +fn jj_diff_on_extrude_edit_is_text_only() { + if !jj_available() { + eprintln!("skip: jj not on PATH"); + return; + } + + let dir = ok_dir(); + let folder = DocumentFolder::new(dir.path().join("slab.bone")); + let sid = sketch_id(1); + let eid = extrude_id(1); + + let mut doc = Document::new(document_id(1), "slab".to_owned()); + doc.insert_sketch(sid, "Sketch1".to_owned(), closed_rectangle()); + doc.insert_extrude(eid, blind_extrude(sid, 10.0)); + assert_save(&doc, &folder); + let Ok(_baseline_blob) = write_solid(&folder, &evaluated_solid(&doc, sid, eid)) else { + panic!("cache the depth-10 solid"); + }; + + run(Command::new("jj") + .arg("git") + .arg("init") + .arg("--colocate") + .current_dir(folder.path())); + run(Command::new("jj") + .arg("config") + .arg("set") + .arg("--repo") + .arg("user.name") + .arg("test") + .current_dir(folder.path())); + run(Command::new("jj") + .arg("config") + .arg("set") + .arg("--repo") + .arg("user.email") + .arg("test@example.com") + .current_dir(folder.path())); + run(Command::new("jj") + .arg("describe") + .arg("--message") + .arg("initial") + .current_dir(folder.path())); + run(Command::new("jj").arg("new").current_dir(folder.path())); + + let document_before = std::fs::read_to_string(folder.document_file()).unwrap_or_default(); + + let mut next = assert_load(&folder); + next.insert_extrude(eid, blind_extrude(sid, 14.0)); + assert_save(&next, &folder); + let Ok(edited_blob) = write_solid(&folder, &evaluated_solid(&next, sid, eid)) else { + panic!("cache the depth-14 solid"); + }; + + let document_after = std::fs::read_to_string(folder.document_file()).unwrap_or_default(); + assert_eq!( + document_before, document_after, + "an extrude-depth edit must not churn document.ron; geometry is not in the recipe" + ); + assert!( + folder.blob_path(edited_blob, BlobKind::BREP).exists(), + "the widened slab content-addresses a fresh brep blob" + ); + + let diff = run(Command::new("jj") + .arg("diff") + .arg("--git") + .current_dir(folder.path())); + assert!( + diff.contains("extrudes/"), + "expected the extrude file in the diff:\n{diff}" + ); + assert!( + diff.contains(".brep"), + "expected a new geometry blob in the diff:\n{diff}" + ); + assert!( + diff.contains('+') && diff.contains('-'), + "expected text diff markers:\n{diff}" + ); + assert!( + !diff.contains("Binary files"), + "expected no binary diff:\n{diff}" + ); +} diff --git a/crates/bone-interop/tests/goldens/cylinder.step b/crates/bone-interop/tests/goldens/cylinder.step new file mode 100644 index 0000000..13b00b6 --- /dev/null +++ b/crates/bone-interop/tests/goldens/cylinder.step @@ -0,0 +1,260 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('Bone geometry'),'2;1'); +FILE_NAME('cylinder','1970-01-01T00:00:00',(''),(''),'','Bone 0.0.0',''); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 'automotive_design', 2000, #2); +#2 = APPLICATION_CONTEXT('core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4, #10); +#4 = PRODUCT_DEFINITION_SHAPE('','', #5); +#5 = PRODUCT_DEFINITION('design','', #6, #9); +#6 = PRODUCT_DEFINITION_FORMATION('','', #7); +#7 = PRODUCT('','','', (#8)); +#8 = PRODUCT_CONTEXT('', #2, 'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition', #2, 'design'); +#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('', (#16), #11); +#11 = ( + GEOMETRIC_REPRESENTATION_CONTEXT(3) + GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#15)) + GLOBAL_UNIT_ASSIGNED_CONTEXT((#12, #13, #14)) + REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') +); +#12 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#13 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#14 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#15 = UNCERTAINTY_MEASURE_WITH_UNIT(1.0E-6, #12, 'distance_accuracy_value','confusion accuracy'); +#16 = MANIFOLD_SOLID_BREP('', #17); +#17 = CLOSED_SHELL('', (#18, #24, #31, #38, #45)); +#18 = FACE_SURFACE('', (#19), #66, .F.); +#19 = FACE_BOUND('', #20, .F.); +#20 = EDGE_LOOP('', (#21, #22, #23)); +#21 = ORIENTED_EDGE('', *, *, #51, .T.); +#22 = ORIENTED_EDGE('', *, *, #52, .T.); +#23 = ORIENTED_EDGE('', *, *, #53, .T.); +#24 = FACE_SURFACE('', (#25), #71, .T.); +#25 = FACE_BOUND('', #26, .T.); +#26 = EDGE_LOOP('', (#27, #28, #29, #30)); +#27 = ORIENTED_EDGE('', *, *, #51, .T.); +#28 = ORIENTED_EDGE('', *, *, #54, .T.); +#29 = ORIENTED_EDGE('', *, *, #55, .F.); +#30 = ORIENTED_EDGE('', *, *, #56, .F.); +#31 = FACE_SURFACE('', (#32), #84, .T.); +#32 = FACE_BOUND('', #33, .T.); +#33 = EDGE_LOOP('', (#34, #35, #36, #37)); +#34 = ORIENTED_EDGE('', *, *, #52, .T.); +#35 = ORIENTED_EDGE('', *, *, #57, .T.); +#36 = ORIENTED_EDGE('', *, *, #58, .F.); +#37 = ORIENTED_EDGE('', *, *, #54, .F.); +#38 = FACE_SURFACE('', (#39), #97, .T.); +#39 = FACE_BOUND('', #40, .T.); +#40 = EDGE_LOOP('', (#41, #42, #43, #44)); +#41 = ORIENTED_EDGE('', *, *, #53, .T.); +#42 = ORIENTED_EDGE('', *, *, #56, .T.); +#43 = ORIENTED_EDGE('', *, *, #59, .F.); +#44 = ORIENTED_EDGE('', *, *, #57, .F.); +#45 = FACE_SURFACE('', (#46), #110, .T.); +#46 = FACE_BOUND('', #47, .T.); +#47 = EDGE_LOOP('', (#48, #49, #50)); +#48 = ORIENTED_EDGE('', *, *, #55, .T.); +#49 = ORIENTED_EDGE('', *, *, #58, .T.); +#50 = ORIENTED_EDGE('', *, *, #59, .T.); +#51 = EDGE_CURVE('', #60, #61, #115, .T.); +#52 = EDGE_CURVE('', #61, #62, #122, .T.); +#53 = EDGE_CURVE('', #62, #60, #129, .T.); +#54 = EDGE_CURVE('', #61, #63, #136, .T.); +#55 = EDGE_CURVE('', #64, #63, #140, .T.); +#56 = EDGE_CURVE('', #60, #64, #147, .T.); +#57 = EDGE_CURVE('', #62, #65, #151, .T.); +#58 = EDGE_CURVE('', #63, #65, #155, .T.); +#59 = EDGE_CURVE('', #65, #64, #162, .T.); +#60 = VERTEX_POINT('', #169); +#61 = VERTEX_POINT('', #170); +#62 = VERTEX_POINT('', #171); +#63 = VERTEX_POINT('', #172); +#64 = VERTEX_POINT('', #173); +#65 = VERTEX_POINT('', #174); +#66 = PLANE('', #67); +#67 = AXIS2_PLACEMENT_3D('', #68, #69, #70); +#68 = CARTESIAN_POINT('', (5.0, 5.051814855409225, 0.0)); +#69 = DIRECTION('', (0.0, 0.0, 1.0)); +#70 = DIRECTION('', (-1.0, 0.0, 0.0)); +#71 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#72, #73), (#74, #75), (#76, #77), (#78, #79), (#80, #81), (#82, #83)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#72 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); +#73 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); +#74 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 0.0)); +#75 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 10.0)); +#76 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 0.0)); +#77 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 10.0)); +#78 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 0.0)); +#79 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 10.0)); +#80 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 0.0)); +#81 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 10.0)); +#82 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 0.0)); +#83 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 10.0)); +#84 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#85, #86), (#87, #88), (#89, #90), (#91, #92), (#93, #94), (#95, #96)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#85 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); +#86 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); +#87 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 0.0)); +#88 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 10.0)); +#89 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 0.0)); +#90 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 10.0)); +#91 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 0.0)); +#92 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 10.0)); +#93 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 0.0)); +#94 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 10.0)); +#95 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 0.0)); +#96 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 10.0)); +#97 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#98, #99), (#100, #101), (#102, #103), (#104, #105), (#106, #107), (#108, #109)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#98 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); +#99 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); +#100 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 0.0)); +#101 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 10.0)); +#102 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 0.0)); +#103 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 10.0)); +#104 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 0.0)); +#105 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 10.0)); +#106 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 0.0)); +#107 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 10.0)); +#108 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 0.0)); +#109 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 10.0)); +#110 = PLANE('', #111); +#111 = AXIS2_PLACEMENT_3D('', #112, #113, #114); +#112 = CARTESIAN_POINT('', (5.0, 5.051814855409225, 10.0)); +#113 = DIRECTION('', (0.0, 0.0, 1.0)); +#114 = DIRECTION('', (-1.0, 0.0, 0.0)); +#115 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#116, #117, #118, #119, #120, #121), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#116 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); +#117 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 0.0)); +#118 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 0.0)); +#119 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 0.0)); +#120 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 0.0)); +#121 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 0.0)); +#122 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#123, #124, #125, #126, #127, #128), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#123 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); +#124 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 0.0)); +#125 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 0.0)); +#126 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 0.0)); +#127 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 0.0)); +#128 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 0.0)); +#129 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#130, #131, #132, #133, #134, #135), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#130 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); +#131 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 0.0)); +#132 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 0.0)); +#133 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 0.0)); +#134 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 0.0)); +#135 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 0.0)); +#136 = LINE('', #137, #138); +#137 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); +#138 = VECTOR('', #139, 10.0); +#139 = DIRECTION('', (0.0, 0.0, 1.0)); +#140 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#141, #142, #143, #144, #145, #146), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#141 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); +#142 = CARTESIAN_POINT('', (5.0, 1.2371791482634835, 10.0)); +#143 = CARTESIAN_POINT('', (3.7499999999999996, 3.60843918243516, 10.0)); +#144 = CARTESIAN_POINT('', (1.2500000000000013, 5.051814855409225, 10.0)); +#145 = CARTESIAN_POINT('', (-1.428571428571427, 4.948716593053936, 10.0)); +#146 = CARTESIAN_POINT('', (-2.499999999999999, 4.3301270189221945, 10.0)); +#147 = LINE('', #148, #149); +#148 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); +#149 = VECTOR('', #150, 10.0); +#150 = DIRECTION('', (0.0, 0.0, 1.0)); +#151 = LINE('', #152, #153); +#152 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); +#153 = VECTOR('', #154, 10.0); +#154 = DIRECTION('', (0.0, 0.0, 1.0)); +#155 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#156, #157, #158, #159, #160, #161), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#156 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); +#157 = CARTESIAN_POINT('', (-3.57142857142857, 3.7115374447904523, 10.0)); +#158 = CARTESIAN_POINT('', (-4.999999999999997, 1.4433756729740659, 10.0)); +#159 = CARTESIAN_POINT('', (-4.999999999999999, -1.4433756729740608, 10.0)); +#160 = CARTESIAN_POINT('', (-3.5714285714285725, -3.7115374447904483, 10.0)); +#161 = CARTESIAN_POINT('', (-2.5000000000000018, -4.33012701892219, 10.0)); +#162 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#163, #164, #165, #166, #167, #168), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#163 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); +#164 = CARTESIAN_POINT('', (-1.428571428571431, -4.948716593053935, 10.0)); +#165 = CARTESIAN_POINT('', (1.2499999999999964, -5.0518148554092255, 10.0)); +#166 = CARTESIAN_POINT('', (3.7499999999999964, -3.6084391824351627, 10.0)); +#167 = CARTESIAN_POINT('', (4.999999999999998, -1.2371791482634862, 10.0)); +#168 = CARTESIAN_POINT('', (4.999999999999998, -2.2204460493E-15, 10.0)); +#169 = CARTESIAN_POINT('', (5.0, 0.0, 0.0)); +#170 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 0.0)); +#171 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 0.0)); +#172 = CARTESIAN_POINT('', (-2.499999999999999, 4.330127018922194, 10.0)); +#173 = CARTESIAN_POINT('', (5.0, 0.0, 10.0)); +#174 = CARTESIAN_POINT('', (-2.500000000000002, -4.330127018922192, 10.0)); +ENDSEC; +END-ISO-10303-21; diff --git a/crates/bone-interop/tests/goldens/donut.step b/crates/bone-interop/tests/goldens/donut.step new file mode 100644 index 0000000..a3ba583 --- /dev/null +++ b/crates/bone-interop/tests/goldens/donut.step @@ -0,0 +1,477 @@ +ISO-10303-21; +HEADER; +FILE_DESCRIPTION(('Bone geometry'),'2;1'); +FILE_NAME('donut','1970-01-01T00:00:00',(''),(''),'','Bone 0.0.0',''); +FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }')); +ENDSEC; +DATA; +#1 = APPLICATION_PROTOCOL_DEFINITION('international standard', 'automotive_design', 2000, #2); +#2 = APPLICATION_CONTEXT('core data for automotive mechanical design processes'); +#3 = SHAPE_DEFINITION_REPRESENTATION(#4, #10); +#4 = PRODUCT_DEFINITION_SHAPE('','', #5); +#5 = PRODUCT_DEFINITION('design','', #6, #9); +#6 = PRODUCT_DEFINITION_FORMATION('','', #7); +#7 = PRODUCT('','','', (#8)); +#8 = PRODUCT_CONTEXT('', #2, 'mechanical'); +#9 = PRODUCT_DEFINITION_CONTEXT('part definition', #2, 'design'); +#10 = ADVANCED_BREP_SHAPE_REPRESENTATION('', (#16), #11); +#11 = ( + GEOMETRIC_REPRESENTATION_CONTEXT(3) + GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#15)) + GLOBAL_UNIT_ASSIGNED_CONTEXT((#12, #13, #14)) + REPRESENTATION_CONTEXT('Context #1', '3D Context with UNIT and UNCERTAINTY') +); +#12 = ( LENGTH_UNIT() NAMED_UNIT(*) SI_UNIT(.MILLI.,.METRE.) ); +#13 = ( NAMED_UNIT(*) PLANE_ANGLE_UNIT() SI_UNIT($,.RADIAN.) ); +#14 = ( NAMED_UNIT(*) SI_UNIT($,.STERADIAN.) SOLID_ANGLE_UNIT() ); +#15 = UNCERTAINTY_MEASURE_WITH_UNIT(1.0E-6, #12, 'distance_accuracy_value','confusion accuracy'); +#16 = MANIFOLD_SOLID_BREP('', #17); +#17 = CLOSED_SHELL('', (#18, #29, #36, #43, #50, #57, #64, #71)); +#18 = FACE_SURFACE('', (#19, #24), #112, .F.); +#19 = FACE_BOUND('', #20, .F.); +#20 = EDGE_LOOP('', (#21, #22, #23)); +#21 = ORIENTED_EDGE('', *, *, #82, .T.); +#22 = ORIENTED_EDGE('', *, *, #83, .T.); +#23 = ORIENTED_EDGE('', *, *, #84, .T.); +#24 = FACE_BOUND('', #25, .F.); +#25 = EDGE_LOOP('', (#26, #27, #28)); +#26 = ORIENTED_EDGE('', *, *, #85, .T.); +#27 = ORIENTED_EDGE('', *, *, #86, .T.); +#28 = ORIENTED_EDGE('', *, *, #87, .T.); +#29 = FACE_SURFACE('', (#30), #117, .T.); +#30 = FACE_BOUND('', #31, .T.); +#31 = EDGE_LOOP('', (#32, #33, #34, #35)); +#32 = ORIENTED_EDGE('', *, *, #82, .T.); +#33 = ORIENTED_EDGE('', *, *, #88, .T.); +#34 = ORIENTED_EDGE('', *, *, #89, .F.); +#35 = ORIENTED_EDGE('', *, *, #90, .F.); +#36 = FACE_SURFACE('', (#37), #130, .T.); +#37 = FACE_BOUND('', #38, .T.); +#38 = EDGE_LOOP('', (#39, #40, #41, #42)); +#39 = ORIENTED_EDGE('', *, *, #83, .T.); +#40 = ORIENTED_EDGE('', *, *, #91, .T.); +#41 = ORIENTED_EDGE('', *, *, #92, .F.); +#42 = ORIENTED_EDGE('', *, *, #88, .F.); +#43 = FACE_SURFACE('', (#44), #143, .T.); +#44 = FACE_BOUND('', #45, .T.); +#45 = EDGE_LOOP('', (#46, #47, #48, #49)); +#46 = ORIENTED_EDGE('', *, *, #84, .T.); +#47 = ORIENTED_EDGE('', *, *, #90, .T.); +#48 = ORIENTED_EDGE('', *, *, #93, .F.); +#49 = ORIENTED_EDGE('', *, *, #91, .F.); +#50 = FACE_SURFACE('', (#51), #156, .T.); +#51 = FACE_BOUND('', #52, .T.); +#52 = EDGE_LOOP('', (#53, #54, #55, #56)); +#53 = ORIENTED_EDGE('', *, *, #85, .T.); +#54 = ORIENTED_EDGE('', *, *, #94, .T.); +#55 = ORIENTED_EDGE('', *, *, #95, .F.); +#56 = ORIENTED_EDGE('', *, *, #96, .F.); +#57 = FACE_SURFACE('', (#58), #169, .T.); +#58 = FACE_BOUND('', #59, .T.); +#59 = EDGE_LOOP('', (#60, #61, #62, #63)); +#60 = ORIENTED_EDGE('', *, *, #86, .T.); +#61 = ORIENTED_EDGE('', *, *, #97, .T.); +#62 = ORIENTED_EDGE('', *, *, #98, .F.); +#63 = ORIENTED_EDGE('', *, *, #94, .F.); +#64 = FACE_SURFACE('', (#65), #182, .T.); +#65 = FACE_BOUND('', #66, .T.); +#66 = EDGE_LOOP('', (#67, #68, #69, #70)); +#67 = ORIENTED_EDGE('', *, *, #87, .T.); +#68 = ORIENTED_EDGE('', *, *, #96, .T.); +#69 = ORIENTED_EDGE('', *, *, #99, .F.); +#70 = ORIENTED_EDGE('', *, *, #97, .F.); +#71 = FACE_SURFACE('', (#72, #77), #195, .T.); +#72 = FACE_BOUND('', #73, .T.); +#73 = EDGE_LOOP('', (#74, #75, #76)); +#74 = ORIENTED_EDGE('', *, *, #89, .T.); +#75 = ORIENTED_EDGE('', *, *, #92, .T.); +#76 = ORIENTED_EDGE('', *, *, #93, .T.); +#77 = FACE_BOUND('', #78, .T.); +#78 = EDGE_LOOP('', (#79, #80, #81)); +#79 = ORIENTED_EDGE('', *, *, #95, .T.); +#80 = ORIENTED_EDGE('', *, *, #98, .T.); +#81 = ORIENTED_EDGE('', *, *, #99, .T.); +#82 = EDGE_CURVE('', #100, #101, #200, .T.); +#83 = EDGE_CURVE('', #101, #102, #207, .T.); +#84 = EDGE_CURVE('', #102, #100, #214, .T.); +#85 = EDGE_CURVE('', #103, #104, #221, .T.); +#86 = EDGE_CURVE('', #104, #105, #228, .T.); +#87 = EDGE_CURVE('', #105, #103, #235, .T.); +#88 = EDGE_CURVE('', #101, #106, #242, .T.); +#89 = EDGE_CURVE('', #107, #106, #246, .T.); +#90 = EDGE_CURVE('', #100, #107, #253, .T.); +#91 = EDGE_CURVE('', #102, #108, #257, .T.); +#92 = EDGE_CURVE('', #106, #108, #261, .T.); +#93 = EDGE_CURVE('', #108, #107, #268, .T.); +#94 = EDGE_CURVE('', #104, #109, #275, .T.); +#95 = EDGE_CURVE('', #110, #109, #279, .T.); +#96 = EDGE_CURVE('', #103, #110, #286, .T.); +#97 = EDGE_CURVE('', #105, #111, #290, .T.); +#98 = EDGE_CURVE('', #109, #111, #294, .T.); +#99 = EDGE_CURVE('', #111, #110, #301, .T.); +#100 = VERTEX_POINT('', #308); +#101 = VERTEX_POINT('', #309); +#102 = VERTEX_POINT('', #310); +#103 = VERTEX_POINT('', #311); +#104 = VERTEX_POINT('', #312); +#105 = VERTEX_POINT('', #313); +#106 = VERTEX_POINT('', #314); +#107 = VERTEX_POINT('', #315); +#108 = VERTEX_POINT('', #316); +#109 = VERTEX_POINT('', #317); +#110 = VERTEX_POINT('', #318); +#111 = VERTEX_POINT('', #319); +#112 = PLANE('', #113); +#113 = AXIS2_PLACEMENT_3D('', #114, #115, #116); +#114 = CARTESIAN_POINT('', (10.0, 10.10362971081845, 0.0)); +#115 = DIRECTION('', (0.0, 0.0, 1.0)); +#116 = DIRECTION('', (-1.0, 0.0, 0.0)); +#117 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#118, #119), (#120, #121), (#122, #123), (#124, #125), (#126, #127), (#128, #129)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#118 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); +#119 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); +#120 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 0.0)); +#121 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 6.0)); +#122 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 0.0)); +#123 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 6.000000000000001)); +#124 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 0.0)); +#125 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 6.0)); +#126 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 0.0)); +#127 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 6.0)); +#128 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 0.0)); +#129 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 6.0)); +#130 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#131, #132), (#133, #134), (#135, #136), (#137, #138), (#139, #140), (#141, #142)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#131 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); +#132 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); +#133 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 0.0)); +#134 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 6.0)); +#135 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 0.0)); +#136 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 6.000000000000001)); +#137 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 0.0)); +#138 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 6.0)); +#139 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 0.0)); +#140 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 6.0)); +#141 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 0.0)); +#142 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 6.0)); +#143 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#144, #145), (#146, #147), (#148, #149), (#150, #151), (#152, #153), (#154, #155)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#144 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); +#145 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); +#146 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 0.0)); +#147 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 6.0)); +#148 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 0.0)); +#149 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 6.0)); +#150 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 0.0)); +#151 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 6.0)); +#152 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 0.0)); +#153 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 6.0)); +#154 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 0.0)); +#155 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 6.0)); +#156 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#157, #158), (#159, #160), (#161, #162), (#163, #164), (#165, #166), (#167, #168)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.8750000000000001, 0.8750000000000001), (0.7500000000000002, 0.7500000000000002), (0.7500000000000001, 0.7500000000000001), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#157 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); +#158 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); +#159 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 0.0)); +#160 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 6.0)); +#161 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 0.0)); +#162 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 6.000000000000001)); +#163 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 0.0)); +#164 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 6.0)); +#165 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 0.0)); +#166 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 6.0)); +#167 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 0.0)); +#168 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 6.0)); +#169 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#170, #171), (#172, #173), (#174, #175), (#176, #177), (#178, #179), (#180, #181)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#170 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); +#171 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); +#172 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 0.0)); +#173 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 6.0)); +#174 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 0.0)); +#175 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 6.0)); +#176 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 0.0)); +#177 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 6.0)); +#178 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 0.0)); +#179 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 6.0)); +#180 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 0.0)); +#181 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 6.0)); +#182 = ( + BOUNDED_SURFACE() + B_SPLINE_SURFACE(2, 1, ((#183, #184), (#185, #186), (#187, #188), (#189, #190), (#191, #192), (#193, #194)), .UNSPECIFIED., .U., .U., .U.) + B_SPLINE_SURFACE_WITH_KNOTS((3, 1, 1, 1, 3), (2, 2), (0.0, 0.25, 0.5, 0.75, 1.0), (0.0, 1.0), .UNSPECIFIED.) + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_SURFACE(((1.0, 1.0), (0.875, 0.875), (0.75, 0.75), (0.7499999999999999, 0.7499999999999999), (0.875, 0.875), (1.0, 1.0))) + REPRESENTATION_ITEM('') + SURFACE() +); +#183 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); +#184 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); +#185 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 0.0)); +#186 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 6.0)); +#187 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 0.0)); +#188 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 6.0)); +#189 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 0.0)); +#190 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 6.0)); +#191 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 0.0)); +#192 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 6.0)); +#193 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 0.0)); +#194 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 6.0)); +#195 = PLANE('', #196); +#196 = AXIS2_PLACEMENT_3D('', #197, #198, #199); +#197 = CARTESIAN_POINT('', (10.0, 10.10362971081845, 6.0)); +#198 = DIRECTION('', (0.0, 0.0, 1.0)); +#199 = DIRECTION('', (-1.0, 0.0, 0.0)); +#200 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#201, #202, #203, #204, #205, #206), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#201 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); +#202 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 0.0)); +#203 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 0.0)); +#204 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 0.0)); +#205 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 0.0)); +#206 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 0.0)); +#207 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#208, #209, #210, #211, #212, #213), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#208 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); +#209 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 0.0)); +#210 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 0.0)); +#211 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 0.0)); +#212 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 0.0)); +#213 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 0.0)); +#214 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#215, #216, #217, #218, #219, #220), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#215 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); +#216 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 0.0)); +#217 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 0.0)); +#218 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 0.0)); +#219 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 0.0)); +#220 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 0.0)); +#221 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#222, #223, #224, #225, #226, #227), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#222 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); +#223 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 0.0)); +#224 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 0.0)); +#225 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 0.0)); +#226 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 0.0)); +#227 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 0.0)); +#228 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#229, #230, #231, #232, #233, #234), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#229 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); +#230 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 0.0)); +#231 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 0.0)); +#232 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 0.0)); +#233 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 0.0)); +#234 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 0.0)); +#235 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#236, #237, #238, #239, #240, #241), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#236 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); +#237 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 0.0)); +#238 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 0.0)); +#239 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 0.0)); +#240 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 0.0)); +#241 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 0.0)); +#242 = LINE('', #243, #244); +#243 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); +#244 = VECTOR('', #245, 6.0); +#245 = DIRECTION('', (0.0, 0.0, 1.0)); +#246 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#247, #248, #249, #250, #251, #252), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#247 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); +#248 = CARTESIAN_POINT('', (10.0, 2.474358296526967, 6.0)); +#249 = CARTESIAN_POINT('', (7.499999999999999, 7.21687836487032, 6.000000000000001)); +#250 = CARTESIAN_POINT('', (2.5000000000000027, 10.10362971081845, 6.0)); +#251 = CARTESIAN_POINT('', (-2.857142857142854, 9.897433186107872, 6.0)); +#252 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844389, 6.0)); +#253 = LINE('', #254, #255); +#254 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); +#255 = VECTOR('', #256, 6.0); +#256 = DIRECTION('', (0.0, 0.0, 1.0)); +#257 = LINE('', #258, #259); +#258 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); +#259 = VECTOR('', #260, 6.0); +#260 = DIRECTION('', (0.0, 0.0, 1.0)); +#261 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#262, #263, #264, #265, #266, #267), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#262 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); +#263 = CARTESIAN_POINT('', (-7.14285714285714, 7.423074889580905, 6.0)); +#264 = CARTESIAN_POINT('', (-9.999999999999995, 2.8867513459481318, 6.000000000000001)); +#265 = CARTESIAN_POINT('', (-9.999999999999998, -2.8867513459481215, 6.0)); +#266 = CARTESIAN_POINT('', (-7.142857142857145, -7.423074889580897, 6.0)); +#267 = CARTESIAN_POINT('', (-5.0000000000000036, -8.66025403784438, 6.0)); +#268 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#269, #270, #271, #272, #273, #274), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#269 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); +#270 = CARTESIAN_POINT('', (-2.857142857142862, -9.89743318610787, 6.0)); +#271 = CARTESIAN_POINT('', (2.499999999999993, -10.103629710818451, 6.0)); +#272 = CARTESIAN_POINT('', (7.499999999999993, -7.216878364870325, 6.0)); +#273 = CARTESIAN_POINT('', (9.999999999999996, -2.4743582965269724, 6.0)); +#274 = CARTESIAN_POINT('', (9.999999999999996, -4.4408920985E-15, 6.0)); +#275 = LINE('', #276, #277); +#276 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); +#277 = VECTOR('', #278, 6.0); +#278 = DIRECTION('', (0.0, 0.0, 1.0)); +#279 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#280, #281, #282, #283, #284, #285), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.8750000000000001, 0.7500000000000002, 0.7500000000000001, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#280 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); +#281 = CARTESIAN_POINT('', (3.9999999999999996, -0.9897433186107872, 6.0)); +#282 = CARTESIAN_POINT('', (2.999999999999999, -2.8867513459481278, 6.000000000000001)); +#283 = CARTESIAN_POINT('', (1.0000000000000004, -4.041451884327378, 6.0)); +#284 = CARTESIAN_POINT('', (-1.1428571428571415, -3.958973274443146, 6.0)); +#285 = CARTESIAN_POINT('', (-1.9999999999999982, -3.464101615137752, 6.0)); +#286 = LINE('', #287, #288); +#287 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); +#288 = VECTOR('', #289, 6.0); +#289 = DIRECTION('', (0.0, 0.0, 1.0)); +#290 = LINE('', #291, #292); +#291 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); +#292 = VECTOR('', #293, 6.0); +#293 = DIRECTION('', (0.0, 0.0, 1.0)); +#294 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#295, #296, #297, #298, #299, #300), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#295 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); +#296 = CARTESIAN_POINT('', (-2.8571428571428568, -2.9692299558323625, 6.0)); +#297 = CARTESIAN_POINT('', (-4.000000000000001, -1.154700538379253, 6.0)); +#298 = CARTESIAN_POINT('', (-4.000000000000003, 1.1547005383792517, 6.0)); +#299 = CARTESIAN_POINT('', (-2.857142857142861, 2.9692299558323625, 6.0)); +#300 = CARTESIAN_POINT('', (-2.000000000000004, 3.464101615137757, 6.0)); +#301 = ( + BOUNDED_CURVE() + B_SPLINE_CURVE(2, (#302, #303, #304, #305, #306, #307), .UNSPECIFIED., .U., .U.) + B_SPLINE_CURVE_WITH_KNOTS((3, 1, 1, 1, 3), (0.0, 0.25, 0.5, 0.75, 1.0), .UNSPECIFIED.) + CURVE() + GEOMETRIC_REPRESENTATION_ITEM() + RATIONAL_B_SPLINE_CURVE((1.0, 0.875, 0.75, 0.7499999999999999, 0.875, 1.0)) + REPRESENTATION_ITEM('') +); +#302 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); +#303 = CARTESIAN_POINT('', (-1.1428571428571437, 3.958973274443147, 6.0)); +#304 = CARTESIAN_POINT('', (0.9999999999999987, 4.041451884327379, 6.0)); +#305 = CARTESIAN_POINT('', (2.9999999999999987, 2.8867513459481278, 6.0)); +#306 = CARTESIAN_POINT('', (3.999999999999998, 0.9897433186107857, 6.0)); +#307 = CARTESIAN_POINT('', (3.999999999999998, -1.1102230246E-15, 6.0)); +#308 = CARTESIAN_POINT('', (10.0, 0.0, 0.0)); +#309 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 0.0)); +#310 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 0.0)); +#311 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 0.0)); +#312 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 0.0)); +#313 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 0.0)); +#314 = CARTESIAN_POINT('', (-4.999999999999998, 8.660254037844387, 6.0)); +#315 = CARTESIAN_POINT('', (10.0, 0.0, 6.0)); +#316 = CARTESIAN_POINT('', (-5.000000000000004, -8.660254037844384, 6.0)); +#317 = CARTESIAN_POINT('', (-1.9999999999999984, -3.4641016151377553, 6.0)); +#318 = CARTESIAN_POINT('', (4.0, -9.7971743932E-16, 6.0)); +#319 = CARTESIAN_POINT('', (-2.000000000000001, 3.464101615137754, 6.0)); +ENDSEC; +END-ISO-10303-21; diff --git a/crates/bone-interop/tests/step.rs b/crates/bone-interop/tests/step.rs index e6d81f8..a7e85ea 100644 --- a/crates/bone-interop/tests/step.rs +++ b/crates/bone-interop/tests/step.rs @@ -172,6 +172,16 @@ fn cube_step_matches_golden() { matches_golden("cube", rectangle_sketch(), 4.0); } +#[test] +fn cylinder_step_matches_golden() { + matches_golden("cylinder", circle_sketch(5.0), 10.0); +} + +#[test] +fn donut_step_matches_golden() { + matches_golden("donut", donut_sketch(), 6.0); +} + fn evaluates_within_bounds(seed: &Document, min_mm: [f64; 3], max_mm: [f64; 3], label: &str) { let Ok(solid) = body_of(seed) else { panic!("{label} evaluates to one body"); @@ -278,6 +288,46 @@ fn donut_document_round_trips() { document_round_trips(&document("donut", donut_sketch(), 6.0)); } +fn corners_mm(bbox: &Aabb3) -> [[f64; 3]; 2] { + let (lo_x, lo_y, lo_z) = bbox.min().coords_mm(); + let (hi_x, hi_y, hi_z) = bbox.max().coords_mm(); + [[lo_x, lo_y, lo_z], [hi_x, hi_y, hi_z]] +} + +#[test] +fn step_export_then_import_preserves_solid_under_tolerance() { + const MATCH_TOL_MM: f64 = 1.0e-6; + let seed = document("cube", rectangle_sketch(), 4.0); + let Ok(original) = body_of(&seed) else { + panic!("the seed evaluates to one body"); + }; + let imported = imported_document(&seed); + let Ok(reimported) = body_of(&imported) else { + panic!("export then import yields one body"); + }; + let before = corners_mm(&solid_bounds(&original)); + let after = corners_mm(&solid_bounds(&reimported)); + before + .iter() + .flatten() + .zip(after.iter().flatten()) + .enumerate() + .for_each(|(slot, (b, a))| { + assert!( + (b - a).abs() <= MATCH_TOL_MM, + "re-imported corner slot {slot} drifts past {MATCH_TOL_MM} mm: {b} -> {a}" + ); + }); + assert!( + !is_dumb(&reimported), + "the matched sidecar restores a labeled solid" + ); + assert!( + reimported.validate(TOL).is_ok(), + "the re-imported solid stays valid" + ); +} + #[test] fn import_enters_one_importable_body() { let imported = imported_document(&document("cube", rectangle_sketch(), 4.0)); diff --git a/crates/bone-ui/tests/snapshots/gallery_dark.png b/crates/bone-ui/tests/snapshots/gallery_dark.png index fae8a096d5048e7427a46e87db458bb7f6cedfaa..c4d84e9e018954fdeee2bd81dc63a1c9f52849df 100644 GIT binary patch delta 24210 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 delta 25243 zcmZ3yljFh>jtR<4O5%;GTU8m~ZmB=;X2rYX|LZw8#r9NuR608M(b0uR*Y0pG(0KRm z9c$O_X-Y>`cd#~9E4DoF>rl}B^WNuw`F>9iv)KiQ=GpGQzS>`Y)Aw_8i__A!Yraqa zcE;qgkM!SPUsuadx%U0_`sBN&;hp_!Bx1T@uB6Lj>XAWuU_wAeLi>b)2*u0B8=4LC!N~y{@(7_yCdDN$P}Lu zEIwly{-x^o+ZPufuQaQFHcL9M@AElJ?Q>R-x0ux~)BRjOr|ec{^2MXmR!q;X`1kYq zq%)!(&JR>s8^swK7IE%5Fk#hFfo1cmZdI)Je{a>NxA#m@;s4t2N91ff z~ENwv-@$L;m;?*ZvX%NeN^99e^=!7pVY@UN`LFV`rdE#@Jq$psnZ{Id7qPC z`dMOPVV~{KH5LDEE`K~rTTk=XoF^}?+kA_!n%i!E{r-8o^f#N1*A<@n=zb(Rf1lum zdn|E5f)$Jm8nX^?H{Z^CemD8r&1W5}_4jM+`}gUzME)Pnq@|%@{mFdR3+nzq*?g`) zJg&aRPS583nn0_5tu1^1zBhlgEjmx;-L~a(ivw+be+e#p+4@|p*01PGw%l+1z2^?k zem$r7yma-u`V5)!BaR<`t=4DXV%|6%5+rIL4*j2*dhKS?U*ByV7v1G;^L9PFHSK!+ zub0Ow{@qM}WzVlWsn__N#l{)kf>CoMBiS0wk@h9&R$`Kb9= z;rE(fC+E+d&ni|QrLt^R)vF(?3i;+${h4^|e^~AJ&9yzodDmyup4<8OZh6(#GpU_R zr*#${m$t96`I%AsX8#kZtxv6Z-~L{>b?5dn*>>~u&r0hy{I)%8Q+{>p{QQHh(%01& zr63={A3Koo#mBRgNtCtM>j^@2>rRr!f1^<6GL% zva7pF<7=;*Mus-R{5U@Vu`Hd0hMLq`KkJkl?Eiiw|+CuTp+dnLhuT(KAK&xdHmz7uUz{ zmngsU@zvis#lJj1K9gR*_08h0?UVftU2Fc|{cd>BMfhs+8JpK{KF;=3>(q-q)*)Y4 z|HH1&{?P-gn7%irQZrwh>;VO7{mY%viBCh5*M2qYc)$O@ott#-7OPYD3(ksuJWyNC zU%GDf+O2ty_t$sU-T%_7*W2*>qPzSNpUr>vseag&YPYub{Q-T|50ko}rG~_vf9-Oz zbFE6d7W3cT|8G}Unsm;lqXEfjqE`L(^yyx)7T@YP56tMAwE|M+aWND^QuP?Uw;PsTdazEUvky-dhU^(ypQ*6_RDnH?Otzoj&u23>G-;jm2(QdD3;z? z{cg>iHG)F-D}S$@cHs9bZT(}*qRYCs->=#{&p-NEc|`+?OngRH17A8I(4&KIjevDoxA<+mZyH#E1$=&c)IS|tGw&YeHM26e!c3p_<2J) z>fGIa`+pMZvc(ZKAO2NuydB4WBZQb7^$0}FK6x=ZEHL$I(e6#m;*~j_+|D4eR`|LtDvt$WI{JLR?5lltzdkh2SSR>=UfrjS({9|D_A_*T?dPx8quzP^Rek=X z^?CKS%ssEJ|2S{^dCIT7S)C2d{Z@*8*(_I{8F7c^#FX}yCUvc>i*7%0Qfw5iL{yEKXvhsAB*|xx6N;V zw_p9;kL$jNWtMj(>(|>{H`bF%vAwd`-^$qT|Ch-YPk$)a+nuYDJ{Bgu-uO&yui>#7 zpy&};KEK4Lc6sJf-Ot&ln|I%;^0WK*W3iyz`dx>=v|K*l`&sJZr_SSY|L#{>eC&}} zo_+nr-Pdn_ls!0LH7zXr!MmNGx9J|Yeqp!DVCOrw*+r>3K5=JQ^Ss@j>ho=`MU{W3HNU_A*{AMD>u%@E=Bx`9iLZV8HTkyV zxyY?$AI??3iDthyGkvb^$?trBgqZYKazHBa)`Pts4|3TyI=;8dU9HvkweI=bY4P>z z=hU4$`n7q@Is4~53;T+%X&&dV|JJbH@%z_1# zw>SM4+*_NaY!&Xf>(UcR!;krDo%!s19fndLADpYdEAoHOzgP2Hx7G65>=EQk@8CXfYy9u`{r_96 z_AA!gN4H)qJT9&O?QZSyiB{@|t>tqg7cHFiUuW~#!1aG`Wp44ixZMAJRlTxwh5I+D z-ZRjgy8p`^-Ji!(ljk0*l*nGQF?q{Hx7CL~Z4HkT^0)hTBH;P1J6-jw&PRWJur2Gi zd0e&Xvw8WA(+*fK`rLR0sgacFQ*V2Ai{W3M{oVZbHTzR}?_4u^d}Dv!KE<^8$?qz* zf4BY`#Bey+HX^%AbNQr+sUPV{=N15@d=FH!J$?L0cPPAA`g*w(tLxcGNw8yM5AJa}P&Y5mC>%=Yrjxzb~v9 z*9up7x;|iKSdhV_-y`+;%yx&I&41T9*RJ2iyrp=$-q-b~?|(Y~t&^YUztr54HxD=7 zS9IU$cfk+IH;diACak;fXZtqbzO+Sx!{68McDNnbfE2+D$c<6P22eY-9&1AtB1bi; z*C#*?`Pr~O!|N4|;tUH+!A<#ka4&~CZF#~?dEp9lo9gM<*TCk!dUCrp4c|gtHE#9q z?>?o9Fn2+1sNkySllv_M-zNOC*LnDUQ4>-hDI=aK|F>YpX*DDb^|hRP-nu`~osH;a zHGEV3uuZ;kdk#2)An|i+`hnYZEcZ5{n0EGn^}ipFkKZXiFDzgGCs3KMSMu-g@BMLm ztN!NCK03YQdR(=s-TyzI1C86w-qm-iPV1Q-U#Ge6&!^LTRomFjw;b4gW>fv?qpN$9 z|GaqI-~MZ6;jx!e`)6lP`|+szd~%Oo?4#TH?8n;W>jL(hKacr*Z1>)3*Zce8`zQU} zR{FpAtZn?B&)@bxo?Ul8rRH1x-1)kV(_u|MP~fb%nLg8S+q-SfUw%KEUGbvvck;W+ z=iT?-f9Y!GyRrV>vwiGxouB{JmxaZY-!)yF!k2sZKXbp0p!)oRoI6#g&&qzu;m^xx z{Jv4W`j}<LrJdk$-`f-17$1B?_^A_cy;plZ{@ly2*Fg>aAItLZSA1+uf4$zl^g(RiQTwB-_4i81*L;XueVcR7|L>bsKfrs2 z7xwwtKAsa%@v!yr>h<;ey8P{a?oVZ$SM_M)jwg@0U)l3ZRalq5lllFwKH-ef>-Ue_ z-|z3={eGA6y4~Mig&nte`o;Khr@MUb)9@J0V{+ARDs~+YF8r0be9NBtOPb4%`?((Md z?eZ_=wAcN4URBxse15&2pT)ZwW^cDw@}=Wh#dE)~E2o>%)r-oCHj z4A0kayZx`bf92!ems6+5cUb5Dj{hKM@*%7~Id99&YldgHTs~g^@3ZrljF|K9zTY*y z^S*uV|6TrjzC0@4_~20Ywc{Utt=2!vdp$04|Mti0s!jWT?z7V9znIz+Q9oH%>i2v- ztI}5@@4r-8uiNqDPt|Tm=Jzeaej(=+12ZIMeX??H^1WF z&i{8gcYT^4-Z?$Ks&Iw3Nld}TrH1!@2-hEx-F{zc|I8oe8(&FfADy{;o{0IqAN`4a zfvq*Q_-W^|`)gRMTpZ{a?-}suFQw=Y=2%9H8So`tr_xnfB7@rqn zf44vXbls{0zn@9xAK9orM?`+l|GGEZPWKhQyRV;9>UZ_|ukY{0`R~=oe|dY`{G9Fc zH`8`*HM>{8@%Vg++FyI5<7g>9a^mP))>vdbB_SzM0J+Ea{w*URTAMg9^uN^OW zc~tyZtN5SV9lvwu9d?(#xVw0{meo4h<@1Y@Vrs979_HEOt-sr8&6np_UvvDwHhcZ` z^}2gr2z@*k{a@~t5btl9iVEelerbQZUjaS#2U#}Wm~{FG@Aa5^L4Ny+_|^CML+7mh zmsj`b;;VOW=O?X9otA&(Bl{~4s~7*iTmM+$c4MBxyoxsqtycXnoAvThQ}OwXo9?0& z_g`PO-t~4%bV?NNj~}i7|NDN}^U&INw;P!s-%Ovk>ikFD|9jS@#(g$>^zGX1 z_m_6GeLpfizD_RK@8|6*$%(Iu>+hD`(Y5>e=*-wypzNvUOQ?Bsr)agB6EVHy5r>jB65cV*{eEZloQI)sC6`Vn&0cFJ|4bs3r+)3b zpxk>0cl~c9cwE<3{4`wXdv`+PBSry>6dTST@TYIe%Nh zc9{|foy})99iAKfb?5E;y_S9!|85-ow*Ag0?JZVusf#+*x-6f~*u3xakA`Oc?#WV( zKeyH2je7riS$&NB^0`$-d+**qw_Bku!{x}`vif@)um0t;y6?Gs*1CVYUtGC-zROd6 zwvE}%g1uqWGc3NW5Pof)sK5J1z2MIUhx=t;N$rWR|CyR|yJKFv+=ld;U;pn|t?{@0m~r~<4(a@TzGp1I@7ef&p7r)O|7Wk?-A_E%!pWA0h>smu2Y``hck+x`37j4K7O7u$yZC)X*2Y%$`~OoWAA6O(Mpk?M zhBF4=FIRrK_}aR+{MN$gzqk6V-x}Sq44rTNc#3d++4PTn*6%O9stB!^o4)Voqt$K( ze;>BXKia;3t{Qkq_C@`n&#!CeRXr*!{Cw8@>g{hacNmR7r-el@MX9=ZQ& zW$66f|6ZMLuVT+F?fZ7)`-2&2za*uuKklyBEjVp;?(c7Zt;+7z&YzL_?Edxg5C5Lq z|6iG0DO$36sZ`mW-1Wa|LQdQMDP7OJ=(I%gk`d@ch+sz)9XX*qnY%fgOPg}-e$Wny?5@7C_j4j z`f=vF@4FZG{kXp^*vHWIjM?os7x(`Ddst?1*TVN-E4K@Jo3Glx@5v_Z#s3@rZMF zZ#VVre%F7QyyJ7pZor8_q(^>gZ zzjC_j3OTQ9v$QtVefsEL_(t%5^?{rJ+GRjPn;YW#5g_xKd-l(^yq9-o z?aqF!D`DC1@^-wO_Lcefx?OJ$Rq?Gon|C4H^@Zr#VD&o|y{n|sumz1F%t$!YnY2E3 z_tqZkP0ur2>b9}Ofu;rOL6ba;x2|`v+{@~0-FiJvecR2t_WX{u&zf?Q+km(|X%uWC|`Me!S3p_wiEkdHJQFuz#Ju$MRnN`@KJ2*RQkYE#7l( zuJ!TM@EF-(AJb5t7xoL{xE63Vn1}GslJyZ?<&uN7InZf9QopD&mFKR)jNpF8LK`^O7v%d&5}8(%rM|G=S* zC#T(&3jFbM$CE?F(Q~g)X#D;m*}wC=-A{{iHeY{4tTnvWRUfssQ1{pM_o3bnF}H7Q z>)OaJQ|9yMnfc^vg4?TR#C`p+{oVJwSA{B8m$s~KKl=5}$CNqc-&X1#w?f1~J!G1V z@m9F#!YaF;CphZ!_WgX;{ZUHs?auUSvq$Oo!?x!hyI_95VzJ<(I^ljht3MybB2zB9 z@yO}Q)xX&oXtaD=-}Vr|JMU-|j=t->{%e%-qG{j~q%mva6`#pCNF7as!k z6JmGw-M09?{%8Z^-}c?L#+&wCUtV6XJjG8!fA5c&)wj>v9gpc1u!-99=MwkglDMf_ zE$5A1=X{mDvwq*FB-wMbpUo(KXJxkk)2Hsme=w_(n+L3w+P1R2`~SLa8(V&L_Gzmf zTY8Z@byJl-gq5$9D|=$-T>E}QGk?d`>oMAS^*i3(dU5mf%)Yu^ld}2`MBgpkow|K) z`>%UP>+QA0;(+1F{+DAY|ROt?3U~>lq}b zLP{bA*X;ENxETVp8qM{Ypt*wKl2FBG_%M)yF7>7A>1i1jyXwJ{%(UIWtUn1BO_;e$+g5F^XIZKG_)L(Db`U}R0i4PDqO*clGN)N z1}^V|vOZ$`ePG;Cj~*a&4v%{3S1I@lJhYmvo*`h%H?BR}>-WXgsWUTZoSM5m=Dyxz zu0554poKJ1)ol0N<#$-`7iMA*N&L7pT%=+pRo5xiBbsOlE;*ZCKHK=ss=jmfze?wr zvX@5>*XUl~+1HVG`>lZX|IDj9p1nH#cvtrNlWB1dw~3AW?xkzt zp^wM;K5vbAZl%O$`Q}8#dwuC6mCxshrq8XcGW*PQ%MH<3F;J>!x%X|p_yse>(BZn7?Q<&@btYZ%RPVlizoK@<`~I8-V?+y~ekA-rMh+ zk4ESJwchvtVf#e8cMs2IR~)xWc_6#kd-{*N@6)=%yi*8e?uT>hx4cq4xX&L=WS1AH{q-gD=JO7gdy?rh4EZd6T$qtP?`P7SjmP`uOZ_kV z`>_4}@vGr+a?@jK5>J;^zuTI>X5%-j!mCfGA9dpXuUP+VX8u2k;vU0C&t~WKe3wej z-|{l8@ci8JBNN?aer-<%1y+0OxPM%l! zynE-fdFH!H-pPO_KYqX4Yt473e*VE@*{?rx?fLLp0MSlNjVe01^wE>c=ljkr?w9Mg z`4h0`e|_Bi8L8Lqn?HKIr}x8;V9;DeMBdAzuXD}s=5*hvy8ZUi)9Gr2fp_neJ4-R!N|oo8R~kjXBNi?92cTJ!tufr<^k|9;&W zo%J#mG@!JL?*hB*hW8xu>kn}6=R>rC1D1K~?bZ^DC|LO8_s;a=Gt=i>`}Aw&^7*2t z*KY`_ssD6RUAM7(&c@@NjLhtRa^%HhN+NakoLIE+`@7voV$1JF?!R{JK=r4U=|{S> z|7zy#_;<_V&xPiwZ#yqIaUZ|`uP(6W&%^eOujYrZh|g}jvVQ+RE3?}#^gouZ-_Ab! z`2BOc7YMHTFX1jWZ$ys~UFrvB-jX^UuCrm7Txh{fyX!hIL!ra*dbVtGzC}@%g*m|8jn(PK(v^v;I7% z;@{1A8*i#fUs>;KbyDTy`rYsP*YEpd6c+Wb-`SRZZR?e7pcvw}E2w|7=W$tc?LNs< z=l|ZGS@&0OxvWnhKAt zjFhSVGO;;#`}KRjk3Ngelihyj&-p6ddxDm6jpB8(NClKn=!3VHpWlsmdtUqBo4x8) zHsSUfYa}bqTmN4ak@HdY@k;gi9lPJ{(f#-L+3bt^+RI=vq}6Qu={rW_nzEcx$^&aeSLPL{{CLK7Zt2= zKS~h=bgPl=j~A0KR(?6R@rM#O&$nMO#pguB+iAK1XKtnq5^fH5Y&O{+wgrbX@zxq4my)qJPTD zpA4HEuh&mmJE!&7FKym`M(*y=78L9 zy+|s2YZ`tm&|T)*tC-tD723<^l%=iN@aWXV*KfBcw@IewRPKn{`sR?;>$UQ=zw7Qw zyni+AZ9BNMe748#_nXZTnLC$0`Ym6Var583cl}55)n=;Ho87PYTk){6_nrD10H$M91@_7OKzh8pCyuZI*&~o~U?Ry`sdYuF+i`(Vi z$d%vuwthxUmuAw|tJk|Um(5xgXI+-U^nOq8-?>*M_Ge#T_wmPK{^OJVZRFx>>%XS@ zSl|6(c;4poF&1GTiPvj4yY0=5X3j755s#}%Es?AJ^5a1>f0W$1ZJ+|jwfDOHuNR9W z5^t(TZRz8+^Y`HI_s3bE&lmpvuD(Fou1>T*s&Ho2ZY@8#+BcoO5|**2)2qMN zsqea9o}aVvs+qEAg|@fO#*{bvuJ1Fvd}g!D@{4ZSm3!m&*L^&a+<)v{{oS4acCBsP zUi9|s|DK!AXBb1u%>VT}ZgsHS6STbcY|pyg&sIg`bS_PLwX%Nsy7>Pa1uIu)>~r3} zHu=B-M&%l`n)=ZHXt9`tgF9Y)TK)K__`LpJ^N8{d-={_A{ruH;x%}Qs(Yx>W>))JF ze8$dQ=R(JZspZm!UmMwX^?%uyxBvCO89AFyCat~tU!?Ze7s;1@d(Le9_wxMeBU6I? zMD_Q7NvgN``9ygCsgF#`{zz#v`)X)-fBoOr)26LoKBMN7#p5@hleW1v?D=tM|8Y(A z`8O8!rGM7l*0uNB&HZuz5@xS8dmT{BURR4$M#S8eud=b~y{BpS_s3(2wZY406s=mB zw5RZRH)sulSw#L?zG4}6`J(!YGnUuy7#@C~)^*WMTDR=(!f2a+N0MdJ{yF?cs=A-v zs+@i|=^v|jSEu?f-;$S?RDac7HlJ6!%zaMTDbJ68`Rz+)Jhu4w5QGsZ;=Mc&_;Ud2@McYXQ+pB4+Hk0sCv*^aY_cTFx=Yghf*=F^3N>=aq^{LzK=D)@oM2XGnwzXJqj}hOU>g%AzDD1yKuaH`7`aHJC zH)s1%w#7OB9qbTIStjMAQ<}@WIMwE8#8rQN3Yy=4d^?|g+n(>cXQp);9+Oaxt9`ok zpxx!D2eOM#OBkMhpWeUyew8sB&x`x@pFpc#qUvq4AMcgl_usDS`#aJ9f8Wab^_s(qoV^?;!_`k)Y2ena5 zZznL8MSNcQ?e=QH{M}`;=EtP#n=00&_wRVpRQxJ8dN#Tnb)U_yUwC8FZNI`x8{3cW z-h02Z*X*uV{j{jE)@cWRG+r7N!GZLCQA59VNTeDv->cL;% zFyVOjmj72DE#%%Zkf$z!;6^l~gyO;mH>h?m`d#Tgn zEyeyEUUc#AJZpC8=RecuclOuY|ND^6?;M@DG&Jd^XjtEIsle?~Zi)Z*mPx)TZtlBy ztEP=-PrGbwkZsy>zqwI!F=BPrX-V)BRnW5Yx8?VgpT#CDwED1afA=gELt0joa?RxErh zh$vOIT&cBc>7JU>-+k+{G;Z7_ho*rn>GLS{U1J`^KK^IOq_1}I^cFq zMRfEx>oq@p%>VX$e0!kr>nCnyYk7ryL@n32?N;*r=EcR&&wVxG4ED7xy;FRA|D$cu z|1D1)Uz_x%N;*d<*x$M~rsCa9PD1 z`>YHB+YFD%6fd#YMg+ab+iknwb%U3!$ksdv*#FP;c;4CA?{*UWwl{41?CL*l2(%M3 zC}N2V5&#YO%sRlmt|)Jmrm|6bhG*Oq50#d)B4+M%1$1eAz%L`vB&)0kBvVjdApupUVY?1BXjbXb8|s` z8;P90)4Kbe_WZrJe{uNwxWh8Lw^o`l=YRcms6Ijk)aNPuox7dS%q_cEv?B3}aD}HM zbbiiYN$me!?m3rp+kd=Tz5dmPo4d=`*Uu=w_cQtQS+g9Md+v|r&HrjIo16FR$FJAx zlbYNZWGxaB-faD?r^~o)>w(?x;;;4Z{cdYe_v__yw;i$q!oDVjF_k}63m<(ve(iSH z#jlI`?RzBC{=|NHf8YMyuE*OzHDS`xssClX^)@-weE<9XYuW6aZIv<=A0A%JeSP-v z!*;p)oSDBDB=hFayBaayHD8yx zC;qPD?x$(eSJ(4ue~_y=u&=QEd;8=2`Stq*qw_ar{=N5)T~?_6X2Rl#`nOjf_nO~Z zvH10i#pQjm<+s+U9`Un&yQT27?Du0!#plW|pI4Lg_m=7P|Hh#C`LO?=yPD6|U)b1g zem-jrXj9YNZMUtezEo(H-TS(J<7K`2-dgGTYY%<;@J#E&p%v;MCN&*^>}E^|kj~pu z?frFCV!h(y-T`VcRV)f-2MOSo^A~dkGA!*d%I@Zf$HOT?3#WT}0#eyXDp9-}bwIdH46+`D1%Owq-xwQ(S*e z?pgEsu=wP)7VnM(C+*JN))5*OYdbA6uQej;B5U-toD8XwHxJKlmU=z0UB0LG`>n-K zKbPORY-?BX|8K>%=a&!9Mc*;&7|O3|{k3Ova(iC%(Z9VHqHY$yuU&lmoAuR3P{GzM z>}O|tEjs&Z#mA%Kuj;?+?|JfRM&`4~cIgWF7j^Y}-_I?-VfJq4?{y3N?AIKK-uZeT z`)l@vXDzSCfXdM8-X1(FEw3r_+nd~}3`^eo?UlB!w?T+p^{RB6Zzm3a-N>K6j!D0# zib-FS1F{u{wXNhmbN{gh#=nnO9Olntx$Bwy{x4t8%4M@w@$C_=_c2JEQ})cV@P{J% zvC!~1x$L!j{bY)cT)g=G^}fTrd#+ypZuh~1N5(+m+r8rLZZWl6{b0qc z%w@fGe}7%&_j>*N>vhlo$`N<@+ACQP<`x{{e7uiczWe*H`aROwYjzd=z4i6~o~<8$ zxokXSZ${KiT&1Z0Lj5K!2ni%pYXR zj$GXM>Q(l!rqAate!3;(ts@EAYu$iPPleIVR1xm@77nU zg1`7*$e*|STq09me7R22t{GB^wk#OFjUSj^#hjjA&Idb-mVy!L{Oi>1aZg!xuc#|1v`<6 zv7UipKyzUIz!W=hKi9)LM+4-J`T?waKncH|dQAx;Qygl7s|W9QMGE|H|F@Pu{}_I? z^wIJAIsZhsOzUS|J-jh9DE-c)ES;%y3j7;miq7boD;;c=nHqA%#5W`+==2o_5yK+M z%X4D9SOq!ELk^gnEjS(HB*Gd~_|Ec7s>4I>C++Vn=U3YOf28;P^Uph<_kJ&w@4x=| z!%imsdWL{dXj?r6boR_DFKCl(4QMbqlylD#g%3;&6HFV$8CGaP!)g;K&O%i`Kzef5 zK0o>GwEYmR2T2{}%Ktw8`mTj1p)niGMw6hJVvHw>@U(=u~o z*oJ8tX#M3tW`KHF!4(zDtk2*O4ISkL7jc%*HSXZd@dUcY9bAk}P=-#KfXgk|&@efg z>KVwyc~d#*F1@qGQt-R~FmK=;Fgs*ViZ z#_gpn_x6w`RPXzM6`RhrX%F7s+M1oS=i~E7t>W|Yk1YHzzB%n|SLWqqXRFVN-F<>mVGO?96BxVyVvRj#fg>&y(p#mmyG6T7+g*lxRJC6~G9*z@>`hs@{S-`VN? z=W_b>-s$o4DGGs{iaitZTNh#DPzw1C>=#t2+W-um3&MVnzP`ioaX0C%u_ro%Gmu*U?~qzwXEV z*2`+ny-hxL^r-khi*@^ciJwm8^|t;uqfq$q8)Nq4z5919gt}1p-8>Qd`oAZC79Q<5 zEw-!vwrrK#`StI`il3e7V^_Z`JwG;mZ^gfz&y!vp6`#^S|M%p?!o#KEM`zrge!l$n zrM~)quG5d|yYcmNK7P06^!&t~pej%@#CZ!z!x>EgmWhRmmbSAG3gb*AFyQwj5T z>pp$^#J8vV-B$lQ^~K-cKk8JUm+`ss|8(Z}hU#;KF8}{^{l`uJ^V<3O_x|30v~{L& z@~J26r*5CN{*br#?)66#R|Y@Y`FvjP=Srschd`$efCqH1vBWi8v-4a2DSD;C;GYU!uag?2W{I>#~3~yYJZ_zn#BVbbtNMuhVw?S{0ak zuJBx?_>m(YA1BX#yRCm}Sd`|w-QVX~ymx)WyCtf}bdetGL{bM_Zc*V}mC zuKHa4nzcXqY;zn+e*Y0qT6%7-bYcD1r4n{I89uX0{{Jz2FJ)}C?RMhvqU!E;xhjKm zHh;G)mD*m(cm00B;u*HtVSk=Yo1Jvz>EYAI#Y8KI+Fl0Bc#-7d_3oNxK-TlDlFaTZ^8Gbg{A!v45>c3#-J z|NQm+KE2uNcWtU!^Z%i{Y25p_pPN5%%?<0Y{dRM|;qhA+_tpNcD7rO2=}D@6w8n>Z zn@+8IYPHPvW5u025$VydwVuuU^I*x3N7K!^MZ;qZ{j4i5IAy=SRr>Ts^83G!A7|Gs zvPm!h^X*y1hsNL2cDy?@=~?Xx!*l!VD!X4?s>uKI@#FFOq${G+)qdt6=i0T0`z@@h zzP%BxulqK$;>E$rk9qB~U z-R^hx;@0khY0uBhi@I$tH8nUT;@Q#O!RXzS*X)zk>EiCO-s6Hpk?Ruy1v1x&SgR|GlI_q22*FC8H zHgox+_loXEzD$qn`CNbA()M2M_q%4-LuI}nn`8O$z~Apvo_`PDzo%;9*4qD96fdre z-MypwQ0&HU_H}AzH!>#w__#Cuh`ik2+S#x5bTaSV+?;-t`TJej;^*hAzfJqU%dW2W zvA+G6bZIAdcw9MKCAx7u3&$8q5FT1o$LMZ z)8}V|pksJ^ZSRZX2X)G;X6N3Xvwp*? zRjZG&N#{hwRo2|$R6iP7-+SQC>;Jnp%6$Iye~(&S$-A3RKkMzO$k_AuTeRVW3;%Na zc0Z^J|NrFH)AEZupZ~Q8i+}uhnY*q!^O>ymuWdWN zt(y2W`M=?ZmQPyumAsb!$l=@r9&G{D{PkO|ZDP6ifB&yn8{gNlA6dPAU(~((>tbD& z`)QjTdhfl_T{%L}PtaN4=D+*r?;q~wZoiv+V50l+X|wZpefW{RMsDx^ec5j|7n(Ag!`}^(o z$HDWXwDsy`s|sVR-lRXB@tn`nHgCtnU!Qh5pZgcMX3r_Di{BUgy)9FI@T*v~^qJcH zyq$L)1-WpOJtZ8J!+B9Nt}@ka&XtZixtdAOORxW_`4_q? zx~_EgjoS73M-yxJZw+{Gw{m;F+jqAEwpjzxyqt zIQD4a^`2cx6T>Cnf9lPj7JgT5?}3`X{PvrAwj2%P%UxTY`E2j2Q>T;u#3r9g{w-UU zQu9PvzE`o?-|N#&p$g6WWuQGSmckW`QQ479`O8JET<7omyXg3|+4`4dTzOfi2_@4vCE{&={U)c)k&yFc z%U?+TFU*+V%Jkms_FIX)<$u3h{CV(K-11mUVRF)D-EA=$vs-ev-(PvQbnDm0Ik)TA zhQGN{ef`)*_A~q6cQhWK-uUOu<@yWHc1~oKlP{guaRHuet+W)%PxsuZ;buTlU~L>eS6w1Msjo7 z`L6e0EI%+mj{n)6o%}_1`&s$=#l7Zznv>Pf%P;R(^?uK1Kbfz4lOJ#2en)0Hul%+n zrhDy=$(eqb@oE3}`$eC9yXU^Y|NVyXFL|>Ccf20{d_KQlxzEPx+nwzBJDx1!o-R?* z{j*-&Jnv&f@m}-0Rnb3Vw_JDO_) zZBc9fzC3?~dGfp5&wB%ooD+|)uw(n5aF2hEZ1p4l$GzsyrbHX+NK|xx^s{(+rfC12 zXEO7DE-!uL-}}|HIdkLlck_PB1^kP+f8L$v_x$8~vHk15w_nSDx3|7>YVJqnBKiM6 z)RO`pf9;d~d;8Pz%h!HC|N3~sd%m9Ad3#shS-pL2ss8IdO!}vrL6g|vHc!;F1JOAf zH@sfA+jV~PZ};PTvY?ZSdd|h}I+8E7@avb$ez9+4TzPcscwS$g|L=Il^?kKxX4e_w91$)fD?==zpo33tiJYUhUMq0Mm%xRe=gh+ zV#;5*_WDJe_M>4!`DRWj&(Fo4vhCVm|7ZcfY(+Q2@2T~-t*YwZZmKSMabe$`sHCH! z;a%10ef`?f3%BaJzNz`OGIQfIbvwzox3>0gm&%r_y2$#}Zuk5D6SvAm=gZrc|8v{( z{a&?U`Mce{pZ|r)*cTjdI{4*t{0)^p*;#CJt-{_^K0EtvYwFDK2dR~yg(#pt*M%t8mRTj= zccj{_i{761@!~q|eyE=R{!~BzTF1e+kIIGB zbf%l?zO9*^yRT9*Q{C^+-TNhVx2t5Wzuq%VJ68d2R#sFV>+yKI`Slv{`q*7HOA7DF z_ukx`uKV%l*&9FK82h_kU$^?m6-|D1Sng$kHsgV!j$y*I1JSymS`O3`1?}Wq4LVK-+noj)3W+K3=E`%7b$+jv<=g;deCl4oUuckZ43+!z93^5 z7#K{U+tRO0Ilv9tBpeV7N-KC2)Du)eTLtyRIg@6NsApgxI;?2nh*fK13)nm;S^m9i&-rPxhchnPAO3=<7^_WEx z?JUD$S3T~ckuL72CtO6+)E)I`^#M&S!(vxGj(Uk+?x-hFKhoMA^+eXwv~ov1wnhQ1 zEW=_~J-)^X9o$h*Oe2Yg?x@FTkKPHgwJ#BQBj09OD7)i)`GiPhI7vnC8(6g+gWuKH6Qb(MfoPWW|gr7Z#FK+Y)CZxa@l|JX`i{t(<0OIZpB>>dhmDAx9o2Z4mKy>*->bC zd(Gx!J+f9NvesEwR?H|oCb{~%-JgPjGiJBfT-;at`_&A;`nguV2FC@rT3+3L*5EMD zWZB(2E6teRH*tSkw{EL@|GSH8%ho>5&RfT%?-R|Wzmj7QB|=a%?e@EZ=l{IEZ}{G(__+0ZzMjbJhhLW4-`l8p zz)ZZt{^yg)J03i`Uw?g3&hHti&*VPdlFmPxXZ_!zN_T_9)_mJtdV4N3ef$ypzr(WX zoS5{Q?|UWw{(Q0H*}`I`8##<_B`!dcEGyk$A=fUwq`$W`0;ptUf0g&bBy`*^SV z{n5bV^M%x9t6fUo-`jh1C)XZ>T%@ESao=6OR)k%)EG4Gk+e%+=`I-+0+Y3*u@6Y1e zQ~G|-XTO>c4doeS zxNZDs!QXFvmf0V-%Eexf$i2F3cZT%8U)%Q|f1v1`^x3ywAo*BNr*rn_pGWWQK3?yqTz+pb>Uc=!8(!?T#)o7P|dXJ{v5qY@UAxbwxOoyB`TUW+y?c<_7U zZ9V(7-{!|WSi3&4`iG(V(eiyeZ-pQG`_3x+XiV{0%bV=;Yk$35zI8=)$)9g6iywWx ze!pXO{%+%6vK!uqpELe<101AQ*?;#(WUW-4-SH{A#2kP+|EBfaqEpp{ykrx3V*YI^5NBMzWdZ!q3{`#En*u|F8GxB6>d;k>UK z+iJcP%53?6esxFme&ZikHlOPj?zdc2b@x&XYut=&NM)H%PKxe~dtaVMKia7NU-0u8 z+w`0r_r5>cvROYPYWnwo`~T_Y{rH@_@d4B4@YfI5ZMwwu@sjp>zrY8wmPsymN>1l~ zydms=e9z}IqV@0V4J@k8+ULL7`CAWECZ#dw|79$2moE>}+5YCz$7Wx%b=&UN9gqEZ zuwDL`pLNdnsT-qarPr=eo&G|&-|k;X$qLpxuh~8-P>#nMlRQ_Tq@@J zJHFic&#Mc~v$pk0nXalTi0qfMUA4PDa{09x7Z)er_#k+3srPeExuk2C48OMTmEG`u z-qqMG!AV}vEc4#nkofg-`Ngf-*Oxt&`FDLM(|>EEGDLW_errIzMdbOL>HYooKULQ4 zez@$$ulCt)_xG*+Zu|Y)?e|B5{r@Yo@m1NE-TkRvS>NCw1TRYKAF!%@`*>Xb_+|h9 z#%(oU0!v2<-Q}y#z3jjKf2G;KPj#4H4Q~h1Dil{|~vL z)Nn1dKVXZTefKFJ8o%8pI3eJ{Gujs0}A5qj98}p*Mb$N)sQuC z?pf>pKzBBx1=es)^}{x~#_c(X_^D@%nttGR70bO%D5muuuzuHFXqfb)-H9drO)Nfaw1AzUQ)f~zqryTe=^setESiNy1yB3 zIcIw9zqLW|^O>v8SNvJO{CI_~q+LzL*PC0i@8`|xoBXNT`@vGb2dwoB3o@AW9bT_; zUomfUS?}Y1TeB+t8`fsGUi|)ezW$%GSZvD0h{~y_}tEACuNp> z`BVLFW3^1}nT>|O-)!D~(ZAYhGS{B{H@=G(-bideHmBHk_W50^>T^o6-u#(7chPeh zTlF7RRXx`yDfipieY;!TKcnyg zS+^e?Y+f9^-0$Mr=&Tm&S;Ug{{d4@9mwvO@H&7O@{YtK8MHm%U8Uf_$dCoo$z`4|21doO)mR{ip*Qx zD)ICB{(JJ?dOK5W{@qBvD#W6_ZcCBQwj1@=|JFWuU*G*SJYpl)srV~KC-(pQnzQG} zA#TI8H#Z`xUM@|(nfg2IcdvZK@oV?0e=KBAK6q=-^V#+P(w>LN*RNbUtxtV^jgsBp zFPCo=onAZZUUuG|@c7!TR_`zPw;$V6|M{GF_L`4pU)OUW&Eb8sWVoM&r zxVX1^OZI)cs_*YY_x^t-oqvp5f1k+VHvaX0XPy&Wy=F_$)*8py&5hg5K0eRB{`u7E z^{&hN>SdE#MW^*!{`-9IFu%Q2?Jpg%^ERJzwoY-nzwh+1=kx31r0XXxtK^mVP}U=5 zsU`M$bH?RuACG6`#g%?N@O!iTdkOt(-y{u-Qgot!`-n$X929$Q_R->UH*%sceQsOd zUvKj-Kqs<$a<~3Im#uHFMd$bBui14=rG9$GkI(b-yZG(@7+i}j-y3y8S}c8jX_!pi zlZl4z=PlK&-E7aCGk$Ng@$I(TSL3#JZ$4*b{OwNh`dby<^-uqp$NWED@%!!ejlK1?6XT9;&s{0vM{W4BekS%T#6GVvj{C^6*?D2C zw^+qv>Q`juo$dYpVsZZ!rH6B_8lJcP{=Q;`*p&LOs}C=Z-CcIoQaq|+;f<8Z@>k-v z_fPh-QtY#MbRr_5F-~{h_K%X^qE`6pT&lij@%PK+?CYf^xoa#ZvD~wdsS7=0b^6T4 zQ>V0#Ml-V=IlKLy?etqa(^fxvJ!k9RecQi9Z9Q>s<*zg6 zc0PDy@n=Kx>}zLipWoq5I?Q`*_21Jith1k4{gXI*cJ(^DV{bN}m6FciQFmo~%*Fq^ zZj`N-Kc>{JbLY(+HM#UE!HUd!0ch{&!md|>ujKu0L{97Pule$Jcg)tc_5W9^?__)L zV_e!dxBOpZOzG9Dp(XDxmfw^7Eno0}<@x(7 znah4$?5_)v-d|s;{%*;+;QQ~pwDtOV&F^T0MP)vfuqw&uE?yCiyk_q= ztF!aU|NON3e(Ckq^NZZ&>MYp!WF%(iZM*qjrovw8Q{bErw=X~5v6!!4GHuSnTV+2* z!;d?0f6L?AQySm%Tgk0wP5kv87N6&QPOg7%Thk-K-D{`S}L{qdjT@lyNkw%ljo_nd99 z#}AYz47c4&+I(yN~b|0+iqrcr#&}YS-9-__h|>b=RzCh4cAOf8|%0K ztKWOS{C;in)2ZRBoMLJvo2oXf(SQEo^89}}o06|2znHlHr|)H{eeyLQ9A#<>_V0Ky z$y?px|AxfFk3ZSRh`G!BoPBcM@_k1R^I5-(xVtv``>)sQw^}U!Rk+{s*NgRcQvck_ zUTV5VPk3`fbG_vm7B=@12-%dcj_Df*So{!&W z+rIzt`ESApcf;pzHivzFdwYBSn?0xX{ue)3t6yC3TDJV?yxs3FZFxJd`hB;bthFiY zy>|IJm3Mz%GhfX9_jA=#o_T+c8*h9cxBKXx&u6V~9{7DNn)%Tb<8!^PVy{F)SFZZ& z{@3rOYu3lI*HsDiYmZ*9{dQ;V%f6etsv2s4$^Y-k-F{OmZ};DGuhu=f8Xlk9^s~?2 zt@!h*)%_dG-|mu{SoYz8V&N;v=ST9a|L?fD)7R$Qmp}J}Dpm@^6Y?^(57*wWvU%9@ z_;HW%xjCy0Um1Rx;LP70w|8I6z6Wo&vmd#cK0nm@x@WxQ|N4vWf7Q;}zW;M_Ui$p` z@1;Q{-en>F_j|v`br;XNbNJ?~<9>O2zR>YUePUhP4 zHF@9vzrM3TVK!HcKT_JHARwmVWa`J)hku#o?*6!J_Tu#1d0!9w1~oEYrq7e!Z?z@< z%#DYqt>^XIy<1ZM<7IzY$In@udz#ty%8Oq;_j|Q7|EwoFCRZ`sx?z~S`tAN7Kj#%5 zI=TF);C?HWU8S$B4i@$rzADbli|aKk`}wkeR^0yI@2U%*UcG+A&pPM&n>)wk-5)G9 z<$za)!NL{k^Y^C9l)X^g`1hN&%l)VO?rh&z;`sO6JvrN|dY`hMDxSaJw(pm{owL36 z>#td>*LS_!`q%tc#^d#K{!eKBeYDT|-IbDmfs5Ttb&D@_ta^KUdw+7D<*HrI<(;b2 zati%~kKYiFtFYTu{$8&5yzTjvVi@&~l{XQ}Exm95@bvGQ(vfcZ&$KUepni~~|zb36* zIxXkd9QQtn$hDm|D-T4M|NmRx?Ji$$B=%;nL#g@O)B5{^Y<=?QRX$sHFTW?SzCRvP zP=2bN-sx-pv+nD!W%l=jSRcQyNk5zR-0YtPlm1%A2dvO$(yUnrqT`buHuKweaO+#x zyYxgXk_AMbkoKg9a~frzY=cA)`tv(H&3T@B5ypSP8}e)q#; zvmgBwkMEne`K(m&m47;HSM1j7n*Dd&+_>H9{R72||7X2^wE4V!|GL=S$J)1EkIvcU zsk6^z{zQB$gkXmfk|Lj?4xcuYW zTOa@X`u=&ckM4tWLBBWOOWd8i>iqVdJADoM>JNBpBUeGI-UoI2el1jX@9i;MeB9-F zUhLx9-QUi>yWO$y>uyc=emU8@yUMaZ{`qPh_4?Juyr?soUdMl1eV%dYv3&inn-S~2 z-Mr5H<_Eu=_uEC?`n_AP|Ek}3LW$cvSK6?~8sl>mac96A|7A0bJymI?Xh)cvCZj!8_Unz{LZ=a|2q4s z9edtv@;?6G6w&l&j0*2MP#?YD`|Ffozj;rp*<}g>{=AMqA9mWl~_w^8;iQH)qObjAGzBXb^XhZ z=INfZ!y2dCaDWDSar9H_8^srt64Oz^-cKR3*Ml&u9*^6IcUriu)5WSkI$F~a%}xev zqur1|K<)+Ci!&g1{fN{>Jx!*t`ETsK;4Rm9_AoG9o&;+(L}`CuVwmE!UGWB^665rM z8;sxTbEh2OW?*1oxZnor05LEyfCU6VjLFz!FqBdzP!F+>GD9dZqaMxU^ma%+G{EU? zFU;C{^q8l!Lu^0^4Qmp_aEQZ2xvCG2@=Od4PT4h|XWO;(Y&X2YC_)zK3}*3J{^LbqbbRo z_0XnyLe?Jp7k_trK4+bDxAc1V&S&$oH{C9p`}#`7^S9-X?p43<* zV7CWLVJ!p$)41xdS8rs^e!KX8==9@@x^>NN=I%UKnq~9-ef@Di`+t#lJ{-?p6#o9+ z%`@CHj1ZMU<4VO3+y2$>Y0yNPzB^@}_vXf{`ES!_EIeAfU*fxKkEFGlRmls3li&B} zJ&?7nDmfD%y}$PNw_ua!7w7l?E8=^*?_cS5ll9ZqebsLK-mSlWvGZ|0-Shirz80-W z{3TG439D+KN*PrY#1tMCEe!piz54p>{9T@ZejK;2?~KmdxwC7Q^}8*>TWhbJm{|CH zZuzm=?|0?8H*3xIeKXi|PFg!{kT%s^9l!uivXT z@89#y7gvh8ZU6HyZR6Q(w~yZWeCFWUQk=p&F@>+Jd9RQMvXzCHB!KKqP-Ipy~%H(ra% zc0E7O_Hp;E^#?&?MRUr2&D{7suKLKf+qu_E?rHMwd3>y|`?9~iZr+}k&ny!D$Ggn8 zt4%u6Az1kJYWVeYf1UpP`@X;5^4Xllx3&ugncqv;`>OBOFXyvqvsMCcM9EO>Qet}Ip}ZyQxsggmr3789+8|D`fR^jl`T{ERvqJf zR`|d6`|-xVe4W;LyH%^sUEG}cJO151Yd*_2*9))9ZaIb+cdWm~$0MBE`Xz1EuEjmy zz473$*Z<5v{By7Mz4a@0c5CmGo#ph3w|tApRp+yAz?7F9j>M#W;@Sxou0mhGUP%zA$Nnx@+Mwa;e$ zIC;M8Z&c&)Vg*d_MR3qnPC?AFf?LXS*YQe-`h(yJfd+udQW$bJ8|uZDP^q zS(mbN&%C~~`Fuy{e#3{C1pRG)ro7qpJFYPIzjpFNSFxF^&`aCYESrX$Kc=a#-|c_D z&tk*-GNnum^j8uiO3TLcE;Z^!PGQot+_{ z@4pTfsaX8)!8Z4#^|f_^)o*@nws?Q&zNu}@+I?>hRlnaWEo)ucHP80{Z-H&F`1Lhg zcl62O{uvJ*=BUpraI*Puptc@&s>&h#; z@$_52-(xIS`Q&2O+Z*eJE9`&2+596_cah!yKin7B-*?=2M9AA^c~rw%`x|eTPLBhR z^lrPGw>#^;ChwlF*|%ywpH05N-kkh9cUx9{)s9;$CN6#yon5EC?OxGm(0s$Pzv`yz zSAz1|wD-G9*6jcHYvZ?DuU&RWJ=y#J-|xpa9{YDq_P5Zx7M1>X<-WK^@n!st)7cuu z85$OG?g?1u-_F--|M#VT;pem4kAU*=-O~Ny(Yaeo|NOeXzt65#tb6|Z-T7PNZT;eY z?Y>`s^yu_|3t!%tTmNhEk9*&*^{(B1_g^;ayBfOtsJ*E+*+l5 zoXo{w6zozMXTdkE& z8}DzEU8V2k?(Qn}HhcEsynVl-v)!tF>*jCI-o7sWcMNFUymWhRF@N}Mq4?)f?R7>b zZT#|bo6lK!pSiO0bIH!Q2d{;Z+5o?vJoZm|7MYe;Wt;bA$BuWqvg;o|3HIyH{v9vM zt-q;Y_O5x3%$%}dkauX|_mApw z{p|8}I(&8+|8EqnUVH0Ism=d8#UI~nK7Z`(_WN?l$NPG@^>!FomA|}`_KbfEA97S} zzgJUlJn#4SV#9(92P903QqCA2pL6xsrf$7mH(0WdKYRD_xLmipe67i|nbq?mvfpk^ z+IBNN-+D58R4>9oly%_hAuIH;_r*Xf6=~d8tVd)^T;0;_wFj(k$8bOSp2)!9DruDA zu)0V4!!uX#2-Q2#Larx#aZ)VM+cup*4>ryR=WPs`sG(8&Q`u$I(@PK{G-cm{%ov4G{;z%ZLQ_EF!8f}Ib%j* zo21&0s;J(JbMAh-rLR|S@q9~WS)Bq>OQvz9VcM4&61Hh2ph1y+EB@}fv+izve&*kt zE9r)LcXqtEv-C5|aTDo^?EQuP5{8Sc;&*@hZ+l(*@xB#t{Zf{zex)z(o2#~?y6n+L zb}j;|5vp9R{jO&cD`Qu{~7I|B}!W}iyFW8UccWVowv*K+1&JZ z70>TBZhXpb-W#`9Y(?M7_8VvGHw5nad~Ua4alf45={3g3t+LmL?hWtXcYJ-`6v?Yg$J?U9|Gv&T_q^O;Lm*PT7<{-AZ6J0cDZR6(VJ zpXK8>7F+KByE=Eh{@x!&a|++J`ZkuonX%D#FKF*N{i_?^H@2Ix-n$-Otvs*h)yp4C#Nyn0WF(8fypg<}Q@_{s>%ApR z?;9BN-T!B=?>7yL-kRBC{cfK*pXCeji;La+wT{fIK9)aQ>8U#`n0NOoF=k{9l#l?fx!#abcnJ*88RPdlbWBE0_N2-G|MM^?Sv9 z=GRzlyHTIC`PJ9w^K0dPfBl^*T4De1#p4|>CY?_D9$PPVcXxUB_IpwS^}l~NZ#?|% zcF1o(tq<3}?|gpmck<(2vl$6<=GmtAOQz5HsLk&zZSvx;)~9vb-<3Z;xBH)v{qL9k zY8H8a3}?+gf28sIt=D-S`D-=>^{oE;>i(S?mbi>+oj`KQ3Qy zR9El%U+cp)=2x}f|LfLmx%}zmwX zzbfkexAN(6VRv8ta(x^AV&}72#&-XHOip9Y|NHt^?7{1?^~qlYHV4kH4RgJAZ0^p< zTzmfi`(9jl^y>AahVK7XMeTZcX7l-OU$a{ZVlf%@2RYB(zEdN`ANl*mvMRe!$m_`HsXTWh8H^Jh=`?3ZWvb$9XY^B49>eSdw9{RGnTj0CUxyXE)elfS&U zxHbPl*~cfr|2yWE-7tGLJO5s$U7qc+e|x``Usdk6mE3&BuM_re_7um%LB~iEePgiCo&&a}!ZW zW9Xuurg~7bY3tPk){l9NSr`Jg873dEdz;J(t{cGCu8gfZsk-sjtJTLRdFxr8ynea( z&9j(-gFiQZyOn)Bsr&29XUUB5{RiNisv58O**t8C$p8B_`RCK=^PjwaX<1fWSNvq+ z#-n1AeX|mC;&*vXE^V@ag-QDf_{he*nj}H$)YritC zuZ#WqZ@F{(G4=U1Lb1C_IwR9(ug$EE^=|y$eQW(q`I--PJ+jt%Ro~u7%376VSd~3F zA-MIrZ1(%!-tYJ8_g8^NO1?IO7RUM;9RD>ZZB_2<#6A1@)#O%#*W4;~>(xiazSc25 zFLSs0%M4Hs0WG6c|1hZuHY}6`8jq;^`^)uy>h#`)TOEG&Ufn0?E>{|3^Xb9;q-E#k zKHl|uT`#+QjfPlc%EOAMQ^S+jSw8P!=CfD;S#|sC#bS$hJ07ok|IqT;4CQ&1&u&^g zI-#7juvKi;x3%uq>z7W8)B5*mdUaCc&*%MXx8Jj}TYvPKx87bAKg*|AmRZ*Qc*wr- z=(OnLZ@1qSnrmI2dCLy6cr|SP(cedu`)#E5R)6i<{eGu8-~X%n$zM&ct+r#(eC?yBdd7%1Ir}{Ci)oX;Z*X}L*dQW@(9+~6vC;_mYIS-0o^uL&4esk}mi|uk9 zl39YA^DZoC+?snopKDKP{@$NyxxW`kM0Rh~-~T75=HJg3H5t!(<-Lbo%v=WRkuV$1K=m(G5-D0j!}bJnXrmfgu*E@7PJ zle7D7S>dVtdg;AYUuPxk?>wHDH}C7lSNxH`zs<@vldXSacs%6z_m`U^x{F0C5^o7t zc)|w*_x*}pQ~iFg|DB4*^Ji_lIz2Puv-N8e)_dLh`z-ENf4>{CSON$d&qBpy${!}Z}|IgTJ+KW@>?IZALspQmOo|ff`Ip#j`8FR8Fn@e& zy8rH$mLor;lCNGrnG0GI{_5lQjV#W01>5E0T<^Pz$8G_yr+$mH_h!b8nd$Qc>o=dZ ziq6^jblO$sb9#F|9NO_`Rraa_)>UU_{P^}i+WOtj*WYIBO+WwR$>aXy|9|;cOf$*Q z1WgN53 zH^zoFKRP0Ew_a6~$e!pbmRUIOYyHN1(iR({UM-X>eC=)VX7BlZg@?b^_pIBx1F{77 z8%taeYzWmS2Q% z&gR|om3`^kt=Ho|u8p#|nfLqc>fGzslipOn-xtok`FBm~nrY7><+G29hWG6L|7rS* z8yl1Nd^pry_-5nrBSoimzdwC`;SgxeFtUTUJZXJCzrXmLrTRIm-*1-XD!cdfoOkQ( znwdUx>8{zOS-o<$^;T`QzcRP-xGeXZyX?n|svOX=wd8+4pU+>Eyews2ayH}2eaG^* z=iOa(VRq6w2PvdNMJ+6z>mg`SOib}vQRg=#);BdgZs*l!U!Kj*KjzGD zE5UqEO5iV_oyB{80S`B%1bO6D;P;93?s9$nc0Ux-=2bq6D7y&?wzV(6Pmhzbt@_gO ze(mnOlK1y)FZ=U(_#$*NIIKg86^18X6iC&BM-8ZHB54NJQ|5fqEW=_Kd^H#rIas=< zrBprVo`DN|h9_S26r>%B17Dzmu^zlpiIyRZKY;70n3u>2k9uhJG*F2EH2+6Y0YZ+a zk^Eebs9pvn5!8bQO$RFQ4{$To4`krS1qswc*ANa!;5RJdtRL9o??FAhfjBUUpdPeO zbD#o$4}(KJ^_mi7l?34aH~u1;rX_Se_W%a|I+nP4c3YS8Y2QPxUc5O^J>&OAYqxT4tQKE>cfl z^!iDMR3F3g(?NlkzoZ7wI=!XmnMM85$xD|`YFe7WC1s|jb>h*nX-em8k6Z3{`1yB& zO~Lufs{Q{z9KAd5`OfE6d)HrYe_ZS_>i{=H$kYSglA!UUNopUM7(!J)1cB%OmVo>f z%DHC>s6Vcd$)wK^5Xz*V3TnsV(gtpSkf9G$g;PUYJ#o&YmUS4m)l)Mt$#7*o1#w4) zbr`luVM!`cvCR4m4$;&1voLL)&dti?Uww&hOcRtQO{O2XZNrp*izN-F52f1>M=DAGz;2{}M z;yJ7O!L0wlY_rDc;PJ*wEO8CbgeqpcKk%J>z#HZ;hhowC#`2TV-bn}lux>1C-Olc--$ve%x=Vx_}O!v2J zljpW+|M^PZTrspi=Ka62^vrgp&(F`F@AuvP?QPggo7B4PEOADl<<4N2YIg_RHGd)W ze13J_msfYSzt!JJK40J07=x{{8ICOkr88 zl8$w;yPs_jFMTlA@Nui#mbdqcjum9H+za)8p!W4|710X;-{z8oXj-SU3KOX$O z$bbI6i@U?uPy4-H(#oXj+Z~(#pD#6A<&J*#s`RD?g9_&9fdyRtIz3TV2h8Y(Y z%=mD@`KK6*{H?P3-4X^5*8l!@@B8fd;~)6zH26>Dn;M-+?)U9m8NBSsBlG(`p#35j z79RfeTvxW@evXaVzsBE-%aiZgn&01Z)-?4qznqPVTwO)do^Q9ZKkhvL_WGxY=+C~h z&2;6zU%ejJD`#7E?3{JIidE^WD@M;IDBeDDq*FNQ-5pEAnjh^_#q~UO{*T3uf2e<# zCo{dVHhKBnvOZt4+UmWjEccG)>-4p&`DC&A3MpE zf4y|qv8~r@mJ4>WA6qWYty73SC-G~a+jMcbG+9^t3E!L_1^Axzg+ix`E>f@#{N2$XZjHW z=J!6;FShvhLRmVw^z`G`$9kXFW?lC;QL1kLGb6U}>(;_!GlHYOo!R^7)avB#=iglW zak}N6Zgy-{-?nR0Pd>Y`;WnFL()aqVH}juLNRykvnR60$k9*cX6WkuXJ@4m?|G%Er z>p!1pS^WHby%=Z?;?1tt>bGUeUw*aw_hkO3`-|@P$;%t3o$1*7{pRyp_IuNx?Gq8N zc|6JDeRld0sqA$V@0b7OHFuqVZ*LS+{Lf!UT>GG zc)r(6|Jc0Z#F&bAH>MSCRC2u0rx4wC3on3!z zjm6U`7Ypx}-j7ZDQ~CMX@vry)$IY?)wkGWO$!!%DKPEVT+FWW}|LgK)?U>+iyEdP* z`yHDuY5(`j<=k`S?``*YMd$A|W#f~XkuO^CUH@I*XZ;-p+ioOvm%nAN`TzI(QE&ad zBFb)WZa&-Ly}ta~oasrAdCgB;x6Zk-0W?{4zrOsz*=?3P9zQQXdSY>Z&d&Gm;{Rz` zt+~5U^+TWh|Jy&F?)`pr+U)OVwi{RcnCMyfXrsGp|2*3$-aYmIK5s7kxHQ~tzg@Ij z+$yR6C(ccId%a`({PRrN%KPN(KdqQ%oMs%^@b|BB|1rkj@5TTB-E94Nb65GTmxoWU zDSv5sD=J)V_T%~;$9`)my`5uO{CM{CI6-&Wk4MeGMa*;5>LN_-Lt1)hT*1Mgg)f&* zUwcI+lE?Pz7Q>BCr{(9z8`S>VT=?_pW2xlWFY7*@|9300@agvTS*3Fx`&$^U+x6c7NS=dvSI0+{g#DKc7y2Jn8hhp3DBy zvf1mtev>?(KEFIrrtHPRi<^57SQkI*F7!>lbJ<^d>z&H!<&0a*#rMy=Uw?^H`Ek?w zdhK&If3Li#zqR$W(R%G?C$3$(wyVps&*sgAX}8bY|9ATHU|IAdZg%+_&u&ed=l)fGMR9yeDe4ddNpXC#7-N*V-TUMmbZmw5awJra?-8swW**_(BMd#aQ zv}RYO_slhV+8L2Pw>0UpuX%RqzMSs%&Bx|RKGxf>bS)yex8l>ul^>TL?(3MH_vauN zbG})9_T#jE(bv6Ot)B09jpR6cefPax@2x+iMSI2E=vZ0Z`@@Gv(#Rt1>?~RFy2qDp zRG&Zpq|tnL?a|Qd^-mZrs^c#&vy~OEEsmLEm=-d-(LDP5(fd;3%4PR;+4$wI6wMLW zia|@)H)RgD z=L%Q9-!}6G<=Rl--WBw99oJ?G|_c{_gJM7s+nhT5c~re*Vy_9jEoq zD#y3?$tLandaXOT-*#W>9Hmuhx25Kk-?QBK{~x={`LpKv#lG)*Hr`~t^^0HP0!Q=w zjM9BN$L>@d{%TnG=*S1&cuL!)$E)-fp0cAKmMGvXXE@kRnazvUst}k zm)m?}#m7jS+ZJ)Z|9wus&9mp{j^by>&Tju>@bA;F*B6(1PoHsj$KLn%s*i?6^VjE? ze%SZx)M~@5Gcyg-u6SNtUA}(D%V+;P;(8x%|9mb#|LO%J_hi}Jwc3-qso{w%NZ!eX$K2A@s-;%Z|V!PJ0FLBR*M_>CG7jOUY`{c*W zy~*=gZ!Fcf3EP&v?r+|kU!CPv#N99M?7ZyNzdhq({HK8XON*b2 zuB$%QGqdpS{&@N2bBl_ScZu#l{(aNB>(YYezvoz&zx=cB+BU0w(M)daS+|UnodvNw#(B2=9*6V-YIN4uLwBOdu^8UYt!OQ&)#;;v9nJ}{Yti!IEM+wb~PXnG+F)0z5fXAW>PY|!G|lL8(FxVGj1H^T(2#_dsH zE@)I>iuZ%HVz7v0cq&w}8nk2*l=v7NcCy^dg7py?0`y4McB`J5NuR-CC56U-hBC;o zebxc)dU9M%zI7P3)zdC)iE?EYKLDj66UR%kYggEmkuSO!Wh3=9pkgen+80$E-U zSV1&F1@#0~&{jb`an7WfBkCC#hz=`SIHI1^2&1wi(iq4|HMkw|>OaGdCe;E&t;ucLK6VA@}e~W delta 26141 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