From d242b10d289fa6931eb2b50aa57072ec5fa0f57b Mon Sep 17 00:00:00 2001 From: "Ryan M. Richard" Date: Thu, 26 Feb 2026 16:04:55 -0600 Subject: [PATCH 1/3] shapes support slicing --- .gitignore | 1 + .../design/assets/shape_design_v2.png | Bin 0 -> 263395 bytes docs/source/developer/design/index.rst | 4 + docs/source/developer/design/shape.rst | 612 +---------------- docs/source/developer/design/shapev1.rst | 618 ++++++++++++++++++ include/tensorwrapper/shape/shape_fwd.hpp | 3 + include/tensorwrapper/shape/shape_traits.hpp | 24 +- include/tensorwrapper/shape/smooth.hpp | 33 +- include/tensorwrapper/shape/smooth_common.hpp | 216 ++++++ include/tensorwrapper/shape/smooth_view.hpp | 23 +- .../backends/eigen/eigen_tensor_impl.hpp | 3 +- src/tensorwrapper/shape/smooth_view.cpp | 12 +- .../unit_tests/tensorwrapper/shape/smooth.cpp | 16 - .../tensorwrapper/shape/smooth_common.cpp | 218 ++++++ .../tensorwrapper/shape/smooth_view.cpp | 7 - 15 files changed, 1134 insertions(+), 656 deletions(-) create mode 100644 docs/source/developer/design/assets/shape_design_v2.png create mode 100644 docs/source/developer/design/shapev1.rst create mode 100644 include/tensorwrapper/shape/smooth_common.hpp create mode 100644 tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp diff --git a/.gitignore b/.gitignore index 936f0405..2df4161c 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,7 @@ # These are directories used by IDEs for storing settings .idea/ .vscode/ +.cache/ # These are common Python virtual enviornment directory names venv/ diff --git a/docs/source/developer/design/assets/shape_design_v2.png b/docs/source/developer/design/assets/shape_design_v2.png new file mode 100644 index 0000000000000000000000000000000000000000..d8edb4ce6cadb361595b93855781bbab8da759c0 GIT binary patch literal 263395 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 R*BUXH{{e`AGWh@i literal 0 HcmV?d00001 diff --git a/docs/source/developer/design/index.rst b/docs/source/developer/design/index.rst index 33cda52a..9a27aa72 100644 --- a/docs/source/developer/design/index.rst +++ b/docs/source/developer/design/index.rst @@ -33,3 +33,7 @@ Design of TensorWrapper expression op_graph sparse_maps + +.. toctree:: + :maxdepth: 2 + :caption: Old Designs diff --git a/docs/source/developer/design/shape.rst b/docs/source/developer/design/shape.rst index ef319886..b4d8889c 100644 --- a/docs/source/developer/design/shape.rst +++ b/docs/source/developer/design/shape.rst @@ -153,603 +153,33 @@ Memory allocation. Shape Design ************ -In designing the class hierarchy we note the following: +TODO: Express better. -- An algorithm which works for a jagged shape should work for a smooth shape - as well. The reverse, smooth algorithms with jagged shapes, will in general - not work. -- Nestings are logically imposed over an existing shape. The resulting nested - shape is still an instance of the underlying shape. -- Tiled shapes are a subcategory of jagged shapes. +.. note:: -.. _fig_shape_design: + This is a proposal. It has not been fully implemented yet. -.. figure:: assets/shape.png - :align: center - - The architecture of TensorWrapper's Shape component. - -:numref:`fig_shape_design` shows the classes primarily responsible for -implementing the shape component. Most end users will deal with the ``Shape`` -class. - -ShapeBase -========= - -The unifying features of all shapes were summarized in the -:ref:`shape_rank_and_extents` consideration. ``ShapeBase`` provides the API -that all shapes must minimally satisfy because they are shapes. The actual -class serves primarily as code factorization. - -Shape -===== - -The ``Shape`` class describes a (smooth) hyper-rectangular array of data and -can be used for "traditional" tensors (those which are not nested or jagged). -Most end users will simply create ``Shape`` objects and pass them on to -``TensorWrapper``. We expect that manipulations of ``Shape`` objects will be -aimed at TensorWrapper developers. - -JaggedShape -=========== - -To satisfy the :ref:`shape_jagged` consideration we introduce ``JaggedShape``. -``JaggedShape`` is similar to ``Shape`` except that users must explicitly -provide the shape of the slices. Generally speaking ``JaggedShape`` objects of -rank |r| will contain a series of rank :math:`s` ``Shape`` objects. The -actual ``JaggedShape`` object serves as a map from an index with :math:`(r-s)` -indices to the ``Shape`` of that slice. Like ``Shape`` we expect users to -primarily be concerned with construction. Again, manipulations of the -``JaggedShape`` will be primarily of interest to TensorWrapper developers. - -TiledShape -========== - -Introduced primarily as a convenience for constructing ``JaggedShape`` objects -by tiling. - -Nested -====== - -To address the :ref:`shape_nested` consideration, we have added a ``Nested`` -class which is templated on the type of the tensor's overall shape. - -With objects like ``Shape`` and ``JaggedShape``, TensorWrapper can't tell how -the user is thinking of the tensor. For example, they could be thinking of a -matrix as a matrix or as a vector of vectors. The point of the ``Nested`` -object is to partition the ranks of the tensor into layers, so we know how many -layers the user is viewing the tensor as, and how many ranks each layer has. -Mathematically the various ways of a viewing a tensor do not change the -properties of the tensor; however, when we are physically laying the tensor out -on the computer, how we view the tensor can affect physical layout. - -IndexedShape -============ - -Consideration :ref:`shape_combining_shapes` requires us to be able to compose -the various shape objects. To do this, we rely on the same mechanism used for -``TensorWrapper``, *i.e.*, an expression layer. More specifically, -``IndexedShape`` objects result from indexing a shape like ``s("i,j,k")``. While -``IndexedShape`` is technically exposed to the user, user can be somewhat -oblivious to its existence. - -******************* -Proposed Shape APIs -******************* - -Constructing a ``Shape`` -======================== - -Creating a non-nested shape just requires knowing the extent of each mode: - -.. code-block:: c++ - - Shape null_shape; // No rank and no elements - Shape rank0_shape{}; // A scalar - Shape rank1_shape{10}; // 10 element vector - Shape rank2_shape{10, 20}; // 10 by 20 matrix - Shape rank3_shape{10, 20, 30}; // 10 by 20 by 30 tensor - -Note that following usual C++ rules the first two lines actually call -different constructors (default ctor vs. initializer list). Using an initializer -list requires us to know the rank at compile time. If we want to determine the -rank at runtime we can use iterators: - -.. code-block:: c++ - - // Somehow create a vector of extents - using size_type = Shape::size_type; - std::vector extents = get_extents(); - - // Construct Shape from iterator pair - Shape runtime_rank_shape(extents.begin(), extents.end()); - -Jagged Shape Construction -========================= - -For a ``Shape`` we need to specify the extents of each mode. ``JaggedShape`` -declaration is done in terms of ``Shape`` objects and looks like: - -.. code-block:: c++ - - // For brevity define variables - Shape s10{10}, s20{20}, s30{30}; - Shape s10_20{10, 20}, s30_40{30, 40}, s50_60{50, 60}; - Shape s10_20_30{10, 20, 30}, s40_50_60{40, 50, 60}; - - // No elements, no rank - JaggedShape null_shape; - - // Smooth scalar viewed as a JaggedShape (note () not {}) - JaggedShape smooth0_shape(Shape{}); - - // Smooth vector viewed as a JaggedShape (note () not {}) - JaggedShape smooth1_shape(Shape{10}); - - // Smooth matrix viewed as a JaggedShape (note () not {}) - JaggedShape smooth2_shape(Shape{10, 20}); - - // A "jagged" vector with no elements - JaggedShape rank0_shape{}; - - // A jagged matrix with 1 row, note the {} - JaggedShape rank2_shape{s10}; - - // A jagged matrix with 3 rows; row 0 has 10 elements, row 1 has 20, row 2 30 - JaggedShape rank2_shape2{s10, s20, s30}; - - // A jagged rank 3 tensor with smooth matrices. Matrix 0 is 10 by 20, - // matrix 1 is 30 by 40, and matrix 2 is 50 by 60 - JaggedShape rank3_shape{s10_20, s30_40, s50_60}; - - // A jagged rank 3 tensor where elements are jagged matrices. Matrix 0 is - // 1 by 10, matrix 2 has 20 columns in row 0 and 30 columns in row 2, and - // matrix 3 has 30 columns in row 0, 10 columns in row 1, and 20 columns in - // row 2 - JaggedShape rank3_shape2{{s10}, - {s20, s30}, - {s30, s10, s20}}; - - // A jagged rank 4 tensor where the 0-th element of the 0-th mode is a - // 10 by 20 by 30 smooth tensor and the 1-st element is a 40 by 50 by 60 - // smooth tensor - JaggedShape rank4_shape{s10_20_30, s40_50_60}; - - // A jagged rank 4 tensor where the elements are jagged rank 3 tensors. - // Taking slices along the 0 and 1-st modes, the (0,0)-th slice is a 10 by 20 - // matrix, the (0,1)-th slice is a 30 by 40 matrix, the (1,0)-th slice is - // a 30 by 40 matrix, the (1,1)-th slice is a 10 by 20 matrix, and the - // (1,2)-th slice is a 50 by 60 matrix - JaggedShape rank4_shape2{{s10_20, s30_40}, - {s30_40, s10_20, s50_60}}; - - // A jagged rank 4 tensors where the elements are jagged rank 3 tensors, - // which have jagged matrices for elements. Taking slices along the 0, 1, and - // 2 modes we have: - // - (0,0,0) is a 10 element vector, - // - (0,1,0) is a 20 element vector, - // - (0,1,1) is a 30 element vector, - // - (1,0,0) is a 10 element vector, - // - (1,0,1) is a 30 element vector, - // - (1,1,0) is a 20 element vector, - // - (1,2,0) is a 10 element vector, - // - (1,2,1) is a 20 element vector, - // - (1,2,2) is a 30 element vector - JaggedShape rank4_shape{{{s10}, {s20, s30}}, - {{s10, s30}, {s20}, {s10, s20, s30}}}; - - -Consider the shape of the (0,1) slice of ``rank4_shape``. This slice is a -vector of vectors where the outer vector has two elements, element 0 of the -outer vector is a 10-element vector and element 1 is a 30-element vector. In -other words the shape of the (0,1) slice of ``rank4_shape`` describes a jagged -matrix, which could have been initialized by ``JaggedShape{s20, s30}``. In turn -the above construction of ``rank4_shape`` is actually equivalent to: - -.. code-block:: c++ - - JaggedShape e00{s10}; - JaggedShape e01{s20, s30}; - JaggedShape e10{s10, s30}; - JaggedShape e11{s20}; - JaggedShape e12{s10, s20, s30}; - JaggedShape e0{e00, e01}; - JaggedShape e1{e10, e11, e12}; - JaggedShape rank4_shape{e0, e1}; - -And we see that ``JaggedShape`` is a recursive structure and thus the runtime -mechanism for initializing a ``JaggedShape`` is with iterators running over -``JaggedShape`` objects: - -.. code-block:: c++ - - std::vector slice_shapes = get_slices(); - JaggedShape shape(slice_shapes.begin(), slice_shapes.end()); - -So far we have focused on the most general way to create a ``JaggedShape`` one -of the most common ways to form a ``JaggedShape`` is by tiling. Consider a -30 by 30 matrix where we tile each mode into 5, 15, and 10 element chunks. -Using ``JaggedShape`` this can be done by: - -.. code-block:: c++ - - JaggedShape js{{Shape{5,5}, Shape{5, 15}, Shape{5,10}}, - {Shape{15,5}, Shape{15,15}, Shape{15,10}}, - {Shape{10,5}, Shape{10,15}, Shape{10,10}}}; - -This is an admittedly verbose declaration. Thus for the special case of crating -``JaggedShape`` objects which result from tiling smooth ``Shape`` objects we -introduce the ``TiledShape`` class. Using ``TiledShape`` the same shape could -be declared via: - -.. code-block:: c++ - - TiledShape s{{5, 10, 15}, {5, 10, 15}}; - - -Constructing Nested Shapes -========================== - -Creating a ``Nested`` object requires knowing the shape of the tensor and how -the indices are partitioned into layers. - -.. code-block:: c++ - - // Zero layer scalar - Nested s({}, Shape{}); - - // One layer scalar - Nested s0({0}, Shape{}); - - // Two layer scalar - Nested s0_0({0, 0}, Shape{}); - - // One layer vector - Nested s1({1}, Shape{10}); - - // Two layer vector (mode in layer 0) - Nested s1_0({1, 0}, Shape{10}); - - // Two layer vector (mode in layer 1) - Nested s0_1({0, 1}, Shape{10}); - - // One layer matrix - Nested s1({2}, Shape{10, 20}); - - // Two layer matrix (both modes in layer 0) - Nested s2_0({2, 0}, Shape{10, 20}); - - // Two layer matrix (one mode per layer) - Nested s1_1({1, 1}, Shape{10, 20}); - - // Two layer matrix (both modes in layer 1) - Nested s0_2({0, 2}, Shape{10, 20}); - - // One layer rank 3 - Nested s3({3}, Shape{10, 20, 30}); - - // Two layer rank 3 one mode in layer 0 two in layer 1 - Nested s1_2({1, 2}, Shape{10, 20, 30}); - - // Three layer rank 3, one mode per layer - Nested s1_1_1({1, 1, 1}, Shape{10, 20, 30}); - - // A two-layer shape where modes 0 and 1 are in layer 0 and modes 2 and 3 - // are layer 1 - Nested s({2, 2}, Shape{5, 10, 15, 20}); - -The general syntax for an |n| layer tensor is an |n| element -container where the :math:`i`-th element is the number of ranks in that -layer (ranks from the shape object are assigned to layers left to right; so -permutations may be needed to line up with layering). - -Basic Operations -================ - -All shapes know their total rank and the total number of scalar elements: - -.. code-block:: c++ - - Shape s{10, 20, 30}; - JaggedShape js{s, Shape{10, 20}}; - - // Total rank of the tensor - assert(s.rank() == 3); - assert(js.rank() == 3); - - // Total number of elements in the tensor - assert(s.size() == 6000); // 10 * 20 * 30 = 6000 - assert(js.size() == 6200); // 6000 + (10*20) = 6200; - - -``Nested`` additionally allows you to get this information per layer: - -.. code-block:: c++ - - Nested s1_2({1, 2}, s); - Nested js1_2({1, 2}, js); - - assert(s1_2.n_layers() == 2); - assert(js1_2.n_layers() == 2); - - assert(s1_2.rank_layer(0) == 1); - assert(s1_2.rank_layer(1) == 2); - assert(js1_2.rank_layer(0) == 1); - assert(js1_2.rank_layer(1) == 2); - - assert(s1_2.elements_in_layer(0) == 10); - assert(s1_2.elements_in_layer(1) == 6000); - assert(js1_2.elements_in_layer(0) == 2); - assert(js1_2.elements_in_layer(1) == 6200); +The last design had problems: - // Get the shape of the 0,0-th element (returns a std::variant) - assert(s3_3({0, 0}) == s); +- Passing things around as ``ShapeBase`` involved holding pointers and needing + to downcast them. Pointers are "unnatural". +- There was a lot of code duplication between the view and value objects. +- Developers had to manually synchronize the APIs of views/values, i.e., there + was no check to ensure they interfaces remained equivalent. +- Trying to introduce code factorization became difficult because the value + inherited from ``ShapeBase``, but the views didn't. +- Exposing the actual polymorphic objects meant users had to be careful to not + slice the objects. -Shape Composition -================= +What this design changes: -``Shape`` and ``JaggedShape`` objects are composed similarly (with -``JaggedShape`` objects having many more checks to ensure slices are of -compatible sizes). +- Moves to a "type-erased" architecture. +- Uses CRTP to factor out common APIs. +- Better separation of user-API and performance details. -.. code-block:: c++ +.. _fig_shape_designv2: - Shape s0{10, 20, 30}, s1; - JaggedShape js0{Shape{10}, Shape{20}}, js1; - - // Since addition, subtraction, and element-wise multiplication only work out - // the shape of the result, they often amount to copying the state on the - // right side of the assignment operator (possibly with a permutation) - s1("i,j,k") = s0("i,j,k") + s0("i,j,k"); - assert(s1 == s0); - - js1("i,j") = js0("i,j") + js0("i,j"); - assert(js1 == js0); - - // Permuting modes - s1("j,i,k") = s0("i,j,k") + s0("i,j,k"); - assert(s1 == Shape{20,10,30}); - - js1("j,i") = js0("i,j") + js0("i,j"); - assert(js1 == JaggedShape{Shape{20}, Shape{10}}); - - // Contraction - s1("i,k") = s0("i,j,k") * s0("i,j,k"); - assert(s1 == Shape{10, 30}); - - // js0 is a jagged matrix with 2 rows, contracting over the variable number - // of columns gives a 2 by 2 matrix (represented as jagged matrix even though - // it's smooth) - js1("i,k") = js0("i,j") * js0("k,j"); - assert(js1 == JaggedShape{Shape{2}, Shape{2}}); - - // These would throw since contracted modes aren't the same length - // s1("i,k") = s0("j,i,k") * s0("i,j,k"); - - // js1("i,k") = js0("i,j") * js0("j,k"); - - // Direct product - s1("i,j,k,l") = s0("i,j,k") * s0("i,j,l"); - assert(s1 == Shape{10, 20, 30, 30}); - - js1("i,j,k") = js0("i,j") * js0("i,k"); - assert(js1 == JaggedShape{Shape{10,10}, Shape{20,20}}); - -Combining ``Nested`` objects is conceptually done layer-by-layer. In practice -we just combine the underlying ``T`` objects while preserving the layer -assignments and ensuring layer shapes are compatible: - -.. code-block:: c++ - - Shape s{10, 20, 30}; - Nested s1_2({1, 2}, s), s2_1({2,1}, s), result; - - result("i,j,k") = s1_2("i,j,k") + s1_2("i,j,k"); - assert(result == s1_2); - - // Not allowed because we can't add rank 1 tensors to rank 2 tensors - // result("i,j,k") = s1_2("i,j,k") + s2_1("i,j,k"); - - result("i,j") = s1_2("i,j,k") * s1_2("i,j,k"); - assert(result == Nested({1, 1}, Shape{10, 20})); - - result("j,k") = s1_2("i,j,k") * s1_2("i,j,k"); - assert(result == Nested({0,2}, Shape{20, 30})); - - // Layers only need compatible, not identical, shapes - result("j,k") = s1_2("i,j,k") * s2_1("i,j,k"); - assert(result == Nested({1, 1}, Shape{20, 30})); - - -We note that it's quite likely that scenarios will arise where the user will -want the result to be layered different than the default behavior provides. In -practice re-layering a shape is a trivial operation (swapping two small -vectors of integers). - -Slicing and Chipping -===================== - -Slices of a shape have the same rank, chips have different ranks: - -.. code-block:: c++ - - Shape s{10, 20}; - - // Get the shape of row 0 as a matrix - auto s0 = s.slice(0); - assert(s0 == Shape{1, 20}); - - // Get the shape of column 0 as a matrix - auto sx0 = s.slice({0, 0}, {10, 1}); - assert(sx0 == Shape{10, 1}); - - // Get the shape of the first five columns of the first five rows... - auto s05_05 = s.slice({0,0}, {5,5}); - assert(s05_05 == Shape{5, 5}); - - // Note that this shape still refers to a rank 2 tensor even though the - // first mode has a single element - auto s01_05 = s.slice({0, 0}, {1, 5}); - assert(s01_05 == Shape{1, 5}); - - // Get the shape of row 2 as a vector - auto s2 = s.chip(2); - assert(s2 == Shape{20}); - - // Get the shape of column 2 as a vector - auto sx2 = s.chip({0, 2}, {10, 3}); - assert(sx2 == Shape{10}); - -For a rank |r| tensor, the general overload of ``slice`` and ``chip`` takes -two |r|-element vectors. The first vector is the first element in the -slice/chip and the second vector is the first element not in the slice/chip. -For convenience we also provide an overload where the user may provide up to -|r| integers. This overload pins the :math:`i`-th mode to the :math:`i`-th -integer all other modes run their entire span. - -Slicing and chipping ``JaggedShape`` objects is largely the same: - -.. code-block:: c++ - - JaggedShape js0{Shape{10}, Shape{20}}; - - auto j0 = js0.chip(0); - assert(j0 == JaggedShape{Shape10}); - - auto j1 = js0.slice(0); - assert(j1 == JaggedShape({Shape{10}}); - -Because chipping selects a single element per mode per layer, chipping a -``Nested`` object is fairly straightforward: - -.. code-block:: c++ - - Nested s2_2({2, 2}, Shape{2, 2, 10, 10}); - assert(s2_2.chip(0) == Nested({1, 2}, Shape{2, 10, 10})); - assert(s2_2.chip(1,2) == Shape{10, 10}); - assert(s2_2.chip(1,2,3) == Shape{10});e - assert(s2_2.chip(1,2,3,4) == Shape{}); - -Taking arbitrary slices of a ``Nested`` object is significantly more -complicated on account of the fact that slice requests for any of the inner -layers will in general be slicing multiple tensors simultaneously. For example -consider ``s2_2`` from the previous code snippet. Slicing layer 0 is -straightforward, asking for say ``{1,0}, {2,2}`` selects row 1 of the outer -matrix. Generalizing, something like ``{1,0,5,5}, {2,2,10,10}`` would grab -row 1 of layer 0, and rows 5 through 9 (inclusive) for each inner matrix. What -if we wanted the first 5 rows of outer element ``{1,0}`` and the last 3 rows -of outer element ``{1,1}``? This request requires more than just a block range, -it requires a ``JaggedShape``. The above request can be requested by: - -.. code-block:: c++ - - // The shape resulting from taking the first 5 rows of a 10 by 10 matrix - Shape e10({5,10}, {0,0}); - // The shape resulting from taking the last 5 rows from a 10 by 10 matrix - Shape e11({3,10}, {7,0}); - // A 1 row matrix with 2 columns whose elements are a 5 by 10 and a - // 3 by 10 matrix, the origin of the outer tensor is {1,0} - JaggedShape slice({{e10, e11}}, {1,0}); - - auto requested_slice = s2_2.slice(slice); - - assert(requested_slice == slice); - -As this also shows, requesting such slices also completely negates the point of -the ``slice`` member because the input is the result. As a result, we have not -designed such an API. Instead the slicing APIs for a ``Nested`` object are: - -.. code-block:: c++ - - Nested s2_2({2, 2}, Shape{2, 2, 10, 10}); - Shape s01({1, 1, 10, 10}, {0, 1, 0, 0}); - - // Grabs the 0,1 element of the outer matrix preserving the rank - assert(s2_2.slice(0, 1) == Nested({2, 2}, s01)); - - // Grabs the bottom row of the outer matrix, and the bottom 5 rows of - // the inner matrices - Nested s1050({1, 2, 5, 5}, {1, 0, 5, 0}); - s2_2.slice({1, 0, 5, 0}, {2, 2, 10, 10}); - - -Ultimately, bear in mind, chipping and slicing are little more than convenience -functions for working out the shapes resulting from slicing/chipping the tensor; -for complicated selections it should always be possible to build the resulting -shape manually. - -Iterating -========= - -By default the origin of a freshly constructed shape is the zero vector. For -slices and chips, the origin is the first element in the slice or chip (note -that in the previous section we conveniently chose our slices/chips so the -origin was the zero vector). By default, when iterating over a shape indices are -returned as offsets from the origin, in lexicographical order. For example: - -.. code-block:: c++ - - auto print_shape = [](auto&& s){ - for(const auto& index : s) - std::cout << "{" << index[0] << "," << index[1] << "} "; - }; - - Shape s{2, 3}; - print_shape(s); // prints {0,0} {0,1} {0,2} {1,0} {1,1} {1,2} - - auto s01_13 = s.slice({0, 1}, {1, 3}); - print_shape(s01_13); // prints {0,1}, {0,2} NOT {0,0} {0,1} - - // If we wanted {0,0} {0,1} - print_shape(s01_13.offsets()); - - // We can move the origin - s.set_origin({10, 10}); - print_shape(s); // prints {10,10} {10,11} {10,12} {11,10} {11,11} {11,12} - -For completeness we define overloads of ``Shape`` and ``JaggedShape`` which -also take an origin. For ``JaggedShape`` the origin needs to be specified for -the internal shapes and the explicitly unrolled ranks. - -.. code-block:: c++ - - // Makes a shape for a 2 by 3 matrix whose first element is {10, 10} - Shape s({2, 3}, {10, 10}); - - // Outer vector starts at 10, element 11 of the outer vector starts at 5, - // element 12 of the outer vector starts at 6 - JaggedShape js({{Shape({10}, {5}), Shape({20}, {6})}, {10}); - - // Outer vector starts at 10, inner vectors start at 10. - Nested s1_1({1, 1}, s); - -******* -Summary -******* - -The design of the shape component satisfies the considerations raised above -by: - -:ref:`shape_rank_and_extents` - The ``ShapeBase`` class will provide a common API for getting/setting basic - information and performing common operations. - -:ref:`shape_nested` - The ``Nested`` class tracks how the modes of a tensor are layered. - -:ref:`shape_jagged` - The ``JaggedShape`` class is used to represent jagged shapes. - -:ref:`shape_combining_shapes` - The ``IndexedShape`` class allows us to easily compose shapes. - -:ref:`shape_iterable` - The various classes define iterators which allow users to iterate over the - indices contained in the shape. - -**************** -Additional Notes -**************** +.. figure:: assets/shape_design_v2.png + :align: center -- Slicing and chipping assume contiguous sub-tensors. For grabbing noncontiguous - sub-blocks and using them as if they were contiguous, one needs a mask. + The architecture of TensorWrapper's Shape component. diff --git a/docs/source/developer/design/shapev1.rst b/docs/source/developer/design/shapev1.rst new file mode 100644 index 00000000..1decc24a --- /dev/null +++ b/docs/source/developer/design/shapev1.rst @@ -0,0 +1,618 @@ +.. Copyright 2026 NWChemEx-Project +.. +.. Licensed under the Apache License, Version 2.0 (the "License"); +.. you may not use this file except in compliance with the License. +.. You may obtain a copy of the License at +.. +.. http://www.apache.org/licenses/LICENSE-2.0 +.. +.. Unless required by applicable law or agreed to in writing, software +.. distributed under the License is distributed on an "AS IS" BASIS, +.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +.. See the License for the specific language governing permissions and +.. limitations under the License. + +############### +Shape V1 Design +############### + +In designing the class hierarchy we note the following: + +- An algorithm which works for a jagged shape should work for a smooth shape + as well. The reverse, smooth algorithms with jagged shapes, will in general + not work. +- Nestings are logically imposed over an existing shape. The resulting nested + shape is still an instance of the underlying shape. +- Tiled shapes are a subcategory of jagged shapes. + +.. _fig_shape_design: + +.. figure:: assets/shape.png + :align: center + + The architecture of TensorWrapper's Shape component. + +:numref:`fig_shape_design` shows the classes primarily responsible for +implementing the shape component. Most end users will deal with the ``Shape`` +class. + +ShapeBase +========= + +The unifying features of all shapes were summarized in the +:ref:`shape_rank_and_extents` consideration. ``ShapeBase`` provides the API +that all shapes must minimally satisfy because they are shapes. The actual +class serves primarily as code factorization. + +Shape +===== + +The ``Shape`` class describes a (smooth) hyper-rectangular array of data and +can be used for "traditional" tensors (those which are not nested or jagged). +Most end users will simply create ``Shape`` objects and pass them on to +``TensorWrapper``. We expect that manipulations of ``Shape`` objects will be +aimed at TensorWrapper developers. + +JaggedShape +=========== + +To satisfy the :ref:`shape_jagged` consideration we introduce ``JaggedShape``. +``JaggedShape`` is similar to ``Shape`` except that users must explicitly +provide the shape of the slices. Generally speaking ``JaggedShape`` objects of +rank |r| will contain a series of rank :math:`s` ``Shape`` objects. The +actual ``JaggedShape`` object serves as a map from an index with :math:`(r-s)` +indices to the ``Shape`` of that slice. Like ``Shape`` we expect users to +primarily be concerned with construction. Again, manipulations of the +``JaggedShape`` will be primarily of interest to TensorWrapper developers. + +TiledShape +========== + +Introduced primarily as a convenience for constructing ``JaggedShape`` objects +by tiling. + +Nested +====== + +To address the :ref:`shape_nested` consideration, we have added a ``Nested`` +class which is templated on the type of the tensor's overall shape. + +With objects like ``Shape`` and ``JaggedShape``, TensorWrapper can't tell how +the user is thinking of the tensor. For example, they could be thinking of a +matrix as a matrix or as a vector of vectors. The point of the ``Nested`` +object is to partition the ranks of the tensor into layers, so we know how many +layers the user is viewing the tensor as, and how many ranks each layer has. +Mathematically the various ways of a viewing a tensor do not change the +properties of the tensor; however, when we are physically laying the tensor out +on the computer, how we view the tensor can affect physical layout. + +IndexedShape +============ + +Consideration :ref:`shape_combining_shapes` requires us to be able to compose +the various shape objects. To do this, we rely on the same mechanism used for +``TensorWrapper``, *i.e.*, an expression layer. More specifically, +``IndexedShape`` objects result from indexing a shape like ``s("i,j,k")``. While +``IndexedShape`` is technically exposed to the user, user can be somewhat +oblivious to its existence. + +******************* +Proposed Shape APIs +******************* + +Constructing a ``Shape`` +======================== + +Creating a non-nested shape just requires knowing the extent of each mode: + +.. code-block:: c++ + + Shape null_shape; // No rank and no elements + Shape rank0_shape{}; // A scalar + Shape rank1_shape{10}; // 10 element vector + Shape rank2_shape{10, 20}; // 10 by 20 matrix + Shape rank3_shape{10, 20, 30}; // 10 by 20 by 30 tensor + +Note that following usual C++ rules the first two lines actually call +different constructors (default ctor vs. initializer list). Using an initializer +list requires us to know the rank at compile time. If we want to determine the +rank at runtime we can use iterators: + +.. code-block:: c++ + + // Somehow create a vector of extents + using size_type = Shape::size_type; + std::vector extents = get_extents(); + + // Construct Shape from iterator pair + Shape runtime_rank_shape(extents.begin(), extents.end()); + +Jagged Shape Construction +========================= + +For a ``Shape`` we need to specify the extents of each mode. ``JaggedShape`` +declaration is done in terms of ``Shape`` objects and looks like: + +.. code-block:: c++ + + // For brevity define variables + Shape s10{10}, s20{20}, s30{30}; + Shape s10_20{10, 20}, s30_40{30, 40}, s50_60{50, 60}; + Shape s10_20_30{10, 20, 30}, s40_50_60{40, 50, 60}; + + // No elements, no rank + JaggedShape null_shape; + + // Smooth scalar viewed as a JaggedShape (note () not {}) + JaggedShape smooth0_shape(Shape{}); + + // Smooth vector viewed as a JaggedShape (note () not {}) + JaggedShape smooth1_shape(Shape{10}); + + // Smooth matrix viewed as a JaggedShape (note () not {}) + JaggedShape smooth2_shape(Shape{10, 20}); + + // A "jagged" vector with no elements + JaggedShape rank0_shape{}; + + // A jagged matrix with 1 row, note the {} + JaggedShape rank2_shape{s10}; + + // A jagged matrix with 3 rows; row 0 has 10 elements, row 1 has 20, row 2 30 + JaggedShape rank2_shape2{s10, s20, s30}; + + // A jagged rank 3 tensor with smooth matrices. Matrix 0 is 10 by 20, + // matrix 1 is 30 by 40, and matrix 2 is 50 by 60 + JaggedShape rank3_shape{s10_20, s30_40, s50_60}; + + // A jagged rank 3 tensor where elements are jagged matrices. Matrix 0 is + // 1 by 10, matrix 2 has 20 columns in row 0 and 30 columns in row 2, and + // matrix 3 has 30 columns in row 0, 10 columns in row 1, and 20 columns in + // row 2 + JaggedShape rank3_shape2{{s10}, + {s20, s30}, + {s30, s10, s20}}; + + // A jagged rank 4 tensor where the 0-th element of the 0-th mode is a + // 10 by 20 by 30 smooth tensor and the 1-st element is a 40 by 50 by 60 + // smooth tensor + JaggedShape rank4_shape{s10_20_30, s40_50_60}; + + // A jagged rank 4 tensor where the elements are jagged rank 3 tensors. + // Taking slices along the 0 and 1-st modes, the (0,0)-th slice is a 10 by 20 + // matrix, the (0,1)-th slice is a 30 by 40 matrix, the (1,0)-th slice is + // a 30 by 40 matrix, the (1,1)-th slice is a 10 by 20 matrix, and the + // (1,2)-th slice is a 50 by 60 matrix + JaggedShape rank4_shape2{{s10_20, s30_40}, + {s30_40, s10_20, s50_60}}; + + // A jagged rank 4 tensors where the elements are jagged rank 3 tensors, + // which have jagged matrices for elements. Taking slices along the 0, 1, and + // 2 modes we have: + // - (0,0,0) is a 10 element vector, + // - (0,1,0) is a 20 element vector, + // - (0,1,1) is a 30 element vector, + // - (1,0,0) is a 10 element vector, + // - (1,0,1) is a 30 element vector, + // - (1,1,0) is a 20 element vector, + // - (1,2,0) is a 10 element vector, + // - (1,2,1) is a 20 element vector, + // - (1,2,2) is a 30 element vector + JaggedShape rank4_shape{{{s10}, {s20, s30}}, + {{s10, s30}, {s20}, {s10, s20, s30}}}; + + +Consider the shape of the (0,1) slice of ``rank4_shape``. This slice is a +vector of vectors where the outer vector has two elements, element 0 of the +outer vector is a 10-element vector and element 1 is a 30-element vector. In +other words the shape of the (0,1) slice of ``rank4_shape`` describes a jagged +matrix, which could have been initialized by ``JaggedShape{s20, s30}``. In turn +the above construction of ``rank4_shape`` is actually equivalent to: + +.. code-block:: c++ + + JaggedShape e00{s10}; + JaggedShape e01{s20, s30}; + JaggedShape e10{s10, s30}; + JaggedShape e11{s20}; + JaggedShape e12{s10, s20, s30}; + JaggedShape e0{e00, e01}; + JaggedShape e1{e10, e11, e12}; + JaggedShape rank4_shape{e0, e1}; + +And we see that ``JaggedShape`` is a recursive structure and thus the runtime +mechanism for initializing a ``JaggedShape`` is with iterators running over +``JaggedShape`` objects: + +.. code-block:: c++ + + std::vector slice_shapes = get_slices(); + JaggedShape shape(slice_shapes.begin(), slice_shapes.end()); + +So far we have focused on the most general way to create a ``JaggedShape`` one +of the most common ways to form a ``JaggedShape`` is by tiling. Consider a +30 by 30 matrix where we tile each mode into 5, 15, and 10 element chunks. +Using ``JaggedShape`` this can be done by: + +.. code-block:: c++ + + JaggedShape js{{Shape{5,5}, Shape{5, 15}, Shape{5,10}}, + {Shape{15,5}, Shape{15,15}, Shape{15,10}}, + {Shape{10,5}, Shape{10,15}, Shape{10,10}}}; + +This is an admittedly verbose declaration. Thus for the special case of crating +``JaggedShape`` objects which result from tiling smooth ``Shape`` objects we +introduce the ``TiledShape`` class. Using ``TiledShape`` the same shape could +be declared via: + +.. code-block:: c++ + + TiledShape s{{5, 10, 15}, {5, 10, 15}}; + + +Constructing Nested Shapes +========================== + +Creating a ``Nested`` object requires knowing the shape of the tensor and how +the indices are partitioned into layers. + +.. code-block:: c++ + + // Zero layer scalar + Nested s({}, Shape{}); + + // One layer scalar + Nested s0({0}, Shape{}); + + // Two layer scalar + Nested s0_0({0, 0}, Shape{}); + + // One layer vector + Nested s1({1}, Shape{10}); + + // Two layer vector (mode in layer 0) + Nested s1_0({1, 0}, Shape{10}); + + // Two layer vector (mode in layer 1) + Nested s0_1({0, 1}, Shape{10}); + + // One layer matrix + Nested s1({2}, Shape{10, 20}); + + // Two layer matrix (both modes in layer 0) + Nested s2_0({2, 0}, Shape{10, 20}); + + // Two layer matrix (one mode per layer) + Nested s1_1({1, 1}, Shape{10, 20}); + + // Two layer matrix (both modes in layer 1) + Nested s0_2({0, 2}, Shape{10, 20}); + + // One layer rank 3 + Nested s3({3}, Shape{10, 20, 30}); + + // Two layer rank 3 one mode in layer 0 two in layer 1 + Nested s1_2({1, 2}, Shape{10, 20, 30}); + + // Three layer rank 3, one mode per layer + Nested s1_1_1({1, 1, 1}, Shape{10, 20, 30}); + + // A two-layer shape where modes 0 and 1 are in layer 0 and modes 2 and 3 + // are layer 1 + Nested s({2, 2}, Shape{5, 10, 15, 20}); + +The general syntax for an |n| layer tensor is an |n| element +container where the :math:`i`-th element is the number of ranks in that +layer (ranks from the shape object are assigned to layers left to right; so +permutations may be needed to line up with layering). + +Basic Operations +================ + +All shapes know their total rank and the total number of scalar elements: + +.. code-block:: c++ + + Shape s{10, 20, 30}; + JaggedShape js{s, Shape{10, 20}}; + + // Total rank of the tensor + assert(s.rank() == 3); + assert(js.rank() == 3); + + // Total number of elements in the tensor + assert(s.size() == 6000); // 10 * 20 * 30 = 6000 + assert(js.size() == 6200); // 6000 + (10*20) = 6200; + + +``Nested`` additionally allows you to get this information per layer: + +.. code-block:: c++ + + Nested s1_2({1, 2}, s); + Nested js1_2({1, 2}, js); + + assert(s1_2.n_layers() == 2); + assert(js1_2.n_layers() == 2); + + assert(s1_2.rank_layer(0) == 1); + assert(s1_2.rank_layer(1) == 2); + assert(js1_2.rank_layer(0) == 1); + assert(js1_2.rank_layer(1) == 2); + + assert(s1_2.elements_in_layer(0) == 10); + assert(s1_2.elements_in_layer(1) == 6000); + assert(js1_2.elements_in_layer(0) == 2); + assert(js1_2.elements_in_layer(1) == 6200); + + // Get the shape of the 0,0-th element (returns a std::variant) + assert(s3_3({0, 0}) == s); + +Shape Composition +================= + +``Shape`` and ``JaggedShape`` objects are composed similarly (with +``JaggedShape`` objects having many more checks to ensure slices are of +compatible sizes). + +.. code-block:: c++ + + Shape s0{10, 20, 30}, s1; + JaggedShape js0{Shape{10}, Shape{20}}, js1; + + // Since addition, subtraction, and element-wise multiplication only work out + // the shape of the result, they often amount to copying the state on the + // right side of the assignment operator (possibly with a permutation) + s1("i,j,k") = s0("i,j,k") + s0("i,j,k"); + assert(s1 == s0); + + js1("i,j") = js0("i,j") + js0("i,j"); + assert(js1 == js0); + + // Permuting modes + s1("j,i,k") = s0("i,j,k") + s0("i,j,k"); + assert(s1 == Shape{20,10,30}); + + js1("j,i") = js0("i,j") + js0("i,j"); + assert(js1 == JaggedShape{Shape{20}, Shape{10}}); + + // Contraction + s1("i,k") = s0("i,j,k") * s0("i,j,k"); + assert(s1 == Shape{10, 30}); + + // js0 is a jagged matrix with 2 rows, contracting over the variable number + // of columns gives a 2 by 2 matrix (represented as jagged matrix even though + // it's smooth) + js1("i,k") = js0("i,j") * js0("k,j"); + assert(js1 == JaggedShape{Shape{2}, Shape{2}}); + + // These would throw since contracted modes aren't the same length + // s1("i,k") = s0("j,i,k") * s0("i,j,k"); + + // js1("i,k") = js0("i,j") * js0("j,k"); + + // Direct product + s1("i,j,k,l") = s0("i,j,k") * s0("i,j,l"); + assert(s1 == Shape{10, 20, 30, 30}); + + js1("i,j,k") = js0("i,j") * js0("i,k"); + assert(js1 == JaggedShape{Shape{10,10}, Shape{20,20}}); + +Combining ``Nested`` objects is conceptually done layer-by-layer. In practice +we just combine the underlying ``T`` objects while preserving the layer +assignments and ensuring layer shapes are compatible: + +.. code-block:: c++ + + Shape s{10, 20, 30}; + Nested s1_2({1, 2}, s), s2_1({2,1}, s), result; + + result("i,j,k") = s1_2("i,j,k") + s1_2("i,j,k"); + assert(result == s1_2); + + // Not allowed because we can't add rank 1 tensors to rank 2 tensors + // result("i,j,k") = s1_2("i,j,k") + s2_1("i,j,k"); + + result("i,j") = s1_2("i,j,k") * s1_2("i,j,k"); + assert(result == Nested({1, 1}, Shape{10, 20})); + + result("j,k") = s1_2("i,j,k") * s1_2("i,j,k"); + assert(result == Nested({0,2}, Shape{20, 30})); + + // Layers only need compatible, not identical, shapes + result("j,k") = s1_2("i,j,k") * s2_1("i,j,k"); + assert(result == Nested({1, 1}, Shape{20, 30})); + + +We note that it's quite likely that scenarios will arise where the user will +want the result to be layered different than the default behavior provides. In +practice re-layering a shape is a trivial operation (swapping two small +vectors of integers). + +Slicing and Chipping +===================== + +Slices of a shape have the same rank, chips have different ranks: + +.. code-block:: c++ + + Shape s{10, 20}; + + // Get the shape of row 0 as a matrix + auto s0 = s.slice(0); + assert(s0 == Shape{1, 20}); + + // Get the shape of column 0 as a matrix + auto sx0 = s.slice({0, 0}, {10, 1}); + assert(sx0 == Shape{10, 1}); + + // Get the shape of the first five columns of the first five rows... + auto s05_05 = s.slice({0,0}, {5,5}); + assert(s05_05 == Shape{5, 5}); + + // Note that this shape still refers to a rank 2 tensor even though the + // first mode has a single element + auto s01_05 = s.slice({0, 0}, {1, 5}); + assert(s01_05 == Shape{1, 5}); + + // Get the shape of row 2 as a vector + auto s2 = s.chip(2); + assert(s2 == Shape{20}); + + // Get the shape of column 2 as a vector + auto sx2 = s.chip({0, 2}, {10, 3}); + assert(sx2 == Shape{10}); + +For a rank |r| tensor, the general overload of ``slice`` and ``chip`` takes +two |r|-element vectors. The first vector is the first element in the +slice/chip and the second vector is the first element not in the slice/chip. +For convenience we also provide an overload where the user may provide up to +|r| integers. This overload pins the :math:`i`-th mode to the :math:`i`-th +integer all other modes run their entire span. + +Slicing and chipping ``JaggedShape`` objects is largely the same: + +.. code-block:: c++ + + JaggedShape js0{Shape{10}, Shape{20}}; + + auto j0 = js0.chip(0); + assert(j0 == JaggedShape{Shape10}); + + auto j1 = js0.slice(0); + assert(j1 == JaggedShape({Shape{10}}); + +Because chipping selects a single element per mode per layer, chipping a +``Nested`` object is fairly straightforward: + +.. code-block:: c++ + + Nested s2_2({2, 2}, Shape{2, 2, 10, 10}); + assert(s2_2.chip(0) == Nested({1, 2}, Shape{2, 10, 10})); + assert(s2_2.chip(1,2) == Shape{10, 10}); + assert(s2_2.chip(1,2,3) == Shape{10});e + assert(s2_2.chip(1,2,3,4) == Shape{}); + +Taking arbitrary slices of a ``Nested`` object is significantly more +complicated on account of the fact that slice requests for any of the inner +layers will in general be slicing multiple tensors simultaneously. For example +consider ``s2_2`` from the previous code snippet. Slicing layer 0 is +straightforward, asking for say ``{1,0}, {2,2}`` selects row 1 of the outer +matrix. Generalizing, something like ``{1,0,5,5}, {2,2,10,10}`` would grab +row 1 of layer 0, and rows 5 through 9 (inclusive) for each inner matrix. What +if we wanted the first 5 rows of outer element ``{1,0}`` and the last 3 rows +of outer element ``{1,1}``? This request requires more than just a block range, +it requires a ``JaggedShape``. The above request can be requested by: + +.. code-block:: c++ + + // The shape resulting from taking the first 5 rows of a 10 by 10 matrix + Shape e10({5,10}, {0,0}); + // The shape resulting from taking the last 5 rows from a 10 by 10 matrix + Shape e11({3,10}, {7,0}); + // A 1 row matrix with 2 columns whose elements are a 5 by 10 and a + // 3 by 10 matrix, the origin of the outer tensor is {1,0} + JaggedShape slice({{e10, e11}}, {1,0}); + + auto requested_slice = s2_2.slice(slice); + + assert(requested_slice == slice); + +As this also shows, requesting such slices also completely negates the point of +the ``slice`` member because the input is the result. As a result, we have not +designed such an API. Instead the slicing APIs for a ``Nested`` object are: + +.. code-block:: c++ + + Nested s2_2({2, 2}, Shape{2, 2, 10, 10}); + Shape s01({1, 1, 10, 10}, {0, 1, 0, 0}); + + // Grabs the 0,1 element of the outer matrix preserving the rank + assert(s2_2.slice(0, 1) == Nested({2, 2}, s01)); + + // Grabs the bottom row of the outer matrix, and the bottom 5 rows of + // the inner matrices + Nested s1050({1, 2, 5, 5}, {1, 0, 5, 0}); + s2_2.slice({1, 0, 5, 0}, {2, 2, 10, 10}); + + +Ultimately, bear in mind, chipping and slicing are little more than convenience +functions for working out the shapes resulting from slicing/chipping the tensor; +for complicated selections it should always be possible to build the resulting +shape manually. + +Iterating +========= + +By default the origin of a freshly constructed shape is the zero vector. For +slices and chips, the origin is the first element in the slice or chip (note +that in the previous section we conveniently chose our slices/chips so the +origin was the zero vector). By default, when iterating over a shape indices are +returned as offsets from the origin, in lexicographical order. For example: + +.. code-block:: c++ + + auto print_shape = [](auto&& s){ + for(const auto& index : s) + std::cout << "{" << index[0] << "," << index[1] << "} "; + }; + + Shape s{2, 3}; + print_shape(s); // prints {0,0} {0,1} {0,2} {1,0} {1,1} {1,2} + + auto s01_13 = s.slice({0, 1}, {1, 3}); + print_shape(s01_13); // prints {0,1}, {0,2} NOT {0,0} {0,1} + + // If we wanted {0,0} {0,1} + print_shape(s01_13.offsets()); + + // We can move the origin + s.set_origin({10, 10}); + print_shape(s); // prints {10,10} {10,11} {10,12} {11,10} {11,11} {11,12} + +For completeness we define overloads of ``Shape`` and ``JaggedShape`` which +also take an origin. For ``JaggedShape`` the origin needs to be specified for +the internal shapes and the explicitly unrolled ranks. + +.. code-block:: c++ + + // Makes a shape for a 2 by 3 matrix whose first element is {10, 10} + Shape s({2, 3}, {10, 10}); + + // Outer vector starts at 10, element 11 of the outer vector starts at 5, + // element 12 of the outer vector starts at 6 + JaggedShape js({{Shape({10}, {5}), Shape({20}, {6})}, {10}); + + // Outer vector starts at 10, inner vectors start at 10. + Nested s1_1({1, 1}, s); + +******* +Summary +******* + +The design of the shape component satisfies the considerations raised above +by: + +:ref:`shape_rank_and_extents` + The ``ShapeBase`` class will provide a common API for getting/setting basic + information and performing common operations. + +:ref:`shape_nested` + The ``Nested`` class tracks how the modes of a tensor are layered. + +:ref:`shape_jagged` + The ``JaggedShape`` class is used to represent jagged shapes. + +:ref:`shape_combining_shapes` + The ``IndexedShape`` class allows us to easily compose shapes. + +:ref:`shape_iterable` + The various classes define iterators which allow users to iterate over the + indices contained in the shape. + +**************** +Additional Notes +**************** + +- Slicing and chipping assume contiguous sub-tensors. For grabbing noncontiguous + sub-blocks and using them as if they were contiguous, one needs a mask. diff --git a/include/tensorwrapper/shape/shape_fwd.hpp b/include/tensorwrapper/shape/shape_fwd.hpp index cbb852f5..9486d42e 100644 --- a/include/tensorwrapper/shape/shape_fwd.hpp +++ b/include/tensorwrapper/shape/shape_fwd.hpp @@ -26,6 +26,9 @@ class SmoothViewPIMPL; class ShapeBase; +template +class SmoothCommon; + class Smooth; template diff --git a/include/tensorwrapper/shape/shape_traits.hpp b/include/tensorwrapper/shape/shape_traits.hpp index 000f753a..ff5879bd 100644 --- a/include/tensorwrapper/shape/shape_traits.hpp +++ b/include/tensorwrapper/shape/shape_traits.hpp @@ -39,28 +39,38 @@ struct ShapeTraits { using size_type = std::size_t; }; -template<> -struct ShapeTraits : public ShapeTraits { - using value_type = Smooth; +template +struct ShapeTraits> : public ShapeTraits { + using value_type = Derived; using const_value_type = const value_type; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type*; using const_pointer = const value_type*; + using slice_type = Derived; }; -template<> -struct ShapeTraits : public ShapeTraits { - using value_type = Smooth; +template +struct ShapeTraits> + : public ShapeTraits { + using value_type = Derived; using const_value_type = const value_type; using reference = const value_type&; using const_reference = const value_type&; using pointer = const value_type*; using const_pointer = const value_type*; + using slice_type = Derived; }; +template<> +struct ShapeTraits : public ShapeTraits> {}; + +template<> +struct ShapeTraits + : public ShapeTraits> {}; + template -struct ShapeTraits> { +struct ShapeTraits> : public ShapeTraits> { using smooth_traits = ShapeTraits; using pimpl_type = detail_::SmoothViewPIMPL; using const_pimpl_type = diff --git a/include/tensorwrapper/shape/smooth.hpp b/include/tensorwrapper/shape/smooth.hpp index fd6cc86e..d915e278 100644 --- a/include/tensorwrapper/shape/smooth.hpp +++ b/include/tensorwrapper/shape/smooth.hpp @@ -17,6 +17,8 @@ #pragma once #include #include +#include +#include #include #include @@ -29,7 +31,11 @@ namespace tensorwrapper::shape { * geometric dimension of the (hyper-)rectangle and the number of elements in * the array. */ -class Smooth : public ShapeBase { +class Smooth : public ShapeBase, public SmoothCommon { +private: + using my_type = Smooth; + using common_base = SmoothCommon; + public: // Pull in base class's types using ShapeBase::rank_type; @@ -39,6 +45,15 @@ class Smooth : public ShapeBase { // -- Ctors, assignment, and dtor // ------------------------------------------------------------------------- + /** @brief Creates a shape for a null tensor. + * + * A null tensor is a tensor that contains zero elements. Thus a null + * tensor is not the same as scalar tensor (which contains 1 element). To + * create a scalar tensor use ``Smooth scalar{};`` (i.e., the initializer + * list ctor). + * + * @throw None No throw guarantee. + */ Smooth() noexcept = default; /** @brief Constructs *this with a statically specified number of extents. @@ -87,18 +102,6 @@ class Smooth : public ShapeBase { // -- Accessor methods // ------------------------------------------------------------------------- - /** @brief Returns the extent of the @p i -th mode. - * - * @param[in] i The mode the user wants the extent of. @p i must be in the - * range [0, rank()). - * - * @return The extent of the requested mode. - * - * @throw std::out_of_range if @p i is not in the range [0, range()). - * Strong throw guarantee. - */ - rank_type extent(size_type i) const { return m_extents_.at(i); } - // ------------------------------------------------------------------------- // -- Utility methods // ------------------------------------------------------------------------- @@ -152,6 +155,10 @@ class Smooth : public ShapeBase { } protected: + friend common_base; + + size_type extent_impl(rank_type i) const { return m_extents_.at(i); } + /// Implement clone() by calling copy ctor base_pointer clone_() const override { return std::make_unique(*this); diff --git a/include/tensorwrapper/shape/smooth_common.hpp b/include/tensorwrapper/shape/smooth_common.hpp new file mode 100644 index 00000000..a8d38fbb --- /dev/null +++ b/include/tensorwrapper/shape/smooth_common.hpp @@ -0,0 +1,216 @@ +/* + * Copyright 2026 NWChemEx-Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once +#include +#include +#include + +namespace tensorwrapper::shape { + +/** @brief Code factorization for Smooth/SmoothView. + * + * @tparam Derived The class *this is implementing. Expected to be unqualified + * Smooth or SmoothView. + * + * To use this class the derived class must define: + * - `size_type extent(rank_type i) const` so that it returns the extent of + * mode i. + */ +template +class SmoothCommon { +private: + using traits_type = ShapeTraits; + +public: + using rank_type = typename traits_type::rank_type; + using size_type = typename traits_type::size_type; + using slice_type = typename traits_type::slice_type; + using slice_il_type = std::initializer_list; + + /** @brief Returns the extent of the @p i -th mode. + * + * @param[in] i The mode the user wants the extent of. @p i must be in the + * range [0, rank()). + * + * @return The extent of the requested mode. + * + * @throw std::out_of_range if @p i is not in the range [0, range()). + * Strong throw guarantee. + */ + decltype(auto) extent(rank_type i) const { + return derived().extent_impl(i); + } + + /** @brief Slices a shape given two initializer lists. + * + * C++ doesn't allow templates to work with initializer lists, therefore + * we must provide a special overload for when the input containers are + * initializer lists. This method simply dispatches to the range-based + * method by calling begin()/end() on each initializer list. See the + * description of that method for more details. + * + * @param[in] first_elem An initializer list containing the offsets of + * the first element IN the slice such that + * `first_elem[i]` is the offset along mode i. + * @param[in] last_elem An initializer list containing the offsets of + * the first element NOT IN the slice such that + * `last_elem[i]` is the offset along mode i. + * + * @return The requested slice. + * + * @throws ??? If the range-based method throws. Same throw guarantee. + */ + slice_type slice(slice_il_type first_elem, slice_il_type last_elem) const { + return slice(first_elem.begin(), first_elem.end(), last_elem.begin(), + last_elem.end()); + } + + /** @brief Slices a shape given two containers. + * + * @tparam ContainerType0 The type of first_elem. Assumed to have + * begin()/end() methods. + * @tparam ContainerType1 The type of last_elem. Assumed to have + * begin()/end() methods. + * + * Element indices are usually stored in containers. This overload is a + * convenience method for calling begin()/end() on the containers before + * dispatching to the range-based overload. See the documentation for the + * range-based overload for more details. + * + * @param[in] first_elem A container containing the offsets of + * the first element IN the slice such that + * `first_elem[i]` is the offset along mode i. + * @param[in] last_elem A container containing the offsets of + * the first element NOT IN the slice such that + * `last_elem[i]` is the offset along mode i. + * + * @return The requested slice. + * + * @throws ??? If the range-based method throws. Same throw guarantee. + */ + template + slice_type slice(ContainerType0&& first_elem, + ContainerType1&& last_elem) const { + return slice(first_elem.begin(), first_elem.end(), last_elem.begin(), + last_elem.end()); + } + + /** @brief Implements slicing given two ranges. + * + * @tparam BeginItr The type of the iterators pointing to offsets in the + * container holding the first element of the slice. + * @tparam EndItr The type of the iterators pointing to the offsets in + * the container holding the first element NOT in the + * slice. + * + * All other slice functions dispatch to this method. + * + * Slices are assumed to be contiguous, meaning we can uniquely specify + * the slice by providing the first element IN the slice and the first + * element NOT IN the slice. + * + * Specifying an element of a rank @f$r@f$ tensor requires providing + * @f$r@f$ offsets (one for each mode). Generally speaking, this requires + * the offsets to be in a container. This method takes iterators to those + * containers such that the @f$r@f$ elements in the range + * [first_elem_begin, first_elem_end) are the offsets of first element IN + * the slice and [last_elem_begin, last_elem_end) are the offsets of the + * first element NOT IN the slice. + * + * @note Both [first_elem_begin, first_elem_end) and + * [last_elem_begin, last_elem_end) being empty is allowed as long + * as *this is null or for a scalar. In these cases you will get back + * the only slice possible, which is the entire shape, i.e. a copy of + * *this. + * + * @param[in] first_elem_begin An iterator to the offset along mode 0 for + * the first element in the slice. + * @param[in] first_elem_end An iterator pointing to just past the offset + * along mode "r-1" (r being the rank of *this) for the first + * element in the slice. + * @param[in] last_elem_begin An iterator to the offset along mode 0 for + * the first element NOT in the slice. + * @param[in] last_elem_end An iterator pointing to just past the offset + * along mode "r-1" (r being the rank of *this) for the first + * element NOT in the slice. + * + * @return The requested slice. + * + * @throw std::runtime_error if the range + * [first_elem_begin, first_elem_end) does not contain the same + * number of elements as [last_elem_begin, last_elem_end). + * Strong throw guarantee. + * @throw std::runtime_error if the offsets in the range + * [first_elem_begin, first_elem_end) do not come before the + * offsets in [last_elem_begin, last_elem_end). Strong throw + * guarantee. + * + */ + template + slice_type slice(BeginItr first_elem_begin, BeginItr first_elem_end, + EndItr last_elem_begin, EndItr last_elem_end) const; + +private: + // Downcasts *this to mutable Derived object + decltype(auto) derived() { return static_cast(*this); } + + // Downcasts *this to read-only Derived object + decltype(auto) derived() const { + return static_cast(*this); + } +}; + +// ----------------------------------------------------------------------------- +// -- Out of line implementations +// ----------------------------------------------------------------------------- + +template +template +auto SmoothCommon::slice(BeginItr first_elem_begin, + BeginItr first_elem_end, + EndItr last_elem_begin, + EndItr last_elem_end) const -> slice_type { + std::vector new_extents; + + auto first_done = [&]() { return first_elem_begin == first_elem_end; }; + auto last_done = [&]() { return last_elem_begin == last_elem_end; }; + + if(first_done() && last_done()) { + // TODO: Assert rank 0 + return slice_type{}; + } else if(first_done() || last_done()) { + throw std::runtime_error("Ranges were NOT equal"); + } + + for(; !first_done(); ++first_elem_begin, ++last_elem_begin) { + if(last_done()) // Last ended before first + throw std::runtime_error("Ranges were NOT equal"); + + const auto ei = *last_elem_begin; + const auto bi = *first_elem_begin; + if(bi >= ei) + throw std::runtime_error("begin index must be < end index"); + + new_extents.push_back(ei - bi); + } + if(!last_done()) { throw std::runtime_error("Ranges were NOT equal"); } + + // TODO: assert rank == new_extents.size() + return slice_type(new_extents.begin(), new_extents.end()); +} + +} // namespace tensorwrapper::shape diff --git a/include/tensorwrapper/shape/smooth_view.hpp b/include/tensorwrapper/shape/smooth_view.hpp index cf2fc522..de40c0ac 100644 --- a/include/tensorwrapper/shape/smooth_view.hpp +++ b/include/tensorwrapper/shape/smooth_view.hpp @@ -15,6 +15,7 @@ */ #pragma once +#include #include #include @@ -30,11 +31,14 @@ namespace tensorwrapper::shape { * API to the existing state. */ template -class SmoothView { +class SmoothView : public SmoothCommon> { private: /// Type of *this using my_type = SmoothView; + /// Type of the common base + using my_base = SmoothCommon; + /// Type defining the traits for *this using traits_type = ShapeTraits; @@ -152,20 +156,6 @@ class SmoothView { /// Nothrow defaulted dtor ~SmoothView() noexcept; - /** @brief What is the extent of the i-th mode of the tensor with the - * aliased shape? - * - * @param[in] i The offset of the requested mode. @p i must be in the - * range [0, size()). - * - * @return The length of the @p i-th mode in a tensor with the aliased - * shape. - * - * @throw std::out_of_range if @p i is not in the range [0, size()). Strong - * throw guarantee. - */ - rank_type extent(size_type i) const; - /** @brief What is the rank of the tensor the aliased shape describes? * * @return The rank of the tensor with the aliased shape. @@ -227,6 +217,9 @@ class SmoothView { template friend class SmoothView; + friend my_base; + size_type extent_impl(rank_type i) const; + private: /// Type of a pointer to the PIMPL using pimpl_pointer = typename traits_type::pimpl_pointer; diff --git a/src/tensorwrapper/backends/eigen/eigen_tensor_impl.hpp b/src/tensorwrapper/backends/eigen/eigen_tensor_impl.hpp index f3d0b60c..d9015944 100644 --- a/src/tensorwrapper/backends/eigen/eigen_tensor_impl.hpp +++ b/src/tensorwrapper/backends/eigen/eigen_tensor_impl.hpp @@ -131,7 +131,8 @@ class EigenTensorImpl : public EigenTensor { auto make_from_shape_(std::span data, const_shape_reference shape, std::index_sequence) { - return eigen_data_type(data.data(), shape.extent(I)...); + using tensorwrapper::detail_::to_long; + return eigen_data_type(data.data(), to_long(shape.extent(I))...); } // Gets an element from the Eigen Tensor by unwrapping a std::vector diff --git a/src/tensorwrapper/shape/smooth_view.cpp b/src/tensorwrapper/shape/smooth_view.cpp index d5398c27..1f7e4c78 100644 --- a/src/tensorwrapper/shape/smooth_view.cpp +++ b/src/tensorwrapper/shape/smooth_view.cpp @@ -49,11 +49,6 @@ SMOOTH_VIEW& SMOOTH_VIEW::operator=(SmoothView&& rhs) noexcept = default; TPARAMS SMOOTH_VIEW::~SmoothView() noexcept = default; -TPARAMS -typename SMOOTH_VIEW::rank_type SMOOTH_VIEW::extent(size_type i) const { - return m_pimpl_->extent(i); -} - TPARAMS typename SMOOTH_VIEW::rank_type SMOOTH_VIEW::rank() const noexcept { return m_pimpl_->rank(); @@ -79,10 +74,15 @@ bool SMOOTH_VIEW::operator==(const SmoothView& rhs) const noexcept { TPARAMS auto SMOOTH_VIEW::make_smooth() const -> smooth_type { std::vector extents(rank()); - for(rank_type i = 0; i < rank(); ++i) { extents[i] = extent(i); } + for(rank_type i = 0; i < rank(); ++i) { extents[i] = this->extent(i); } return smooth_type(extents.begin(), extents.end()); } +TPARAMS +auto SMOOTH_VIEW::extent_impl(rank_type i) const -> size_type { + return m_pimpl_->extent(i); +} + TPARAMS bool SMOOTH_VIEW::has_pimpl_() const noexcept { return static_cast(m_pimpl_); diff --git a/tests/cxx/unit_tests/tensorwrapper/shape/smooth.cpp b/tests/cxx/unit_tests/tensorwrapper/shape/smooth.cpp index 208f72ee..60331521 100644 --- a/tests/cxx/unit_tests/tensorwrapper/shape/smooth.cpp +++ b/tests/cxx/unit_tests/tensorwrapper/shape/smooth.cpp @@ -56,22 +56,6 @@ TEST_CASE("Smooth") { test_copy_move_ctor_and_assignment(scalar, vector, matrix, tensor); } - SECTION("extent") { - REQUIRE_THROWS_AS(scalar.extent(0), std::out_of_range); - - REQUIRE(vector.extent(0) == 1); - REQUIRE_THROWS_AS(vector.extent(1), std::out_of_range); - - REQUIRE(matrix.extent(0) == matrix_extents[0]); - REQUIRE(matrix.extent(1) == matrix_extents[1]); - REQUIRE_THROWS_AS(matrix.extent(2), std::out_of_range); - - REQUIRE(tensor.extent(0) == 3); - REQUIRE(tensor.extent(1) == 4); - REQUIRE(tensor.extent(2) == 5); - REQUIRE_THROWS_AS(tensor.extent(3), std::out_of_range); - } - SECTION("Virtual implementations") { SECTION("clone") { REQUIRE(scalar.clone()->are_equal(scalar)); diff --git a/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp new file mode 100644 index 00000000..e9ac1d66 --- /dev/null +++ b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp @@ -0,0 +1,218 @@ +/* + * Copyright 2026 NWChemEx-Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "../testing/testing.hpp" +#include +#include +#include + +namespace { + +/* All of these functions expect a vector of shapes or views of shapes such + * that: + * + * - Element 0 is the empty shape. + * - Element 1 is a scalar shape. + * - Element 2 is a vector shape. + * - Element 3 is a matrix shape. + * - Element 4 is a rank 3 tensor shape. + */ + +template +void test_extent(std::vector shapes) { + SECTION("Empty Shape") { + REQUIRE_THROWS_AS(shapes[0].extent(0), std::out_of_range); + } + + SECTION("Scalar Shape") { + REQUIRE_THROWS_AS(shapes[1].extent(0), std::out_of_range); + } + + SECTION("Vector Shape") { + REQUIRE(shapes[2].extent(0) == 3); + REQUIRE_THROWS_AS(shapes[2].extent(1), std::out_of_range); + } + + SECTION("Matrix Shape") { + REQUIRE(shapes[3].extent(0) == 2); + REQUIRE(shapes[3].extent(1) == 4); + REQUIRE_THROWS_AS(shapes[3].extent(2), std::out_of_range); + } + + SECTION("Tensor Shape") { + REQUIRE(shapes[4].extent(0) == 4); + REQUIRE(shapes[4].extent(1) == 5); + REQUIRE(shapes[4].extent(2) == 6); + REQUIRE_THROWS_AS(shapes[4].extent(3), std::out_of_range); + } +} + +template +void test_slice_il(std::vector shapes) { + // N.b. we just spot check here, full checking happens in the range test + + using smooth_type = tensorwrapper::shape::Smooth; + + auto vslice = shapes[2].slice({0}, {2}); + REQUIRE(vslice == smooth_type{2}); + + auto mslice = shapes[3].slice({1, 1}, {3, 2}); + REQUIRE(mslice == smooth_type{2, 1}); + + auto tslice = shapes[4].slice({0, 0, 0}, {4, 5, 6}); + REQUIRE(tslice == shapes[4]); +} + +template +void test_slice_container(std::vector shapes) { + // N.b. we just spot check here, full checking happens in the range test + + using smooth_type = tensorwrapper::shape::Smooth; + using size_type = typename smooth_type::size_type; + using size_vector = std::vector; + + size_vector i0{0}, i2{2}; + auto vslice = shapes[2].slice(i0, i2); + REQUIRE(vslice == smooth_type{2}); + + size_vector i11{1, 1}, i32{3, 2}; + auto mslice = shapes[3].slice(i11, i32); + REQUIRE(mslice == smooth_type{2, 1}); + + size_vector i000{0, 0, 0}, i456{4, 5, 6}; + auto tslice = shapes[4].slice(i000, i456); + REQUIRE(tslice == shapes[4]); +} + +template +void test_slice_ranges(std::vector shapes) { + using smooth_type = tensorwrapper::shape::Smooth; + using size_type = typename smooth_type::size_type; + using size_vector = std::vector; + + size_vector empty; + auto eb = empty.begin(); + auto ee = empty.end(); + + size_vector i0{0}, i2{2}; + auto i0b = i0.begin(); + auto i0e = i0.end(); + auto i2b = i2.begin(); + auto i2e = i2.end(); + + size_vector i11{1, 1}, i32{3, 2}; + auto i11b = i11.begin(); + auto i11e = i11.end(); + auto i32b = i32.begin(); + auto i32e = i32.end(); + + size_vector i000{0, 0, 0}, i456{4, 5, 6}; + auto i000b = i000.begin(); + auto i000e = i000.end(); + auto i456b = i456.begin(); + auto i456e = i456.end(); + + using except_t = std::runtime_error; + + smooth_type defaulted_corr; + smooth_type scalar_corr{}; + smooth_type tensor_corr{4, 5, 6}; + + SECTION("defaulted") { + REQUIRE(shapes[0].slice(eb, ee, eb, ee) == defaulted_corr); + } + + SECTION("Scalar") { + REQUIRE(shapes[1].slice(eb, ee, eb, ee) == scalar_corr); + } + + SECTION("Vector") { + REQUIRE(shapes[2].slice(i0b, i0e, i2b, i2e) == smooth_type{2}); + } + + SECTION("matrix") { + REQUIRE(shapes[3].slice(i11b, i11e, i32b, i32e) == smooth_type{2, 1}); + } + + SECTION("tensor") { + REQUIRE(shapes[4].slice(i000b, i000e, i456b, i456e) == tensor_corr); + } + + SECTION("Different size ranges") { + REQUIRE_THROWS_AS(shapes[0].slice(i0b, i0e, eb, ee), except_t); + REQUIRE_THROWS_AS(shapes[1].slice(i0b, i0e, eb, ee), except_t); + + // Catch it in first preliminary check + REQUIRE_THROWS_AS(shapes[2].slice(i0b, i0e, eb, ee), except_t); + + // // Catch it in the loop + REQUIRE_THROWS_AS(shapes[3].slice(i11b, i11e, i2b, i2e), except_t); + + // Catch it after the loop + REQUIRE_THROWS_AS(shapes[4].slice(i0b, i0e, i11b, i11e), except_t); + } + + SECTION("Last element < first element") { + REQUIRE_THROWS_AS(shapes[3].slice(i2b, i2e, i0b, i0e), except_t); + } +} + +} // namespace + +TEST_CASE("SmoothCommon", "shape") { + using smooth_type = tensorwrapper::shape::Smooth; + using smooth_view = tensorwrapper::shape::SmoothView; + using const_view = tensorwrapper::shape::SmoothView; + + std::vector shapes; + smooth_type defaulted; + shapes.push_back(defaulted); + shapes.push_back(smooth_type{}); + shapes.push_back(smooth_type{3}); + shapes.push_back(smooth_type{2, 4}); + shapes.push_back(smooth_type{4, 5, 6}); + + std::vector shape_views; + std::vector const_shape_views; + for(std::size_t i = 0; i < shapes.size(); ++i) { + shape_views.push_back(smooth_view(shapes[i])); + const_shape_views.push_back(const_view(shapes[i])); + } + + SECTION("extent") { + test_extent(shapes); + test_extent(shape_views); + test_extent(const_shape_views); + } + + SECTION("slice(initializer_lists)") { + test_slice_il(shapes); + test_slice_il(shape_views); + test_extent(const_shape_views); + } + + SECTION("slice(containers)") { + test_slice_container(shapes); + test_slice_container(shape_views); + test_slice_container(const_shape_views); + } + + SECTION("slice(ranges)") { + test_slice_ranges(shapes); + test_slice_ranges(shape_views); + test_slice_ranges(const_shape_views); + } +} diff --git a/tests/cxx/unit_tests/tensorwrapper/shape/smooth_view.cpp b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_view.cpp index 654557c4..147e1769 100644 --- a/tests/cxx/unit_tests/tensorwrapper/shape/smooth_view.cpp +++ b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_view.cpp @@ -73,13 +73,6 @@ TEMPLATE_LIST_TEST_CASE("SmoothView", "", types2test) { } } - SECTION("extent") { - REQUIRE_THROWS_AS(alias_scalar.extent(0), std::out_of_range); - - REQUIRE(alias_vector.extent(0) == 3); - REQUIRE_THROWS_AS(alias_vector.extent(1), std::out_of_range); - } - SECTION("rank") { REQUIRE(alias_scalar.rank() == rank_type(0)); REQUIRE(alias_vector.rank() == rank_type(1)); From 85dcfab5e7f80a0f981f214250c392c1a8f9e0d6 Mon Sep 17 00:00:00 2001 From: "Ryan M. Richard" Date: Thu, 26 Feb 2026 22:40:59 -0600 Subject: [PATCH 2/3] more tests --- .../unit_tests/tensorwrapper/shape/smooth_common.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp index e9ac1d66..f542d6ab 100644 --- a/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp +++ b/tests/cxx/unit_tests/tensorwrapper/shape/smooth_common.cpp @@ -66,6 +66,11 @@ void test_slice_il(std::vector shapes) { using smooth_type = tensorwrapper::shape::Smooth; + smooth_type defaulted_corr; + smooth_type scalar_corr{}; + REQUIRE(shapes[0].slice({}, {}) == defaulted_corr); + + REQUIRE(shapes[1].slice({}, {}) == scalar_corr); auto vslice = shapes[2].slice({0}, {2}); REQUIRE(vslice == smooth_type{2}); @@ -84,6 +89,13 @@ void test_slice_container(std::vector shapes) { using size_type = typename smooth_type::size_type; using size_vector = std::vector; + size_vector empty; + smooth_type defaulted_corr; + smooth_type scalar_corr{}; + REQUIRE(shapes[0].slice(empty, empty) == defaulted_corr); + + REQUIRE(shapes[1].slice(empty, empty) == scalar_corr); + size_vector i0{0}, i2{2}; auto vslice = shapes[2].slice(i0, i2); REQUIRE(vslice == smooth_type{2}); From 5ea6a544b4a2e0e5ce71151f6783b3c7a00a8b3b Mon Sep 17 00:00:00 2001 From: "Ryan M. Richard" Date: Fri, 27 Feb 2026 08:46:19 -0600 Subject: [PATCH 3/3] fix docs errors --- docs/source/developer/design/index.rst | 2 ++ docs/source/developer/design/shape.rst | 14 +++++++------- docs/source/developer/design/shapev1.rst | 6 ++++++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/docs/source/developer/design/index.rst b/docs/source/developer/design/index.rst index 9a27aa72..81b3540c 100644 --- a/docs/source/developer/design/index.rst +++ b/docs/source/developer/design/index.rst @@ -37,3 +37,5 @@ Design of TensorWrapper .. toctree:: :maxdepth: 2 :caption: Old Designs + + shapev1 diff --git a/docs/source/developer/design/shape.rst b/docs/source/developer/design/shape.rst index b4d8889c..3804121a 100644 --- a/docs/source/developer/design/shape.rst +++ b/docs/source/developer/design/shape.rst @@ -159,7 +159,7 @@ TODO: Express better. This is a proposal. It has not been fully implemented yet. -The last design had problems: +The last design, :ref:`shape_v1_design` had problems: - Passing things around as ``ShapeBase`` involved holding pointers and needing to downcast them. Pointers are "unnatural". @@ -171,15 +171,15 @@ The last design had problems: - Exposing the actual polymorphic objects meant users had to be careful to not slice the objects. -What this design changes: - -- Moves to a "type-erased" architecture. -- Uses CRTP to factor out common APIs. -- Better separation of user-API and performance details. - .. _fig_shape_designv2: .. figure:: assets/shape_design_v2.png :align: center The architecture of TensorWrapper's Shape component. + +What this design changes: + +- Moves to a "type-erased" architecture. +- Uses CRTP to factor out common APIs. +- Better separation of user-API and performance details. diff --git a/docs/source/developer/design/shapev1.rst b/docs/source/developer/design/shapev1.rst index 1decc24a..922975b5 100644 --- a/docs/source/developer/design/shapev1.rst +++ b/docs/source/developer/design/shapev1.rst @@ -12,10 +12,15 @@ .. See the License for the specific language governing permissions and .. limitations under the License. +.. _shape_v1_design: + ############### Shape V1 Design ############### +.. |n| replace:: :math:`n` +.. |r| replace:: :math:`r` + In designing the class hierarchy we note the following: - An algorithm which works for a jagged shape should work for a smooth shape @@ -32,6 +37,7 @@ In designing the class hierarchy we note the following: The architecture of TensorWrapper's Shape component. +Hi there :numref:`fig_shape_design` shows the classes primarily responsible for implementing the shape component. Most end users will deal with the ``Shape`` class.

Z#(C`hrU#r-O8LB}8XIeOqX;7)d&NlWwU4Oj}IT zY(~I_(WALea4TCmy%1C8)7PV^dxr!gLu1}k`Vy2mTs}r4p0g7`la90;{bM$9`^ixJ zkCGtOE0W=}UC%C_$%7hh1cF^4HQyu%-Vi3#40X@U=c@g4&vJ&B`(UY%GNDcM_2p|$ zP$0YF*||fky*v`%s*{A;JJ`MU+dP7kaFH>N51$#P;UwZ9{5{Y&8VTvU0cdf}xtJsI z$L!cpa89^DZThn3N9au#kMj8_bxPw=>vl%-&+Wv17*q2ASQWvrgWZu7mT;jZN+BX4 zSfpSqoK;Kte|#&bVFi{ZT7*JmULOgdco+JnKcD=@7dysy|HPO$im}Z)Z~NFnXGx*1 z5?5;C{krF*JZl?tKL)ZX*+|hiT*}k!69ZzE0JJ>|sUn^$*-N$QfPCdE$DN-nmCD~q zcuMs>E=5mdC-#qzOE^vbeI*? z*-#*)*Z?4!l&^gRlP!#3a?IlPsAG*%&CHr}f-4}8w0}i008;9L2!;7c?V}qclN3vK z{yicd90`AE+pWj@Rd&O%)rSd^ceLK=gI+_W3xm{6KULb z<5T{uTdXcttoy17+9we}29g-%vh=XU4*zvYg&e_=Wc|!y=92|S=5jfGa8T5$hxtou zl~@nOmHTadz`Yj(q*xegwe+HP&0~qxBm*%M-l@5=6-n_fb)y?6`-9c$z?56wyfL-m z)TGIRJJX^suS`bxMFyCcqUu}D(#(LtL$-;18v$hqky3w2B}|xYF!R~9NR6;U&W40v z0mmR%Dsa{^5X#hvzpm4tSu^zzRL(;T;y+#xXG%_Iz}~X&YHH~_}9a{7a$o_2mH!?smZGYf!{74L<(X^|3CQ~XoKHbfL<_a z{8vcVcZ@gg1$gk4!)_l~$mCbO@U8lC0$a90hLQ}ETSY>ex zK>414-du^=QdviZ@3s}YTU?tnpbg%u|4e_J138@*OtXV$#|gAEtT0HnVlG&8Y-8NH zv`lCReoVOQ+7Bt?ZnVow0^~Ozb(I1h)ix6=N*=5ZkCH2vU_y_Y!MtU2QvAkt8@LbO zKZ(COz2;nUVL@1b50U^+*7t(ac#?h7q2!kHoxDfYWXZs+W1gSQk$Lut$5E1*=C&una zhpmzvDZxD~>;|FBhsU|s+<5jA1hm`x{eT8~zBmB8c4*-qoumPScz+njL&ND$!fbDP zaWED=MuQSHEO9i9I*#{iR{i6SkzhI~IJab3wPkgO#9aMKVJ8{#*K>Bkb7HKd6=?1R z!gF$p=|n))jwXei0Lq1jJ~lum_Rxj1>z??x!yvVIeS9nQJYJRKb!GnhQ5&yxCj_>h zw!uyobVs}~GzP7&hhlrd$^C0&#|Xe!e22;t-GKlG9R53QW#0?8{8xuP=2(pBu2`y? z+-FWIuqd%ZWPtPEC6NqCXqk<;fzXKs#C~7bcOW58wyNDlHf1$Vp`nIAVDkCSd<;RG z;sGgRdabkxI#GVK;y|M0&Z-w-TJR;vB2cWae_%Uftr{^0BbZ=vxd~0B?sTFp=DO ztW)A+Gm_BdH6V&yIKRG?;FteQ%;u2j4?=bSgu0@h1?Qio3^@c+|7Y!-Py*tg&D&28 z;jQ8Id-rfUSn~XkkQiSS=h6#21KfMH1c3C!HaA@C*lGs@*CU8F^6$ie`Q^zzb@nX# zV+`5ArE5Cobnv}2Cr}p(*-!a^Uzgq7Y(y#q9XEsS*?uG6!PURNdCI^rc%jgIV zA(tY7GCwg*K<|u%;Ob29VnxOR^dREt)jYa>{bF~wLwfw6`yyf%;MM7QX>fbKrj;b*wce zRjBJiOK4^s+v*{Or2*yr0MnAywSg%rI3x&}N!{ZH4S;=K+xko}`}9t!=A4+Dj3^tU zVKmS1?Ck1%$urD@i_cTMkiX~8nfIfE6YFrHh@c|w}Bb^ZQK zSO{tlQ!3wZqiG}Kk){Xhj5jiB*hvV$l(I)=^Y`7;CS4!U#>f7Q5B)C&hS*8I`9jwy z5QZ^(v>nKDo1a>n4;T1wi`PwwQ)EKq^SNCfcxIQ^msY2Pg>D{5LzWX65~hFt>?_AJ zsPeu^m(Jh1@gR1v=WheOae-7c*6EY1-c2YmJH-CXx+C|vb$!y>OQ?_&02s`8>Db7Y zjlYa7hiRnTUNc6MB0_3J(x9bfF(~7{I%9rlhs{^9tqoGI7r+FCSA2g!reM>g!-F`> z;0pO^v_;n&o$bQ)v%NWT9V#Tr{Sc3IAIB!lTZRtF`- z*Ulg$A$D7|A?DS_#=~7CgD@qc`W`}0{GU%EsVL0-=>$YE0B&F*ok3%<^5WXmKTk1( znoCC`lHuAk=kW1gFc&q~cbJo6Op&?L^xBE)QtJ8Tz;}Ep#eo^g0)_dU4rftkYUWR`y?jQ|k42glt zO@Bn(<;NSaIE@Dczi~Bgz zyX>;yhwY_u7}n+txtg=2u3e$FdqLjUL60>%kFu-6_)uN}qw>xi-m zM4hbfPH~g)I8XGro|U&Pt^<*~*3GxdH8=s><4+ndkx_D&@3X@8Uq+P!oD#+SGWGr~ zSxL5pw39kZd!q#}p4Nyyc;u${d7J^O7Z{nUw#qm=&!L)wy-Q_9C;7gltgi!9gdmA5 z6hu?IE5(s?**pCwRoxHdmC4Xen5qVmYW-*LVz8U^M9F2O&n4$tpfFpyat3gEp*1JNcNgfI_$x(=Qx?P zuZOGEsrF?^-u~>`@p-?BDrU%5Bj!A}+e?VPePR#=9}s@85ibl0rrk2uUl2%N9>>2W z0%M+OV(?6;e(OR^NTt_ zx>^OReDvIPp3n;kl_qE(!jF`DDWv*djZ!V7IedrfN2S^Ty5M-M%n_L#H1Mw?x34dV zN(E+RX*k#Cyid|WZ`?Ablth2o-9!N$9D?rd2}!by8M}U~IzdySBv996sUPNXk@4lJ z*4XU9pAEM|y|z?w=VeI!7p4XyfS)y3Qj$^Fv@`$!HZcV4QB@JsP@Oo_MS6jzS_3yX zDR(4_j?DSB4U%tff>7AL6_H`hAjK<&bQBjL;j(*X?1qmd1oDa#@iW`DGtoFF>)k2i zL1Jgf48(i)LTZDSjH;`zZSlo#4#Ec?0hL?3Uu=}OCU>)M;WupaZAEsor%2xu&tb>( zrvQ5AWjQ5J291RY-`3vX{fYe4P;*#`<#~sCEZaE38AtUxz2v0kK-&eKI-n4{m)tOJ>gk_wt+E0?~@BsB+gS=!6ySq}CauRn< z(uIM$7``DxdsI)#AOeuutd3tUqwYUt3^1sjl!rg_lrW#FtQqFpzfY@MaP9~}q#q%m*&$VQB!EMW$f1VWk8%h&zkp0a7?y%gb%NF~} z=gFc{vBbUjykXEfr*W1k27(pV=E9s8h@2jC!Kso~Al1O_%tD7!yXx4DsZyxkqAc+9 zzWs&P9UnUZv|2UCanjx0-3_GY?sh;F6YkGXtVV*OtGQdyMDtcX{LEl_;VNKHw&}Q{ zRxFdI)*Zv2o8UZIOmtj>Df!$YJATIWIv~r_rI+9nqY3>5B7IYbNVF7ONe2G}I^c|< zi0DxkgN+QB)UjiVcyb>{8E>;tw7Kaio4=kZ2OE0IbV7+b-xXRaIzfi^31Ii%OGx%+ zz4{z~IXQth0(@AGJ?EvjYfa>(T%TcLVoDXy8cRz3)>u-;m#hj<_1moo_!n zx24W5KtnMuN5B8+nL?^cTYoDH0k=TrLHgW-=+D)|Z2!kmcccJst7Z9mHGsBXb`I(O zglyH(mBqF)MUZKvD7_X!sg`QZCK=lUAYY}yhNwUxvn=9J+6$Mll4x5P^tc6nFnKa} zBo_e#yPhmoX@F2qe22$W{b);I)eNQZ;v)t@wJAhp*QI%e_qBs7)cAB5+Z>j9HpHOsUfg3P)|TIw0RdMJl6Sjwx;%T0s-sC!d=_A0y3ZM! zXdDHL=kzJorpUHyM9IejpDrg|&cFoVM!|t^aFj+YQELWl#WC!cpIk({(Mwm}+?=6& zvS-=7D2-+OLdDUN6oqz>JnBgqZn5@XmTlB_TGSr}R@-Iaf*(k$fpU>PKBB#v)I|LY zRe8%3=>Yz1n~1KDlpnCBx_cQ8sQd=EF>Qs#35^h!LuPrD#Pt=$kubzwe3(5K=YJvroO6}fr zir*qmSWV0IimT{Ry`92=*-5r+^z5zLHpO)K`|e+EGO`qW=4a`H`)8lXke5);*R92# zq_OrrZgv&{r%i2;sOLre2b+FSW3iCE$7bO{`r?gW!;PvYb=M$NB!L2t@u6NXqy|Gl zdzg$l;YW8{gDsDnrinJO^5xi=U3fx#-LURSKzTJ|XVVV0XVsuX)ZZa{*5M=okbBagVa2{RY! zIq$fG7^f^lHqfD^2R=i&hDqnK!cC%Qfq(9M4{3JyJ)W{dD|es?#;J$Q8MqE;qDxCw zJA%&(A8X4tnkbH+q@}-8CWF9?3NlO`QBswUIm2#1wyS@B}Bizlih;v6plu@9kc_L&g|6o@U81pbhePhk2 zoom%0I;S==opYO^m;BZZAFqSpCt9Ph9j*XNWYE~HI5Z}d-l|TZ)Vnmz7zkAD6#C}z z)^(V&cm*+z5QFCj&7y%Bgg5t_xoC)>c->Fu(WKl-5{VH?^~-t<+s(GQ(lF`3sZ1+I z2{Se47_NwOeHC2s=erhuNGWPj{)iqEAIm-66En6vx^Q}5y0+Qk$@$m&mT3a0i-98% z4oLsQ$|gXOkR`a8UgerkdKxB?Aed62= z&kQ6;fSSeSq}QS5Igpr-P!AmqC?%PML2M1r7!#`@*La*#b(0Mwq7Qr@%+lI11y1h% zGES8pvXNWX{a_kK2uK}@cjs>*2vIzz4zFq6zH>DvtwO*Quy{8me$9p&2H5wKVCc>iK$dl^QR z(%f<+8A`a@Op;-6?yFKmmS_15Iyr3SmjWUr`>4cz0kmTPifB8sd~<_?J&{fqi)#k2 zdk?VGFJ4f=5q4qea`{k|xhA&hWt?@YdLq-qts`cPQnam}21LufWb+kF;^&NMEm z$&iX*FOGWaKkJ>lPNyOPr#xsZ+&C-&tmUgAYL)>~ClPiH7qSq)I$^2dRbbI>sUw!*zsoU>MEt)q0Vqknv-0iWN z3##m6P)44}qScIc{wRkU4hmjhY>IhA^ksu)T}TP#Ky|$0u@f}$u@8uzdA=SsG#AQi z_$b9WgA@&v7yYtq;4-ZTTH@Z5-!;Vo_428))SbPdtvmzEA(KgcmM1x}`$Y{~fhzT& znIjr=aY5>VOLiQq2NSr+53ng#wxQtpezMw=6+djs7$~Fl{et4$vrNz|R=AdNA*`7B z31w1xCz!4Q@U1D6JXbgc=fKR)GYBRb>{!P50gD zt+$%%lMV)KeRj#%aTC{YZYTV;2)oAl_{Gky%Rx#P#=e4+tyrA#k@30F?hgwO{z_)S zoEAW&o!-h*du{)NM96!YQB+#4Ub(v<>%^}S8t^bMJ>wEE=BS8~9$?6P+SI9UwRA-i zWz}7sQfr`8x|eqmvSG9a1zfSt;9dVGMj?EK&iXjix&sOwY7s3C+G6G(s>`^s$2s~->~-3*eI&J(PD zm{RBXsy;d|&y&u2Rb&wKm;1XuBmXYACNsccm7Ww|_7}1t?H0}E&!)$45{N6Cy zLYE+m?e&zg=>|@Zr+?bhhEUS8Bw5`2d`H%6pBkKSM^OrJC*OcRYo#QSTdmg+Ll5N2 z=V+d_3iawAlr+~o9GTnMY|sl+VA6?8+#75Nt&Iolt}p4;jP<|zeaplj1w3X$&8Zjh z-!yb=!GH2^zD-ZL{S${qX!y`i&r&o$j-BpX_Q1mK3!y9*)bZ&(v)9#dUeZFUbz&QAwtMDPD+yPoM{?$LaA-b@5 ztJ1X9EhX)C*H9Y2hN?ZE+Tp+m(!t^AG00sUWy$7JYrJ{|V4I>Y&t@X*N{>PsNAptC zrSVe^>{hRA@29C@IWv@A1dYA6ksJxlVHIqwTKxEk_&U!Y69-}uIq5zYB~(%x2zr;R zY``NwYM8OqG^mnc67s5UM_d^7N%PDwBbB6vGi%(M=Jj3`QK2S^up-vEc`LZu))}I|3p~M!_&8xPBls@fe399v)PrKa@h@tbkU3;$Awat9q zf1B-5z7jF~6o{W!FyUv9&z@PhG~Od+D?YmQx~C0!o6_9S*ja**sVH{|A8*Z*<4|hy z#l3;6hFSB7VT)<9ULn*u6S(oxDPz)9Iv#`i)x$%D1=@4T?rimp!`g|03di<_k8xmo zra8pv@%vJZHMHpx9N+3UNq)*UDzgu%PR}(3=iCZ<Ar&vDNUg zrEa*#*q}-p-gAbse8``?hIf;3AmuY(n>|HLLW7zIj6JRzJDsP`Y<{UC<9Geo%XRSQQJG;^R;a7Q2wse(ohlL z?FAS{*9s~j2YYM16-1*i^hbu2CDs@>wJRbZXrs0{3pH=drESLfo>>OZQvHeQGPBUx z4>El*E7mB25xEy3^!+iP-s5)Xs;+ASCY|y6u`R2?`;;Gla6W#fm(N!=!!sC|BO+Ne>K%&P} zxitpbb*@CwlYI~2h)7eA$F4L;46@~+Fu3EQ+=&LqswvG%(F zfDzKODF}J#c3D>^8L6nVG>t-csQ}(KMk&bhoSe$O{<}8g0CwnnXmRU~ zWZbZbcVV+~Po_1RZKSleqWj~7rpopwIu8z?g!Jj%-`^|ps^m+cv~e)p^lnHb1-49t zA+qWQSS`~I2FVO5NIdj!r; zRe~Pse5Wiqqh9o>6QnK>6i|ePHG`k}{RAwb84V3;xmFLTrf_Yu^WURSPQIb7C*8(oj70neYQ!^* zlTTDVT`Hw;eYyx4Z2|HN`vBQi0Z7X8!!OgU3)N*t)m$I3oSgzx=7ftu>J%G_i$US| z#jVs?gB>$q4Zd)1fb}6iHe=QQpTzm~`6VH|g33~CMk`FRaxliShWH#JygImB7@hgr z(=>Pv20dd{HjS!(B3kPK8sM_jAG&hFrh9(_0=jPKsd)?%w?5>5s8hS|`ChO2FJG)D z(!9g=ST91R$k&#!K&2KTfK9fg2Fpx=bIn{-Qf#06DHL-@;J1`ZxPkNDw4yD>mEC2Y zzwAHNlUyjT;2X-Ff=f<8y|&!8h#_H!UqyPC>FxzTp~rOOIYljDS6Ob?@(mqVd5h2M zZnjDEq6<@f@Lz@h1dAtBIAjOo9X?F&RSOMc8MFl2u^`BYI(((+w{NSU^1OanxmsBD zJ6e#rC_U7xq536b7D}MUTD`OHtUv@j{otP(F_LH59R9O^|HDbHBMM)H-8+~P%`Hh@ud3UAAnhW`-kvvO-^|IRmWJdok{B8}DHcLKLt zSt@J0<-TFQmIYdG1&%Y4>sy`X6vRrCC5Q7jKm-8)(yf8SWe|oNwo8CeKyJNIZc*Eo zQ54H$$xCzr3M`)FfdH+nNw@(tLV9Qu5|TJs`|9b@{8zS1bZ=CuT0o(RiGOF+qhZLn z2quLSYdY;;@9-sw+M6=GzhqAx)v*hjt4%w|d|n-Y$*}4~S{!>Ya4$Q#jt$E^%73H< z8>{Ehb(UMrq58po>4{ncqp9OYSZSMa!0L7Y8ey^KvUO`lxC98k9ALg$^Y|k^Cp)lk zk{&Bemrs?KQu8Itg?@2)I?7603r%$0sF!N^1KXm+FAG03y51Gqd~Sta9owV}eC8>? zAG7UjH>^L=6)Wv){6cipD4gilQvyzAO;`)ltQ}aTn(+ZP6+ZFI0B+=s2dNj4p=g@_^wHB3DxYGtg z(~n(6fmB>_x@}&&h9=#r(bpWThl{G1jLu$`VYy0A`^*f+K#PIlnhPdUKUi*(Ccg_h za%7J(Y5A^$vWM^?DT-y#UTEtnIUaX2XKT~a8Mxf?n#q`jD?7{FKY+^HVGS;|^Ih#g z%Ht0>EBs-*Mhg6i`zKB(D>#866n zK<==nhbsu0(BKb`BZ(m%Wza+Zn`R{GL{Z@^J(}N`Q_A}pY)H{h~ z`EAt6A$%sMo@pJ9FrcebD?b;m4N0_zDc-%1M|mPNpY$8qFmI4s|!}S>n!_D5IsU<4pe!YFL6bRcb1N zpPz1*G3_rlaiahHQhhF&O&*_dDZ(P)6rLyb>0H8zD!pgr3uikXDm@XAYffT~5X^Zb z95*5wSYUR2r#b!0+gDe+o#B=%b}ji?EH{Xhf78#XU=Y)W?vGQU|1?rl^#GYVAY6I8{F$@ zKR~6!eoy}rqHmkhnyMj{V|Gqvvps3GDuI2EfsvlD{lCD4M60B0_^4EV3j98MPJLDi zYE=`|?PKJg&vutJId2&$UBYRi9$s3^fc2fOB*C^jpC58kj&Ti_8Wh@db})U;N6KzG z@iuWxplOoZVgXW;zVA&+>RI$I7>UJh1P=)JL88Bo`}h+p$l?ryhQ6d2+yj}d*a*Rr zdp|m{bmgkOGR%Uux74!So90HRCybVArfKx3hmsY;FEwNJ+Y`eJQK9)mlxfymmo{KC zx0uFM6)Vi_ITQ7k;z*=1v@Gn+uSf?yxuZ;N=SiFNefLtbaehc0`z_L{DSqp*)x*&j zRn$%R^ja^Z99Bc6jonci2!NF!=pO7X9IiFViB-h=Xd+jE2Dp;EQO zPlfnr(&ipuKDrs1>vs75z*LmFsAwG{^_1diw_pskgQlHVK4~bf0&!MH{RRgE-p-Fv z+Q77Ns~Up@CiL#gl2bZ`91Wx8pQ~Id&P4C3s1j&UOdIY&DaPpw_nDNm%gzd)3x+%H zX~_Eat-U4yfj3{EHF@QfCim^3ecPn0UURBtNz^y zi8b)R3Vke|B`$8s}RuGTvRZhor#}Wd#uV!Ok?ul7Wb@3=Jl`k#y!L$fvW@i2wiKN&l@nb z4Xwr-#J4;5;mhXrsdP8yRQ(0~#INi|5U#@#J{ z0LK{2adCkC&$}EVL;0#OvvoW;)W4^bq7Q>?$6$|MRXmUlb;`N2`f6o408paQ^0 zTLSpr8wcYnLi_D)BWP}z3k~=Q+gL4ZrH4-Y2`?kV%#zi_eTN6MM(rRay&c5)Ux_UmG<>&9bM zV5TWK-g&K0Dv;@cgveLKR%Y1RZd3kabsGk28$(fub8?pi+vZnEVNULUcQ(*w{Vz$$ z5J^mR-HF?cF!V>oZzHbD>PLP8`#tmsTf|!C8(?(&FzD8Cl7?0GaV#6gSz2c&{@w;F z;T!y(-&MG9W4USO4ZKO%iq?jkxVkHTP}l5Q-+TaA0`6O=Ff;4Mejq<*3`QTf_W!uM z=x{MbzTS9;Ymh3grM*|bJ_v#?Bm0(rUJ60YBzD#w{p(B6Kn^mcZ<_31XT7(JkCFWu zr#yn~P7ko{T3^fRvtUr9EUh=m({Lal6FnHtwZqS?I|^6WaAf z0)+#{b_fX$VjwH_7mEHSZSP9YE1ldU>mQ5_Lv${+P*3z~8tgz5r9*8Xnji$3f==M- z70eEQQTEn1&7ZUE08>NX7W(qw1I=D=enm~*-V+TvtR#=;jPQ>ZrkXdqmggz$+T2$i1Sz75ue({4hA zDUUoeuJB2SDu9@6lZXMZtqs0~DCY#=sh)uR%eE_}&Oa`I{N!^M_1@q<{#f^ExWN=G z2cREZ(Asxs1G447k!)M5buU`wI04{)!DGg38wLQ!ZUtvcM=j?7<|cjEF+0PLI}tfj z^!heo(kdqj4N)f;?FL7f*S7|a-3}gl zttn?e22X2WvO@qE$WTy!um0IFF}5> z9u!~eQO`J_DLisgxW2q_WwjeTh@c4N*uc`&L!4NLe7i+RmpwtD)?;A;j)Q{pnRO`a zskUfSVhtJhjMFd#!FTlU0wGXpl|$8>g#+Q0dPslkl#oQCnivd_gN{kU@$xtGUtW9v zxf5}!ADJMHaS{5tA31gM=VX{+#qVpz15*bn@fKF(He^GjIZ!jTnQGSoyBtc3>!}r+JqO_CJQ_w1OYB zwtkfCf-WQNn30mn8f7HfJI}e4a16S0!V)TZ@nzVlY&}=W-2Ukq&ak5WEcKalDRS`A;@==hhmV&~* zFwcn%OYV1AWrCy=l2O(mBgkm+4A{SgCqX_}F5LzCHR?k_3GtwlyncUwhKJq%6ctf| z3NHd}go<;X!R&5Y6!b>ZjEqqDJOqg77(F;>@pE;|*&k|8b6`YyVtamfejR>SZg6`Y zWLK@!3oh(k>t`Styh%}lWxR76SFy#O)%JNDY9V~!O0sQxE*FyAo)rk896$*hSzk&} zfErjA@Aez91adf{0^Lb32L|DzCxt*wK3p%XCW#68Rg6s1_)X&%rv<1&$eZ)a0Xe)^ zVg(T4qJL2X1;Cge`%kRfJU(!f76E4X%^BD`;!&-r_D}K1l+`=$?bW7ImoB_kQ?99k z($+-q@6CXVGXR~?grTM0&LQYZCfWp2cq>_|tO9N+GXQRQf`rsp@rls1KooiS#gkR6 z^?>&@VkM{dcx>C|WtEX5i;dZ#^!|`aYK)#gqrhx53$wi;1NW{J3qq;ql5E2Ygmi!1 zGz%0+WeM$8Io9+d_P=O<9@wY9B^Y8eYX*J*45b(jAFcZmYIl?C^)V2iIM#sDi*Ll9 zh{Ngz4T#1Y-}LcVY~1n{p~7;N#poCN@nDjYAlQ|@WgzyM&T7v>Cmc}eq8pGf3Y`p0 ze(Eq5yhq%uj%f;F*l_i(*E{w}b*AVw^grg2_YmdrnV{Zc0broB6Zj2?|FJ_GY|T8ti2OH{y6&uWVyD^45lX-@ zJ#3YtvHFWU4{@p(`{QMxAbSMctDemJ+&SD5K!8_hRGNs~&^1jM)#g`(gTD57_}Eb@ z@7Q~?J>_$ak=FtTd2fMj*KzaDsNCgY68`+QmSEkny-_8GVpB+-7}O$C!o_TKpAole z?gdif$D|tP5=bZqvObs7{ZS?in)sqqgYSoUQ1UutoN!d4#w-;@hn-g_f4+cSx)~o+Vy>0*3`{XBax(T z)UO25c-Y&^K$(gO(qsGZwHMlqpGol`FvJu9;J1zQVc)g9yeyTdAEQ@X*aFj7Wc{wa zPUF$ct`si|+9vBFEIRi#`>s*$PoeKboZ0b-B zY2-vq?30(->P?lUx7>`N0ldU~T|00xede^=8G4xPOC6$L&0LcKcZfk85;zD3`0z$- zPpDYCvG0ba3aD2RV0b6yOWM2Tjo55j(n9_T?d!KE)(TiLQ` zq>>xppQN8Z1DxM+S%aetX)mBgmW1%!q|!a5^a&C_s}K6-v_P|!;C#Q_kI-A}>3>l~ zZ*8bb*FlviGNl&(6$W>7(exAlmw9koY|6;yk&(SKGApt&GBfi~DKav%_nz5%q#?@QTao>c z8B)LVmP+sE_s{!&KHrM_zV7Qfuk$?4<2cT0P_rPTaL(;^Fz~ExQs*Yq-?^gS99M-< z|JllhZ-HY3gOg@MHI6aZ)%zj?Q>t4UW$~6noih!u0$J$exj>;?pD74$-d6_%3|GWMW8xbWq(zJb({?e;R8(0g$II5+c(BWAM( zF&q*LlF&BI^s*jQgnqdQ6IO5@;}G+Q$qt?)hvI0Q7Jya;+0>(*j@mYuAD`34GR!`t z$$Ln#L4pELid-HU(fxs|P3Xk4&2)NX7J$E(=0Nz>k<|e@j_7qF=en8Qe0gHL3@*H} z;Zmj`#AqcNTKrXh|E&_Svv_l1bodZGUNnWS8kXXKwPVNb=JtF( z0d=CV>jt;g=Dj)FA~1*8xVVR#9md}E_(bWiC->V&;yZ+M1fdLAKnbrX|E}$@aX+ys zcVfjbx}n*O1qRTRc%!7iJ_@x(s5=AZ*|}amGemr;EJSIurv_Y>X(^3;Vu4#FHh!nS z;HH$`Z4695p7=C={hf_p<$XpYQr6qO$*mgP&V zpT7L=^leb=pW@G|e5_9P6+A{R!^&HB+Tzu`!qV#W`q^rFBp;}4L#N1BbMuc}@aITR z5X<`HxO5VqcJe2bTB(Dqrj3Xe$kthpvi$ZI6PKK}OJy37?);C4CB!A&XaN}{{nc^ir?P3|_BqBSeTZ>>AWv-Zd&rIW6X6aVUd*%)*K zWpK-(g;MA4F`*Op<_}mAK8Zl79I|24DSh^AX9A8xkS4Xdqe{U|XxJBL2d7b_9DXOG zMit=L7be5YRm|KYqiAkQX|wDAc>$W7(6{8g4kmJ40KHU^BmP%`G)( zv)cOSRyV9X;sWCR3}qn5-5QOf*PKxUbqC_&MDuJb!}Z$dk^xDNx!P_jiCz~X+o8T> za6b~;%%llXuxvkMY~b_^nfr4t^7f!Xg-DtGU5eQJ(U7@-E;gEYnFp^eo=LcOpr&P! zjlOcM9}I2IMbG}U`JInVvM0Q3@0s`0L6mZ3z6WB>Ng{F{tn}6E7k%|YcT)&DZg%ur zJ8neJQ5ZIrX6T6U8lJGqX8%5Xgw$Vb`c4(osae>2B)r7>P+dfG=TrOpBU9g{<`#)| zZF2}V=O|T1=+c@sI{8c;BfN-?FuT6RI2OUIqAzg#i=EEMvn)G8G}%+F9XTTc1Doiy zGoMi04C)YmJ@#XR*KRH|Jqq%1{+H56SHccc#YNDqRq2J88{?^jEv9-YM-?hJt9HbjZ4>Z7rM8b+dEIHSasYB>j}?dyq{A4LT?!LJe=wNClNvfgs9Pz zW>ikW#JHhF-A^e}o2;m6x;UcVTZt#8Q!LmPnXVC_vP5yZNmA*CAvt>2;O$|2x^fDJ zGIDi!oY`SzC5mE9NME&kH`681Txiz z6dc|4(kSYs!)h{Ibw zHg!}y(zj67A-9LbQfqB1@yej&h|-{>7_UF?Gz$@9m0n)vjuzg|f@)q{ZUG4q3V4k* z+r!GenL3ln80V3sg$@uAbmiVbN^|MsHlja^mGubJ_Cr5_y!Sr8b$;j3MRtm&ZJ(=$ zz+T|s^;7r}yQ+?$yn0P8)nCI7h`u2PxlPeSu5BD z^2udn;7E{J`ZH?Y`8j~qxPh+lvdZjIz7>xeh46>cs;X`mE2>Z$ZyEH3D#js2y@^!j zxz<@ot9c*%SdFjAHvPbXHy3&=ot?-pHgN?m)r%$K8j){5S%9RF_elmVB1E=N+ zSs?)@S{Vi3k-RV+fNtfh>%scQaaoLvNuKgA!XU5b_O_ z2!qp0q1E6SV2Qn6C*`%}G6rJJsB31WVvh)UwL=jDn12n}Y&KZ%iip0vn*4q+aUj5!iLVz)B_j%5N8@!V_Qy!cxsb2O|?kT@Kp( zFetBK#c(pg#EJYAF3pV&Kt3pNUoGGfxy^_&{KpS#g)nG1RPlDSKtmG&x25 zQKWpcNLRnL)z&9J4zGG?t^BVQ3+%_%m4CwXUmNt<8HB32k7q7V4V%hXx?+I)#x*pb zLr;cbaN&Y4#S=BkXL{W{=_89NHLTHQ{td-suk4N(TZQn=1@}^VVE1771;5myTizkDlP)BANj^!YRkfNRd} zJgJqzt9WIvEJ0Pkhk4;;o%xnmWh2VB@<=zIoTJLy_<&eTm5l(-lr@yz5OdK7wz()( z^aW$(3Q|nv)`u#+tH`{%Pw_1tVb~@S5Ez7~+%LgR9{PE1mTp;iS&nBksxT@5cF0b9 z!y3qWV%2$XzIvFlRoOa2=S0FoshO5!m>Z3*FnS;S`VOXqy<0e*4;6O;Q_;KbagR%* zCr4hp$gwMI1lb+~*PrJZkK|ojr%uLLbWxPK4gz#`K35-B()jcch}8mchPD@MxIz{! zNA3!^QX{T&D8_bxK@Ep{ZA9F5TMT|2S6un6y`#fkH@5>|O)4BL4!IX29-TY2@9KcW z24zQdFz)yjaNq7q6!$4+$o~2y)ID6`-Wem7THvO~GFYWSulX6P z-x!c5`45!yaZ0D@+n!z>?Hq2T>%(zPX3%d3+@QfZ_lH2@HH*3GBHJrrcHCJ zVF@ph_t%?xX-CRcJ*+AWlna)k3uQK5TDLxRaWJ3OC>tp*RK-<#%^ ziryjn4y46wZL`!cHy@d9CS@DQM+meHYOSck_*1Pz>Ohq_ii+_PfKi)+*K1u?9f*A?t?=ul&4r*xFkrFkVz<(aoccaoIFxlIi$$l(orup|S3WjgFSI73{xg*2 zW|{=^71(1b6fcmR(SxdeNe5$+Y`BJ{G9vZ+dK`a%L(`~VGyKgrPN!UNbf-6&^lyVg zAM9)&T&l_;S5Vb-ZuVL=4xG`^B_f-}b|{rR+OYUFpU!0_ksgcO>H$=LQ2?Z#jUmzJ z!3?7b=w7Htv^~RdLIyoIE3Erl<9U%A%3TlLO1m2+KLvkISg2YYSBT4_A5)nqf1P_Y zyj4f<)}XdX^EcIKyV)#`p3CZWkTgWfN8SW-3=xj@9OtFeEN!FdboFM{!om;L$htJU z^~cz<3_~hcyK9O-N<}Sbm}JZeWaa=NnP;oC`~%-0e*efsDvUaWj>BSatD;OkIf3y+tbe-Ns3!y(ir| zN5oYUZ;||ndXU!0jlm_}Tx67$1kUTJ?cvUHOQM1S$p#+dTXS+)dvMy;U5&J~XAX4R z!@XL88~n`4Ai1mEV2?z6rK)jib98oFH-X$r5Z^cI|J(2JF)nwEr-#Aj`e;%e@p@VQ z&?zO7uQpk~+k2=tM65q|#%m+Olh$2cWaltC#W2(A=!tI^8g-V;gYN=KVdg7`HHFKr zr`a4_`Jv@-JMj5BT&q!FHo$c<6_Q`%a5Z z%*e;g^f($^)llO?fF)C=qEyBu8tUyW33*k&gj9Z1Q)$2R`pGdd{6ML<}&H-{$`RhjctDD9SW~cD@x)(EW{D>S=ha%jM>`o+l zW|ykjAlwr<+?L`v&cyCm(|)$}!qr#z#*I86zcK#cqW)O_q^Fu-*j7K}MOD-eQ5x;y z4gc+)H6~yPdzyk#rx;e(jB%;!Z)x<-(y51-e$iN&ay9N~VDys3*(ItHvCp}g7Me8- zuaf3dT&1b~i1=oIXd23I`sl2Us@S~mTg=618ozlY3EHL?*;Sf?Cv%Qm!uz&%t?*P% zR}G^0zV>#TrEfZ1q|v^ve@POrYfZo7q>t5=Xu4-CCmbNW9z8jk%5J&%m8@s#PTGer z?LnGAb+N?WjpwnQY&wr?Jd+)r3p2TB%CbMDP(b$+IfURn3_8>cNJT>J9@(qOZGScG ztgzeAfd~rj*ulp2v+5MZ0>dGeNvxp&k8v`P2%oNnK{zLdGOF-5u>;=rth}M3kmiR@ zlb1ZTG0iM?O=({sjx|wj|IxuPm1KHFEpjc@FHZ_X7LxK9;$7yLlD`h9hw>m3U(XvG zFg41IR2xStq&_PHJCY%v!)alQ$pkm%*j3*3RMX|L%wH2D*zIq)W_g~gY`(E6z%HZx zYbajwT|vP{)@Z#M>^dAAqN|xRH-Cr`&>FdoNDl6(l@5L69g87H?SP}(N4UPs7hX+9anH>==0!vL6`ym;nJeDuFt&^x zfg_g&hscq1_W6?i-j~EaI{*Y;7}T*eS1E~oqsH1za_JNvS7RZ}D#rbsG|M#(pot%D z_N(<*n#LK-o>U&B57%ATrl))NSn-~bzFuqK@Stg=D^wE*tm?89cA+pmQ>VTtvoY3d zNL#vniP+K6g)wpL_Fg*yuppo7)#1u0VYZn~@Dg{4gaM9t!Y4wPmroPHcg%1`t3RlF zbcx35>h0R!aTh)?vsyw5utBLyA$Fx$eTd?A$FG;Z~DLFjC30-`gnK)0H6$OB(dP4g-QDJ6wd%=u{N~se2*lG0y^&NG3 z$=e>ebw9QzFhtu~7TKcJU{V_=9T7T#CZBBIV(fy!De9>&Hr=vrf4O0hu_O8JdV%~> z6>#YDor&n|MlVr z_o@pd_3x$7&k#lPeVe=^aS*~;?*~N(M$_T2WTcFTa}1pyPA^nk`)Gm3V9Q4HPJXOk zqb$Ix0}^kl#5^9JJ1=nVzF{1!quXw2Cb?^DC*<$o0K7l^ks0G6kF&ihWa47n!rgse z*F!8-=oPh}G(T3`d_YvYRaoP;({+ZEXgPzp{wg`1eW9?UUSRsFMnuTmmnC4P9BCDs z&flqmB82+TwT-WS4sAp47$@!ZFcAf`m1ErOi1`1w-c{zAY|qrn?;lEMgwxosH73asur#B8@5Ax-eK%skyfrpT*2|c`N3N)THK!v^KTVlD<+>*k~GdIyM*6 z?io_MA43^jRMBjy4OR*ytld?PsPVLR6Tz_=*m;Qza|jCbeB9i=dbo;!%1LxCcm?he z$Afc9GA^Nm3C1UrpPhle6G0uAL*9^SB4<4X3gz~&n30;4rSZ8mD?|jKV_j1Mx08Dz zhP|^a|7tH2eX89_(6wry`TU2vktr|MG4pPWB^Q)QHr@F1Uf`@dYMR!*^povj&%2qK z!Ve_7P+3EeAtJpDrmC1;t;+4BaE?prSyy_S?{T-LbDWgL%G1DLA$(t1wgi2_HA$J> zfOt&g!^#@XC60Z6cYqMk%~XtXSa~sbn}bw(2SIq~RkxkPh}9c~4VvXrL?4Ga zpQNk_q;p^EuqkED*KPb|-pUy4>EYC&RXs-|a9!m~?b~Vcw9CfVwq(30(C`awcX%W-qTNNuFL5g1&gwjNvSlxT0bO z$yAc+tQmceoA4yFC|-McCD|X#{Et>5D6M`v+M@O2#Uj^IBd4OOpU!a?-Wzd7ez)aw zbsYO3|GL>;`tFBw$0cjj>fHJ~pOcDN-jIqmIb+Riy;KyD#@Q;Q=VTQfU>EVSELLv% zUh8-1`8hFPMU=Ph##nL(?ej`in$Rx(tPu{{4ZSlqJsno|<#q}JKg$Bx6O)T(Jls+0 zee1^g^KNsMc^s~K5dsvR?CV02;Xu)~`gkr^d;sz~;ju6C;tychWGJxJr*y)9kzDrj zwn)VL*bYO%22DTm!`v`Dcgef3wIRLcj?CVl{~!j+l{7T*9=Wmfo^1dU$6X+A=+zoC zk?D^kQxrfo@58aYNk>bUd-V~~R=6Eifw#hQoJ$z@H2MH0r9i)nV|s5#OCvV6Vu!YJ zuT_n)n{ce_;>HY%UbuUWg=`W_x43Uylb__9*`-#GS;8xod2&0~)8wfwJnl>vg8N;s z{qYUXaOcF^mQ^C<%W#ux*|EVe?;VXG!6<>^zG#uVNj0^Xmb}&qu53z6# z6BSzyY1sE)Q`kQ10s6Vay-gE)e`x|&1R!<5Gb^$YEXV#FTE{Zbn3tHw_+K1A zQ#l1O4wrI0xpl^ZW8|G_t=?#jJ%+dpBP7+g7@;>>JXX=BKH6Fo;kt<_ne%_^%LzXh zRZ2V~jxWHSwwtB(GO0gboRt6djXvX4*{~eLsEu1gl@8fGRZ7!$3}8r-8>DGT=(77= zAX_)b8_m+lrLm?seV|&k0lpS?oftQas8Hodu)B^(>6{sQw|wobj_l1ZLapG&d2E|G z1B{wG(Gu)LX};$Pi=ubO5%};08m6oxl@3LZzsMWN@p1k6;wWZZqO?!vV-ON@(|PPo zwTx`d{MM8&T^f)B(x1ZvlBw}JA7Y=;T{FnJa@A~)vyEy!4ADpmp+0TFF*L6C#Ks-7 z#V~jh|N5O+XkCf~0^Ph(=RBaFz9JF=9Z9c^sUvo5$OIrn1-#mOr#1yO4mVo_3~hvd zc6G2<(LEwuTOHK&sjie3>G=(js=FR?Rn@MU@5~BUe^#xJJs5GuEJ_{W1f$@wzG;X0&0_)cOF&QZ(U%ajGO44tw(7*VFHDD+jLV_auzWvb}& zt8yaTaPJ(WbZGkaufim z4?>0YB$%^?g8@=%EjGWsR4kRuv`}Ya#0ZD`8T&8%WezpK6VzC4)HkO;KkBf<=bGst zsb-KfHR2G}db`;!{vG>?yjtn4*4w*UeP=Y)gwxyvl_FBsi1=XET+Vzbm?kKpEJ`U=l1dq)=Urs*@7dwwom{1OlL)&!;tet_>H%5TwUs40P7Bc z2AGyz#hcFB@6B=0sIvWV`JFUe7^$$KI}^kXG3k`v_3(N5ck&KB0lfKCy~3B{$G}_{ zd)H<(Mdrl3IIthV*PIE=`Ck71T-t_hal(Z+8}YSY-g?ApP^;UUZ@>Wvc0sKhn?}xy zP!>(aEcMJ=?q{Pc3?9R1Sq(^0d&@D(;FV+yt;~D0En;viJc+=-=^XnL7+NonPkQ=f zxzFfALL7c6F$J?x&8JEf=^qXUSrb3(dVZ&t3PT`FNsU7r^Em)-lN6RCl_k}Hq&N@d z{OV$mNuUv1h$s`r(NePl+vZTFuXL^VkY5J!x~si;dZ!{DZWJzp`S&omIjh2dET0?y z%jw6)_4-fw5+g|>Eplvwa1pg%&=51+)Z?O=&-nH>aTe9}HAI4aA*rpvJYV#t+(~ ze>ynSNYuVWB zA>FM-8L9XP8OE<+wdUzeZ&ZVnCr#>dSLD0JI0fpo$#+Bpa(ScUjBpAE{qH-}oa7KUaQy6O@R(sr(j2rl=W$ zE9GH=vEtpS=CD=Wx4slCLe56W59uHxXH>3NTLUKA`sACCL@^=SsFjB&6oY{8wRODP zFP--EUskjyiW|u2Nh(Q4aH#1M48rxmZ?6-m%P?ZQ2xcRmJ#<6i#6Am~UIROJei3M9 zf$NuUZ+VjnG=<~~&m$}38IN;{*NQy$_CS6Ly8Nv8V`&)hVg%Mcg(huuby;b2e<+dI zxNaxtv8GR5pg0?(j|O9dX1FtRrNGH>G^&oZhV9eB{@RY0d6FJ=hF!O%Vfpgb8zF~W z?V`6K*YJ^S_eni68Wrz@eZP)qNb9jp03GFEF+Q7=bpP`HMj%d4PY!r7x0@-)aXUGb zGn5m9q>%YIfA%z4(_J*sYnq^!_+?&lVWg^0EncKa965i-kC_e@XHGAB;So1OoxJpZ z^W0}Zi8qpI=Khc=$x!v0a6W5oRjF}iPk;}N=vBo$CGX(4f1gwG29k;v2wGsj8{6oxnz8(yzWR-&bKdbmjA9fnpxy_&w1~fJ!({ zoQhqS5fuDh4Dm+}e1XF2zH6tjoNk~-fbFlR zF{-VH4Qd2JsHCHl-C5V=n!{MAdL(BL3BsiB)zFbz_bP@!F#wzvH(SZ;&?*RKU`ofo@QvDlh3 z80_gy+-YhQYJcN3-9T&A>gw0JRhYJwnySH%6qa-jdMADr*6cOC4GaUnFWVNwuVz0w z2Of&8MI6tcX?ciVw51C;Fq#lHFOJPiUzO4AtJC%9L*cJM_G=7$sSI3{A>?ppa~Xku z+H~dA{*wj`;A~$gss#f#w(N*#15LHWt9VM+F%`zbcumM2_>YjBN%eJ+=9$Uv$-YaW zZ+t0ExQ}~6n)UllQOdx*$6IebIap%WbrCF60=@&6=5ftzOXmcm%q&&A%*WWLSTSne z`*R};uOY_moZx{{Z5YGkN!ii^!x9J8+!%sg0O@ZAEN=U0IAL}lTv`Q3F#$+^A-UL{{%*ZdQFOiJVH=g5|oz(sP2wuv#f zRewm1wdBzclqN1w_Zd8>sRk(K=0@<}^4$|<0~agawEjcOrykOX6=;8>$PZvhbQYN? z9hM!J8xohT^QEaF-I1E9c=m%oOtjDdBwnbJxl$S0}LM`oGh&eLeXdJ`v9%v zRBQPp3VnKVE~nxhq7P7t-3z$;-<(Vx{YuR8u(s+*yn?CO)E|IIBJD>7#_@%*3naAob}iv-XVW|4 zG-3J^;d?Gim}8>|;}DGoCF73bY{PikZ=XJ7HVFLM?-gg4AwE8?QQp;A0R;#pt*tE> zxZR>LZV)NI^~M)0Qjic~g$8my_j#;zijQzw6=70WN1~O2opO{SVn+0o)NBB9uP&>V z{Sdl$FQm&sE;cS}O`P{?l4xMHs zL=-FKtO>fN$FrmkiSd|sOYbO0zSMmU_u~|}n1sU6DLFI_o)MgB+xHhD zUaLMbUA6`HI*oeO_~q{RZ$l!7YtDI-dv?Wz43$}z;Y5DrGo@dHR#phe@>_t-Mjy>< zeMR-hwCK;5wepj4;^&S=?me3}dqM;6W=z4x1t-k#fc{6FI2c@(ln?WfUeEd8I;!;k zw4Ad9Bx@)yoNemf*tMILHkpu4uK?@lNvrV|7;?S?|kBZOL$h{F)WExnej$o)h;r z5J-<9^-B@P$c8eWMTpz$S=vQu6l8YfO3hgtoZo>&8>YDlGM7oX2_sB>Zg+Zy;4g4v zrOUW-AWrVRE`>ijK$W&d;Te7DrdQ9ZDuc?>Slt78w1Io!kEaZAWVFoJT@~lrETPQJ ziHk;T7kNYziaw?}xHmgMNmmF_y9*OkJ=GH7C$gI_>T~{AfVEYi*InXuxP&);_Y5sQ z23!bBe^m&zM8ohJ8VRCxvfv^)TOC)q9VvFmYFqntB-mIofsa!g%k=QO{S&jd@?s}I zXId=yNzJvGw;K#~BoApw`jQ{cyzb)#=7CRmhJ)}ei?4M8F^Lf-kf})XFK$s-cGe^6 zqTF#=)_45#eV*gQ9M$wNb=9SxUxu5^2}&awkl6$a9Nq+7V5~xsmjE>La*M6UM9zy2 zKgRb5cYyE?2EO&o6`RI$b0r))rSg!#T84Ec+7#faWg_B7>?EA=`>7N9~cxc zgMcHghjjYoM&*X>d{=s4Px8ms7Hh<^_0DUX#4SC7onMLNlk4MPELZ&HIwx%()M)d> z7F{Ap5I`Fd&v-ixc3sg$0B~bSC*wv24`Bdue<{)@;IuK=yE4_%0`ekDytl=7NHS*JY+G-N+AFfr_Nw~qv_H*Vgo@-s zHXZFon<7n4SKM_d6JHkPV2vUS-!j^^W+dM%5u0B14du@G29B{h9PYt7)7b5f+p+Si z!@KZbRN|$46z-)#Sn*||Pis_1+CVGNNp6O`J=SM3H+u{EqvyBqYKO7;)Q<8k4y4<$ z_sjTX&UGaF)XZv|C&+tSJ4W%{yH&f`t{(zu1u=iC$Y@2kt21C7I;(u4kPTF{2xz#H z{Q#!p*{xQR*p@W#p6lK1`^;mSDSG0F=&bs!z2PzRnz)}9cf(mkbQxges8YiHub*xz z!2q#%IY`?4ch*;*;bZJ?;5v1-p|>l74(2RDcrWyXo1EUYU!m1k@)_v5Nz<4Lq)n{` z-jScM)0@E?I5$av^%h|H;y|URrFmEd4mc7m{W7kFv!_i5iDv=JD1Q5?PhStiai6=K z+`4lfY31fl(5w>IRcK!FRjF2tT@J(gw8c#Y0!5dqS97qQb6LX; zuTd}Udgd{4t(kKT?;uzEKys^gU=8L-Jq5dNf7hx?%j|cv)=-1kLABP%l~eetu7~H^ ze7Q{1-&uI(zy(Wph=lS1bp2b^wC2IV?lS(^nu&sUjSDT@GO^G??IqGT4^*VRsO}?j z;cv8eQYj}l`}W@ET@W(;=o=H_P!cqk2PaFr!q&KdJX%ldns&!A{^40j*(1Q>q`YWg zAMk;U8%2+3dT|^C|KpYN8EAJd=blMvcx)r%!)||(c3T-dBpW5X#V3L{e7kPq$I7@G zn6)eVoIos+dv-nNK=ueyP)^;A#N>bQ%{)9L#k(c>otS!+0mi!|p+!OK;;wJwmY1BZbBX>2G z*v0z1@O4tC7P5v`1&eZNl4`T%|LP_&XDRZk?V3;|&EF?0!`-tO_zA*zX*lFBg5g>QM zO(@-gAZNJYSe4?YkltW6c;;GeSapm?ZxnWN7}@iQn)s3%+J<)};>9w>)%Srd^hD09 z8%q$Q5zX21WEEGjPpH0k5$#+eHglco^Zz6#fwpoavsG9k-EJCG7`NB0?7o;4$jrYC zAuajD-J9?Uq6G)SE*D-+p1ll4CokPiM-hz9d48iA>fXic7G^~C6|VlX%1IddbiJqe z>O6#VifJw-&+zR=WPCn#Z!NA(EBVBAAMSP_B`~p;Dd|XjDKF#wcJOl>wP{Jq?6AFg znt143L_q6!q2A+tWUPWdp=K=RXg^=R_OyrH&)u2fHYD>1lED#hOLYxBZut{H=l`C& z;FxssbRux~{xU5bC-hG;>MJoG=_&UKx8DpXe~-yBj)fWbuPLE!4W5{F4{uUy!NBw~{!4Bbm?Sz$ww)wUEmRe9kLIRnnuKw4Pk< z179$y_kj;FNxP))42YdE+z*(AAkXv~H6Nl_(FZX3x2)T91`=HsWFmkr_=jtt+D2BD z^6TJwbbeQ^$zHvD6_E#|!q>*=^_I2@rlSQGk8MIC({-*jL*gP*#GtMaKb+r9>&wCB zLplmU3OL9(k*`H)(kbih@4*UvttEdk45K(GOO8~UU_9T$mFS-vNbXq$QbA!c7AG<} zpRY|EVT>yOr9832a7>dfE~czLn^k_MB=q&6on}*v@kRhx?haGod9wsl-&MnyuTMe|T>2$>9&Vej zG9DzaXP0BQi*m$GD)V{j>pa-*r#tWnrLvC1UG z{n_MN_=lhNhDB6o3G9!U88QD_ach5;Z zYZ~gM504V?x!ygBrnzfRaHxbJhHJJf8WZ<$<41a&OEXPr$EYJa&y)1kcu84-z8Jw- zp-ZhPcJC_=U9ZeVv#Kpg2s=VH)ykZ+4h~C?Cuc*xx$Hu^=_XxUlNh(1sO=NMz205a zQV}uuS;c3odxF*BMJLqY6@E`h6*9%X0Q{;qytqPsaUXj-LIolF@fa!!vV?m8fOmr^ zD`r}YHcUeF!NKB(&=|_akzrZdT8MGht}?dTii0Dx_bBCP@Ju4Wxk$u{u-@= zI=9a|btzXp{w~CIYrU|OJ`CTrn5{LXrc%Cv!D;C-$@z+qD6rpBhBmj#W?qn`6ILsK zTMT9Qc$#2&n$j!5kWnt$(T+&_(Ne&Kri^J}kn&l(F0&d8eT?fjIg-LS$RK)yf?PyF zlIbw-V&7>Wo2=y1-hGzov%=sx3^0d|(^{$f6ma8xD!x_^(rE_Bw4QEq?|1D`;|Tio zgR%n!DM4^OwMop`G&*YptZ@TMsEhzh&)?29Jy|p?ReyEojT^3)D!fTBiG(F+5Gbq^ zuL7t*>D2y#T|Hl4m_}qVzMO6I^Ua7ydeou7Yl#KsFhPn?MNu z@Is1Gy7>-32h0Lyl~p-XqJ4Z|Fb3FZn327S2SLj@=22NVO!Axu`)D z-7maFi~?i{k7vdXrKQxoo$t=PJt&F%Ne~at_NA0rr&v;l{P=-`t&0?7j$`E#>e+N( z+}&1nm^n3_R)WDiw}+ZlTR2zLFmGB}2a3%?V!%f$NeqDsBoL&Og)rqzUa@9aEu_wrw(<>Lct~?p zCVE=pkY-vsOKe{nNvCJf20bxvj#0W|?A5{Cn)isbH&d^w^t9cF%e`(knDI>foFD7? z58j)l$6f>!nS>vyT-t_u-7%y70vu6-vuQC>h|5@d($Fnz({ zj*f7D3^nGa=(^c=xTpC2UY8)CqfTF5%@p^OX*#R!JazA6nkQX!_mKJL)V-?S_qXk4 zVqDuq0`_mtNY+ap-@g@nTmpqtzxx7mF&4_8rhTuZLg6_Os<8hF_6m3=q`jqzd99Qt z>>HE$D`(X^B;eSY@C-kFMXuF(oZEB)Gc_qPI&e;Y(@gm;pi~;xSs=CVn_HYb?V;+e zilC=eG%SWmVss{*adLn@J_YgCFj3Bo%`>nVpfquJ-1_v!Pp77l+c4rocdibvlG3H= zE$%0fR4Pd=O!VYvbKN62yC@)!odhVBPR%E7!gS%`;=Xt;#H?>&>xX^aPzQJD3`|vE zL3#m2G;Nim+2A)I3kk1+3u~Um#3^|J?&J+tokF9hJZlCXt50WN(lmAGYtWE&bmtq0&O(A#VzoUD zYJkAmmRO{@N_T%8TkU!hnsNlvfE%AZ)Y3L^yZOh9ow~sh|1R?<*HH)oxpemhHsiR= z>gPaZx{3>z^MV6y)+#U{E|Z=xkLWOl)MpAA!EktH)*Zb2WBGi-ySF|qj3rkUbe(RrD$9rhhJImLTc++^irE zOpMNolT@}`wAcX{s1QeA;6r*VOM+ehY(a=XpKP&=YvAm#1wv4lK6-gEH$&{gVgm)c zR!Sr5obZhrml6j7lDxU^=27;w!X>?Q52K1To-XgAKaj48sL_5D`JZ5#%%pDxo!(q0^jp=~RGqf1h={H>|mVNP;X~Vgnr}S}I z^yY-(nV&FYdH3rEBJ=nB!Itvi#Ean83)x2(f{aKupci zH^*$fkC_^tr|Iw9YAK!$6Lxm2u$_{a?@FZXiY-o$D^<$nuAhxN$}zZMMz84VIa_Vb zW6@jeW!N!jVa-SDF$c9OF@G$6J$FW$_?5Yu%OpG0wx}bg1_f7Oa6uqXU#y6pwd{6x zX6r~gc7;|5>FvzMfH>P`CTE{KXq-k7D7p^Mwz=oXcs~MdTJ$~AI<5I6q5a#0tetMF zbyLmBP6cFmB3r1W1DHE`9gAtps+1CT^I3ycTk2(hO zkkFeg zm`W5$u%u2r>0;1BrW9HPh~>urN;FZWghyxvx?T9**b9UHJQP^yL&bi3o0Yr; z*%*uXjdo>Rz5Ts;W5bLy4d#s%a~*3vuV+jFrsc0 zTb`b6IM6LQddf`@ynPSXZY?Ol5ZItC9JoL7xGj1=*quctK1@D8_->p~SX>Yf6ZmWV zMz*ZtIlz4S7a% z9Ug)$Wc%m zs}rdoSVIxj_Cjf|qTPS|r(m`xrylhAz=}!-V>K#WJREKgoF@jni%M||6&R?U6`{(91@ zz*&4sWV;_}_SRE|tbNoPT2#EfZp}>T(tDV6lLUf45OQ3)zijwf@$ni@VbI@?8{`Qw z7k8PD{P*g>>KPrDpz$aKtE~3|Z0pDl)#fOGq_B+#Eay}nA3cNl_dV|85q;+={)oPR z^b6mC9YVHjUDBnvCuImOo6Hu1KqT^d8_sW^e?6a@}fvm`3W%@ z4Wv0h`=Jk#z5et7RM%l z8^zQEBAkWx(6p7wJ)Bm8QVYmx>Gd$zj^R1o!{yVceGF~ypW?%}!6z@=|5V6xNk^bO z8kN$r^VFw!w|hsnTEjQ_;=GkkpkLN2cyctMm{+qVtIJe+Zu>{ z=f8z}xz;m5R>O-2ROmyWA3@)?<=@@D1u$QW(v#iaYXhs4A`S6F4fmrN@}l1LG5mHy z6=1*@3j9UqmG{V}*k1v9#Abf$@Bwxp(0~b{&90AlFn*3CqGD$SM&RZBm#II4CZb@L zhGa}QOwXnP@86ecQi3SradqLZu@#CQ4+qF)R{cfxm|<<%a8_zZQNg`m{r%Vsw8xMR zj~ex=wTtwD6ZFf*618yP%Alvf*}@xF?Z8K(5%_Br8aCh@Z3GhpCh*@iclSS0O$H*8%%g*d zv??QNsf_%V9Ry|+JrO!NKtL85T%q(HzVXPvd*vb;hv0{78tt!b`Fr1*<02B}fokWX zuSQ_L6$TQj&OZ->5G5P!yr8CO0mC<;t%FR9adNn9{!nN3)=-u8l38a;K|>i(fC9#K ze3uB)kx(ClleRSuN!o>T*8=P*Z}0WT_P;pz?D8EweBgQ}Oi@I3ipj@F_=#vOJlP0# zwmo#G0DXv{xieKx_@9R`B)){3%GU7L)fRRO@m&Z%h@NO82ZWAc0Pj5-X(QcR-EKm} zVUN@9i+tOAjXd4i_va1-T5Jd=r$q@4?phi8x>0M~u}=Hjd~EQU$B*BKp~brVKS#Rj z5BOtZVTZtLgb+C&{HG{GFw48y)(L=D!A}3)E(vl$11{KPr@Bb72_NbHKN}zXT}Ahu zQTIMgiWtf#;yZAg{Y~;9|Br!o_V1e}D|bKi2!;SF@qi2 zjL-hN=cGeWDH9BcV@#UHy&HRrA&mp&cLdPy?)xG;@Ze@aSpj#aWpSsi2Z@5eUMmGQ zpKjDRKe7-(3CM6(>zoN-Wbho!0fM68-nCt=wd?u27G~rxIE{VbqjdCpAq-OZjYh-Q zegVGQcnI$XTIZGNXQ5;XleTkpAwAHYqR)oQ&v<=t>eGIFfPLeIYTix(!H|?Mq>Yc z3xDg{mY+i)Z-*y(zrC>xN50eS^mlEaTlwFK9P;KyVv)5Lj^)*;0E^{C7Vw0Xfxh8-o{mIKcQVYV(E0Et63Aul@4| z$mG<*pLBMQ{(c>7GNd;J45EhqV0eF-WGVk=JHN7%rXy%dwi``AeaDy~5^9z4ldb8nQaaBHo?KqC?*kpmHJ zfC+W9e4#pD_m4%oC(09d6yVx|T);_*8_Eg<_7E;kr3CYyEW{PXg$BXfT98ZspJx+9 z4#TwjRMzjchK}U<`sEPpN@{MTn<g{pMj zV}CcIC$9bd_pp*f{Yk(%(FKED;?E+Sdx&9(B_d@`125Wwu*z@_NM=^UFwZH zK2ECseHt$YvdqmPWa?=(e%F6{TVf1XUR=d|3i#IRi>KB9_AkifVdpeda}*;Y(O+AK zUJeQm$=m z7-n;Li1~5+5xGX>4xyjN1v|&{KoRG=IBU0IW!c25;#Wpk+VHMGO*Cfie60Vlt|$ zA8+vXry2m-vWlGdJzm<7bkW1NkQv5`Z{0 zL}LI?8u-tJ`~N+TCmuk37eP;Qsk8ucAywcb{r*h0awwmq97xutlYEYzY5kwaIsuR6 zy!njsz+-78+$b@>sdH_qtblv(c-tx_=vLUiasxTZ5F#h}wJ2v{QTXkPD%5`;0xa|- zF(AyEP|$thR{{5jNg$v64*Ee=IM4?P1KPAJ){CR9d+h69pEl?o#63<-c*pOb3@0do zc&1tesC7hUU*Kb$Dg3y9|1h_wE1fYLC`={rhTV4l?{1^M0G~VA3Z|Owr)N-qkYm$Y zb;d2_LdIbW{b3W?E;C>>!42k%XV2ISsJLru)@p-7BHy@h|2r$#mIEJr7f0CVV*Q}o zGbIZ+5KGt!rZDpRcU7>A5~APpx`ZW6813r&m@M zi)h>~yDTj@xSCBzhJ)_2je~+wnLhtX4Mumaa`rlS%~!jDgcIW+*ajZS>P^haLmQRs z=W6V=ct-N&T=mL+z2hA;bc?0m1<)G9$kR9+-eDVWgohdD_UGh6)`o-)!!q*S2cUkXWh~)%i|=m=@DOr_x4edG0L?=S1nE+cap*rX8$IwgRsy z>c`>Z@to95k$zrXA5)Vj*OhJBk)#1_koj$9P=J|aI&U-USC_;8Z)8h6J)XoNXcHO2 z`_NAc3tfL0gg=sC5N>w24@n(>RQ5MyRZkD3xrH>{TRt z?|D&Z%ibe9GyAfoq-4+R%ARFrKgW4p`gZ@G*Yo^yzixf6@wv|PIFIuf@AvyKU?tH+ zB#AswS4M3=v%VrZkYGOnrLT8Ipj)mwZAn}~v=wnix3V07lsBMud1860^KeBoD{&wP zj2fn@2Q}2osV#9IVPyNQLX*zR8<68-^e86APcW_TTM>POLMAU}ScFZ*Bz(S9P4P8K zNC6@)RtQT&Lbz1Fz@2=3aks0PB!Th}n}yHpG63O82BA3{Ah4z;9=qt=1k;xq0G440 z64!Z7zwfPqJhuVd<;I0A1UV}|I(YBTp3sY#c8Il|)af=KZ@8kfXjh^-Uiq+i)@G$m zJuD_w2A1u#R_ui#ce4`n_H*ACPL8H7pJsPj0IaQI<@UO%!r67#5oo9(-zZ+RZ(@(d zr97WXko=>Xt|4>xYFldaZPWx95V3CnDA!3{x8IMK+4{iW?rGtS#K)832AESXg|B6o{2=EN zPQ7|5P>g8EbEg7^&Z=M8{&Rl~+Mt{1{GUu)3F20U>yt+IQ~FY@Tx|GImi-C)>Oir1 zSmA14Uz7NoG4sK4bwDK>FTZz;ii0je7v1X0yVs#j)zF3pB5$N+j!4+t^24IS=Zneq zrZ!_2yJI$H?AzNS#$m}sj0au^P8#*V3th_LxZc$0c7LryFWZ(RV|39~Br-YwIb(2J z^JV(zw&X1v%f7Xgmg94OG+S#-c7qbN$i|zQGXn6Z1V%o6PB~z zbo(Y+6GvgPK>*Mt4R$`-;KO_Mv+JuDjQ%A_kI- zF9-^uUFHx1tqH>kl@>Gf1sf=K-Vq%mN9jx^ZOivN2$u0PX{l9b38)&p&_7QSsN4pc zBc~sOjsG3EhL-loLF+9E%6Cd7R{Eyl42)xjFxa81L8sd=$=kD146U+GQO&dGNxu`kQ4unV)bl;lh`oDIv5jxpjrHJjfM9=e`y z_{DMTF;|dorL8A?S{#qmo|sfwv5xh+iXtN{$TuKSnG^!n6-sSccBjAB0H}*l#Bu? zF%w&7=VUPZ1ln2Lrv5qCJzN?>xY!Z@9!L^GuTApi)EISapfSDx=d{kv9N;a%z+3K* z49Wo-<=s~jTdpis1@0RTYq0De3OX(uRl+6WIMbs)+r3JSXMg7sBbq=;SX19*lOr5C zaBNdDVn#4sD6Ffc9>S@@u`{n$rwS$efu(;Ir26lbt61Tt>WBxTh6An?4vsjGD}J%; zz)?Q&C7H&D?MO%XMO2P%_M{8cDicM6ZODl4R&Td;Q4*L)#5k`M#TZ#mD+R?^^2Rvd z#Z>KB&k2RJZqe_zJ}m;BwtQLs={c9#`_XHynbXz|7hR3N~cf^HYK4`5|2Z)|9GIHIyzO@H`?m&97?k)1^tcg1@~D6ajW{&rin! zl0v=}n&L_{Cvu>vpwU;#U$JzwvD>hu8`9+a=cVdMrsmtO4^afR@=RSP!2AIj^0Ou+ z0W-;agYG%g^6Fg9K_|Dg+g`Idnd;_LEzkOwx+JRCZjk(SNwBUv3w3oQNRVQI?41nb zJl`=%<790ytO!MUh#OxyU{%lqV)J>>9ZZwA0#E$RgSwTs3rNt1I?vJIJIyRHMD&lM zF50GChBhEls!EHp0dedG0HiV5ubFWI4TkCqT!_az*(T{qRJH9x5Pr`FD1F!MWmD*S z^Nn6TWRdr=EA0r28Hc!FqtJ0)hf5*syAJ)WF85NqoE?ZR0lAZ%xGw-$kK#Vql)+C; zO!W?4bvelwCVpnN2j@69xw(q=D@{`rD=fxrL{G0+JH$o? zYWf>~!*?viTS(9qf#N_zD8sD@76L8=v5BRCcf4>m>MY5dwZ7`gF4Ju6O~?`1rmjoB z@}eX(Cmpq$^f2}U_v^RaWe#^o$0dOwY{&8~-r3iw8*+#V-^WXv-#wd*TL}?kXOV9e z88LmOLrp?w1)3u)E&F7$WPJEmifoO?%fdA3BIt~@SFx*o&MC=z{rQJen(a@|f^p!m@Ltd;CZfB*l zO>4M?`EjIVwy4kGYxp_+SKZh?)XHk*?Orlg#2rZJlAZnqk+iyPm3e>3xgW`su46!d zpm`@NIMd<$3vQl>`Q(Xm;Y*j3DX+@ynu;=s9gjMrjk;f!!`_uz?PehNB!Rl|cZVQc zizUDS(iN$_DK79V1caW%h_vPm2fX%f7f=duXrO&rwMXue;zMTjlYFi#W~RbpXeiDM z?PPT7`k;D>Y(%c%d1pV$i|G;yV_`@{YTEMA=9k@)KSuVTTKoxKk!RCHbDdP zvp6(R0@z7dlk5AK!+cu0MhSw{sI+PER^6 zR6+s^wSinStU)#^Qq_~e1{|}FdWfcGK{f~!H9nnk%7g?7V}zPOD>Ph11PU6VzzLCu zz|DX)0#Isz-5V(34LVOs#l#J@Dz~1~%nm*JT`f@v@2Tm_h|f<962+5R?=QJ5f4_U6 z1F=m(>Eo0lpFrw&Zu|>A@SyQ6N2%z~8<5oqCGL;F{WF$ZF-t=LV0TY}Z&+K8yifx` zo1Sl+XR`&U%t0T^WSOucm&$`~4Z$MPBDl+Z6M(LF*r8SfdQzG1dO-`n0gX1;Eem_? zpdeHz`6kZHn29}LxKac#$Wl*lW5&6v9gm;Ma67l| z_T{`hiAX3nLpC#BM&ga+mR3B(MzPXMljVolr2o}LF!e;BJ5|)V*r@&%{Nj12yBXb$ z?}kDQC-~>r(24ZlIECo3BY=nqL_~s?ZtAaHz*za6k8SLKoMLf*FZt2g!rx=Os}phs(^W>b#8e7ap*93nQ&%F zTqOSI%r6*I+@~C69POfT;%`#TqKkofO-^5MmA~?MLl~XRUUwSQJCx)_X8HdXu0SJ! z`xiu9&JLiPRKMHg5&r=P?2u5>-rWPXv~LqAV9q9&R(kG>;sq?wkDMWbG;x7}-*HY$ zL8s;XgRkNGW=f!Y`QktO6nDY^9J(GH^fX6xZ4QnEO@Mg>E}BjD776a>d5}SB^i3IN zAZY#k*Khkl2LsKL#)pA!{WXX#={ejGZSB!eC6xh0~<7 z7RNrd;y(S#J~t=~$3{ZxG5f!t{t$qIBuY{#Y@>X8cQHS}Xha?lk(W46^h-()-W3~(AWsNU{jYp{ zOEw|yib&~?U-x{nq#>~9`zv|f5PhNF#u9=&i=@M=|w6vzBG0lg287`pIpN& z#%G#8V5y>=Lgu|4|Jr%1JUE}p839cdc3v{X@>=5miO698U_b9DkStBCkIU-Z-(_UE zf|denO@mIH*DE5J%Cy?y0F*x0|Ij6v5i)>S^IW85SIgiaFpB)dQ`2rGj9yPbbdf_b zQ|%m}iXG|;r)dsG37V6CzK`=#|L+e5ih@sS5%{Bjuod{=a*)*eoGy&f04D9!MGe2S zD--cP|2oj(ZbX1d$QiFjM_~7X{9#C@*31J2T&;XKv3kC0hX+xfZoOcW4i12F?BkJl zf9vSm`_PEFB%}lL*o;*FK1d+MJ}5Bz*7k4RKJZ!rHpYpP38pywwY?s&?2i_82l2K? zz6ph^*j{LlkN>l(&BMZTB|kSaxTOT3CG@eNLR3mSS*>sjmoRF?`~4+51;hU3IRR1Ei;UH4V&o%<2>arb@5N3j;YXn>W}#-h_@cHKW7x*T;Hc)4&GpKgoGmz zmgK4lr8!<2mL-E&wqiJMiU@lY92k@)pl;{Y#DR0~+w8fH^MgC)n-vbAbL8@$tpYla z{K(hxSKbJJ?Mcw_w|aVl2u$?Ax2_kkGk;(0ufwu<#r}q;c`zPwnLTzYhHHrMvjgz2)sS zNl^rB<;GJ|ALVwza0AjVat=0 zqlS0~Dh_80XuMxO^`_yvj{h(h#H-bCb=KpV5;NYs)+h`#2(qD1u%=7H zwre9SCkT}-os@O1v42OsG-xh?I9*HQm=ah9hJ`$Q%&QNixu~P0qwsI2r-#=UvrwJ; zxJN{NG4a!5+*1&%Rd@8EF|dRd=j0Fw%KI!lf6uC47g`l{UaR41!e)WJYZT%N_jmDc zEPF^~=L=KfwG??8m#XCzdvE@i62dnK0nWn45es$sTYhj`*rnOZBU{7x6Q%HyoMNiR z{RQjjFIByyWBTP;dK>Ez9{rl}_Ah47yg36%+69yIy$4gK{4+SGJajFLFqAgdHh zy)MD&$-wm8tq3L$A2gM7<}knWCE$!rbC8u(0|)oJu|7Z>|GLZnV>3yL zEcFV*sR0;e{FesMV5~4jR%=qm*Pn+hjOsquqxokBdoGoeej@yQ0-m6H2p;FpZTy!+ ziw9H@>}NP~V7Ih!ldwI^RD*=7`U9DiHGW0%WUD*&ywsUccL>5Vz`~}(!Uo&ep2sch zL*hR~eDrKz@J2-)=QY_Nki}6?RUPh|`Eq{h;$Pgt`+b{G|BBTHoXg7J8#sob>T06x z8(iolPEO*zNuo!7Oc($lNm6<+#WWAtFaZ5{#sCvSjZH{WZ?HHMeFu=BOC4JdTWhy0 z0gnrp^hxS0f_cYQ>D!dh;pf|W0p{a4C#DJ`JhlOxwKx<^k8@Rr5T2cd#Sg^&t`Wig z69^(F4UmW#{P^%h36AQcsh@hp-lz3kO11lrju7-iX6{{g%ayv`iEwcK{PqzWLQn(K zTR)y~>-EXXI6qu@T}zKc|ll zo>7eVGNRfA00vwm9G{P8_V{z+vC-HavZR|VT6|pfgu?A~-s!DBxXBE1U^TwET4K)= z|Dc8CK+e)B<0r0pFb+}K=;kW|0%V21h@*A)66e?#kO65-yZT~x2cQP?w`{PL3^YAe zo>jl!?yEkgUVoj%l*Fm3p;xov@d@f;FXQ@gC=q_tW+p`k0?Sj)V1?a2T)m8Zu`$5v zwIVGEQWes@nz)KU@atQyz7KQ-H9-Kme)Hay0Su_kNY%Y!=7oV6(b2$7+}Am^dCdkm zulqVb){qh3u3j3AENWlsa8>MO9vRkCeD2*rIXEBaDzxd+{Bw&3yUGz|I=#!kaxsk>NV9&v_4A=7%M&kQvbxGN_L@K| z!1K*^pWxuUlI<(}GYPD6MK!(O`E6Dj^*!e?ftJ&8(3^x&I{+zpCi&t%&ZPu$R)?8M zjV3S9kWGYXaJmfMP%{lvk&0Z^OuN?|zr* ztaBZ|s^0W+6+=bZSrk(QHHKbIkO;iC!}Wol=onAH6GGux0a@}`*!T1*c8`j2!}l98 z+g079;YDWOPC{=pXl1r9mFe=H=CmE&&RJlO1wk=G&GQ+Q^e<;~NiFUCLAWe%UjYzf z)!BPcN>_MI>NAXa$!xg~KZoTNMN2)dW5b5*<|cW#Z#*kO*z4lJn>%dri;pMim;f7? zJwZp=%G&PN|L|p^tP>$)B-iUZZ|`ul@(K$~(kYv`w*aQr8X&nBg#oc;+d^zu=4u(L5}`BhY#Y2 zX-gjW0CDD*&OcuWA!W3u>2qdh%WcQyQCVixKsRw+6)Kj4&r6mzcK#ra;386w;{jz3 zEJF1_Y<0-evfTfLQ7SJ{N);6pgs;iKCc@1R*U_Ib+ex&ciX;<+bR8lRW&KD`?#X_T z(wJHs8yxQkeZ+VHv%o8_%{--&6dnVK`1aDIZD1AAB}u81pSN!Kpo|T~2O@g*SU{%s z&5q*yoQ6{s#oSq$5mDY_^N#DW7Xf_B^(Vz-omvL!bt4c5(`~t)iA=&I0pr#A=@fNv zGf2hgRO+~bU~Lv@0zkil!s4EBnREd&E?_w7(nH>YheSG`|A-C3@D+8Ss}x%sUA8>554JQC^v!Sd7W6xo1`=vDxAob zyj0u=(sYK9=^f-%jN`6?v92RfCJccn{86yIrQeLfDUb*#;(R?q`E)N+%FCae>n|srV_Xd2-(Qvr|?3iIM@T>`gE^)W0`|CexiT(3)G_aX!EURp)x! z@|EmTM6`m-uXxOAnWi4If9qHY5HLrfBDxRTi=e*Hl2{M8Jbp88=M`Y%*UsPj;9stn z8S4t;wBM}t^2Fp6!>!YF`d#b;2u*k*2`nO`8YfYlB@Q-Au{4`tjW*H(IXE+pn+E1zuu3ybq&AO}5Zny3z1QtAu&7{N~_%TRL+e_ONraOx;FI<)^7V4s)?Z zm)s0M8tL5qx<@PwP`|YS7_ND7B%}NS2ZjQO}tT zlGE#Tk|8+y*P7CFzuHfXY(>lN^eUZulY8bVu;~=u!8UvMb+&D2 zQMTK!M~m^!JJxI-{I!8I?A}^kS7EHr!(I`YarOpYW2$th&vEC3d)#$`!cSIJ2EW%T zwCfrGhirPlJVJFMCjwS}1D>FZ*HKo9;_ zVhy7Y#0H&ROtr@)u0ZcUQ^#h%)Z}+58Q*kL2EvkpesXyTZq!-9#-CZ74nvSbgEtV7 z$(Ea9`^Mn*IL50pZr`5zoJwSd@2AK4EvOgA+YMF#X5llyIWl=;elQjZ_HWs(l39s; zoFD2`JWMoskgsCZL`GJ(JUR98y#q31l+}|(peX#Aj%;<~^=jEjpGb4S4EW}Xq2<{= zRS0Sh9b&bmdNollKfaEX23(o}Eh1ka6c%Im(9*p{YG=*`d{!oDB7%&kF_piYuJ?sg z>tTGrI@@;UVmtE0FdsUU0cJxrnKiq--F`K_#{}t)AaXtQX{oK7$FUw;E|a~588Cx) zj}7W)^h(_{A(8c5T&Rrdb*=seS;q$Pnk??NlX8RnOM?ocjow zP;}B2`z`o3UpM{WkNb@)_!%Ee0vaZN>|(2a*pD^$gjxkOUZE>YH07DK*re&YsNtoT zmx<47v)mFLmNowd0F0EwMzR~uRTOnu(kreyd4uzSpgIHOntfNb0MweAdiNHlN>I>p zkQ+Ggl%Knt?FJ^HRea>Y0)&_fz#lq^w7h6PScf%OYWf_wlvy&lD(CTOy+YTWpDdZ` zSYwQc(7oj#c7-CB!=*l!>n!1Whxp0Dbfrgkegk||qvqO{<{AhXF7eByG9&U0Xl3wG zufA`uX86J<>i=_F^tA+o7AJ(D!_OcW#iac}Xd`ZCGZk?rx;EKQJU*`{kt5-EVI4LqllSw|p5iN4vvLr+*iG(9 zSB~f)l+8{tm!zg<1*Hkl9xi=$qb-aQ=!^tzW(E^cK7{t zP4TKTulSQRN_!(;j5n^Vic}aqsbn8@96FpOMmz63w<@&i;L&~5xN5J4UATl%n~v3M zUw@CuW+|b{0W%`t;k_ zqID7J@yO*>Exd~B~7m{ z-}^wewpz7w7Kfxg!8yB?wzvr(J?^2Z&NtYbUq0|aon^P;Sg%kWS9N4Tgko0;knEJ+ zl=>lsSD}2JK`*>=i0G?ZdHq0(es16U$tQMdA5dq}q&wR@q*Xt#e=*}vFH0O}yZ!(U zuOq{FpfVzG?{~XcO7}O~ek{+})>Nt{S8tR!OoS;z7o@0C@!6Ur`ODDr9Y6G%$G5HG46N{`i@m-;^UNO#$9!_(xFWjS0)ZdInOZyqlTwLqm| zF*1|t++&JrW2$agl#4l;+2Jl#k7@j^C0xH64@>URYD&5)HjtVFn%$j|VvQGPlC|%8 z@*4BHZAGE}(p}4J=sU{xOE~wACaO;j9bGR@WOQr4|K9xwv=-TKG>^+emfoL(v&f)YB2;_?MFrBXFrJh+-DJev={%JUdU@wTzWshKkIuEN zorFchM;o4R6e!V^X#<3#o1L07pfMA0p-ET*^@TIWHA@__w9D?sdTu*&k#(0j&b#@& z&YS+7zbzfY>0DXTp1RC+CrvM|Ny8-8BSNLhW2?kv7F!k2!K+-$RzY{csHvdRpF-8w z4HCoQ?PJA#M(aNs2g9b4Ies-#2d7t1d|UBIb@8ZVkC^j~TTcBU+Pqa(-Mm@`Dilxm zevh7n=AVs)Z>H(5#x+kZA8Ev>(%3u{(i9j__QW8^6r#0YRu61-$8vYK&NNTtvgC#@pf!Gdd_qa{3D-FYc7=C195g z*Lxv9Y*GA@|D4@~B0?-92+RK8b9<$K6iv<(02YB5RX6JQL7sHcItqIWGIy2|C{XxL z$`lXl5T0$gK^UVc;n#wCAG9;%Ld35rIhFtluBOW}q1@2K8~PqQsoacO8(%RA7$(NS zJV4smzyu2!gl2_G_lZsv0^N08dKL|==Pz(~n>EVODNW2D*s?)- zSPw#bXc*Lgcyf54Y@sOVcGY%ei&sk1VH+fZ1H^+VUENq-GLNd zR!GZC4$vj9{&@3@Coi^Z4n*fBE}v#4_U0MhZX2-3N$-xR;0=*6_k#=Ip@&~eUJTYM z+YADH@DKAnq^itw4uimE!*XDWj#JXBz*`h=4fD6Mbi5%_hgdga8!i$ zy|+JoWc~#dn7h`?zVCc1JN$=hZ0pre<|n~oLCRVH9y;eA)f7N7Glw$_tAz z%hx>W5}PK+O>gNpuF(ndMt_-bEMTHOe(v6* zDvBJEBV-$M+WL=a$=&W!B8Unr64}Y?3(G(?w|l(QN4%a*eLKAIEWw+WJ)Y?<6m^Rs zqI0Tcy>Z}b(s4nTYZ?j*z5^}R-{nF1pbuKsaza`C-&u5FdckoRxuoJHDU^$%*tgoW z)NL){a|cY^Luqo!PY)EdQ7hJ9)i-S-DGWi)As?8RU&=V%q-OX?eNt2?(fcJcO785o zY|-v4@F>_j0F>VHvhtfQaV!>|A-fwTel3^LN2r_M=(+FDJ7s0YaPuS#S{w^K=8t(Dw zj}%5o^g2xlQUIC;HpnVp3xap4d~HzWn}tPR9VGR*x^+BlNYlk%a>9M`CNm24wqX z*Bf6qCt;hssgx&$925bbL1vP$-5ldf>G_uF6+i6rw@pwfA{WBYBm8^CtGt>h<5$Y z9Cp)C^y3^m$=8nixhWhyK25WPsb2Tt_BCH$noRJk0_c>@-0h<-EawlNiTARY@?#^i z(&rq(5{<67ru!Nas(i7(kl!?*9AX2< zvt^@&-4;piQWOF#EA3JN!wfPxxPj*_Mseq5|d&L*0+A9;uDaD2myR;2S_3YxG4`!GYu74{9gs!-Eu^~f)-+DQ^zOrp2WYPV z9y8cnRm=K@hGj93l3Z;wu_OW`j(p~oYhxT$81KHqE1+di2C#~XLHqTJ_(6MpDbc=u z2W36Q+R(Cjc2PCj<@xVOF|y`_Ky8z9d%2ruUE)-NUkd+QjIRlm49Mo@aPUcS#)$vg zF_cz4-1Hn=OmHeBB@1RkCaCAeium$RjHP*4S>mxZ{FqGu)EY&Zb4(}m?0#TNW_n=t3cLM#w(?{Z3ByU`* zKPFe!G)L(2!a$7cTRHiRT`W)JaOM!-OV#quE<3(Nt* zp6cU!`x+^D%C2&n+xpEoH29L(FGWdLd_utmuW(9yH_S^4Z?p9Pbl;+HvE8d=!x&Ww zftzg0W9^n=LL{C(#!+LUuE4z+xHo9YcOYZ(^oz9IUXu*0x=I86ibh49_osBufKQLz z-0EuICJrW+`VMb;dVB-WT=G}H@$p3sE#MK-c1Ptyfp`H5#B4coSVSF+&xAihRBUg5 zqbDmc>HNavI&*Fs05rXWog~9{5>i*04`?3?Ezq_NFR3{_z)vp!AV>dYKaF5!8(_Gn zj(jdDZxrlvvhBb=?q~l>;qJCtzHP%7PkooP%FI5e=02kBOn*xoH1}weD`}S(X>`ro z27uKK8T&pAOlcbWX`Nxzp%`AOuJANRoS|wyiFU=k+Hr7aP_o98g8a98>abkU zX*s3A5)euJ z6VnLWwo9?c7(htukpDJRAoIbUHondp&s1*-MUyKRUU(0mUM^Cm+R#(lV1TjlH8XGR zU%a#$#*n(y8kt?-Xlz7-#eNXrphHdX;4txD`*b?5Ox0;RYac6=i>!v)g86o|DOM+H>?roT@9{R@ z%Wa!x5rG!H1}=H(5_e2`Sj8qUM`p+ceJkVmW8l;iaO12-ft6#r!#74jsmB6$UdNHU zyX{<_GyTP}J$!(#D$|7qVIuAJm{)rddN_PB&0T#l7H0j5eH^6tYRlA93>)PRxt)w9 z&?4vHI(L|C&~7zDbwJLtN-IIvC+_NwTTRr6$CaEl+FNa_F$Q?Y0NP@em5bhSh1cAM zCW}2FYEt6)2^fk3lqQ*bXl@;u1e%8Qx7-jtafMoqy~Qb3pj=mJtM%tD2ii05?iP-?VOo@FwC!v0O zROa`w)#;Nt_g`MDLxDi>3E{0-`n)^lj(|JT>~IXx4ekB`HF2(&7mUCSk03W}(PsnI zdoOWyvPT0m6odQEJflbmd~!sQs>r-}pbG{qIJRp&jHJjsEhRBo@;OfPYhyz}^khn~ zi^1fRIcwhY~rfM80-lX zTAgj1Cx(tWuL(63G%7^&-jH|ExFVb?2bB2DfeO{t2by2@-lg`(i1%BX+}xt{U)TEN z#eYuaR_|&I{plI^T4c|8AJ;2I0M^ugrQFDT4V4;SfAF7TOjpUVB+dk|@IXK(Fw;n#kl46Rls)pw! z9CgpefkNTn9(8)!6DGH$mor5Gr&<1;ztfhRGi2&Q_HAO2im`}npG^+akW4NU{K+~pWRpWe>=1ha2u}(lOr3iOkNo*RDmCqCq#=0(zJa8U-8={FQ)OmA3#fKV||svc`gs|-e(W*bkrhswbwbR=>M z?;nMcCCZe^q!vrLUjZvKvo(f=_QXu-boPYdO{;ap$xdOwJhGJVj6c znbG1_q|5xY)U;XP%QcuJ)eyzYmbnSwb;Lxu^W`+jhkm`FSmM?3v#o*yF3by$`UWgLM?j1hA-1Q{N8r#KgJmhHNw|j-o zC&LzDht%hsk>B_8rD;BeX?U0|o=Jf`g*eEfGR;V}sG_WY%YM;dJjT%>|76&!%L}*K8*_6n%G2CwKiprF z6eSzk@KGUBp^5pu5@7`zEoOloJ>r=!6xJW>Iyc#9l#&pDw9QE-fF=C^Ea#OC{t@N}6(M1l^KcxDal7VJtpd9i!Oo z2D}C0;rCvjxv(hZ$y9aW;5@!80_od#%~P=Shq#tdy2IQxwYJ{GHMTmS<2pOK^?>Y3 zK+<&k<-DnPAu=W~Aro4*B?}z4dh<@U2LsWZ^BGM-; zVbx~t4%|;jQq4af;o{#ZI4PPFB^Eh;GAfDPTVT~MFgDF0DAv2n?WDehIzRcm^ z4sn9)@ZM4TY*vq0d9OI z*{IypP1Gy-JL}?We!Fo5@khDD>J*c5&DF+=vArcvw~j%QRoa=OJ4CVnO9%}wCU-}O zoq#S!@QolDi=qe7S3*?}^P4YFJLLL4gY~$f>)L1Nlvjx8>m((%&J5EW`SoQCF^(lH ziPj-$xitE~zs%Cg;$Y+A_c(=$fz2q|Qs;Bft+V_ioE&mjIzr}#=(qkPy;uwH z(M!ZZvBIk2zd$PM)&9!K%a5;Ax}MdbTzTIv$9}*W>6+#Y^bbdU;UashpY&eIs)v*0 zLca4o9ov2okit#{(EqUg9LT0J&CNnhhe;#Q>UmLI(xJZmi}{Sda!jCFSd#lt`U`vn zLpo%HEO})$MnpBsRc_rq*tE?tKWb^?gB<;XUQe&j&E1whAl_IF(-D|aeFKe282t4j zGRzFxMh;LrcBwMwpU);zK?LhnO)1+jEGozgl2m$2&F^89kRtquI4~LO2gbuX`6B2s zEO9$jNd%wax5X{MoY$Zy9=v;%-(C56Y5q3mM4M2b*#*l=(VbPZT#L-GyDT&A$CjfK z3Is-HQ0%fs#=ZFIaA{STf_*v%LQ4U_kDu;3^qZAN~bNy&Gk3rL71S-d7PA- z-z?37C=gt{SEZ>B;k^TLp~l&<_q2VyyCZckgfBVYu{2QnO&qx7&R&Rj`4$c1KSgqS zh8)*pmWr#kvP`!5wG{y3KLg~U6%Sr)x9UKi2gT$N_p)Mp%Quj=lI^>(Qx^k7-ofAP zf@1**q-JPJaj@u;YZee!RTdXHhf{`>*Bi%E;1d1@erk64jcSWxRfEkM<0w-`sUgYH z=8NMDyy0o2oc!HZ_7bi~7B0+nuR@b&WqU}z>cldOrhV1ptu3dsm0n{!9lx?H+ICKL zu-=+u@vMzMY<2grM5hc7x+#X_toSV;zM%DHi-3J?SUn_;<)9R~+kwV$s6(w- zpJRz{P)DsB{Rwdi2T8WAvJ@TN8ki&WrEHCSa|o;{VR6MI{7b9nerE`qbb+Ndz}>^u zEGmC4Y|Afw^B~PrXNxA4K_VA_aY7@Zia$S|bwR6L=owlnpco@mpVy7sxIZ>2(mpl9 zV}{x2ZB=(ux#NZpWO$AJ!9p~f;j%C}7UWGnWt^eo-$^oPBg#B_@Qf;9-> zuS*D-j1Y)EO59Os_20`%%z0J(>g+J}Ectn^dOQ^`Ekb-Ca<)zfwi4pp5lNPr2Tp1_ z9!+((;g*>s0x{Ml-&Y;wJX4}+UROk00tctGbmfTO`-*2|hndMWDF?Zq-=b`3tjR6y z9=SZ@BaWpAo^~9Bf|bQO*MqkH`;kF%qFc0zNNC9&2z-M9LsO$E7p(=v`e2xpRBl4} zfm-Z6HtH3T_@YGX4^u?x`@sh&5<#7vO?*5U_f($y9t{{!Y<%D8X5vOTy$BK-E9H46 zSiI{Lk4RE}E^HlN>8q|f1oa5w9I{OXule%+!F`cCN}ixwbBm5_WBWjZ%uo;j?_fX9 zU@qN0zN?WJf0RgHY{L0V_R$60SZHL~?_FL$CK;91r-6^mk(3*=T38*$5!0c}YjgP5 z_~RyXUTHj81~4FQ`*d(<7XZ;6F{3EsPz(HGjV^0=@gYw5r)LeTmMH{U_O?Q71=td9 z{C|-?3AZBaOf*Pb9zsp%t1mt$qtzchL+ucBmPd%7p*85zE;jdtxEcWuH*eJa(K6Yd z+Kby40fKU<{3O~d7DXpQmsq;N@C$GX^WaFbmAPXf2^Wv&Ci!umR8IZJZDafw=24ST z6g?g_v`#ChyG2PS+D!COX_TxZ|zrad=-$eh{gk7=Np)6krd13;h!oy@` zuaATs_bMzqzp@Lrt|ZbQD%5vQE+G>2Kit`VR(ZZesUyS||4ab}7$BapuPu}aq9+*! zIu@7kIdZNlj$43o9&X{ymXhzIkY-1p%kL6|X5k8I!5>z{DCkHpkzM={W? zSNU3KlYo5G3HW)m*Fx^&p0Pukg-2nyd+KD*G5jYSrFi7t?K>Ls~BnJ1^Q zkK+*e=mrGRlRsK!eb&BeskZgw z5X;xV@O$`U6PLy zEpsi7rLN;Y!GH}6h3hmqvj5lc_LIgvcpKov(B4%`xRW|oj(_2uN8)Ohc_pO7Q!vT= zpn2^L{JucY004>)$($XC8goVl&X?ggvpe+g$E_krbPbAk8;Oc8m|Ug@*6Z5`D5wP= zw!|-4b-?dNCx`qH?7`I+jmamy#IK?SeH7w@`)~uUUy!(^(vI%cr2i|iIHJPBT}``6 z(EpSxJ6v@S2$HepxHv30)e-M$pC$idqE~MIb45U)vL%}f#5*tQC zy}nlekk_+LO@BN}_l_4V8Tms495M{_#S($!~(_q$dWtRH`A`o?5rloiIjbC!>TtF($_9&K z+7f@&jOQdbL3fGu&z_D~Px0qXaUT(y;KHVLx*MG_8d*q>Y93zXLvBD^5I!~!4UNWq z%o=T)GW(V%Nv*H@*Ln4PF%31#a%jSeZtPL~E01Xc81(F}M-1>YIki}}c1k%J9yQ<} zI2#0B`=>|r-{0>^)7SI;q_W`10^8bFR|Hi6i|8!VY=#(n~^xnmLtr-7m0hpk-gmAW?DG~puErI)@?Yq?3 zL>vX#=b#ua`0>o&6X;Ac0dQcZS9J+EJBEvc31`n|(yO7jqtv!&YqM*#xAj6)?mk&I z6aofZ*K*?DO}(uLbug)N?rcPLJQD$%8rW)k5BHvZe6$?%yWEziyo#yv>pSE;AhYy` z_KEO)s05rW3c#_=;E5j}f*77ziIQ=Z)Io`}fgEg!S^~4QGyPPbEgi2EVnYJ%In2Qt zG==0E{!?IGVCSF~|4eL*^;6|AK|c?Y1b#{U?u--(NW`1qbN z`V=xZS{67TMD!6dIM2mR-PJb>Ddkh!ko4UnVaUq|J^TVwH7GBl&wK}P$J7`XXej>A zXL=C7XL>mR`d5p#RxeS>@=h9ZOXf~IhW<>Nlk!EqJf*h3_NG>$qj=~191nRgc|OHtG&0`X*|xe@|F<{CBa$Yo!DwPoNYX%@{Axfnh=1PNFyxORc|ip-Nwm# zv+NK-yV|Drsu-YL{vG0YDiLVAs2>n<5?92F2 za7-rq>gRCZS9tg#pwD{=Vaiy*|2&=~I+Mnvz50HPZ41&dt$?lw=H%8X7dDKc#oH4~|()G&vL}I~zT4V7ma8rvqf+pe$ zY186C%8Mfb1*gs{nEiJLc4!Pk{Zv+@4rG7gcArSx0v_3Bm*XfNOVXw7IM8y+SB`*D zBS3cdaq6Xp;T;NGRiMD1G8%Fz5vWpzbOO3ld*4iS~k*3lIHIb#_EG9<&11 zMD>_n6~X+FBnER}A+JCxmpbwenJF?30Xior54JhXL6q|MS7DK{4Lrx&>H>Ez6mpXo zt>MV6fS^k9=zp^N0(2$IU7GCh`aJN34H3{Wy$yyCO|r$Ee2;t?TBE}yP{e9;D2It@?YsUa4Y|um>^s~n9dRZS zU||@6ysZAjL1qAgw(OGnVf$S%04@0lNcOe@M)^yVNd@I4hDd?SSOr8iZvA~^fU;L0 z72lbZC=2O6%y;&7ydJp;#3tEwb~CtmJ3s*gb#%{h?9;|WWJa2DROy}_A; z_&MS?v3XGfrlBy4zT~LNFav(MSe3*j6hM-F%edPCKu@qK=Mq6d;mAt7e2?;mb*7m8 zF73*K2q8dWQ_p5;=vOqgljHB}fI?WX%=9z3U!r&m1L^?nZ@jI5#gYd^sv`?a47*&; z>*Pp$-T_Dwk99QFn)6z`&(&WBXmOj#Ipa1~P->cP`=^}s^_|~)#1+P#!mt_=f(qX5cW$>yTq68|%Y82EL)YwvLB8kmD1 zDu4m(>e?$OUGx0koCcu6t zLck%`#5(I;8bOemSJT((ooYI*-R&%26~uQZ-3)@zdx0Rk7rgM8eW zhX8g$-}tYGS@Bn1eGX0l9TbKAFHbZI4Vi&ez3Okm>uC^kN)1Ez?j0C?R<8`xCA+j) zm>kp@`pgw0y3$j-y)m?tqGB6i82S#*Z}$?v*k5gluOKaK0AMJ4`WpZ}GzU=F-Bil0 z3vE{QD3V)Xt***-_8#HGt?n9ak6C`>OkM-ev&$1`&Mz9>GvXkKyW&|OZ(w#`dTo3q z%*@-;kI_Nxq_?F>H^|=b7dQ)i#JUhMSydCJV1Mm~tatLfm~QQ(sQi4Ls_>9o#)uL3*p}Pp^*bpj#0hD^*T>$MIhnw@Ey&;f7$TR^dWd>C|sXa$$Zr5l-Li|`h@^5nCd?yM@DUNXGLj2VW z@HSUevNi|U3&mNyT0H@g6fU?eC$(b&=4MNSQcj8JYX1eh<0vE{AX=lJig$NI!ErnZ?)#_@!=Wa*>!mq}N+TQ)lu)O(jovg*Mzae(zED{}*VQQdNjWh97aF*op>VvOC|9U>8jnRlOD zB$QPh-Cgt~7r!zgaVrqPntGa#A2xweqv!|V?J?#eXrnFSx^K@Tj3PyeRyhqtQSMdRA0{9X>uEdVd5;5MBvJckiTDnSxqSi z*wU+8L2G1AMOn0@sMmz+I0P4hoQRflPIu$!bs$CjL6y$kKQzepCvKA0&uuAA`s( zXGQz~J^wF@OnZRafUa1oNrN)(83{1=aQEgQ!vkROWP&_1+d>CvZ3bdu#!VXJrucXkIr#pFn@@{;hXrKzU?!It#qc6`{*Fde9Ud(TP#GI7;*Xu=m~nSikN6h^&M%DiUSyy;oEA-n)`LB6}+d zO?y)zd+(8zk`dXPWX~dGe~*{m#r>}P^Z5P&_b)xJxLnuyI_Gg7$8!kneD6p{o6uai zLbbohd=P9B78B;a00n)rmsQpfoP(hA^mM|lA8s-qacc`rJKiDDu6br**v!$}AdqGW z34&Y@$or(GVTkb{r&%-X?EVQroiNPdBIRCtAA1ero(PxnnVD6K;7LnUU}p4iSwW=o zynJV8$+H-=``Xmtw%EWKT6FPZEF!v5JNdq;>ju;siUAwe2j&YVn=Nf1)@=^3{`K;U zd|yeKHAZ(>bV}HbH0KOGabg%o+`IDjUVCZT^x@^1MvALuWnKpbOn8QoBkg$IrA>wx zMIBvx5tenO*UesDKDIO+l{Zz^Hm)|h6F$znWqVPnGB(j37p6z-+^aw$xrY}bM(g1o zBoKyVK$xA~3@SOEWa(s-`D6u~(EiCubPX~whB^WW?Z`_U8=aec;u+QDic&i%n@yj1 zCBD799c6=0Y;$aWm1WLa-Frkw;~Q3cR(7Ih{J)IyI_frUg4mC^2m0L=3BKi(Z&Pb2 zcfxllc&y^eGot0S*7ei1)dbdC*_NhEE0ugsf&_IA97tVcf*fK?56915t!ahX+l6Q| zRs?jy#ye`I)GtBq>FX%{*T6xth3(2Ma%vFEmM941O^1~brx{fT7zh0{PRO{ zG)RDy)Lg;f*|Fd2YF+7BJ)?76+i^uj+f!`4s|8`w=H2Cdn2Nd%lF>2v=am|-C*G?06u5c<6KA? zYs^3P)%{r0H6I{m4aT%FyVvjr=|MsyBaIrVyx+MYas~kUSgXZl>xBfv4V>nmB7+1_ zO~ZRSSZJ=!HeCc$GHlK$q+*!sc5@CKJcDzDuZLIuG5u=1n9y}jnKlN_qHaj&+NQAD z@5jYIE`yYd^?riNJAm-Vaub`Ze3dzU8YE#mxg7_Qwa(Gg>bsvV0{mm$1H4SQymzN6 z(+xNbSXxF~7BOVw(%ME}@?tVUBV`2dq z>Ox4S){(Va!=|BkI%P!AGWOZR*YV2H@g-b;~$ZC9oME+9C&DSsFReKQYf$r6?h?YTor>h$Qs}1!pIbN#clT@EGh-gQ$mnVy^fi5YsD1j?O;rt#GzO z*jB}h_`YP}Jvmg)TwN>!%Uz*?{S=`~Jq#UdDVByChR(YJ+dVm)hRz-vqvjfYITfQG zpwwTaq@sYwPlSo-ez1 zEF<-XEVb75?#g)fdEzy#6qjaio>L9gt#G>2n6BTN;^tZIN#Qu8zt#$>ixY(+C5uZZ z*Ji`Jc)JEXTS^UkU(loN;?WFYVV6gK8A&}#z z^7$;Lk-e3b9edAn>s=$0@dH&9nOjXBB6ZzEJKOF7?FupINJxR=EsTSH#I|NNDn_d6 zf)4{To5lnCpRFdi9tJVftwK8WUy0tIf#1(KA4w4Ye5G&$byFa`1eIUp*G~?9cjy%u zS3;+xiK7mwy?i{gk`M=+G3oh5vYOc0Ce{a;UFQ!3K{$qe9{lDM# z;RG;9GSEQhz-2q#>KLULF--J7urvIC8 z2a{<3)&C~kzgN)zcDR3SVsLEzZ-+a4jDf4}|BlrEIG_G^r2Z=|`Ckn8?=USyBf-kQ zwRL8N{wriddjWxB2|399lnh9JSsRvw97JEQlt+-xQHigV*sjtYDZ2Z$G{u7Zw(+ZHov3R7TN_@ z$cgn!aG{h%P>qKd^8Ot5j)K*k9;q$47A5LlhIm{c)f=QDhFD^PZplher*H6i1v6BP zGecrsbR`t3?`M5Nx-8e9YU`HvTeYqUdkE|mmaS|~$z75w(8$AiwYxbdd@W0-Fhe3%_jGfbakx1D0Z zVa04R(sG1R5lk*$WGx>Ubb~9VeN$=EuESo}2#L=6%IYj@dW?RzC!UpK&(MU-#10G} z{ICGom2<411J*#4Y+(FD zuq7Z*)*#*OlwG*m2g@J>q@j~Xc>l6eDO2IngVUSml7@IL7aP_+0F$*2TR~+&-5^Cn zVVbz$Grs>^I1`?sAsLev%`M1+_Chtm7%2$!+{>b!>iinAS=j+#mZ!b<{|K(xi^mIxHUZ zbT_04`~GG7ECD2Hx=|C*iYc;WXue>aFg9X354lSo)p!>kow zFGX|QyjJLX&UyT~Lk$M02AoG}EYiP&orDwUNZAp5w~%`2X|{E!8t22##Ch{H?|$m? zKX<`9h~CD{^kb*ks{vD^zn~XYJ`S+n99G>jmBY=Z!9ffdwscn!UlhGvghq!kcOEwf z_4gP5zP3Gl0oe=kGZRoz&j;FiLBEKg z`~*0VpvjA@hV0Dg@8v-SM6lpHl;O>QNQ`{|uQ=3n0tx68&4NZq&fWsW(wC3V3KjLY zBLE1#@mqx$3|`_s7~q*>22&%DMYpUIDan-ON{I{B;C)O&mWDGygqY_Wgue=Ub2)9V z7JxB~6ff^vUHAopIW(1k)EQf%N^iBg0nA;Qm8Z8(x^>82Xj#8@DWM%>@?-2A#>hCJ z`ee#M?13rv{!ajJ$~6NxehNV9>SGp^ecFOR0<8#a|IYua^&VaeUg8J}%gE$8c-?6% z4Od!%|2{Z`+{Qdyo&#b}m`XT){^|iB(gNA@V_`!6K2GG2SB&;-H1fR9u@2|LZ z0zn8^0E(dK18sC7F*3X70f{4h0OvT|P2gc)^01p9Ab$wFgHU^~k%HUg*#f8;dK%?` za6l1gD-vO#*)Wh}Xd@OomS7jR1|a$EoC4*U;&$*RLd}5C)WJ;4kaI*XRYr{dPE$|IM(<)yK z&USt-4J1mz(MrAFdI^KaxL$V_Dm_M!ke4Z6gsS}joHoB;H2>LGQY_W68m}=BV{Rdc z7h_|-)&o$jeNOkpn@}Be0*FX2;#`6lMyWfnbQvI@E;W3yDvkHRtn@}g0Sy6kC z1kD|RRVg?C+t-4%=T>wqs1&aOZL<&JyOU}$73jDswZ>F6E$@?dsMwvC#})hl<{`oz z{|lvbs8K+aNSX^%YD|B^zfKdb6U6JNnllZ-wl#RMX|hMJauWYQmRhABQauF2)KrFN zpQoTKDW5DhQ~*$hc%+1qZxpWEO{AklX$+|IBH-fItbvUtXXR$Cs_X9d1_LIW5ejS4 zdCv?JtT%~C2$TBJs%T5d{(`04p&SQn#?luHONfn~0}kyS=z24AaR1H$bH^XuXla2KKh4eu)2L*KdZ;q23c2C8~HLt(5(aIvEZ* zZLqq^0R9|LSp^Kt!1rPR)oFpO?L3&qQm5!#_^{l^kQ(p1Y>H~8rR)to)dMm}XQk^F z;sA=yBf`A(PrUN`*hBVc2>;eGr$E;YfwY`9L^L}GU|n#A8Qz>h=XM(hF+D2;nn3EL zT#YOyHZ5OnVVW5>?@_l~cL1pn@hLGmC+-26Wx;bW{Bs|+NyEuuFvzGfc-G1HNhg9- z$HseIvkXLZGC;9ymsam2?X&ULOSMq}P1uA#V5yq}%vQFK6U2svz}U2c%2}B==NHQL z(B>T?o-lUA2GIvbP$8#hy5<%@I@0(Zrv>xlYFHXK@rA#7iGX`}@ROA5cnZ$=~3MFbw z;CCl`bwCHtsY=+P&dRSMkJV%)`XWc%1`xX$Knfj>cPTy#z^q~N2RIs40HZ}prT0A? z03oC*1enKp7{wxf3Q(dOgSxw87CR@D~qLsM3_y^C(1@F?= zEheROTF{)rVpK(uyVwpVT%yi>mnp!T@X)YXOn?$pKES|eEtD-*5DbD6AI4)xz@dZ) zXEMXyT?C%&uAYc)rEI(?Lg42qhfTg&??T515trvS0?tU_63dI^CKX zCkCjD%JpI>D!bU-+7OzD?nln7jr3+`RT{-D-_frR>T#-BG;*pDKVRk6ZlEyt0->Gx z)UoEZSr1s`7J=`QW2^+rQ{kEm$ZB^!rn{PzZah;1@G+L*dM>G;s+o~Cm?#-M4`84o zz>WzfVVbC-lH6cWn2Gl_cs0FsX=Gz|HLWUD`L&DpG%T6-bHr)G9}|~}+H!&+jJ1`T zXyyNM%oU)gO3NC5DK7=ED11UK+1s8H>vD+)luuXK3vpBQ&T?abIv0WeQKE{th&?xR z7YH?(MC~=6vf3~n78b`(CtTJ$aGK#O2mUVravuao6zS+{2iKhw5sg|#M< zl^r>Hj2(lm6E_`Pv=IE4Q{6cV5arFK=vG-h%XRw^>7WYbtqxhfLI9{3wY+K#j}9PY zR(x8lbI-c02)vAY1?^{V0ahRqIdRh0pSW6TJ(1QIpWb00Tj1wvEpX?ESHd{z`Y*VfL0>+IC37_q{=2~PSRT4e(^p}m% zp^gfXLOKfMJs!@?{76xO3t1XjwW3i2TO~rLxE+-)eHky!QI1ul*{8C=wvVqPbnb&I z1_ro|hASaaSF+`%@=_Bfg;O=cf(YTfqk#~t7ho%rnbS-`33cg$165RyokLmo9x8uJ zdAOw#JFwdk2-UFLtuvSI6n3etpk)A>NbQyvbK2{hz0USP<4^T6Vco)bO8mM=O|zIr)pcjwuRV z+R&wWyXVAm+>;Jts&h+6D#N>6RWCMK z1XC1zSU+;AFD}}4gRo5}v<4;SLCX#-4cQU0zvKY`0#8ilPi z;i6(-+RnsIs0;GHS7+tR+_{Oa-*s>L;e{tTu*K7qFc|H?PP01MrNoAZw-s)#^i_i| zisyZ-Pkl|I_#+ogGmlr7j|;q=`%KJyQb)aQ9^i#JDXsh4;AS}hT^BO)KjtBRicSyH zRt->CqbY1=4ejAh(+jbZ6{t~V3Wk*@P|hGgUjS*?XWo488D9bG{`z!|9aKU!?ifX}1iG!z>?(BFP-u zTk&1Havs&Fq_|+TzFNKHMq)qMUr`mbtl6;Yp5W<-4}kOn@dDwUM1#AKwyE?g*j-Td zs)BIgnApsb&~I}P@LK_tUcS`FkHV!PME)nD^gqIVDXN_2b9`(aOL}21X|D=T!6s=2 zI@2GV-ogFA4@KwNi{+6L)UJuanWZ z$G>W`_M~f+57ot=Cy4er518Qq}IWeqc zlp*BCG|LjfkV+@RyK;W>JwN0KD?f|v*srUK1gWUg#ES9D$7`!K%_iA&DoSYD9M3lp z$TW}O?@|_7_K~ct<{s~bBilG?&jK)#D-T%iPO*0EMv>z;PBrZf{^LBW5-BYde+BAjzfELk43d?!y{pwXs0bu3+$S*vct)ahEwh4I(0r8(6_ z?0z}7mxJ79=5mvx>#P($XBH3R;8n+hr6jLeCw+&oI%K%>5srq?JOVea^TS`4|BNw% zSPo~aM{#!9A(^#F%#o1S6oQc1Hh+f_Gr8SPu3ef4S+{QPM^g|82Ny*PRlJ^j(-Z<( zt?AXf?JesTL0PhV?Zo$$pS8&1s4-H0p89F^=eOJy#^Xq%NZB?13j4HzgQ}7U5vAIa5+9|m z>S(L4TaUCK%bGEVJ{(Hh%$;lQ34ZvsL6Zc)UlOU~eI8DUipP`c$HMKI8jVPHJR0$| z()?Qh<%ZMwVXCHaLIVM4ze`IaJ(;?Uz8$^CQ)-LRJ(v(|<$+Jm-$s_ESi?tyN1D3P zF*yFwbz*W$)~0yk*_eY?mf`a z<<2%Ua<$U$dmkN*wgEVa%a>QfJ)7}>sdnhb0$L8lJxAo~!XBR!6Kz+k`_6Gim0JEK zZ;GFmXpoD_le0p+6AB>V>AL`)0u0VzAyb4ze>C!!Wz@po!0kV~0pjFX&Re%_#8z!P z*rOCBD+7>|zo6wzku<6xAA*_Hv%VlEf7t{elCgR@h}g>T*YI857VKi+0H|X~5V_gi zi&RAAU%iD~1(aOyW+P@ffC@wBV#l>H)n?A_l_HRrEFW)$s2TjyN;|v)Rx9L$7T{C zhk>3hU1N|w`94jO@ve4HqFlek(vU&6Xp3Lyk{>os-))>zM}uAJ5z;`-e8K9a?j{k< z7h-|+PM-BU`3lkN-u+U0ygZQUM3`_PFPsWxEAK%*@NTwa-lQ}F)i)O=%6uXb5byOy zy{kjGcTQHs?eqg~kAEgmiZ#CcPGr=Fac#qea0Fs5)&z5Q2v3aI-RqDn}outKP%D5f1_I7u6n3q&*?&W+3aB<=-Ojo5Oi*36JI9268 zI80S_Y+G32KsXrv!m9c@UsD$s4Wp?ZGhg*|c*md(j;Lxl=v>4rz0J%nzu1#SxeY3X z<`90{@M&`N3r^e@$Uq;k0F3zu!=?EElClqt=%PUM7|LjyxYW}mVoC+G#btlC zbik$~r)32w{h=L+?3*IY35M8p6zB?+i(nqXy*hsu3X{`S95r9^C_KG$;wH@W_u-$1 zvk^cnweSwWsdk6mDw)hmQL>KYIim!n(`7_bx?y7sG#2VY+!5CuHk*97EGCa{F(HgN z1h-E1j>E~LO2$5W)|({sZZm{=L!E(0aZ+YRB$48-Ra=wT1EFJZo11Uq9!zR1upCfh zQ)NhVjKeYU$TCpMrr|TyOEzdF_uK;dU?r6>5^nTxf!sgbBn5f{8_(i&4t<8SY`*_V zx~KVdinPhHiUu8IWhCJZ!F_@;l0vjXGpv-aD>nxdW9v^@UvsSR!_z zR68|6T%MWE7*v1htIPMe4)*ApqJ}Yr=T~utZr7BV$yHk@y_h3b^>gzi30&O`*fM^R zymT+cVR@zNg4|^#3UC181u^MtM;&&8Y|m^S@(C!fSvF(NHHA*i!SF@%T6_cPj&=$P zhSu~~-G}aDKT979tZ2ktM;3$SMg1*EMKdxQ+!NfYGR!!neEx{=p z_S`Y)(cFGP@ko*jcTErH_)eO^i)a-;MA#SH!!2hu6E{YE7G9v#LkMYtu%Kqht=eN8 zBb9P`TA}B|m2^xbRdBUx1zF44mJ4BdR5>r>^pI*6te`%mCfU?^S-I|YETYj%i0Gf# zCW3NN%^Wew{D&8pfS-7?iy%NNUf4NLFD=OBp@|i_SSsK1*%R|duPH2mdXNTz-SAzz zep$GCCF??JR8?~pwHWvYs+s0gy({8%vPX~T>>jUiP}~)q%lNVypiCh5egt-j?XlrG zfNuonzE`n1C0m;Q@u|pKgs$7SdOiHBjz1(ZjO9UbHpGr7JyTgOY9inPDIP6`{7NLU zTGwNSFlX+HJQ7&m=@!Gqu$_eJG8S0d9*8J;Jh_8(c5t)3;Vv~`GF=p zadkFUz>e1Lfvl2Nds1En&yv9oP^SRhAz{ROP=D+(YBuT$f*=L&C6O{l+Jr87ZVQ!23GYe7jNx z{reChxq~xs&-GdxI7`vfe)(S?>;y)v&)gGVG_$E(F2I<2vCL))Ec{hc=S)ge42{9h zA3$^^Sov$qYo*puq-qfd4iREau3fUa7y)^*QLYX0XHLk9d<=O_wT9$LAf)9X9n>_A zofx`ue63oV;m7+%C~eLS>8RneVRUoSc@*51U3R*@TCZjS62Q+>yWbt6t-4!#qwt zts6a=sEjl0w9dJ={q#X$=af#5l5Rg#LFU2h1&2lLVbO6B#V3(S$ho>SQq`zkS$lUy zU?deT80KvivN&=~2y6>C;+7qrZ-zR@;rMx&X>)t_^L;?)ysohSZao7>PeoM-9wF0a zaX{QRLVly5voS|hyLO=xB8`$I)Bn`$-w1+d=-x)V)7~qtCs-59%-goD%a`7`n&d)C zn<2AU+Tao%i*><-!*Hbp&^Q|s!It~;GZp}05B z@bHzM%b7gZULj7WVYg!YuRnM+du*a`q-M`Rs6SosLebo|S!RpqWefNG2(ZwXRy#Y% zb$DiCbsoA9f61TLBHi4Nk}O9sqr?>O@u#^6$vJ!MpJ;WnM;OQ4d4S|S6t6b09q~p8 zWPm0MQc~X8@&N8u(t%XU!9>L(f{ZJg4e+^FA1vTrGBXhuA(l^*LB+UvH(!0}-mDL6 zA69C3qz@&MHn^4WUhK)o)X$^f9Xs7(n*8~EU~DH-%h@!A%LR{5alGv9qVL}zBIqP{ zL|lnJrc%bc^n#pS)0}%~lWW3Yf0;=`3_TkfT*y^xjW43Q@3>}A+2mutH5F|^im07) z9Q-QAdS^oK5$TGHm=1LoS!x54XX@`2As=iN87S-c=6pth8;yK9l+$pIHhVKEk3vel z7;dZ45A-@^4e&gZ^{hY(rT8&#e*;;+j9qD{AOlJ&g|P=$VEmuOZsr84*IUeJzRD#iMD`IF#bl6ZYHDk;xi^kf|s)iZ0gjdo!=02Onvgoc@g1PSH!;2=@+ynZT1deRA^XNPjVw6GEr{j z-FeO^odBuTHMmA3>J+@0n(fYvh_7Pk`M3{CtlrCaq!?8vni`-8@Ji7jK%a5AXhDCb z<}C%!dER-RGr4>g+o~4SN69pTdVLM*9$@6YeE7}>Pv|@j)^$?CL`FB!EhG8cQ}Z*% z@&j9yS#^D}v9Y$T^SdRJ0!u;!UMT34D5zNCC};#;;-=W0ESB~Y=?jn;#mRJocnn9D zju7n*6=kdNNC6wg(VuTj!9WA9uc;DW0UN_VKRWy|DCklbDS6Ris-}W*3t=)^otPqc zNbC);Mw(3_$Hl?79GE}9*4vEMz)xds>xH{M$IliVY7D$oz(LC;97RgUZ}Xj3CT~Mf zE-yugigxF`0j>=$DJ%CKtjnige@n_nK5k4(+;yw;9los2`IyVd)BNXW5fFR#V%dQ8 zyz~v^wnCls9L2kY&;$yi2~9v=#EY>*`{&`Vp@C9_l-U|sY(5LQhIY_B2Os#*N8AFv zggra%_*ua#H6ff-3aaS50~Yz>uE-%-EkO6{`KS@8w#3_D_9Mjb82xY0NPvN~3tY)$ z#z>3!t}D@=pj7yRu7kP=Cb%3-Y8fft^g2ZL|1iZK&3?91au$xNlfmuR|Mh%7$54^r z;bRoiBCM0}QAE!e0Lv(20ID18uyCch??3_k_ISf{e>)J(-+$P`O9lW;ENmy$US5j@8c8e+jOBNcyf&P3}f+J{$QqVI+|X!3p6qJN8sTjagffqz!dF6^=ru-Zjm6` zYKLw{l6g}&TXxc78z~l1Y&D6tg&{Z_C%p`p_Woy50Eb!h^{KzKhJYT^yVt22W?ve) zTk6S!DV!jKj+LrI`&9+^&r$M9U5REV#x+XQEq9Qt6ESKGN#s6psKd-E`@G}ZK=|FXR5 zkq@+Z8G?DxT?&NgXLv0lI-kG>MFX44!EX*;2FN1Q4CG9nzg+}Cl&sVR)PoL8aKLVk z;z@T9l4w0NY`8kS8c_n88W zgKwf#LW8vSlL9v!zyBQEpDjI4V2)}v)1K6fcF;0ar`kyo2h#ETM+7A`H zgGW}-LIbEagQaihpDpqdXGZ$mws(g6cb`9`g9mVWB2@X{j|PQA0YtgPs3|Noif{Ge z!G0d{90g71^k-$B-yia8yP>>>Oi=*Jv6*TRjs`t@b}#^DQSe8y_-wKF{`el1W61ss zphtP1Cn(|f?;mW^3LWT>7}D<8d1ZHKPW^hRaul>&Y>=h?NHKx<*H2+^o)ee=(lKEW zV3L?01-$?GLU_ymE-iu8NS};vbm`Zlc{kGL>~7AfI~*}R`^U3^*qbEGA)VgoZ@AO! zjETQH#JiuW4X$YYGsi^!@>L0DSZ}qwwDWFBb{!+a^F3%wLo9U2VspungW2)B9ktlV z-;~`o{fy3Vc%I(C&VY&<@c{3czYXrf330FVq1+_n-(5kuhK|(jd$~{!zW3Kyp`azv z!R&FF?8G`Wd(NXdRfl46cO9DIzh3^i`o&pbYG#F93x4zKJqP2R27(AWtB;6T4nOj9 zak%paEo$W6xT>21_-R_A(-v8E_A}CZQH91N3wxSvCPP_}`A+dSp4s zM1^1+dLTt~aAbMbNr7HMO?`Ob{%WzpEwo&c(J(fBy<0Ivhc^{TbY#hQ#voeR|7}x| zr0hl`r=kxO2&F%0s|p3`B?YzNh_>?wi};@giIXFfq3#Ilapf4%U(=4j7|oEv=6=GX zl}8CnfAooWJHf+3l;RupAP|sDa`1`Xpcua5bphQ-^MQ}lpF2Y?vXvaiFVSeR7yPy7 ziyypk?Gu;ZLRlEi<|1n)*F7&(EP7o~r_>0oNy zfy*lC>rcu15$67{DQ}|_jNafKy-Rv9KmJ)d3RLhb##@voM-SGo_&0b2;&=v{Umboh zNhzO2!YsXgZT#Tt2vU^L?B{6r935e=SM4W@I<&X``a|(Tg6n$EQ^LYXU&JD)WJ0MI zSce`)ipC35C+W$t1)o3WcPB5hWkIN!vG6I$@%La;PNIMH3fw?X*!umW-+KY)elJ5J zA`Dxo>(C>F_(0Pc=#?=Kp7i(Eu_E8%R9)KPZTGuf3fkzk=p`_ld(`M=@c!~g#1hDC zrm!LAJ7-Gp`}g#W-hd0B4lRZX{C|cuzlTbkFOWP z1rY`j(n`Rarlr;-avgfZMKnVy`fpyioMXrS7+@6dv6JFnOrpwC_kTYvK?(uvTB;4= zZO48;?eC###(FE|g{$r5-{;h!`}@}fuJ9N29yln!y7^#M69~ZcY#>xd{oMs#;-%nn zg#zM4Mh_ImC(aPg9@^9XnK^GkkwZuLU8Ek25C;|e?dDTlU{lNmM{&gW2rFdR8lIx) z*=*eT!uq=rzuJg`o_9e(tlVOJf4+E2(E;ZAmR&72T?9B!M}cx+%cD~qwcMbH+#W5v zMM;2*2AB&z(8OVf8Xz~sssUHynUaEG6ETZMFM(1-rBaln(C>jb)K45}xhF=ISgJdF zBihemiBl${BMLG8*0Z~Sb8H3xa|;ysbX3lOo__jiP%b+SIbcLexq`q7zA>am4 zIbKY18?QdF>kZU07Qo#Cw08?^%GOX#I&0T!=od*L;u4ZC(5YLGj^u{8tcQhHAVVJk zMa+*Gh22`JgVFsaf)qA|98bQZ{V~7_sUYcItvXBDw%<|plnUTKBF=H*X@Du>EHeXp zvZVSVBD08Cx^k6L&9(X}#&cU_LsdcZCT3DYkIDr^b+t1U9g>q401dK^ z0Bes8w#x58Gb2@1o?2ZaaKFYY&>!|Zg}zK>5GbM#2wl;uHuBH0M^V*pB^*9fevP;| zkiXDNfc1tU*os8c-dg8JS!qe7y|zHEs0DC;T^beMts;?K&Z?RVLeU{#_xWo zTS5Hepo~B|nQ-rTn%Otmvvyl&r!6Aoo$$kMqad!PcAGP=T|JE@3@-14qqU>Y)K<`8Lp(A41@x+k`CF%Mfl`dxL1OArww3I#Ma_`vBJ7?eH0+!$3rM+t0y?)X-FynR^!e2RABN{ z2Z)Y|Yw^;Rc1FuOCpD}!h04V$<^f4c-x)zQ1$mL!Q zR8m(yNt|;Y0SeiTcdmIYHUQIcU1%GNC6NNnWvY%+yD1B6x^w7KQq@B%mH?nR-WfmV zhB%OmJg;WEGS)%mM?MyRdneYsQj?V2@S3xXpKpT7sahosno3ORPa|fjm-V_gw1Cre z5-p}tqrij^P3H}}T?LyeI=b+vExM$`Up95ye?qXBNhwLrDww>hC1GbD^xRJ4u|km5x;(baaGXpy(9x&S^McF@i)om0(vJ! zv)6c@1WHqeV(RpA=?z9P;QeJP^TWX!xH7GNeS|nl&b7P}ZbFj)#F8FhbS5AN70t;I zWjT)iz((Hn!8c*8-+-qPe|G>#m@QDz1>eLiD{Ha%#ADRr36IdXcapYgd(m{Dv9N7< zC=NUJWa%E6>Wdjyw&tC<7Avuo#BNuKQ@1=Gtd_b|C?$Qo}qp;2_?`K)sSSSp6bEQd>-hXT9Ev<3PRt41R>QTkG<4`v;^Kz5mihHB-6r#ycoBhThi{r^rQ?0mOThU1iSvEG_XyT2+cOdeP5_;7fgWu& zjkC?b@Y@`CJ!^GRRr0xY zyD&aiPdWp$e3ohGE=6;pSXY!MMC-#8i3rC=@kbZpx8;TrmBV2#GOFZkq{>t!W#!0d zeR<6*eO&RCz}x2fr}J0 zW(JD0*FU{<0~jpVFyo6^h()+t#r7(kLC;b)&Bg)nn)em2H-X5+ZDy{3W4mZJwC|QF z5Iy`BvE6U@*22IdHM0X$@kA#ziGuSsFE6fKu(N*DP>L;bNOI6-SFlmE;)v0AI)2;8hb49D{h(GO#dFtv9 zGHYGyOsfz&u(PZlb=%5c66Tgsa(p?C65UUEQqp1f_tbp7OWFm`%4rd=8tQs zd}=4Y!i#uum$Z}qL2rH}3qw~%MFRPH{4*bo6?oPa--gg<*ce#Zlh9A!XLp8{Jd8bn zKOPNn9E)nc2#4&t18BdK1JlJ6qcGlM^Mej365swdRzC@B(KV8>RvOteXA_F70_NSP&%G}tW2r=;N%@O4GrI;ox2W2eoDO*HV71fDLRKW_D5>{m@5s7VSi0m3^-s zyLm;+5Q!b;>(o!FFaDXn6sHt{sr}upL<?$txi)`rkGiX&x8qk+2k)-gtO{C5*By;KK*&Yep-K}>eY!+6_3)9 zdr>2sgxYi&cGJA8k;vitxE*^<57hZE09bPK0PK%vL_vtYRX3hBuRVYkJK6*>9p_Tq}% zPTrmZ0v9Mqy2eT32+_5cD&4mZp$n~eM-0Ex3)kH5KOH;7XXymU4id zGY%3~tq3+10r9H5)qMROnf3fo9#W1RipoUcbNOz<_B}?o8Un%-UwIk3g*z|p;_(eW zv)%2rZ2RVefh+t?dPS->$g;n@m3QD?tK9n22?k?rUaIS`7#96M03$!gT2`=oEEm0A zZ2L35UP^i5u|3%w41Rz5)QT;omMH`f6FrhzaaCnMl!p*t)P37wx)MBz$g(X@C=lJ? zX0FgnbJ?+-w|3Tu1KoJZv1oK&-yfa!{^4&V6VJiDeCq1N>(Y@iW-8^l!Yos&-B`!r zZ=xq2O@!Xoe*fgGECfOei7(GdY*47|eSZ>UVD|L!eG31T6Kp(1Csd(4$|3KxEc64w z5Ya$0>Kt%g0;CaNtMJOB^*6)7(b#78wtk%d*4(*r!i-V-OUl#_dCyJd=>^4*Y=I0B zRz#>I3do-k@U4Bo18Q-VK%B?@9f-!f7Xr57XxgPffNIx<8{aHI%rpszNT$@ORDH)x zHz*D?UT??$BU%=>Crr`SZDFx8U%1*Z7N)b2WO{KG7**^i)FAT2MDC%^XwPfS7&1m- z7B2YOb*v*`>;e=g#0nR;KyghjuxdH))7UHFA)+&^%|zF}f?djTe{y|4{Q|^Pt0dcw zK)`=h*;*?jTqi@}ild&aU^Kyw&9L0B)F9DQ(CgV}6dnn5gSQp{y7X>ZzSMcC+F`ZM z*N1)U=3>mwBSuY%V^Q~Y{I8@UY&w7G)HO|MzIg2dlg}-8)akDiMU9ECT-~aZGh0Y%#mPd)M5eZsCn~f{tj-<2{?>~k zXXb#H%=Ikhv4q;_12nmpPWS<_PLgj6FJClUoQr(^gEsiOBLu;;T5K1ui`~ts*TtSZ zkzOk^KQ0+2<qg zyWT1>vU6nW^gKVCj2H=)VgS|Rg7xNequVejO1nt~)LKeE4#FQk~zOKvD+C%5`J-V*#>+ntj~=`11XgtET=ZmP2x7=X)R@aV6+&>s{R1 zS##hgoZPU7K*R5?s9AlKUsTib$Galrh(EpaO-Y*$J;mALTJOdIc?$O;Q%})>@krx9 zfwA-1St^KU!_kU>5cyTVNc2Gv8)F$AN^(1MvTy|$uHPqvue^XwQcQBZ?Tv|H;P)|u zR!{vD9P@keVP>MzgFysS0bI+Y&naI$^IeV$k?4bc&b;;tQwy|z3OQ`ymc-gRV zltfl>^d&bvP-62QBi7?+hWk<$b?Zg{*yWd@PE5Hg@D=NCFJP-Kd)dm?$}`04m+#)F z!koyYClhwcDQ=C>4R>c|E50jMW>ZOSpS^cHx9L-EoMPydsCkr-i>K&nr}893Cs_B1 zy16plrz{o~!*Pwe{&w7w)nNlviAOO4C_FA%F2>E~VQh#ztGFv@26OxI114}$iGcV*T*Z`q3lomQfrn~FY(OyoZ%OgTiE$@Ljg zGXM;W`dJC>J~}P7o*}LL)gGcCx!MBD#WDA^&HUI_#sT8C0tuanwhVUPWt$Es^F^lk zcRj~fqAe@W@bwVAQyDJB2~W=r@{4gUd_%4*HHewk}Z!(rv4JNm|?E5jHhH0az?t{jMpX zgcm0fNK#B3U;)XQ;Y;@5VZrDVcBwvf=L9DLC=!nz|Da@nDyMh7$n=wdYQqQM$UFCp zFMNI=r+ivVxa&rG#Td~Ed8+po&ug<@w|ybJa1A}6?WJX!$o%%BMT)B)WqU(VCh$U` zqq@EoQJVbq?&4UbaD;_-qQ;8CN)PXXYPg(R@Os$X>1iCB#g`U{mklG@dmOyiHc?rn zfoo-1QynDxp_RL;2% zBD0uOGFY^(kA|eA84vR#Zlp%`f-5 zTSaMq1mIT-EZB1decuNek7e$PUjJ&}$G~C{S8jiYg4&?fXiF;Xt`PqFzYL2w@b~Oj zDsxE|r3=M%aow9bF@3p%PqmjjTC;`3R183dkPWa+(O38d{5kr=C0zBdQoWHZ__}_k zu~TootiqM(|MB(KQB|$$`?n%&SfGN7GAZelMo9ssrMm=?PEn8s1rbm{>F!2Cx)H&k zrMp8(1!)%i?&;b4oIPIszW+JS*#mK|xt`~a>-tI5U-17-( z!oOfS-J#a#84^n+f)0Gc^DQ*VHU8RAx1Edvus3Jp4v_AmZ2*O!7Kk0wn<~FC~M41*;B{Ho&9x`Cuu0vZk36+OSO|TTm zsC}=KeWV~>AaqqVM!d7iM%iHX%wnLY?Ip~2C)?qwcC)A;_)sGg)`a3*>Fnq4q3h{% zd}C_ot$UB65dTF&xWIrOK7r^rvu<~e@`zbs0o$?4^w4;x29nesvhuC^2(uAnwPPlS zUy~bTH2rcbEm*JJ)A_4N9fNyNwR;1_!KlaC6%1?cjLG=!_#%5e%ArR&pf$#WF7|>P=5U)r)%0m=hSr;NNsj_Jq=I*|l{p zzs%aNsX;<#@iVmK9m!wL+ZY9j?)A}8cbFF3QeZoOKz~j;wSX+uBkX);i@Dpm@dk|- zc7B#63KVe#W+AoL%W%h_$+&B#aM`MOly7iTj+%YkPbWc6Qepl~np5QhekTmwJ#~t^ zNka}dc!H4$lh?)l)n_-ixM2#vbrt8pAAjRTtEO*TroqkyrEH~+D}MT?xjSy5Y7kOZ za)OfqKTnph*Q)zPMd2W$rktd%t<25dO-w=f&RyuSRh@3ma;(2chL3Lk!zo%@@m1?2 zf~?tw=FD9($JH1NEF0X6F0Asnm>!Tl+Vd3Nt{6AV@Grah4ZTAes4gBCUDYL9-Jock zu2jBH{lccezqnRXH73zTn8OuUu2%EB#mX_U{p6%bl-jqWNAKGwMq z7wt@`oaaWV;fG}799hc;)g#L`^42e%l=KgV2RE-f`JH03%*0nF*QghoA$hH0)JHp1m1OL8 zcgZb9ww@ZAc$PI^lr@^SEaWb8ad%-i>C|D}*5PulsI|lO!98m?4jHY`(6|sdq*x+l z8beR~fS?^03SFQmB!8Sod?MnGvXz6LM&H^=pOaV)^3H$ZUUHrKd`in8x4dd>)vAg@ zv&l{Az%&!zC-+GDQ?ali>3$DCN)}CLL$Jxy6GHZuvrZ5|FO}Xq*6;;ZfQ1clg_OQ$ zD$Q~u>6Bifp=jPjas6l2uB`#bBrnmzdQuf9Xv~VkYG*-3$P}7Md8%@v(DNDb9f5b7 zDr(V6E`#5$JjZxp8Lf-!%S4>z|E*1fwW88#tm27No%%)We<`(o3ie*+O~?5TCE7=V z@k&6#JT}mP=U7b6^@Wgu(T>1Ry^lf}|J1jmYC{TaBcrn=R?16y8_!;wo4N^`pL_@d zyVGOoenx%*V+a}z6L{!!5QCs;9bsn|hos>UKPAcRVON!h{TSMgP{ga@>hXkoJzcoW zTB>ry z(Fn-d$PZ&oH~YZv_hJ=1kME}S)D2)Z<0=Imi5GXl_isDu)Sg?lqx78ZWU+H)<^%)P z?8W_LIX};KbCD42{;F5U9NvAlNbV2E$ ze6JibmiGMv>|DMXRQJ?Q9?=1z1Uz0ukP$KhNbrb8zft5@=_{mD-p%Hj=-Ds^&r!+DunnjY{ zmT|^MXrgCz{JtjL&6@|)!ycAB=>Z8Xf&&J3%1`hk&8J;v`illS>FigbRWQZ;3tIq{ zSbl=x=6kYREqVtWtvnM(1Pka4oB*`CS z$VmTGFz|w{Z>3jkuXCm=-S+UK&l2(}mO$S56u(r=U6Z;9>Cu*RZy3Ay0wU3a?wrF7 zijEp?^0L>^4G=|0pQt>qUZZ!ixq&}w{XqjRFF)N;5F=<YG0cf4Ph0m z5fIA)ux{6TFi5w4`{nD(udX~*dx4MG&n*KNNlrVSY_qK5b*(+gL@_Mgd}?9Tgsn1p zz#KY!~p&fUy#VX$k5 z?DQV1VC>7zA)_{$w6F=f9dnOky26VDtK_^!=T5TttgK$t=l89A z!jvOjtgLzkLS{C0ZAGE!`<%Xla542VF*&^ z9P2tZ@^x@yPTX|cm7yKG7b1*>>2{k&V61jOg0~7Dy@4!Mi^+`E!o{Yeo42Dw$?30U zYzRCYCGy|ACbGm&VefF>WB*^u&cCH6jL2+tqd3H)Vy^;UCNkHOlclhLc#PFD zd3>~!erwx$t&1;&EWsv>A;ij4T2NGb(^lNHp2>SUPDMJ^LpL%cAc11Oq;}3Pw zlOXAoy-faq%B~EVsOp~X^e^5waSPnD`GQp|iRWyjGg!9E8gk8Vk0pbtG)qW=)>8H` z{5#_s(gl(St0bD$i!HEMS5q_g+xk(dQDWT2>OTcZxor;u zN|*)FE4ctt?FF`2fDJmQUlavU8FLP9l+K1;m}brgeV_(C_|fLnK$kB^@^(i^l_G$( zT$;|oZf|3LZPg_qYDw6<>ng8WSHSU|(27yckC$i54DY>hel67BByU`n$TB(CvJk6f zaa!+Pe+L)|>vDg1fwQ@m^HJf!BDCX!vtBg@k7L8o7O-CtTDKd5t@UC4M1{}^Qt@Hl z9bA+v#oHfi;bw0nMJDHjzpm+<9-olhYwp<^+guNs<;T*yER`Vg&+bmUd9~&r7QjDx zq7&GyipiaJ2IP6IlP`Ko#RwM4EzT*6pVaWg+6aCOiy`5Y_mN)D;QB^uk9f`Y)v)fX zuOx#SZoqoyjj)mA!L0Q6fRWOu$lCZhn{+=5KeC4kP2NI3NNnE_sd@q3uCDQk7xnz! zPV0MxgVfKPQq&?X!}{Uji?QNYWS=WV*TefcK%l%BHSO6(Jli~3t5)hCPL@HJEPeMh zLEX0r-A+drkzu!98T-)l7fp4(MlO!QZq9;Mgo!qdtfP#If^UbUM~Rw~*KXd0fkVKd zSb=)EG;0i|(b6%>Z`95=1FW`jHH;DA6j$NxsZpcAPJ>7BWUV z;SJEQ*w*Ote8hzc-jHqk_%=tgmTq4JggAR@uPUWd{Td46Ca$6vn`+-Yd@3MQ+8=NK zv6VwfJZmJw>~;#5q3bugW0f!UY3_uw@sW$sOQBLpLSuTpyPvqnw!|N9TG&#;NR~n| zKsENG5&bKbuHdFXX6v-N#f&7wt#4BJ=o4jj86RkLp;4*1;#whhzTL$2h!(5HpuAd9 zG#~C`{~cSRSs)+|GwM0;(fcT@V^6ATPrTXIix|w3RGg$;8(#Eu)oY-eSjIhF@C}zN zHtmld6|g?#;|Q=-S{hw=D#nLh`kmcKeu4&nlFSrgBy2CMm~&~4;kT`4$`nB)bV$X= zSU0vnN4C3i0==mfO9Kp=VLSfY7kg*+p?1_FH6R~3rI<45UIY5PcKE1QlgJL)-bqbp z<8#N#4yn?iXXX?TKIMf~b^0G2JF=~P&%tNm67*vYtKOF-zz_dvZe5i%p>Rz*JpTkk zqn)`ut?bHJn>zI2+?55_{UICKN30GKZnLY~apdWCv5PY_U$l%Ecz3og1CDOwQW`Lv zcC}SKt&W8QhG30#Kiglm^%Be6ljchu*8^7egqEH7e~w;3IWf19K3;V{D&AcdPPz8t zM&vhx9~BZh`+JU<;Oaw!bLy6;f-#lB2+Y3V7NQ=v4@3kwy-BeyqCRvZ^=Hx<9%U+jP2Zne=yq0_c&zFHm-ZA>=tY z+v)KO!Y?>tq19{~FiwiTpKm`8tMC=)Yn5m@<4ool{_3G&V&O*L<|??yn6$Ju+Gc7V zW6u?5E+U?U6t}ryUZ%Ok#4D&vBP<-&hN6O^ABjFicw_6i#O@`!qub^qVBz8KLNWZ! zw?c2Zm9Al=7hsW%+^NT-UylWbjv11j4-wF=Z<^I$!R;pcKNtZ{V5d@rdgNy@T5>qX zY!`lP8zadr}ZAHyAl@hft^ZBeWo*gekwA3rMz`Qiyp1&XFHp2Lc`a~BlBrrRsSKBhE{IQI77 zUQ|1G(l5ExCWx*4yST}Sg@Y(P_Wd!l6PVxKKH>iV`B|;p-?B-u=4r2)b;d&>3~Un3 zPI_fzFX~f^Vl}K6vbTf2?$l!Z`7l}U-o*Srp9q2f`C+NC8sP*!t#sEQsyY2b|C>w8 znnq|s5aGiUo~my^@YqWh?g2Wn%-D2TdI5iVTmG)|;iMy4RyPxxGQP3=%_$#+$g*TG zhM;i#+p&@B<1Kz?pWbf5cD#Bo%l$a&1ckjk&L3LE)|>y)lg~##=tKEzpbW2sixKTo`s^PIzL*5@-QkCL3W;P- z%-rAvsAWzdb!sv*3MA5FF95Fasip$tMe4);*_RTSu`@2!b1yk5iTq)8@q-35X0;#U zCd3h^3`kOF|AHBr{C~`0pz=5GNk`4-#=euCKk0uW>aUAYfB3B!qY--@XnE=085908 znItcuK!3t_JE*@LLPK;A*%nekD@lL~Cokn)I?HdvK_6xsu+Onu|H!zLa6_F(jfWJA z2(~Jyb>KU4A8i({ldH) z`h?Wi6#2f&vpyrV-QdgWg`9=7?ywP2gkf7YtnB(9uMB;}2?&-I{`xQF<$wR^^9ir{ zHc05*e+b{DNt1gAvzivPIRGxc;Ql%)eMabsw!Or*&YvtO|CliG`!Ce0KsA5}`dM~< zrhyL-EIuDzT)2loNL;o_OY~Y1*}GB)BIWQ+&RP#%ZOGV=ARdJx{aDMa8JJnjh1r$v6J=cG{iYMtRv z_`Q7v1Dcjw5KtkKrEvLCpRy^W2gwY|;GvPA0fu^}M+5oVh(Gn+ z>3I0DIK;c4f3Ks&kzVlxaSj1{2$n3QzZUSs=lsj|_uqq#3X#zHCZE3ZS0|N{3^o!S z#B0_X&a?o_)a>+3brapOx)-!0ci|a3ppf?X1tfdCpb#F3hwgX*X8FvvIN@X{A2qBo z%e*&aG9D!O|8p+^v!zV_h1zyioHbmPp6aCa4YYhw0nKg00 zh95Aea2K#MK5kMkFOmu@rgNbx*QFXF@a#oUe;U>Oa$XB;dj}csE74=8UM&KssN^&d z_vJ4;65Y8A_C+58Jo}TEnyyuhi-A_ccu3X~v51Ap?dadx)?1+8>UL+$7js zY=uw@dy6TcK{Mg}rG{Qm?{1cL$W79D|L?3tTDEYK9?4O)6Gu6#K9VQIu3S3Lpo9AD z8D#TfZCSmM$k~^`YgIF`nz{}AAZ=YK%4}EjpW9jsyY?CsZ|Z8tFPPyiKZTyeYo=5TZ&vZ zRD3L@zR9faZ`I^bh=2De2f5FuA4 z_@#Xg%SkU838w4iUQsBbHENI$J(1Oi~LNI+g*m>QswqR-Cb)RespBKA^UB- zra~JK)ouifq+)lsK&x5WwDlcduYDsua?!gDcfFI9;numgh=d^%?w0FOeV`|eU!Q)q zLDW4NIo}q=pdOrMfqoq*FHP4teNyw)`&((hUrxLd-bCTN+~H+|ub|4tzA?Y%Kw7yw zNo=TBQfLF%sfnEB3t7$Zj>b85UjH}-%JYfDd)pqDqoTaUl|~|&eWMc?dL7uhPDT-8 z>17Tp)h>fS`x+tv1r5;AJxF!uUDr?T_T7KwFO*J8ZzU1}#}y(e3<$iCh8-9vsx&lm z?R_uL3)%UM4D{3(rK_4jo5i_5+{FEe&L7NY5yFplz}LfpoiW)8D&{?ZrUuw!U98N! zwGI(@1r>qqd~1ZvAyP7_ zJrsungR8u295)YY8y~l`5TXDo(esW#*pC58=HtOq#(Jpla5fxNJh9+Z(|Y{HT}K;U z@q`0B`@QyH^L2+Ef>}GI(%K+xS7t(MC}U-=$G#n-WEd)=`nwwb|Gq)VL)dsXwZUz# z$%D0)s?A5?0J~cJzDbx^HdfssVJ?8fVnQk?7j`A`tzimJuv3tbb2q{JHK8H^apxGz z*bZ0%my`qfocaP79bO3SmEs!YNQSGFwvl(gJ*Uz#d1c*tz0GtbkQ4X8sv_SiGi}H+ zMmx7kRXT37u7YHfcd|UArfaLoVbbB-+Psc{kNd>?X}S!>GsIIQAF6@a^386}au}8F z)=4zgDk8-5&rSQk8v#7z;7NzCh{xt*Ai??E<_Fh=J%!T-FpmFvUACxsqfH7@?HmA= z8bn^MLg2=H4~nL%cD<$qy zzA4zcXSo?PGemBKd8_Kj`?GK}Ay%w@eY%e>vjI)txC*NE3Bnsalb`z^5KEKS4{epQ zJL~39{^95vL2A#=Eurpfx66_Zbyd^d>-Hcj1}mawn)Vd=v0EyR=P2K>3GqQ`@;#I^ zy6Hpkl}n6L1SS6y_gaHRi0D%qaey_bk~g6h*D^E(ch4`w2-F2XJ6F9BBhe9N-75~v zfsa!oJUT=NXpVr@WfiVT;k|Jgws2c7u-iaod|!_$I9DIB`c+LmArLBVvCFGB1Bx1A zP+H%NYB+4sgP@=7`R3wUIcoy9XRFJ~l;k5x4_8?po>nhsY22gM=jv{q8*`^gL9M8wMKFQIl1G3ot`rI z9!+2qReR>I)93FZb{ygX+nPJ`UrL5y5hyq;=mZix9Q$MX4pLMMu!vJW-_G7zZ(FF* z!l3fEPg_vMIie= z-HwYie-@@S=(^M)7shV&5@XlsyQjFgo|luCU5|e1B|@f<=XQQW8Z&?3PEm6Ve8T;w zFY&b>oP0VdDdgq=QO zVgzf%|Agj=TCVYZ_`=~>Mn=is2s85~oAn68eOmJ|)=Pn)8ExIP;Ft9ASYuZ*z@%U| z)2{})Rh(Mdhat6JZoj-ZKbg4eB+On`#J>NyY?e!E%ngh_odb|Am+N=ScM#I`{k~Zv3)K@+&9u2lx2*Nhgd@ z+U0&Ie6%!zZ}ngYq?w>wYv@Y^a(I0q`kqh-p-Y}VY@>V*R*1`{5hD$n#J!iMdfPVa z+CcKnQ+9;BE-OP%e3q01ghxrpR2nLG7E{IRhv~maK8Y7v?deeP8xE(+_9%VJiQ*oy zQ<&z27kx2ZH?W_bZ72z(^QKUn$~*daCIx7NZ(2jT0mxA!t7d{Pd2s&C_g{8LXU3>cVSl?whTMC!T!jX_bY z*O@sCS1;PaXmn>+DP|;#wVz{}E`PY`*+M(SshS@B%o3#wv;_}Sg;xYy{vPe34ibIZt|72gUXyNwk=7JYx?bU4FD zu#2oEj2@Gu=`*h*u7}sV^gbI9T(MExbCK6_PTdWBwQ)$Q#3uWX(R1_#e70jl4J#g_ z6!s$$cb?=Wn3^3eiXK}a^zmL0xC&l(i0`<}=;U?Sns#0yAiCT?vofkp1fFI1Ox(81 zGSm<|mv>iHN9kHE+pQH9TBPaUuIIiCbtOpRkfQr$Tj=5&md0D^1xu_8Zd&sJHJ*~^=yW9BdTz zPo6)PBCaOS6M=nyGb>LN%F(5<}T7wYnGfde>tVcnwwAu@o7k%k^oYjU>8*TmPuvJ*=$)P9b z0vMFr&I}899`1_qj)=-k7#q2L15>to>Y^NlQvqhH&}*x9edVFcNhI$u69zVk{$XUb z$KU-$hqP<&Rfu|4)+6bX#HLM>j~a+j!8)acR$*`oo{c-D{8MV{7Vk6kHH~1EnlYKrToZrBK&tVbg*=!HGdKXdq zqF%ZIVPJa89H_~f5AeDfjO;k*T}KX_h$2PPd8Jgk-`;uf^?;}Nk5BFvTvOD8>q%pZdGEvLu{xdM@sybhE#)dm`veOC-4hgwR?p`Bq3v(lgjcF zdL!?d+mZ2Jx`|7)w8#n|xt?=MEuI?BXHGTzdzRZY;M zNw-kks}@-}*1}OnGg)ik?DSh!9qNSpmO(~r2(puf>`2`R8#(WNczp1~ru55g8HGEo8%+OUGILPu;u;o5bmm*o81}H$QZT%vz z5a4|6x;h&DChyFZ?LvBA)#nL9CMeFVJV7=~r++o&EnfNt&n@q~e1}xt-<~d__1Ri@Fq5eHxaue0M|8~R%6S}l;3G|I;AP=J}S4yzbDCw19~!H>d< zkX~0ZGAneuK<++%!};yJV^D}Sn!g(>b03|Lntj%fq+9-w7~XSvfN`qRC^JlAyZcFE z5whEUHYqPv0x9*w8Npat?>6M+Qw+an9`t%<#Z_m%wLbLFh(g22NU^tny1r0fF#_JV z>grzoFx;H&U&ei5Y6G{C&tQMnCSZ}8wzYA@sbpMy&SIQ<1wV`Bq+kMMlrv4aZCIB7@X1|=P8hhufZLuAd%1P{!7j@4$O#CAL z+k-oS&71&>ib`3^_{ws{3DN|(HkazR0}w*f;&6tarAzA8x89GNSdKf2atue65PFC8 zwuMbS|NHZDVbIu>8Fq}qz!)vZ%X1SEa|)v;P$Wxq)ZuGSex8! z+#mSZVrwXjj~)e_TB9lPQoy)_)8(+Y*%@9&0{i#3T6H__FD-U#3no0L{h>GEUrv<# zfbhoGWU(I`$*2-}N2v^tx zN2HM{w^u(@Hd&@@_OlB{-ScZIT`VKp-fCYSPp@m`8iwxg{HGaL@7vd<^nNIwk=YX2 zyu?I3g1PC_RA&nqM^7?4!j9(8UW9?l1%ZJx!Yi&pOXF8eFOCMWSAQa~x#Xm8QNXXC z>z)o{8J4dHZ*F>T%6$KWkX1|#B$TN%a#c9z%%Me}@PJIyouWpsqb6|U11Z5RIfJXcZU_V*a~wG zM`Py#e71Aw{#O@g9G8lQVG*g}QfhsQI@~7tCneiey$7GSj5jw~c(S%Hlyr=r>P*;d ziNA_CAoa_f4=Wll9WXJ!!K8nrV!YupKF`=UrFcvn1f9~8GzPr0fdusI%2PGxQW;W3}U4!i|(BQ08{tZeKtB5xx% zkzvwmg5hsMQ@~8O1|>5eKWiGx2FU#0zzEBr@;%}|1XB@3%9G@zLHG_2G}Wq%xjkIN zf4y;pg!%}*xGF7(BX5AWHc0%CxsMQ7xy3hPny~klE z<#(k_VNWlmyS~$54+V0mCkGX&hin-*zg=N~khU`?437uNP_M6qKES_O)y7^E4TUL}gQ5s-K~}IN6WfCttW@3d zZOdxt#)&`c^dTjDonyo|cIM?LWQDkAFPoQoMYdLu_s%P169w1LkFpP@lDQPP6<(Q-=cnHHyi#+%#mOwwAez$`q`{!OSCIuYbL_mHIH`lEfTt0z0lVEh{k zI^-V2a9Ibcn4T8vq_p%W59C9mmQN815fNE81ri;A(sk^>S6@>Huv+pk&%laGi@)mX zG)IkuxnCT;D!qO-U}N8e3q=NALk}ulwfWrFj1%t*KJ6{#6}o!7#$%#BK>SFa=kGeJ zIPQaok}J;oZNQHF*6Jw#bVd&4xv%RILxLaJpU!TagUK^wgSpOIk?{T_PWor~0UJHQ zQ~_ekI6AK|Z0*RfKx|=KnkI~mX4p6^PIIx~>l8jIc+_hd$cA?;zo-YTZ_ku@jEhD} z#Wq!sgD7bNt9EsmPWc@ln!`qe#?!!5sM1} z4K8MW+MEkkT2(PUJUbKcer>|i$mL08VxGK#gVBB2?pOQ~R?3~{`suphlCI@0@iV}xYXjN^`zk7=~+yjva|-uVlDCcMr1!B8EtTD>2b2x3fk6XcY&kMoeM;&sMpY?6WYa+rGciYVNOl)Fn6P@WVK@)B@tJg&;n`LI>;$E#Y2U`J7(JCi<+P?gS}t`gVX046L7zB14j8J z`5i?HVtff_$flw^%JG!ZVIO&beLb`(4X0hG znXxkgZ$K@A5&BkN){Srr7~WP+FY=fUKc=z;PJjWPSOb-dj-T*x%z{|)LE1Jv{es;K z<^27ybD6#Oqn>wt{Clv^X_v%LsSDwE6eBFwtT&sX~_TSzE8C?w2~JZohq)R9IAAX@SO5)h3z0{exn_ z?SqGg%9ae)OG)D$IDoiUzx(aKY5}B@Dyf8P49d6exStlgl8f+k|LT_bb>3smeYmr^-P`K2e7v;6ZdqUuMd}GRRNIYcx za(fJSSZyI}OxFEA_R(ZFja&gX_U(h3z0B*$m`o(z>*XvQ8JCH)G44i_=vdlk`-x5) ze>v{ZwV9sXy-%Jd>Zz^#avBse!VX%Ard&TFq^-Ny{BDI`TZogqdN8KQF;F2H0DDH4 zX}vPhSn-f*`X72torplvMI~o^Sc`Mfif`+Fm{e24Le4_cQT^9V7}>eFy~{BKMkLn= zVb@Wym{yf?$GIBz4hz4vco@-C@F&+^EsN3y6T9#a11wb_2d(M~85v@E-C%L5LJH7~ zd|}-8wH*EYFC&^>TIP@KJezdJc;ED*Y*u)ZUrSTmN}Fu90k9$z&mHmn)dY&lPY7e} zw+SsH8o|yE>N_V?LAil7L^OpZz`P+D6gSNN2?>EpY@BnR1DWCvY>MMCjK=VK-A*ET zPZ7*P*5;e57G7eHsWqf3nw-8KS`j3^HcUYdyOE8iE{h`zp9-iIshu+wd$8)r2+Jxt z?5G0lhFue&5bGk&)H|1aepPnRGJtcVw)e5DdLbpUL(tvu)il2u4)*&Gr*H?>!@b(9@N*s3B^p zB#K|`4lXJ;Ek~uUK=D52mGne2%$06;AqWDIhp8EtlWI!vmc&zFuk~0%!F^#fEJX;r zG-(+UNH1pVO`DK1U;MLZ4h?-$R*}KT#}+ zj>!Q8s&OFbj*-8UhM$(@@r?GOMMyU6w0ucrE&{Vlj7AB$$~JeP(fA?cBRfLGoQIF) z>eVVYRH2sGbhKsNK)@8WV_zQr*^IdR$g|FEr#wu^L3^U=&tj?9Vot^Nsn$0GT01|w zsc&+l*w6+|68oftk|+3|F^=9{Mm?Dsm`1ZoD5)fRM*5qrI0`%K>gOXm9sThZzfrFGscl&e~q&NMZQw z%q6lHK$6l^Iz50zy402c)Y$n8^?Y1>*LB9F{5QxQGFW_6^`UDz<-rY zhH6g~9=-hF6E%Vl`h~lK4Bx^Q+ny{Q?4OIC(2?*W(EuHgLfszg>+t zX~37@Zs1TIgPpHKg#ZMhQHuj@oj*k^lnG!Dr+LX;DxFhy4wPC_d1xwo1c zYV(=aROElScHq~gQhJANoF@AQfYzi!r+NN{@d3FV!2-I#zPAGeE3s-nU<FE*m902^XlKF0{+unRRv!I360_ZsFfkM_FESij>$XBDv_Y3oJQTN|~dLVGF z07&O{k}JhbZH}U~9`K zjnSO<+7W6L6fah(q7Ey~z@~j&UFW{H@qh7$i&4!Biw&UlVB-^PeJVDL_m4b~fOHU| z1m2cC4MhGueawH92xfwuy=-JWc2zU_F*D)+L579+01A7U<^{#l%}XSk{D*9d0Q!LA z76YP($b19lCt^$}ceu+EKe3*hgC#E8{r*066RduL$Pq%tnK*d^wWqj*+rfKTu6R&h z5H7&1{*LAM|KF?wBpd>66OMp!NXSrt13Roo##=0dxO*%@A%?4^_IncnvImHmFd4!1 ziT|%+u*MGdVwrHvnL>75Th(P-`0Ok%w*ej$r%^_-IX9>gbhqM{^x#_Ueu)0VXYGwJ zoj;tiMZVuNnT8dE)ksYGZ33nJ50?Io5U7GqKsrYB$ID{Lk$5kz2=a9&zzvSmc|C^$ z`3ED6!V?CdvYLtyYi0NjMV}wvTjXsxVl6$U{atQDr37z-HmERH%fg;B^C+{eCuLx) z&R(A*Lh!+9!rx)0s?=NO=Da?8^i~vg7DcMics7aGVWv6ImgVJBF%fJsR;{~Zb#c+l zd!eky!u>ZQ5fWmfgg3!dc3>D3=zirTP^YGR`_o^3!p9gY72Gjc=EgPKfJj8fqAWbQ z+ZR1)vR@CI+jd}T*+KM^F_OCqmKipoSy`c}N%zf{%8cdExRfNv+MMhpWx{8Uj4``CYmpq_6uHz2AiU*A)MDWvMIoA;-+Jpn8cpY)NybtT}DW!v(s6 z4&bL*K+3quog3e15w6H$KP`wIPeNhZns?bYR{^Uf)@(lWX@zc;RPy63&1J1>0ME0r zPQ){+%NTi?0lKY2MP2bv$9Ho)a>5olQ1IL8X+7vjXR0+#67i4+O_IvC#oAcaFC;58 z7yj3wr|f_;F^Y?W9RF(aHS7Av;0Wh+QH2LpH7yUw zh8)zR>)@N4BOSEAi2biy?e9N|DG)v1 zvP1+jhQv>!3y94UT{02gF5-snz0VD(bsmKIb{&*}2u)7dLE2)T59JGc{8xMMv9^te zrw$fg^ZA9QeO0NRIsquhc!9+eSbRR>3o-h4azfz#8&7A>W3$#{YiM}=7lVR$S#ZXI z!7Xn&?oXtTWts{-S7u_jn_K>L){8MAd|)dWMR?~3`On;i8-5eJZ2G-_9O9T5no-a? zp1;62z1Db&@Mm*jkx+(o&Hhqe2Z+1wp1tvv>X&Q)k&%-0N9G5^F|(kr35UR`9d?~k zMuY?Hj^)?R-S9%iOYV@6Ko<#kRpF;w-?zkIBG{rWDde2H_=U3GUfF8>1gg3uKfZLJ z8vmc)0pjNofb3xIMCzSi+9u$*b;m>ZdO=zG`;FbHryaM*^-bX3j^gy<S3U#IkqxoMHdyx4^z^}O!C(i#&yX-Ml%QS|RPsGTgUnp|TjTE%`zAXG~{UQw`l;nTx zbuy@w8b~74WUoNd;w=@`Qc)E+TwnKC2^#^KG=N>!w{|9wMIOfT9Uv)dhl#K?ETqet zA6@wrlnGYO+XoAPo>rh=QnE+<^EvQ8y&l?z#~2H+)EEMe+H2kQmO^`=A#MjV`t+9S z^foj|{~^%cqRA0KUv~ZZ)o9FcrRJCLTjwR7xg!dXgsV%oySAHI#bvCz>*m)E($Mq% zJDTOuc`mHuJCU0eR;6Cn(PcKHe5^6Que*?Xpwev2iXtR$BBRVw`|htX-&g0 z+xvuhX-$qfNnQo z(duIG7%l}{jns%qdY5Z(e!ctjUOwqphv>GCa|l(NE#J`HQ=(SN4f94r4PIWGAT^AQ z;Wk5j$CsQr`A6}|S+zpL`?tKqzCTgt_ii06QF>nWbHLrdCo8T)s<)M!%dbHrQOH)*JeUS7gJ!}#Q4!1Mis$brL0 z%Nmn5wv#bNiR#t)ky^fZ8;SUh4|lYSoG^kkIu7i0(1RVUbvYD%mY$g{(Ol( zAkKEiil@Jhk>T|_ksneHlB*Y^XN7aatG?X66a&eo!$i*krc!40t}2XVpaANY+Y}BU zD7OE6f3lTDF@HZ|KNKGtKE=N|h% zIgtd#{NX3PJi|30SCM>ggA5oiZ1I?PQ_Tu=oC@%u^g1jiJ>4f&)Pqv1D9jx1l5Hqi zO1MC5^D}V`wlTLf^<=#w%nOw&CNXQyZ$j(A1Z`59cLUiNTwT|DlM+MQK6kO99s)kN z9cCmQVW)kmt^sahK8A#cDz^pq&eAqAwaN~uEs@^NKo zMB*p;+>I|@TUJR(;n!d{k_-C;JYR07Y0qzA=wkD>FfF@M~-| z^r&?o5P>`$oo(4dZ1a%)1K}UOSln|zH1c;LQB=nl={1JI=ptX^wEE!L?rFcm@0E>m zY`M|Rt;jr)5j%T7B+; zEE_;baDWH(<%YTbyy|#FDu#FuGNE2$XIj)SevK_y(HSukrTKuJB|@g)#^!v)toDM{ zRn7WD(6LQe9PJM_#A+IP^h=joBV^{G;L5{Z*laIn<&Pt z1gBV1efH|FG|M+rHltXzjc>m=Zv>m@+YQx$>sGHH0n~pW?M?RwXOO8C8$ z&b^jvzlnRr#4q2tlb~*!~-u{X| z#=U|P-yT`Nwzbx%Q+fh#^2PqM-E1$=^bVK;_K6ebo*dHh?1Nh846Jn^7qzdic*2j? z3T96#WZ(WUD-cUw!Cp!LyKO=@?8h~@K@fG#<*CS7903Kg1>z}eNebUQ%|bpXR~1Mp z{ZjhUOPZ$peLX;OHb5+CeD}4*Y9$gu;VNQXzqjDT^)vcjungT{dM(QwX(my0=UfW? zdH|Rzs%S5<-wA8T&|++C!6wiwr1zqu0Hl7q`D%@^e4;xDZF0}e>SdyATqI;kh$dy@ znzAiav?)|{W*K<4&Y(V4duf9tBT!b2c#;Wb#e0;Y zF|1C6{W4)i8AUV_8cLDCy>z=6ro?<>`E8D);@Fiu`+3;c>nade9zeUc zn#6O5BGk~h_A z3V(<-D7!Lj3KK`X@?SR%yBPz3zlpD^(YpsIf$6)UsCB?d2QeAeS=*6ND+UmV##EE%h?U zksEVObBW7)cgR%yiWjqv9&}z`Jn!NoAUN~MK#8-ICV^jZ!_w zTx>vaM=BOjgWm+r2%L|*}6xR*(P z>f!+?OGiafa`^9;;+iHGbgka%Vfxn%tN+?^a3Qh;)dQ`Q1(zY_7L9cXg|Pg=_9}+P zNz~%d62?**!{RuVAXpfACb`A(73zg&6@!h9EQ!tg*t2xU$onLs-Mii(v*+^)qg(g`&3FCIF&Fy9hTYW`Yu<8AAlQs=m9J4 z-1@nw$Eiim=-JY<;q>vP&!Tci6#5L?CKLu1$76v{8+Kbb4tq8W>tQiIu(*gd2Ca|H!&MzCD;UTQ#3{aH?i&KMgj#>SotQ$dThu0vb#Nk11XZ?Pl5EGr+ zJogWPm6&k{ejeqBiYRGdmQVg5uy}n7DyI89Y}B{!yef57Mw1V$TKH!FCAitO< zxSW||9sQW>oNx))e? zAx7xzpCg%Nu(njZ!|aJhz%+cGzJIrvUK@jIG-j8!@|=HbpISpgEp2#k5Z0~3AY*K# zL*L~W?R*pN_zoO$z0m%A>;j;sO&o$0yv#r)R;a)x(~Y^Mi71?%Bz+*EH@%+Yli!wA zk7n4W%r<2y@LfCnnqEv?-4YGxYB(5Q&;Nhjy?H#9TN^OkIZw~&=+vn+o#x0q?#+Ve7)AxJ-fBj*vd98b` zbzSRP*SZGgoTj%7d(4LjH6z_>`kbXn9`?-LTkAk~y6yBy207{_%I{hP2J1YJuzSjy zMyy+z(n@&*dwQPU#y5UcI8WSUNj-M|f&PA-_rSe<&h#hcc;eZU|EaoPT?*8{_Y*y} zPs^!!^|y7@_>M*6hJ?v+fyQO7=F;D;1e3d#igtv7*k% z@P`CT=-%n{JxA zGB^(K$1t#cs;pMJ9oENkMdobX)&MxsbD#GhRkRt$Qn|=L)v8%mm;Tr<-|GPsQh?o)vFhgs4I`zzB9v%j z8?m*?|gC6tSScVedg-tu7x2Q`*q3nyv<5oBU=~?YGrYH9ZR@s>a@Ewy|hW>1V>T z)qVB9gi{{g+F6beJ5sPO>u^EJt3>~viyU1H89s?PtgX;o_35>cK9A#WiruWt26bL0 zj=HDY>b|@#P5IKwz0gtG?Q&FGdmDe&xvOAP?ekBk^b}pr_8hG&0|q9H<0BawSZ